Come conoscere l'indirizzo IP di un pod dall'interno di un contenitore nel pod?


91

Kubernetes assegna un indirizzo IP per ogni contenitore, ma come posso acquisire l'indirizzo IP da un contenitore nel Pod? Non riuscivo a trovare la strada dalle documentazioni.

Modifica: eseguirò il cluster Aerospike in Kubernetes. e i file di configurazione necessitano del proprio indirizzo IP. E sto tentando di usare confd per impostare il nome host. Userei la variabile d'ambiente se fosse impostata.

Risposte:


166

La risposta più semplice è assicurarsi che i file yaml / json del pod o del controller di replica aggiungano l'IP del pod come variabile di ambiente aggiungendo il blocco di configurazione definito di seguito. (il blocco sottostante rende inoltre disponibili il nome e lo spazio dei nomi per il 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

Ricrea il pod / rc e poi prova

echo $MY_POD_IP

corri anche envper vedere cos'altro ti offre kubernetes.

Saluti


1
Ho appena testato la tua soluzione e funziona benissimo. Sono sicuro al 100% che kubernetes non abbia una tale variabile d'ambiente, perché printenv | grep '10.254.24.167'non restituisce nulla tranne la variabile definita dall'utente MY_POD_IP. Comunque, prenda il mio voto signore :)
Elouan Keryell-Even

1
Hai mai provato a recuperare l'IP dell'host tramite status.hostIP?
PEdroArthur

@PEdroArthur No, non l'ho fatto, afaik è un'aggiunta recente. Vedi la richiesta pull qui - github.com/kubernetes/kubernetes/pull/42717
PiersyP


Grazie mille, questa risposta mi rende davvero un grande amante.
Liping Huang

25

Alcuni chiarimenti (non proprio una risposta)

In kubernetes, a ogni pod viene assegnato un indirizzo IP e a ogni contenitore nel pod viene assegnato lo stesso indirizzo IP. Pertanto, come ha affermato Alex Robinson nella sua risposta , puoi semplicemente utilizzare hostname -iall'interno del tuo contenitore per ottenere l'indirizzo IP del pod.

Ho provato con un pod che esegue due contenitori stupidi, e in effetti hostname -istava emettendo lo stesso indirizzo IP all'interno di entrambi i contenitori. Inoltre, quell'IP era equivalente a quello ottenuto usando kubectl describe poddall'esterno, il che convalida l'intera cosa IMO.

Tuttavia, la risposta di PiersyP mi sembra più pulita.

Fonti

Dai documenti di Kubernetes :

Le applicazioni in un pod utilizzano tutte lo stesso spazio dei nomi di rete (stesso IP e spazio della porta) e possono quindi "trovarsi" e comunicare utilizzando localhost. Per questo motivo, le applicazioni in un pod devono coordinare il loro utilizzo delle porte. Ogni pod ha un indirizzo IP in uno spazio di rete condiviso piatto che ha piena comunicazione con altri computer fisici e pod attraverso la rete.

Un altro pezzo dai documenti di Kubernetes :

Fino ad ora questo documento ha parlato di container. In realtà, Kubernetes applica gli indirizzi IP nell'ambito del Pod: i contenitori all'interno di un Pod condividono i loro spazi dei nomi di rete, incluso il loro indirizzo IP. Ciò significa che i contenitori all'interno di un pod possono raggiungere le porte l'uno dell'altro su localhost.


24

kubectl describe pods <name of pod> ti darà alcune informazioni compreso l'IP


12
Penso che la domanda riguardi come ottenere l'IP dall'interno del pod / container, dove kubectlnon è disponibile.
Elouan Keryell-Even

16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Questo comando ti restituirà un IP


3
Grazie per la tua risposta. Ma voglio conoscere l'indirizzo IP in un contenitore in un pod. Quindi voglio saperlo senza usare kubectl.
yanana

14

L'indirizzo IP del contenitore deve essere configurato correttamente all'interno del suo spazio dei nomi di rete, in modo che qualsiasi strumento Linux standard possa ottenerlo. Ad esempio, prova ifconfig, ip addr show, hostname -I, ecc da un guscio allegato entro uno dei contenitori di provarlo.


12

Potresti usare

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

che si basa su quanto suggerito da @mibbit.

Ciò tiene conto dei seguenti fatti:

  • hostname è impostato sul nome del POD ma questo potrebbe cambiare in futuro
  • kubectl è stato posizionato manualmente nel contenitore (possibilmente quando l'immagine è stata creata)
  • Kubernetes fornisce implicitamente le credenziali di un account di servizio al contenitore come descritto in Accesso al cluster / Accesso all'API da un pod , ovvero /var/run/secrets/kubernetes.io/serviceaccountnel contenitore

Non parlare grepcon sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (ma awk è meglio per questo di sed)
William Pursell

4

Ancora più semplice da ricordare rispetto sedall'approccio da utilizzare awk.

Ecco un esempio, che puoi eseguire sulla tua macchina locale:

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

L'IP stesso si trova nella colonna 2 dell'output, quindi $2.


4
Presumo sia perché non stai rispondendo alla domanda. La domanda è but how can I acquire the IP address from a container in the Pod? : stai assumendo che la persona in questione abbia accesso al kubectlpod stesso.
Seivan

4
Non chiamare grep a awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell


1
kubectl get pods -o wide

Fornisci un elenco di pod con nome, stato, ip, nodo ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.