我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要互相调用,肯定不能用ip的,因为地址不是固定的, 如何能保障pod之前访问的可靠性,由此就衍生出Service的概念。
Headless Service通信
要定义一个服务(Service)为无头服务(Headless Service),需要把Service定义中的ClusterIP配置项设置为空: spec.clusterIP:None
。和普通Service相比,Headless Service没有ClusterIP(所以没有负载均衡),它会给一个集群内部的每个成员提供一个唯一的DNS域名来作为每个成员的网络标识,集群内部成员之间使用域名通信。无头服务管理的域名是如下的格式:
$(service_name).$(k8s_namespace).svc.cluster.local
其中的 "cluster.local"是集群的域名,除非做了配置,否则集群域名默认就是cluster.local。StatefulSet下创建的每个Pod,得到一个对应的DNS子域名,格式如下:
(
p
o
d
n
a
m
e
)
.
(podname).
(podname).(governing_service_domain),这里 governing_service_domain是由StatefulSet中定义的serviceName来决定。
例如在本项目中存在服务elasticsearch,另一个程序要访问他,命名空间为iscas
那么替换项目配置文件中的IP地址为
elasticsearch.iscas.svc.cluster.local
此后,无论容器是否重启,IP地址是否改变,K8S会根据服务名称找到对应的该服务对应pod的实际IP地址进行关联。
参考博客
https://www.cnblogs.com/Jack47/p/deploy-stateful-application-on-Kubernetes.html