Jak poznać własny adres IP Poda z wnętrza kontenera w Podie?

96

Kubernetes przypisuje adres IP do każdego kontenera, ale jak mogę uzyskać adres IP z kontenera w Pod? Nie mogłem znaleźć drogi z dokumentacji.

Edycja: mam zamiar uruchomić klaster Aerospike w Kubernetes. a pliki konfiguracyjne wymagają własnego adresu IP. I próbuję użyć confd, aby ustawić nazwę hosta. Użyłbym zmiennej środowiskowej, gdyby została ustawiona.

yanana
źródło

Odpowiedzi:

174

Najprostszą odpowiedzią jest upewnienie się, że pliki yaml / json poda lub kontrolera replikacji dodają adres IP poda jako zmienną środowiskową, dodając blok konfiguracyjny zdefiniowany poniżej. (blok poniżej dodatkowo udostępnia nazwę i przestrzeń nazw dla kapsuły)

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

Odtwórz ponownie pod / rc, a następnie spróbuj

echo $MY_POD_IP

biegnij też, envaby zobaczyć, co jeszcze oferuje kubernetes.

Twoje zdrowie

PiersyP
źródło
1
Właśnie przetestowałem Twoje rozwiązanie i działa bardzo dobrze. Jestem w 100% pewien, że kubernetes nie ma takiej zmiennej środowiskowej, ponieważ printenv | grep '10.254.24.167'nie zwraca niczego poza zmienną zdefiniowaną przez użytkownika MY_POD_IP. Tak czy
inaczej,
1
Czy kiedykolwiek próbowałeś pobrać adres IP hosta status.hostIP?
PEdroArthur
@PEdroArthur Nie, nie mam, afaik to nowy dodatek. Zobacz żądanie ściągnięcia tutaj - github.com/kubernetes/kubernetes/pull/42717
PiersyP
Nazywa się to „Downwad API”: kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin
Dziękuję bardzo, ta odpowiedź naprawdę sprawia, że ​​jestem wielbicielem.
Liping Huang
27

Kilka wyjaśnień (nie jest to odpowiedź)

W Kubernetes każdemu podowi jest przypisany adres IP, a każdemu kontenerowi w pod jest przypisany ten sam adres IP. Tak więc, jak stwierdził Alex Robinson w swojej odpowiedzi , możesz po prostu użyć hostname -iwewnątrz swojego kontenera, aby uzyskać adres IP poda.

Testowałem z pod działającym dwoma głupimi kontenerami i rzeczywiście hostname -iwyświetlałem ten sam adres IP w obu kontenerach. Co więcej, ten adres IP był równoważny z uzyskanym przy użyciu kubectl describe podz zewnątrz, co potwierdza całość IMO.

Jednak odpowiedź PiersyP wydaje mi się bardziej przejrzysta .

Źródła

Z dokumentów Kubernetes :

Wszystkie aplikacje w podach używają tej samej sieciowej przestrzeni nazw (ten sam adres IP i przestrzeń portów), dzięki czemu mogą „znajdować” się nawzajem i komunikować przy użyciu hosta lokalnego. Z tego powodu aplikacje w podach muszą koordynować wykorzystanie portów. Każda kapsuła ma adres IP w płaskiej współdzielonej przestrzeni sieciowej, która ma pełną komunikację z innymi komputerami fizycznymi i podami w sieci.

Kolejny artykuł z dokumentacji kubernetes :

Do tej pory dokument ten mówił o kontenerach. W rzeczywistości Kubernetes stosuje adresy IP w zakresie Poda - kontenery wewnątrz Poda współdzielą swoje sieciowe przestrzenie nazw - w tym ich adres IP. Oznacza to, że wszystkie kontenery w Podach mogą nawzajem docierać do portów na serwerze lokalnym.

Elouan Keryell-Even
źródło
25

kubectl describe pods <name of pod> poda kilka informacji, w tym adres IP

mibbit
źródło
12
Myślę, że pytanie dotyczy uzyskania adresu IP z wnętrza kapsuły / kontenera, gdzie kubectlnie jest dostępne.
Elouan Keryell-Even,
16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

To polecenie zwróci adres IP

Anton
źródło
3
Dzięki za odpowiedź. Ale chcę znać adres IP w kontenerze w Pod. Więc chcę to wiedzieć bez używania kubectl.
yanana
14

Adres IP kontenera powinien być poprawnie skonfigurowany w jego sieciowej przestrzeni nazw, aby można było go uzyskać za pomocą dowolnego ze standardowych narzędzi linuxowych. Na przykład, spróbuj ifconfig, ip addr show, hostname -I, itp z dołączonym muszli w jednym ze swoich pojemników do przetestowania go.

Alex Robinson
źródło
12

Możesz użyć

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

który jest oparty na sugestii @mibbit.

Uwzględnia to następujące fakty:

Adam Romanek
źródło
Nie piszczaj grepdo sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (ale awk jest lepszy do tego niż sed)
William Pursell
4

Jeszcze prostsze do zapamiętania niż sedpodejście do użycia awk.

Oto przykład, który możesz uruchomić na swoim komputerze lokalnym:

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

Stąd też sam adres IP znajduje się w kolumnie 2 danych wyjściowych $2.

wir
źródło
4
Zakładam, że to dlatego, że nie odpowiadasz na pytanie. Pytanie brzmi but how can I acquire the IP address from a container in the Pod? : Zakładasz, że dana osoba ma dostęp do kubectlsamej kapsuły.
Seivan,
4
Nie przesyłaj polecenia grep do awk: kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell
1

W niektórych przypadkach zamiast polegać na downward API, działa również programowe odczytywanie lokalnego adresu IP (z interfejsów sieciowych) z wnętrza kontenera.

Na przykład w golang: https://stackoverflow.com/a/31551220/6247478

Kevin
źródło
1
kubectl get pods -o wide

Podaj listę podów z nazwą, stanem, adresem IP, węzłem ...

Belen Martin
źródło