headless service无头服务

headless service无头服务Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

欢迎大家来到IT世界,在知识的湖畔探索吧!

从上面的结果能看到,虽然Service有1个endpoint,但是DNS查询时只会返回Service的ClusterIP地址,具体Client访问的是哪个real server,由iptables或者ipvs决定

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

欢迎大家来到IT世界,在知识的湖畔探索吧![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   <br>NAME     READY   AGE   <br>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格式为(StatefulSetname)−(StatefulSetname)−(pod序号) 3.StatefulSet会为关联的Pod分配一个dnsName <PodName>.<PodName>.<service name>.$<namespace name>.svc.cluster.local

转载地址:https://www.cnblogs.com/chadiandianwenrou/p/11937041.html

文章部分内容通过网络收集整理,如有侵权或技术交流请联系作者!

#Author : mayi

#wchat : a

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/75082.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信