k8s Service
1.service介绍
2.创建Service
创建一个deployment
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 2 template: metadata: labels: run: httpd spec: containers: - name: httpd image: httpd ports: - containerPort: 80
启动 两个Pod ,运行httpd 镜像,label是 run:httpd Service 会用这个label来挑选Pod
kubectl apply -f httpd.yml
Pod 分配了各自的IP,这是IP只能被Kubernetes Cluster 中的容器和节点访问
创建Service
apiVersion: v1 kind: Service metadata: name: httpd-svc spec: selector: #指明label为run:httpd 的Pod作为Service 的后端 run: httpd ports: #将Service的8081端口映射到Pod的80端口,使用TCP协议 - protocol: TCP port: 8081 targetPort: 80
httpd-svc 分配到一个CLUSTER-IP 10.254.23.80 ,可以通过该IP访问后端的httpd Pod
根据 kubectl describe 查看httpd-svc 与 Pod 的对应关系
3.Cluster IP 的工作原理
Service Cluster IP 是一个虚拟IP ,是由Kubernetes 节点上的 iptables 规则管理的,IPtables 将访问Service 的流量转发到后台Pod ,而且使用了类似轮询的负载均衡策略。
Cluster 的每一个节点都配置了相同的 iptables 规则,这样就确保了整个Cluster 能够通过Service 的Cluster IP 访问Service.
查看 有关httpd-svc的相关信息
iptables-save |grep httpd-svc
4. 外网访问Service
ClusterIP
service 通过Cluster内部的IP对外提供服务,只有Cluster内的节点和Pod可访问,这是默认的Service类型
NodePort
service 通过Cluster节点的静态端口对外提供服务。Cluster 外部可以通过<NodeIP>:<NodePort> 访问Service
LoadBalancer
service利用cloud provider 特有的Load balancer 对外提供服务,cloud provider 负责将load balancer 的流量导向Service。
目前支持的cloud provider有GCP、AWS、Azur等
添加type:NodePort,重新创建httpd-svc
apiVersion: v1 kind: Service metadata: name: httpd-svc-1 spec: type: NodePort selector: run: httpd ports: - protocol: TCP nodePort: 30000 #节点上的监听端口 port: 8081 #ClusterIP上监听端口 targetPort: 80 #Pod上监听端口
kubectl apply -f httpd-svc-1.yml
测试Node Port 是否正常工作
通过节点IP + 30000端口能够访问到 httpd-svc-1
最终,Node和ClusterIP在各自端口上接收到请求都会通过iptables 转发到Pod的target Port。
5.使用ExternalName将外部服务映射到内部服务
apiVersion: v1 kind: Service metadata: name: my-redis namespace: xmc-test spec: type: ExternalName externalName: my-redis.default.svc.cluster.loca ports: - name: redis port: 6379
参考
https://www.cnblogs.com/benjamin77/p/9908547.html