k8s无头服务headless介绍

我们在k8s中访问POD提供的业务服务时通常都是通过Service name的负载来访问,其中负载的原理和CoreDNS有关,它是将Service name解析成Cluster IP,这样我们就可以通过Cluster IP作负载均衡,把流量分布到各个POD上面。

ClusterIP的原理

一个service可能代理多个endpoint,每个endpoint实际就是一个POD提供,client访问的就是service的ClusterIP,从而通过iptable规则转发到到后端的某一个POD服务。从而达到负载均衡的效果。

当service type类型设置为ClusterIP且clusterIP设置为None时,那么这就是一个无头服务。

我们查看一个例子,获取headless服务orion-controller-mongodb-headless

image.png

然后使用descrbe查看orion-controller-mongodb-headless服务的endpoint。

微信截图_20221114155700.png

最后使用nslookup命令查看orion-controller-mongodb-headless服务后端对应的IP地址,也就是三个POD的IP地址。

注意K8s中资源的全局FQDN格式如下

headless服务名.namespace命名空间.svc.cluster.local

上述中svc.cluster.local地址是固定的,是默认k8s集群的域名。

另外10.96.0.10是dns服务地址,可以通过查看名字为kube-dns的svc获取。

微信截图_20221114155620.png

看到上述svc实际有3个endpoints,实际client访问由iptables决定。

下面我们来介绍下headless,再往后面讲可以能接受的更快点。

headless服务是为pod提供一个固定的地址,上面提到了三个endpoints,client访问由iptables决定,但是当我想固定访问其中一个POD时,这时候就需要获取这个应用的headless服务了。

还是上述例子,只需要在前面添加orion-controller-mongodb-0,orion-controller-mongodb-0是绑定这个svc的sts服务的副本之一。

image.png

orion-controller-mongodb-headless.orion.svc.cluster.local

修改为

orion-controller-mongodb-0.orion-controller-mongodb-headless.orion.svc.cluster.local

我们再使用nslookup命令进行解析下看下结果

微信截图_20221114160950.png

这时候解析出来的地址10.244.169.133其实就是orion-controller-mongodb-0的POD地址。

通常这样的用法时确保服务是sts服务,切在client访问时有自主选择权的业务,这样这些业务可以根据自己的需要来连接具体想要连接的后端副本。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/896.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。