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.

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


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.


24

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


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


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.


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:


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.


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


1
kubectl get pods -o wide

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.