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, busybox
um 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.conf
Datei 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 logs
Befehl ü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.