1. 9.2 Service和Endpoint
Service作为Kubernetes中为Pod实现负载均衡的组件,几乎在所有的文章中为了方便初学者理解,基本上说的是Service会来监听Pod的变化,然后来更新Pod的IP地址。其实这个事情不是Service干的,而是有一个幕后英雄:Endpoint Endpoints表示了一个Service对应的所有Pod副本的访问地址,而Endpoints Controller负责生成和维护所有Endpoints对象的控制器。它负责监听Service和对应的Pod副本的变化。
- 如果监测到Service被删除,则删除和该Service同名的Endpoints对象;
- 如果监测到新的Service被创建或修改,则根据该Service信息获得相关的Pod列表,然后创建或更新Service对应的Endpoints对象。
- 如果监测到Pod的事件,则更新它对应的Service的Endpoints对象。
kube-proxy进程获取每个Service的Endpoints,实现Service的负载均衡功能。
1.1.1. 创建一个Headless Service
编写一个Service不使用clusterip
[root@linux-node1 ~]# cat mysql-service.yaml
kind: Service
apiVersion: v1
metadata:
name: mysql-service
spec:
ports:
- protocol: TCP
port: 3306
targetPort: 3306
clusterIP: None
[root@linux-node1 ~]# kubectl create -f mysql-service.yaml
service "mysql-service" created
查看Service,可以放心CLUSTER-IP为None
[root@linux-node1 ~]# kubectl get service mysql-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-service ClusterIP None <none> 3306/TCP 17s
2.创建一个Endpoint
[root@linux-node1 ~]# vim mysql-endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-service
subsets:
- addresses:
- ip: 192.168.56.13
ports:
- port: 3306
protocol: TCP
[root@linux-node1 ~]# kubectl create -f mysql-endpoint.yaml
endpoints "mysql-service" created
3.查看Service和Endpoint的关联
[root@linux-node1 ~]# kubectl get ep mysql-service
NAME ENDPOINTS AGE
mysql-service 192.168.56.13:3306 42s
[root@linux-node1 ~]# kubectl describe svc mysql-service
Name: mysql-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP: None
Port: <unset> 3306/TCP
TargetPort: 3306/TCP
Endpoints: 192.168.56.13:3306
Session Affinity: None
Events: <none>