2015-06-10 8 views
28

Kubernetes przypisuje adres IP dla każdego kontenera, ale jak mogę uzyskać adres IP z kontenera w kapsule? Nie mogłem znaleźć drogi z dokumentacji.Jak poznać własny adres IP kapsuły z wnętrza kontenera w kapsule?

+0

Istnieje wiele sposobów, aby to zrobić, czy jest coś konkretnego, co próbujesz zrobić? – aronchick

+0

Mam zamiar uruchomić klaster Aerospike w Kubernetes. a pliki konfiguracyjne wymagają własnego adresu IP. I próbuję użyć confd do ustawienia nazwy hosta. Chciałbym użyć zmiennej środowiskowej, jeśli została ustawiona ... – yanana

Odpowiedz

64

Najprostszą odpowiedzią jest upewnienie się, że pliki kontrolne podlubu lub kontrolera yaml/json dodają adres IP podrzędu jako zmienną środowiskową poprzez dodanie bloku konfiguracji zdefiniowanego poniżej. (Blok poniżej dodatkowo sprawia, że ​​imię i nazw dostępne do gondoli)

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óbuj

echo $MY_POD_IP 

również uruchomić env aby zobaczyć, co jeszcze kubernetes oferuje.

Cheers

+0

Przetestowałem to w kontenerze, a ta zmienna nie była dostępna. –

+0

Przeprosiny, poprzednia odpowiedź była niepoprawna, zaktualizowałem ją. – PiersyP

+0

Właśnie przetestowałem Twoje rozwiązanie i działa bardzo dobrze. Jestem w 100% pewien, że kernernetes nie ma takiej zmiennej środowiskowej, ponieważ 'printenv | grep '10 .254.24.167'' nie zwraca niczego poza zmienną zdefiniowaną przez użytkownika MY_POD_IP. W każdym razie, weź mój głos sir :) –

7

Adres IP kontenera powinien być odpowiednio skonfigurowany wewnątrz przestrzeni nazw sieciowych, aby można było uzyskać dostęp do dowolnego standardowego narzędzia Linux. Na przykład spróbuj ifconfig, ip addr show, hostname -I itd. Z załączonej powłoki w jednym z twoich kontenerów, aby przetestować to.

12

kubectl opisać pod daje pewne informacje w tym OD

+0

Myślę, że pytanie dotyczy uzyskania IP z wewnątrz pod/pojemnika, gdzie 'kubectl' nie jest dostępny. –

7

można użyć

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

która opiera się na tym, co @mibbit sugerowane.

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

+0

To działa dobrze. Dziękuję Ci. –

6

Niektóre wyjaśnienia (naprawdę nie odpowiedź)

W kubernetes, każdy pod zostaje przypisany adres IP, a każdy pojemnik w kapsule zostanie przypisany ten sam adres IP. Tak więc, jak powiedział Alex Robinson w his answer, można po prostu użyć hostname -I w swoim kontenerze, aby uzyskać adres IP pod.

Przetestowałem z kapsułą, na której działały dwa głupie pojemniki, i rzeczywiście hostname -I wyprowadzał ten sam adres IP w obu pojemnikach. Co więcej, ten IP był równoważny z uzyskanym przy użyciu kubectl describe pod z zewnątrz, który potwierdza całą IMO.

Jednak PiersyP's answer wydaje mi się bardziej czysty.

Źródła

Od kubernetes docs:

aplikacji w strąku wszystkie używać tej samej przestrzeni nazw sieci (tego samego IP i przestrzeń portu), a tym samym może „znaleźć” siebie i komunikowania się za pomocą localhost. Z tego powodu aplikacje w pakiecie muszą koordynować korzystanie z portów. Każdy strąk ma adres IP w płaskiej wspólnej przestrzeni sieciowej, która ma pełną komunikację z innymi komputerami fizycznymi i podsystemami 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 zasięgu Pod - kontenery wewnątrz Pod dzielą swoje sieciowe przestrzenie nazw - w tym ich adres IP. Oznacza to, że kontenery w kapsule mogą dosięgnąć do siebie nawzajem na lokalnym hoście.

1

POD_HOST = $ (kubectl uzyskać pod $ POD_NAME --template = {{. Status.podIP}})

To polecenie zwróci Ci IP

+0

Dziękuję za odpowiedź. Ale chcę znać adres IP w pojemniku w kapsule. Więc chcę to poznać bez użycia 'kubectl'. – yanana

1

jeszcze prostszy do zapamiętania niż sed podejście polega na użyciu awk.

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

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

Samo IP jest na kolumnie 2 wyjścia, stąd $2.

+0

Downvoter, proszę dać mi znać, jeśli to nie działa, ponieważ działa na moim komputerze. – whirlwin

+2

Zakładam, że to dlatego, że nie odpowiadasz na pytanie. Pytanie brzmi "ale jak mogę uzyskać adres IP z kontenera w Pod?' Zakładasz, że dana osoba ma dostęp do 'kubectl' na samym pakiecie. – Seivan