Comment connaître la propre adresse IP d'un pod depuis l'intérieur d'un conteneur dans le pod?

91

Kubernetes attribue une adresse IP à chaque conteneur, mais comment puis-je acquérir l'adresse IP d'un conteneur dans le pod? Je n'ai pas pu trouver le chemin des documentations.

Edit: Je vais exécuter le cluster Aerospike dans Kubernetes. et les fichiers de configuration ont besoin de sa propre adresse IP. Et j'essaye d'utiliser confd pour définir le nom d'hôte. J'utiliserais la variable d'environnement si elle était définie.

Yanana
la source

Réponses:

166

La réponse la plus simple consiste à vous assurer que vos fichiers pod ou contrôleur de réplication yaml / json ajoutent l'adresse IP du pod en tant que variable d'environnement en ajoutant le bloc de configuration défini ci-dessous. (le bloc ci-dessous rend également le nom et l'espace de noms disponibles pour le pod)

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

Recréez le pod / rc puis essayez

echo $MY_POD_IP

exécutez également envpour voir ce que kubernetes vous offre.

À votre santé

PiersyP
la source
1
Je viens de tester votre solution et cela fonctionne très bien. Je suis sûr à 100% que kubernetes n'a pas une telle variable d'environnement, car printenv | grep '10.254.24.167'ne renvoie rien d'autre que la variable définie par l'utilisateur MY_POD_IP. Quoi qu'il en soit, prenez mon vote monsieur :)
Elouan Keryell-Even
1
Avez-vous déjà essayé de récupérer l'adresse IP de l'hôte status.hostIP?
PEdroArthur
@PEdroArthur Non je n'ai pas, afaik c'est un ajout récent. Voir la demande d'extraction ici - github.com/kubernetes/kubernetes/pull/42717
PiersyP
Cela s'appelle "API Downwad": kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin
Merci beaucoup, cette réponse fait vraiment de moi un grand favori.
Liping Huang
25

Quelques clarifications (pas vraiment une réponse)

Dans kubernetes, chaque pod se voit attribuer une adresse IP et chaque conteneur du pod se voit attribuer la même adresse IP. Ainsi, comme Alex Robinson l'a déclaré dans sa réponse , vous pouvez simplement utiliser l' hostname -iintérieur de votre conteneur pour obtenir l'adresse IP du pod.

J'ai testé avec un pod exécutant deux conteneurs stupides, et je sortais en effet hostname -ila même adresse IP dans les deux conteneurs. En outre, cette IP était équivalente à celle obtenue en utilisant kubectl describe podde l'extérieur, qui valide le tout IMO.

Cependant, la réponse de PiersyP me semble plus claire.

Sources

À partir de la documentation Kubernetes :

Les applications d'un pod utilisent toutes le même espace de noms réseau (même IP et même espace de port), et peuvent ainsi se «trouver» et communiquer en utilisant localhost. Pour cette raison, les applications d'un pod doivent coordonner leur utilisation des ports. Chaque pod a une adresse IP dans un espace réseau partagé plat qui a une communication complète avec d'autres ordinateurs physiques et pods sur le réseau.

Un autre élément de la documentation Kubernetes :

Jusqu'à présent, ce document parlait de conteneurs. En réalité, Kubernetes applique les adresses IP à la portée du pod - les conteneurs d'un pod partagent leurs espaces de noms réseau - y compris leur adresse IP. Cela signifie que les conteneurs d'un pod peuvent tous atteindre les ports les uns des autres sur l'hôte local.

Elouan Keryell-Even
la source
24

kubectl describe pods <name of pod> vous donnera des informations dont l'adresse IP

mibbit
la source
12
Je pense que la question est d'obtenir l'adresse IP de l'intérieur du pod / conteneur, là où elle kubectln'est pas disponible.
Elouan Keryell-Even
16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Cette commande vous retournera une adresse IP

Anton
la source
3
Merci pour votre réponse. Mais je veux connaître l'adresse IP dans un conteneur dans un pod. Donc je veux le savoir sans utiliser kubectl.
yanana
14

L'adresse IP du conteneur doit être correctement configurée à l'intérieur de son espace de noms réseau, afin que tous les outils Linux standard puissent l'obtenir. Par exemple, essayer ifconfig, ip addr show, hostname -I, etc. à partir d' une enveloppe attachée à l' intérieur de l' un de vos conteneurs pour le tester.

Alex Robinson
la source
12

Vous pourriez utiliser

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

qui est basé sur ce que @mibbit a suggéré.

Cela prend en compte les faits suivants:

Adam Romanek
la source
Don't pipe grepto sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (mais awk est meilleur pour ça que sed)
William Pursell
4

Encore plus simple à retenir que l' sedapproche est à utiliser awk.

Voici un exemple que vous pouvez exécuter sur votre machine locale:

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

L'adresse IP elle-même est sur la colonne 2 de la sortie, par conséquent $2.

tourbillon
la source
4
Je suppose que c'est parce que vous ne répondez pas à la question. La question est que but how can I acquire the IP address from a container in the Pod? vous supposez que la personne en question a accès au kubectlmodule lui-même.
Seivan
4
Don't pipe grep to awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell
1

Dans certains cas, au lieu de s'appuyer sur une API descendante, la lecture par programme de l'adresse IP locale (à partir des interfaces réseau) depuis l'intérieur du conteneur fonctionne également.

Par exemple, dans golang: https://stackoverflow.com/a/31551220/6247478

Kevin
la source
1
kubectl get pods -o wide

Donnez-vous une liste de pods avec nom, statut, ip, nœud ...

Belen Martin
la source