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

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

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

 98
Author: Shubham, 2015-06-10

9 answers

Najprostszą odpowiedzią jest upewnienie się, że twój kontroler Pod lub replikacji yaml/JSON doda adres IP pod jako zmienną środowiskową, dodając blok konfiguracyjny zdefiniowany poniżej. (poniższy blok dodatkowo udostępnia nazwę i przestrzeń nazw dla 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

Odtworzyć pod / rc, a następnie spróbować

echo $MY_POD_IP

Uruchom również env, aby zobaczyć, co jeszcze zapewnia kubernetes.

Cheers

 181
Author: PiersyP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-30 21:11:34

Niektóre wyjaśnienia (nie do końca ODPOWIEDŹ)

W aplikacji kubernetes każdemu pod przypisany jest adres IP, a każdemu kontenerowi w pod przypisany jest ten sam adres IP. Tak więc, jak Alex Robinson stwierdził w jego odpowiedzi , możesz po prostu użyć hostname -i wewnątrz kontenera, aby uzyskać adres IP pod.

Testowałem z kapsułą obsługującą dwa głupie kontenery i rzeczywiście hostname -i wysyłał ten sam adres IP wewnątrz obu kontenerów. Ponadto od było równoważne z jeden uzyskany za pomocą kubectl describe pod z zewnątrz, co potwierdza całość IMO.

Jednak odpowiedź Piersypa wydaje mi się bardziej czysta.

Źródła

From kubernetes docs :

Wszystkie aplikacje w pod używają tej samej sieciowej przestrzeni nazw( ten sam adres IP i przestrzeń portów), dzięki czemu mogą się "znajdować" i komunikować za pomocą localhost. Z tego powodu aplikacje w pod muszą koordynować korzystanie z portów. Każdy pod ma adres IP w mieszkaniu wspólna przestrzeń sieciowa, która ma pełną komunikację z innymi fizycznymi komputerami i pods w sieci.

Kolejny kawałek z Kubernetes docs :

Do tej pory dokument ten mówił o kontenerach. W rzeczywistości Kubernetes stosuje adresy IP w zakresie Pod - kontenery w Pod udostępniają swoje sieciowe przestrzenie nazw - w tym ich adres IP. Oznacza to, że kontenery wewnątrz kapsuły mogą docierać do swoich portów na localhost.

 28
Author: Elouan Keryell-Even,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 14:29:41

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

 25
Author: mibbit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 17:08:46
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

To polecenie zwróci ci adres IP

 17
Author: Anton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 17:12:59

Adres IP kontenera powinien być poprawnie skonfigurowany wewnątrz jego sieciowej przestrzeni nazw, tak aby każde ze standardowych narzędzi Linuksa mogło go pobrać. Na przykład spróbuj ifconfig, ip addr show, hostname -I, itd. z dołączonej skorupy w jednym z pojemników, aby ją przetestować.

 14
Author: Alex Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 04:47:54

You could use

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

Który jest oparty na tym, co zasugerował @mibbit.

Bierze to pod uwagę następujące fakty:

 12
Author: Adam Romanek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 06:34:52

Jeszcze prostsze do zapamiętania niż podejście sed jest użycie awk.

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

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

Sam IP znajduje się w kolumnie 2 wyjścia, stąd $2 .

 4
Author: whirlwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 07:29:33
kubectl get pods -o wide

Daje listę strąków z nazwą, statusem, ip, węzłem...

 2
Author: Belen Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-19 15:31:19

W niektórych przypadkach, zamiast polegać na downward API, programowo odczytuje lokalny adres IP (z interfejsów sieciowych) z wnętrza kontenera.

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

 1
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-03 12:18:24