Як дізнатися власну IP-адресу Pod зсередини контейнера в Pod?


96

Kubernetes призначає IP-адресу для кожного контейнера, але як я можу отримати IP-адресу з контейнера в Pod? Я не міг знайти шлях із документальних фільмів.

Редагувати: Я збираюся запустити кластер Aerospike у Kubernetes. а файлам конфігурації потрібна власна IP-адреса. І я намагаюся використовувати confd для встановлення імені хосту. Я б використовував змінну середовища, якби вона була встановлена.

Відповіді:


174

Найпростіша відповідь полягає в тому, щоб переконатися, що файли yaml / json вашого контролера pod або реплікації додають IP-адресу 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

Відтворіть pod / rc, а потім спробуйте

echo $MY_POD_IP

також запустіть, envщоб побачити, що ще вам надає kubernetes.

Ура


1
Я щойно перевірив ваше рішення, і воно працює надзвичайно добре. Я впевнений на 100%, що kubernetes не має такої змінної середовища, оскільки printenv | grep '10.254.24.167'не повертає нічого, крім визначеної користувачем змінної MY_POD_IP. У будь-якому разі, прийміть мій голос, сер :)
Елуан Керіел-Евен

1
Ви коли-небудь пробували отримати IP-адресу хоста status.hostIP?
PEdroArthur,

@PEdroArthur Ні, ні, ще, нещодавно це нещодавнє доповнення. Дивіться запит на витяг тут - github.com/kubernetes/kubernetes/pull/42717
PiersyP


Щиро дякую, ця відповідь справді робить мене великою фаворитом.
Liping Huang

27

Деякі роз’яснення (насправді не відповідь)

У kubernetes кожному модулю присвоюється IP-адреса, а кожному контейнеру в модулі призначається та сама IP-адреса. Таким чином, як зазначив Алекс Робінсон у своїй відповіді , ви можете просто використовувати hostname -iвсередині контейнера, щоб отримати IP-адресу підсистеми.

Я тестував із стручком, який запускає два німі контейнери, і справді hostname -iвидавав одну і ту ж IP-адресу всередині обох контейнерів. Крім того, цей IP був еквівалентний тому, що отриманий із використання kubectl describe podззовні, що підтверджує всю суть IMO.

Однак відповідь PiersyP мені здається більш чистою.

Джерела

З документів kubernetes :

Усі програми в модулі використовують один і той самий простір імен мережі (однаковий IP та простір портів), тому можуть «знаходити» одне одного та спілкуватися за допомогою localhost. Через це програми в підсистемі повинні координувати використання портів. Кожен модуль має IP-адресу в плоскому спільному мережевому просторі, що забезпечує повний зв’язок з іншими фізичними комп’ютерами та модулями в мережі.

Ще один фрагмент з dokubernetes docs :

До цього часу в цьому документі говорилося про контейнери. Насправді Kubernetes застосовує IP-адреси в діапазоні Pod - контейнери всередині Pod поділяють свої простори імен мережі, включаючи свою IP-адресу. Це означає, що контейнери всередині підсистеми можуть дістатися до портів один одного на localhost.


25

kubectl describe pods <name of pod> надасть вам деяку інформацію, включаючи ІР


12
Я думаю, що питання полягає в отриманні IP зсередини контейнера / контейнера, де kubectlвін недоступний.
Elouan Keryell-Even

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

Ця команда поверне вам IP


3
Дякую за вашу відповідь. Але я хочу знати IP-адресу в контейнері в Pod. Тому я хочу знати це без використання kubectl.
yanana

14

IP-адреса контейнера повинна бути правильно налаштована всередині простору імен мережі, щоб будь-який із стандартних інструментів Linux міг її отримати. Наприклад, спробуйте ifconfig, ip addr show, hostname -Iі т.д. з прикріпленою оболонки в одному з контейнерів , щоб перевірити його.


12

Ви могли б використовувати

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

який базується на тому, що запропонував @mibbit.

При цьому враховуються такі факти:


Не grepsedkubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p'
трубіться

4

Запам’ятати ще простіше, ніж sedпідхід awk.

Ось приклад, який ви можете запустити на локальній машині:

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

Отже, сам IP знаходиться у стовпці 2 вихідних даних $2.


4
Я припускаю, що це тому, що ви не відповідаєте на питання. Запитання полягають у тому, що but how can I acquire the IP address from a container in the Pod? ви припускаєте, що особа, про яку йде мова, має доступ до kubectlсамого стручка.
Сейван,

4
Не перекладайте grep до awk:kubectl describe pod $POD | awk '/IP/{print $2}'
Вільям Перселл,

1

У деяких випадках замість того, щоб покладатися на низхідний API, також працює програмне зчитування локальної IP-адреси (з мережевих інтерфейсів) зсередини контейнера.

Наприклад, у golang: https://stackoverflow.com/a/31551220/6247478


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.