背景
分佈式服務部署在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名稱會變。
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/