我们在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
然后使用descrbe查看orion-controller-mongodb-headless服务的endpoint。
最后使用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获取。
看到上述svc实际有3个endpoints,实际client访问由iptables决定。
下面我们来介绍下headless,再往后面讲可以能接受的更快点。
headless服务是为pod提供一个固定的地址,上面提到了三个endpoints,client访问由iptables决定,但是当我想固定访问其中一个POD时,这时候就需要获取这个应用的headless服务了。
还是上述例子,只需要在前面添加orion-controller-mongodb-0,orion-controller-mongodb-0是绑定这个svc的sts服务的副本之一。
orion-controller-mongodb-headless.orion.svc.cluster.local
修改为
orion-controller-mongodb-0.orion-controller-mongodb-headless.orion.svc.cluster.local
我们再使用nslookup命令进行解析下看下结果
这时候解析出来的地址10.244.169.133其实就是orion-controller-mongodb-0的POD地址。
通常这样的用法时确保服务是sts服务,切在client访问时有自主选择权的业务,这样这些业务可以根据自己的需要来连接具体想要连接的后端副本。