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

【完结】