service:服务,是一个虚拟概念,逻辑上代理后端pod。众所周知,pod生命周期短,状态不稳定,pod异常后新生成的pod ip会发生变化,之前pod的访问方式均不可达。通过service对pod做代理,service有固定的ip和port,ip:port组合自动关联后端pod,即使pod发生改变,kubernetes内部更新这组关联关系,使得service能够匹配到新的pod。这样,通过service提供的固定ip,用户再也不用关心需要访问哪个pod,以及pod是否发生改变,大大提高了服务质量。如果pod使用rc创建了多个副本,那么service就能代理多个相同的pod,通过kube-proxy,实现负载均衡

[root@k8s-master ~]# vim service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
targetPort: 443
[root@k8s-master ~]# kubectl get all
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes      ClusterIP   10.10.10.1            443/TCP   5d
svc/nginx-service   ClusterIP   10.10.10.85           88/TCP    20h
[root@k8s-master ~]# kubectl create -f service.yaml 
[root@k8s-master ~]# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP   10.10.10.1             443/TCP          5d
my-service      ClusterIP   10.10.10.212           80/TCP,443/TCP   24s
nginx-service   ClusterIP   10.10.10.85            88/TCP           20h

查看pod的标签,用标签来识别,并代理到后端的服务上

[root@k8s-master ~]# kubectl get pod --show-labels -o wide
nginx-pod                           1/1       Running   1          17h       172.17.80.4   192.168.30.23   app=nginx

修改我们创建的my-service,把标签改为nginx,然后我们访问我们的my-service分配的clusterIP就能直接代理到后端的Nginx上了
[root@k8s-master ~]# kubectl edit svc/my-service

访问10.10.10.212:80

[root@k8s-node1 ~]# curl 10.10.10.212:80



Welcome to nginx!
[root@k8s-node2 ~]# curl 10.10.10.212:80



Welcome to nginx!

service服务发现

[root@k8s-master ~]# vim busybox-5d4f595646-dzjv4.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
[root@k8s-master ~]# kubectl create -f busybox-5d4f595646-dzjv4.yaml 
[root@k8s-master ~]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
busybox                             1/1       Running   0          1m

进入创建的pod可以看到负载到的cluster IP 和端口

[root@k8s-master ~]# kubectl exec -it busybox sh
/ # env
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.10.10.1:443
MY_SERVICE_PORT_80_TCP=tcp://10.10.10.212:80
MY_SERVICE_PORT_443_TCP_ADDR=10.10.10.212
NGINX_SERVICE_PORT_88_TCP_ADDR=10.10.10.85
HOSTNAME=busybox
/ # echo ${MY_SERVICE_SERVICE_HOST}
10.10.10.212
/ # echo ${MY_SERVICE_SERVICE_PORT}
80