web-dev-qa-db-fra.com

Comment connaître l'adresse IP d'un pod à partir d'un conteneur dans le pod?

Kubernetes attribue une adresse IP à chaque conteneur, mais comment puis-je obtenir l'adresse IP d'un conteneur du pod? Je n'ai pas trouvé le chemin à partir des documentations.

70
yanana

La réponse la plus simple consiste à s'assurer que vos fichiers yaml/json du pod ou du contrôleur de réplication 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 met en outre le nom et l'espace de noms à la disposition du 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

lancez également env pour voir ce que kubernetes vous fournit d’autre.

À votre santé

138
PiersyP

Quelques précisions (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 hostname -i dans votre conteneur pour obtenir l'adresse IP du pod.

J'ai testé avec un pod exécutant deux conteneurs Dumb et, en effet, hostname -i produisait la même adresse IP dans les deux conteneurs. De plus, cette adresse IP était équivalente à celle obtenue en utilisant kubectl describe pod de l'extérieur, ce qui valide l'ensemble du processus IMO.

Cependant, réponse de PiersyP me semble plus propre.

Sources

De documentation de kubernetes :

Les applications d'un pod utilisent toutes le même espace de noms réseau (mêmes adresses IP et ports) et peuvent ainsi se "trouver" et communiquer à l'aide de 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é et plat qui communique entièrement avec d’autres ordinateurs physiques et pods sur le réseau.

Un autre morceau de kubernetes docs :

Jusqu'à présent, ce document a parlé de conteneurs. En réalité, Kubernetes applique les adresses IP à l’étendue 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 des uns des autres sur localhost.

21

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

18
mibbit
POD_Host=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Cette commande vous retournera un IP

15
Anton

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, essayez ifconfig, ip addr show, hostname -I, etc. à partir d'un shell attaché dans l'un de vos conteneurs pour le tester.

13
Alex Robinson

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:

  • nom d'hôte est défini sur le nom du POD mais cela pourrait changer à l'avenir
  • kubectl a été placé manuellement dans le conteneur (éventuellement lors de la création de l'image)
  • Kubernetes fournit implicitement les informations d'identification du compte de service au conteneur, comme décrit dans la section Accès au cluster/Accès à l'API à partir d'un pod , c'est-à-dire /var/run/secrets/kubernetes.io/serviceaccount dans le conteneur.
12
Adam Romanek

Encore plus simple à retenir que l’approche sed consiste à utiliser awk.

Voici un exemple que vous pouvez exécuter sur votre ordinateur local:

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

L'IP elle-même est sur la colonne 2 de la sortie, d'où $2.

4
whirlwin

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

0
Kevin