Kubernetes назначает IP-адрес для каждого контейнера, но как я могу получить IP-адрес из контейнера в Pod? Я не мог найти путь от документации.
Как узнать собственный IP-адрес Pod внутри контейнера в Pod?
Ответ 1
Самый простой ответ заключается в том, чтобы гарантировать, что ваши файлы 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
, чтобы узнать, что еще предоставляет кубернете.
Приветствия
Ответ 2
kubectl describe pods <name of pod>
даст вам некоторую информацию, включая IP
Ответ 3
Некоторые разъяснения (не совсем ответ)
В kubernetes каждому модулю назначается IP-адрес, а каждому контейнеру назначается тот же IP-адрес. Таким образом, как сказал Алекс Робинсон в своем ответе, вы можете просто использовать hostname -i
внутри своего контейнера, чтобы получить IP-адрес модуля.
Я провел тестирование с модулем, в котором работали два тупых контейнера, и действительно hostname -i
и тот же IP-адрес внутри обоих контейнеров. Кроме того, этот IP был эквивалентен тому, который был получен с помощью kubectl describe pod
извне, что подтверждает kubectl describe pod
всего IMO.
Тем не менее, ответ PiersyP кажется мне более чистым.
источники
Все приложения в модуле используют одно и то же пространство имен сети (один и тот же IP-адрес и пространство портов) и, таким образом, могут "находить" друг друга и обмениваться данными с помощью localhost. Из-за этого приложения в модуле должны координировать использование портов. Каждый модуль имеет IP-адрес в плоском общем сетевом пространстве, которое имеет полную связь с другими физическими компьютерами и модулями по сети.
Еще один кусок из документов kubernetes:
До сих пор в этом документе говорилось о контейнерах. В действительности, Kubernetes применяет IP-адреса в области Pod - контейнеры внутри Pod совместно используют свои пространства имен сети - включая их IP-адреса. Это означает, что все контейнеры внутри Pod могут достигать портов друг друга на localhost.
Ответ 4
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})
Эта команда вернет вам IP-адрес
Ответ 5
IP-адрес контейнера должен быть правильно настроен внутри своего пространства имен, поэтому любой из стандартных средств Linux может получить его. Например, попробуйте ifconfig
, ip addr show
, hostname -I
и т.д. Из прикрепленной оболочки в одном из ваших контейнеров, чтобы проверить ее.
Ответ 6
Вы можете использовать
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
который основан на том, что предложил @mibbit.
Это учитывает следующие факты:
- hostname имеет значение POD, но это может измениться в будущем
-
kubectl
был вручную помещен в контейнер (возможно, когда изображение было построено) - Kubernetes предоставляет учетные данные учетной записи службы неявно, как описано в Доступ к кластеру/Доступ к API из Pod, то есть
/var/run/secrets/kubernetes.io/serviceaccount
в контейнере
Ответ 7
Еще проще запомнить, чем подход sed
- использовать awk
.
Вот пример, который вы можете запустить на своем локальном компьютере:
kubectl describe pod `<podName>` | grep IP | awk '{print $2}'
Сам IP находится в столбце 2 вывода, поэтому $2
.
Ответ 8
В некоторых случаях вместо того, чтобы полагаться на нисходящий API, также работает программное чтение локального IP-адреса (из сетевых интерфейсов) изнутри контейнера.
Например, на Голанге: fooobar.com/info/170978/...