Как узнать собственный IP-адрес модуля из контейнера в модуле?

96

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

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

Янана
источник

Ответы:

175

Самый простой ответ - убедиться, что yaml / json-файлы вашего модуля или контроллера репликации добавляют 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

Восстановите pod / rc, а затем попробуйте

echo $MY_POD_IP

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

Ура

PiersyP
источник
1
Я только что протестировал ваше решение, и оно отлично работает. Я на 100% уверен, что kubernetes не имеет такой переменной окружения, потому printenv | grep '10.254.24.167'что не возвращает ничего, кроме пользовательской переменной MY_POD_IP. В любом случае, примите мой голос, сэр :)
Элуан Кериелл-Эвен
1
Вы когда-нибудь пробовали получить IP-адрес хоста status.hostIP?
PEdroArthur
@PEdroArthur Нет, я не слышал, это недавнее добавление. См. Запрос на
перенос
Это называется «Downwad API»: kubernetes.io/docs/tasks/inject-data-application/…
Алек Истомин
Большое спасибо, этот ответ действительно сделал меня большим поклонником.
Липин Хуанг,
27

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

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

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

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

Источники

Из документации kubernetes :

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

Еще один фрагмент из документации kubernetes :

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

Элуан Кериелл-Эвен
источник
25

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

миббит
источник
12
Я думаю, что вопрос в том, чтобы получить IP из контейнера / модуля, где kubectlон недоступен.
Элуан Кериелл-Эвен
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.

При этом учитываются следующие факты:

Адам Романек
источник
Не подключайтесь grepк sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (но для этого лучше использовать awk, чем sed)
Уильям Перселл
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-адреса (из сетевых интерфейсов) изнутри контейнера.

Например, в голанге: https://stackoverflow.com/a/31551220/6247478

Кевин
источник
1
kubectl get pods -o wide

Дайте вам список модулей с именем, статусом, IP, узлом ...

Белен Мартин
источник