Wie erfahre ich die IP-Adresse eines Pods aus einem Container im Pod?

90

Kubernetes weist jedem Container eine IP-Adresse zu. Wie kann ich die IP-Adresse von einem Container im Pod abrufen? Ich konnte den Weg von Dokumentationen nicht finden.

Bearbeiten: Ich werde Aerospike Cluster in Kubernetes betreiben. und die Konfigurationsdateien benötigen eine eigene IP-Adresse. Und ich versuche, den Hostnamen mit confd festzulegen. Ich würde die Umgebungsvariable verwenden, wenn sie gesetzt wäre.

Yanana
quelle

Antworten:

166

Die einfachste Antwort besteht darin, sicherzustellen, dass Ihre yaml / json-Dateien Ihres Pods oder Replikationscontrollers die Pod-IP als Umgebungsvariable hinzufügen, indem Sie den unten definierten Konfigurationsblock hinzufügen. (Der folgende Block stellt dem Pod zusätzlich den Namen und den Namespace zur Verfügung.)

env:
- name: MY_POD_NAME
  valueFrom:
    fieldRef:
      fieldPath: metadata.name
- name: MY_POD_NAMESPACE
  valueFrom:
    fieldRef:
      fieldPath: metadata.namespace
- name: MY_POD_IP
  valueFrom:
    fieldRef:
      fieldPath: status.podIP

Erstellen Sie den Pod / RC neu und versuchen Sie es dann

echo $MY_POD_IP

Führen Sie auch aus, um envzu sehen, was kubernetes Ihnen sonst noch bietet.

Prost

PiersyP
quelle
1
Ich habe gerade Ihre Lösung getestet und sie funktioniert super gut. Ich bin zu 100% sicher, dass kubernetes keine solche Umgebungsvariable hat, da printenv | grep '10.254.24.167'nichts außer der benutzerdefinierten Variablen MY_POD_IP zurückgegeben wird. Wie auch immer, nehmen Sie meine Stimme, Sir :)
Elouan Keryell-Even
1
Haben Sie jemals versucht, die IP des Hosts abzurufen status.hostIP?
PEdroArthur
@PEdroArthur Nein, habe ich nicht, afaik es ist eine neue Ergänzung. Siehe die Pull-Anfrage hier - github.com/kubernetes/kubernetes/pull/42717
PiersyP
Dies wird als "Downwad API" bezeichnet: kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin
Vielen Dank, diese Antwort macht mich wirklich zu einem großen Faver.
Liping Huang
25

Einige Klarstellungen (nicht wirklich eine Antwort)

In Kubernetes wird jedem Pod eine IP-Adresse zugewiesen, und jedem Container im Pod wird dieselbe IP-Adresse zugewiesen. Wie Alex Robinson in seiner Antwort feststellte , können Sie also einfach hostname -iin Ihrem Container die Pod-IP-Adresse abrufen.

Ich habe mit einem Pod getestet, auf dem zwei dumme Container ausgeführt werden, und tatsächlich hostname -iwurde in beiden Containern dieselbe IP-Adresse ausgegeben. Darüber hinaus entsprach diese IP derjenigen, die kubectl describe podvon außen erhalten wurde, was die gesamte IMO validiert.

Die Antwort von PiersyP erscheint mir jedoch sauberer.

Quellen

Aus kubernetes docs :

Die Anwendungen in einem Pod verwenden alle denselben Netzwerk-Namespace (dieselbe IP-Adresse und denselben Port-Speicherplatz) und können sich so gegenseitig finden und über localhost kommunizieren. Aus diesem Grund müssen Anwendungen in einem Pod die Verwendung von Ports koordinieren. Jeder Pod verfügt über eine IP-Adresse in einem flachen, gemeinsam genutzten Netzwerkbereich, der die vollständige Kommunikation mit anderen physischen Computern und Pods im gesamten Netzwerk ermöglicht.

Ein weiteres Stück aus kubernetes docs :

Bisher wurde in diesem Dokument über Container gesprochen. In der Realität wendet Kubernetes IP-Adressen im Pod-Bereich an - Container innerhalb eines Pods teilen ihre Netzwerk-Namespaces - einschließlich ihrer IP-Adresse. Dies bedeutet, dass alle Container in einem Pod die Ports des anderen auf localhost erreichen können.

Elouan Keryell-Even
quelle
24

kubectl describe pods <name of pod> gibt Ihnen einige Informationen einschließlich der IP

Mibbit
quelle
12
Ich denke, die Frage ist, wie man die IP aus dem Pod / Container holt, wo sie kubectlnicht verfügbar ist.
Elouan Keryell-Even
16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Dieser Befehl gibt Ihnen eine IP zurück

Anton
quelle
3
Danke für deine Antwort. Aber ich möchte die IP-Adresse in einem Container in einem Pod wissen. Also möchte ich es wissen, ohne es zu benutzen kubectl.
Yanana
14

Die IP-Adresse des Containers sollte innerhalb seines Netzwerk-Namespace ordnungsgemäß konfiguriert sein, damit jedes der Standard-Linux-Tools sie erhalten kann. Versuchen Sie zum Beispiel ifconfig, ip addr show, hostname -Iusw. von einem angeschlossenen Schale innerhalb eines Ihrer Container um es zu testen.

Alex Robinson
quelle
12

Du könntest benutzen

kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'

Das basiert auf dem, was @mibbit vorgeschlagen hat.

Dies berücksichtigt folgende Tatsachen:

Adam Romanek
quelle
Pfeife nicht grepzu sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (aber awk ist besser dafür als sed)
William Pursell
4

Noch einfacher zu merken als der sedAnsatz ist zu verwenden awk.

Hier ist ein Beispiel, das Sie auf Ihrem lokalen Computer ausführen können:

kubectl describe pod `<podName>` | grep IP | awk '{print $2}'

Die IP selbst befindet sich daher in Spalte 2 der Ausgabe $2.

Wirbel
quelle
4
Ich nehme an, das liegt daran, dass Sie die Frage nicht beantworten. Die Frage ist, dass but how can I acquire the IP address from a container in the Pod? Sie davon ausgehen, dass die betreffende Person Zugriff kubectlauf den Pod selbst hat.
Seivan
4
Pfeife nicht grep zu awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell
1

In einigen Fällen funktioniert das programmgesteuerte Lesen der lokalen IP-Adresse (von Netzwerkschnittstellen) aus dem Inneren des Containers auch, anstatt sich auf die Abwärts-API zu verlassen.

Zum Beispiel in Golang: https://stackoverflow.com/a/31551220/6247478

Kevin
quelle
1
kubectl get pods -o wide

Geben Sie eine Liste der Pods mit Name, Status, IP, Knoten ...

Belen Martin
quelle