Kubernetes Pod DNS 解析

Kubernetes Pod DNS 解析

目前能夠將所有服務解析為 IP 位址並進行 telnet 和 ping 操作。無法將 Pod 解析為 IP 位址。雖然可以使用 kubectl 和 telnet 來尋找 pod IP 位址並對它們執行 ping 操作。我需要如何設定 DNS 來解析 Kubernetes 1.9.6、dns-controller:1.9.1 中的 pod。

答案1

@mk_sta 的答案更容易使用,您可以運行這個班輪來測試您的 DNS:

kubectl run busybox --image=busybox --rm --attach --command -- sh -c "cat /etc/resolv.conf; nslookup $POD.$NAMESPACE.pod.cluster.local"

輸出範例:

If you don't see a command prompt, try pressing enter.

Server:         100.64.0.10
Address:        100.64.0.10:53


*** Can't find $POD.$NAMESPACE.pod.cluster.local: No answer

deployment.apps "busybox" deleted

好處是它會在運行後刪除部署/pod。


對我來說,問題是我的 Pod 處於有狀態集中,因此 Pod DNS 解析有點不同。你必須使用(例如):

web-{0..N-1}.nginx.default.svc.cluster.local

pod-N.$GOVERNING_STATEFULSET.$NAMESPACE.svc.cluster.local

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

這是可能出錯的一件事。您可能想提供有關您的具體案例的更多資訊。

答案2

您可以建立測試 Pod 以busybox檢查 DNS 解析功能並偵錯問題:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always

檢查Pod/etc/resolv.conf上的檔案busybox

kubectl exec busybox cat /etc/resolv.conf

內容應該是這樣的:

search default.svc.cluster.local svc.cluster.local cluster.local .....
nameserver 10.0.0.10
options ndots:5

向叢集中的目標 Pod 發出查找請求:

kubectl exec -ti busybox -- nslookup XXX-XX-XX-XX.default.pod.cluster.local

如果您尚未解析 Pods DNS 名稱,您可以使用下列kubectl logs命令檢查 DNS 元件日誌:

kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c kubedns
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c dnsmasq
kubectl logs --namespace=kube-system $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name) -c healthz

答案3

我見過解決這個問題的最好方法是創建一個 Jump Pod。

步驟 1. 使用規格文件建立 Pod。

cat << ENDL >> jumpod.yml
apiVersion: v1
kind: Pod
metadata:
  name: jumpod
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
ENDL

步驟 2. 將 Pod 應用或建立到叢集中並套用到節點上。請注意,它將位於預設命名空間中。

kubectl apply -f jumpod.yml

現在您可以使用此 pod 取得 Pod 或服務的 DNS。

例如:

Pod 查找 步驟3.取得您要找的Pod的IP位址。

kubectl get pods -o wide

步驟 4. 使用 Jump Pod 進行 nslookup

kubectl exec -it jumpod ping 10.244.0.149

服務nslookup 步驟 5. 尋找您可能想要使用的服務 IP 位址。

kubectl get services --all-namespaces

步驟6.現在使用jump pod對服務ip位址進行nslookup

kubectl exec -it jumpod nslookup 10.245.150.103

以下是一個範例,說明使用 nslookup 的主叢集如何不起作用以及 busybox(又稱 Jump pod)如何運作。

$ kubectl exec -it jumpod nslookup 10.245.150.103
Server:    10.245.0.10
Address 1: 10.245.0.10 kube-dns.kube-system.svc.cluster.local
Name:      10.245.150.103
Address 1: 10.245.150.103 hello.develop.svc.cluster.local
$ nslookup 10.245.150.103
Server:     8.8.8.8
Address:    8.8.8.8#53
** server can't find 103.150.245.10.in-addr.arpa: NXDOMAIN

希望這可以幫助!

PS 如果您偶然需要匯出在 pod 中建立的 DNS 文件,您可以使用它。

kubectl cp default/POD_NAME:bin/FILE_NAME /Users/username/FILE_NAME

或者只是使用 > 將其匯出到文件。

相關內容