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名称:

  1. 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名称会变。
3.Pod会对应如下DNS名字解析pod-ip-address.my-namespace.pod.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.default.pod.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53

Name: 10-101-26-51.default.pod.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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章