2015-06-10 4 views
28

Kubernetes назначает IP-адрес для каждого контейнера, но как я могу получить IP-адрес из контейнера в Pod? Я не мог найти путь от документации.Как узнать собственный IP-адрес Pod из контейнера в Pod?

+0

Существует несколько способов сделать это, есть ли что-то конкретное, что вы пытаетесь сделать? – aronchick

+0

Я собираюсь запустить Aerospike cluster в Кубернете. и конфигурационным файлам нужен собственный IP-адрес. И я пытаюсь использовать confd для установки имени хоста. Я бы использовал переменную окружения, если она была установлена ​​... – yanana

ответ

64

Простейший ответ заключается в том, чтобы гарантировать, что ваши контроллеры yod/json-файлов контроллера или контроллера репликации добавляют IP-адрес IP в качестве переменной окружения, добавив блок конфигурации, определенный ниже. (Блок ниже дополнительно делает имя и пространство имен доступным для стручка)

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 

Воссоздать стручок/гс, а затем попытаться

echo $MY_POD_IP 

также запустить env, чтобы увидеть, что еще kubernetes предоставляет вам.

Приветствия

+0

Я тестировал это в контейнере, и эта переменная недоступна. –

+0

Извинения, предыдущий ответ был неправильным, я его обновил. – PiersyP

+0

Я только что протестировал ваше решение, и он отлично работает. Я на 100% уверен, что у кубернетов нет такой переменной среды, потому что 'printenv | grep '10 .254.24.167'' не возвращает ничего, кроме определяемой пользователем переменной MY_POD_IP. Во всяком случае, возьмите мой голос sir :) –

7

IP-адрес контейнера должен быть правильно сконфигурирован внутри сетевого пространства имен, поэтому любой из стандартных средств Linux может получить его. Например, попробуйте ifconfig, ip addr show, hostname -I и т. Д. Из прикрепленной оболочки в одном из ваших контейнеров, чтобы проверить ее.

12

kubectl описывают стручок даст вам некоторую информацию, включая IP

+0

Я думаю, что вопрос заключается в получении IP-адреса внутри контейнера/контейнера, где 'kubectl' недоступен. –

7

Вы можете использовать

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

, который основан на том, что @mibbit предложил.

Это принимает следующие факты во внимание:

  • имя хоста устанавливается на имя POD, но this might change in the future
  • kubectl был вручную помещен в контейнер (возможно, когда был построен образ)
  • Kubernetes обеспечивает учетная запись учетной записи службы неявно, как описано в Accessing the Cluster/Accessing the API from a Pod, то есть /var/run/secrets/kubernetes.io/serviceaccount в контейнере
+0

Это работает хорошо. Спасибо. –

6

Некоторые пояснения (на самом деле не ответ)

В kubernetes, каждый стручок получает назначается IP-адрес, и каждый контейнер в контейнере получает назначение в тот же IP-адрес. Таким образом, как заявил Алекс Робинсон в his answer, вы можете просто использовать hostname -I внутри вашего контейнера, чтобы получить IP-адрес.

Я тестировал с контейнером с двумя немыми контейнерами, и действительно, hostname -I выдавал один и тот же IP-адрес в обоих контейнерах. Кроме того, этот IP был эквивалентен тому, который был получен с использованием kubectl describe pod снаружи, который проверяет всю ИМО.

Однако PiersyP's answer кажется более чистым для меня.

Источники

От kubernetes docs:

приложений в стручках все используют один и тот же сетевой пространство имен (тот же IP-адрес и порт пространства), и таким образом может «найти» друг друга и общаться, используя локальный. Из-за этого приложения в контейнере должны координировать использование портов. Каждый блок имеет IP-адрес в плоском общем сетевом пространстве, который имеет полную связь с другими физическими компьютерами и контейнерами по сети.

Другая часть из kubernetes docs:

До сих пор этот документ не говорил о контейнерах. В действительности, Kubernetes применяет IP-адреса в области Pod - контейнеры в пределах Pod совместно используют свои пространства имен, включая их IP-адрес. Это означает, что контейнеры внутри Pod могут подключаться к портам друг друга на локальном хосте.

1

POD_HOST = $ (kubectl получить стручок $ POD_NAME --template = {{. Status.podIP}})

Эта команда вернет вам IP

+0

Спасибо за ваш ответ. Но я хочу знать IP-адрес в контейнере в Pod. Поэтому я хочу знать это, не используя 'kubectl'. – yanana

1

Даже проще запомнить, чем sed подход заключается в использовании awk.

Вот пример, который вы можете запустить на локальном компьютере:

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

Сам IP находится на колонке 2 выхода, следовательно $2.

+0

Downvoter, пожалуйста, дайте мне знать, если он не работает, потому что он работает на моей машине. – whirlwin

+2

Я предполагаю, что это потому, что вы не отвечаете на вопрос. Вопросы: «но как я могу получить IP-адрес из контейнера в Pod?» Вы предполагаете, что данное лицо имеет доступ к 'kubectl' на самом контейнере. – Seivan

Смежные вопросы