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