Headless Services無頭服務


一、Headless Services介紹

Headless Services是一種特殊的service,其spec:clusterIP表示為None,這樣在實際運行時就不會被分配ClusterIP。也被稱為無頭服務。

1、headless Service和普通Service的區別

headless不分配clusterIP

headless service可以通過解析service的DNS,返回所有Pod的地址和DNS(statefulSet部署的Pod才有DNS)

普通的service,只能通過解析service的DNS返回service的ClusterIP

2、statefulSet和Deployment控制器的區別

statefulSet下的Pod有DNS地址,通過解析Pod的DNS可以返回Pod的IP
deployment下的Pod沒有DNS

3、普通Service解析service的DNS結果

Service的ClusterIP工作原理:一個service可能對應一組endpoints(所有pod的地址+端口),client訪問ClusterIP,通過iptables或者ipvs轉發到Real Server(Pod),具體操作如下

[root@master01 ~]# kubectl get svc -n ms   #獲取所有svc,看到gateway這個service的clusterIP是10.0.0.14
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
eureka             ClusterIP   None         <none>        8888/TCP   21h
gateway            ClusterIP   10.0.0.14    <none>        9999/TCP   20h
mysql-production   ClusterIP   10.0.0.251   <none>        3306/TCP   23h
portal             ClusterIP   10.0.0.124   <none>        8080/TCP   17h

[root@master01 ~]# kubectl describe svc gateway -n ms  #看到gateway這個service的具體信息
Name:              gateway
Namespace:         ms
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"gateway","namespace":"ms"},"spec":{"ports":[{"name":"gateway","po...
Selector:          app=gateway,project=ms
Type:              ClusterIP
IP:                10.0.0.14
Port:              gateway  9999/TCP
TargetPort:        9999/TCP
Endpoints:         10.244.1.212:9999   #該service下的Pod地址
Session Affinity:  None
Events:            <none>

[root@master01 ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh  #進入一個容器測試解析
/ # nslookup gateway.ms.svc.cluster.local         #測試解析gateway這個service的DNS
nslookup: can't resolve '(null)': Name does not resolve

Name:      gateway.ms.svc.cluster.local
Address 1: 10.0.0.14 gateway.ms.svc.cluster.local  #這個結果就是gateway這個service的ClusterIP

從上面的結果能看到,雖然Service有1個endpoint,但是DNS查詢時只會返回Service的ClusterIP地址,具體Client訪問的是哪個real server,由iptables或者ipvs決定

4、headless Service的解析service的DNS結果

[root@master01 ~]# kubectl get svc -n ms   #查看所有SVC,看到eureka的這個headless service
NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
eureka             ClusterIP   None         <none>        8888/TCP   21h
gateway            ClusterIP   10.0.0.14    <none>        9999/TCP   20h
mysql-production   ClusterIP   10.0.0.251   <none>        3306/TCP   23h
portal             ClusterIP   10.0.0.124   <none>        8080/TCP   18h
[root@master01 ~]# kubectl describe svc eureka -n ms  #看到eureka的這個headless service下面的endpoints
Name:              eureka
Namespace:         ms
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"eureka","namespace":"ms"},"spec":{"clusterIP":"None","ports":[{"n...
Selector:          app=eureka,project=ms
Type:              ClusterIP
IP:                None
Port:              eureka  8888/TCP
TargetPort:        8888/TCP
Endpoints:         10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888
Session Affinity:  None
Events:            <none>
[root@master01 ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh  #進入容器測試解析
/ # nslookup eureka.ms.svc.cluster.local                    #通過解析eureka這個headless service的DNS地址,可以看到關聯的具體endpoints信息
nslookup: can't resolve '(null)': Name does not resolve

Name:      eureka.ms.svc.cluster.local
Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local
Address 2: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local
Address 3: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local  
  / # nslookup eureka-2.eureka.ms.svc.cluster.local  #解析pod的DNS記錄,也能返回Pod的IP  nslookup: can't resolve '(null)': Name does not resolve

  Name: eureka-2.eureka.ms.svc.cluster.local  Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local

根據結果看到,dns查詢會返回3個endpoint,也就是3個pod地址和DNS,通過解析pod的DNS也能返回Pod的IP

二、Headless Services使用場景

第一種:自主選擇權,有時候client想自己決定使用哪個Real Server,可以通過查詢DNS來獲取Real Server的信息

第二種:headless service關聯的每個endpoint(也就是Pod),都會有對應的DNS域名;這樣Pod之間就可以互相訪問

headless services一般結合StatefulSet來部署有狀態的應用,比如kafka集群,mysql集群,zk集群等

[root@master01 ~]# kubectl get sts -n ms    
NAME READY AGE   
eureka 3/3 22h [root@master01 ~]# kubectl get svc -n ms NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE eureka ClusterIP None <none> 8888/TCP 21h [root@master01 ~]# kubectl describe svc eureka -n ms Name: eureka Namespace: ms Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"eureka","namespace":"ms"},"spec":{"clusterIP":"None","ports":[{"n... Selector: app=eureka,project=ms Type: ClusterIP IP: None Port: eureka 8888/TCP TargetPort: 8888/TCP Endpoints: 10.244.1.210:8888,10.244.1.211:8888,10.244.2.45:8888 Session Affinity: None Events: <none> [root@master01 ~]# kubectl exec -it gateway-6cd76c98fb-8w92t -n ms sh / # nslookup eureka.ms.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: eureka.ms.svc.cluster.local Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local Address 2: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local Address 3: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local / # nslookup eureka-2.eureka.ms.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: eureka-2.eureka.ms.svc.cluster.local Address 1: 10.244.1.211 eureka-2.eureka.ms.svc.cluster.local / # nslookup eureka-1.eureka.ms.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: eureka-1.eureka.ms.svc.cluster.local Address 1: 10.244.2.45 eureka-1.eureka.ms.svc.cluster.local / # nslookup eureka-0.eureka.ms.svc.cluster.local nslookup: can't resolve '(null)': Name does not resolve Name: eureka-0.eureka.ms.svc.cluster.local Address 1: 10.244.1.210 eureka-0.eureka.ms.svc.cluster.local

 如上,eureka就是我們場景的StatefulSet,對應的pod就是eureka-0,eureka-1,eureka-2,他們之間能互相訪問,這樣對於一些集群類型的應用就可以解決互相身份識別的問題了

三、為什么要用headless service+statefulSet部署有狀態應用?

1.headless service會為關聯的Pod分配一個域
<service name>.$<namespace name>.svc.cluster.local
2.StatefulSet會為關聯的Pod保持一個不變的Pod Name
statefulset中Pod的hostname格式為$(StatefulSet name)-$(pod序號)
3.StatefulSet會為關聯的Pod分配一個dnsName
$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

 

https://blog.csdn.net/zhangshaohuas/article/details/107552452

https://www.cnblogs.com/chadiandianwenrou/p/11937041.html 

https://kubernetes.io/docs/concepts/services-networking/service/#headless-services  官網介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM