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.
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
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.
Ź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.
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
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
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ć.
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:
- nazwa hosta jest ustawiona na nazwę POD, ale może się to zmienić w przyszłości
-
kubectl
został ręcznie Umieszczony w kontenerze (prawdopodobnie podczas budowy obrazu)
Kubernetes zapewnia uwierzytelnienie konta usługi kontenerowi w sposób niejawny, zgodnie z opisem w uzyskiwanie dostępu do klastra / uzyskiwanie dostępu do API z Pod , tj.
/var/run/secrets/kubernetes.io/serviceaccount
w pojemniku
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
.
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...
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
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