Service作用和原理
作用:Service的作用次要是用来做负载平衡,dns解析以及对外裸露端口。所有的pod IP和端口都会通过label匹配到,而后通过coredns解析实现了服务发现
原理:Service通过iptables或者ipvs对拜访的指标地址进行批改转发数据
Service的类型
- Cluster
- NodePort
- LoadBalancer
- ExternalName
Cluster类型
$ cat myapp-deploy.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: myapp-deployspec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:v1 ports: - containerPort: 80 name: http
$ cat myapp-svc.yaml kind: ServiceapiVersion: v1metadata: name: myapp-svcspec: selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 80
$ kubectl apply -f myapp-deploy.yamldeployment.apps/myapp-deploy created$ kubectl apply -f myapp-svc.yamlservice/myapp-svc created$ kubectl get deploy,svc,endpointsNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/myapp-deploy 3/3 3 3 28sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21hservice/myapp-svc ClusterIP 10.105.225.171 <none> 80/TCP 22sNAME ENDPOINTS AGEendpoints/kubernetes 172.16.56.133:8443 5d21hendpoints/myapp-svc 172.17.0.6:80,172.17.0.7:80,172.17.0.8:80 22s$ kubectl run cirros-$RANDOM --rm -ti --image=cirros -- sh/ # curl http://10.105.225.171<h3>Hello World!</h3><b>Hostname:</b> myapp-deploy-ccc8b4bb5-f829g<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>/
NodePort类型
$ cat myapp-svc.yaml kind: ServiceapiVersion: v1metadata: name: myapp-svcspec: type: NodePort selector: app: myapp ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 32223
$ kubectl apply -f myapp-svc.yamlservice/myapp-svc configured$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21hmyapp-svc NodePort 10.105.225.171 <none> 80:32223/TCP 9m46s$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmyapp-deploy-ccc8b4bb5-dn4lb 1/1 Running 0 10m 172.17.0.6 minikube <none> <none>myapp-deploy-ccc8b4bb5-ds542 1/1 Running 0 10m 172.17.0.7 minikube <none> <none>myapp-deploy-ccc8b4bb5-f829g 1/1 Running 0 10m 172.17.0.8 minikube <none> <none>
如果你尝试刷新页面,会发现失去不同的主机名,这是正确的
ExternalName类型
$ cat external-redis-svc.yaml kind: ServiceapiVersion: v1metadata: name: external-redis-svc namespace: defaultspec: type: ExternalName externalName: www.baidu.com ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 0 selector: {}
$ kubectl create -f external-redis-svc.yamlservice/external-redis-svc created$ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEexternal-redis-svc ExternalName <none> www.baidu.com 80/TCP 5skubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21hmyapp-svc NodePort 10.105.225.171 <none> 80:32223/TCP 17m$ kubectl run -ti --rm busybox --image=busybox -- sh/ # nslookup external-redis-svc.default.svc.cluster.local.Server: 10.96.0.10Address: 10.96.0.10:53external-redis-svc.default.svc.cluster.local canonical name = www.baidu.comwww.baidu.com canonical name = www.a.shifen.comName: www.a.shifen.comAddress: 163.177.151.109Name: www.a.shifen.comAddress: 163.177.151.110*** Can't find external-redis-svc.default.svc.cluster.local.: No answer/ # exit
- 如果内部服务没有域名,为了进步服务的兼容性能够采纳service+手动endponit,自定义一个域名
apiVersion: v1kind: Servicemetadata: name: my-servicespec: ports: - protocol: TCP port: 80 targetPort: 9376
apiVersion: v1kind: Endpointsmetadata: name: my-servicesubsets: - addresses: - ip: 192.0.2.42 ports: - port: 9376