技术流ken

运维拯救世界

k8s环境通过DNS名称访问POD

背景
分布式服务部署在k8s环境,由于运行在每个pod中的服务要知晓这个分布式集群中其它的服务节点ip或者dns名称。而statefulset给其管理的pod提供了稳定的网络标识符(例如pod名字和主机名),通过headless service为每一个pod提供了固定的dns名称,很好的解决了这个问题。
然后,心里就又了产生了另一个疑问,k8s还有哪些方式可以直接访问到pod呢?

直接访问pod的方式
pod自动分配的ip
在k8s中一般使用Calico或者Flannel这种网络通信方案,这个方案提供了k8s集群中所有pod的ip互相通信的解决方案。
优点:简单
缺点:pod重启之后,ip是重新自动获取,不是pod的唯一标识

DNS名称访问
k8s提供的DNS名称和k8s集群默认的集群名字有关系,默认k8s集群的域名为cluster.local,则所有DNS的全名称都会以cluster.local为后缀,本文测试集群域名为cluster.local。
k8s为pod提供了如下几种DNS名称:

k8s为service资源分配了DNS名称,通过DNS名称可以访问到service对用的pod。而通过statefulset创建的pod,并依赖service headless能实现给statefulset管理的pod提供固定的DNS名称pod-name.service-headless-name.namespace.svc.cluster-domain.example,具体样例:

# kubectl get pods -n test-env|grep kafka-0
kafka-0                                1/1     Running     0          2d23h
# kubectl get services -n test-env|grep kafka-headless                    8d
kafka-headless                  ClusterIP   None             <none>        6667/TCP                     8d

# kubectl exec -it dnsutils bash
# nslookup
> kafka-0.kafka-headless.test-env.svc.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10#53

Name:	kafka-0.kafka-headless.test-env.svc.cluster.local
Address: 10.101.26.45

优点:适合有状态服务之间互相通信
缺点:需要先创建一个service headless

2. deployment或通过service暴露出来的 DaemonSet所创建的Pod会有如下DNS名称可用pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example,具体样例:

# kubectl get pods -o wide|grep httpd
httpd-7c456f6cf9-m5jtv                1/1     Running            0          17m    10.101.26.51     work4   <none>           <none>


# kubectl exec -it dnsutils bash
# nslookup
> 10-101-26-51.httpd.default.svc.cluster.local
Server:		10.96.0.10
Address:	10.96.0.10#53

Name:	10-101-26-51.httpd.default.svc.cluster.local
Address: 10.101.26.51

优点:简单
缺点:pod重启之后,ip是重新自动获取,不是pod的唯一标识,故DNS名称会变。

https://kubernetes.io/zh/docs/concepts/services-networking/dns-pod-service/
https://kubernetes.io/zh/docs/concepts/workloads/controllers/statefulset/

发表评论

邮箱地址不会被公开。