Kubernetes Pod DNS-Auflösung

Kubernetes Pod DNS-Auflösung

Derzeit können alle Dienste in IP-Adressen aufgelöst und per Telnet und Ping an sie gesendet werden. Pods können nicht in IP-Adressen aufgelöst werden. Pod-IP-Adressen können jedoch mit kubectl und Telnet nachgeschlagen und an sie gesendet werden. Wie muss DNS konfiguriert werden, um Pods in Kubernetes 1.9.6, dns-controller:1.9.1 aufzulösen?

Antwort1

Die Antwort von @mk_sta ist etwas einfacher zu handhaben. Sie können diesen Einzeiler ausführen, um Ihren DNS zu testen:

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

Beispielausgabe:

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

Der Bonus besteht darin, dass die Bereitstellung/Pods nach der Ausführung gelöscht werden.


Bei mir bestand das Problem darin, dass meine Pods in einem Statefulset sind und daher die Pod-DNS-Auflösung etwas anders ist. Sie müssen (zum Beispiel) Folgendes verwenden:

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/

Das ist eine Sache, die schiefgehen kann. Möglicherweise möchten Sie weitere Informationen zu Ihrem speziellen Fall bereitstellen.

Antwort2

Sie können einen Test-Pod erstellen, busyboxum die DNS-Auflösungsfunktion zu prüfen und das Problem zu beheben:

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

/etc/resolv.confDatei auf dem Pod prüfen busybox:

kubectl exec busybox cat /etc/resolv.conf

Der Inhalt sollte wie folgt aussehen:

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

Senden Sie eine Suchanfrage an den Ziel-Pod in Ihrem Cluster:

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

Falls Ihr Pod-DNS-Name nicht aufgelöst werden konnte, können Sie die DNS-Komponentenprotokolle mit dem folgenden kubectl logsBefehl überprüfen:

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

Antwort3

Die beste Lösung, die ich kenne, ist die Erstellung einer Sprungkapsel.

Schritt 1. Erstellen Sie den Pod mit einer Spezifikationsdatei.

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

Schritt 2. Wenden Sie den Pod entweder im Cluster und auf einem Knoten an oder erstellen Sie ihn. Beachten Sie, dass er sich im Standardnamespace befindet.

kubectl apply -f jumpod.yml

Jetzt können Sie diesen Pod verwenden, um entweder den DNS eines Pods oder Dienstes abzurufen.

Zum Beispiel:

Pod-nslookup Schritt 3. Holen Sie sich die IP-Adresse des Pods, nach dem Sie suchen.

kubectl get pods -o wide

Schritt 4. Verwenden Sie den Jump Pod, um einen nslookup durchzuführen

kubectl exec -it jumpod ping 10.244.0.149

Dienst nslookup Schritt 5. Suchen Sie die IP-Adresse der Dienste, die Sie verwenden möchten.

kubectl get services --all-namespaces

Schritt 6. Verwenden Sie nun den Jump Pod, um einen NSLookup für die Service-IP-Adresse durchzuführen

kubectl exec -it jumpod nslookup 10.245.150.103

Unten finden Sie ein Beispiel, wie der Hauptcluster mit nslookup nicht funktioniert und wie die Busybox (auch Jump Pod genannt) funktioniert.

$ 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

Hoffe das hilft!

PS: Wenn Sie zufällig die DNS-Datei exportieren müssen, die Sie im Pod erstellt haben, können Sie diese verwenden.

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

oder verwenden Sie einfach >, um es in eine Datei zu exportieren.

verwandte Informationen