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