目前能夠將所有服務解析為 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
或者只是使用 > 將其匯出到文件。