¿Cómo saber la propia dirección IP de un Pod desde el interior de un contenedor en el Pod?

96

Kubernetes asigna una dirección IP para cada contenedor, pero ¿cómo puedo adquirir la dirección IP de un contenedor en el Pod? No pude encontrar el camino en la documentación.

Editar: voy a ejecutar el clúster Aerospike en Kubernetes. y los archivos de configuración necesitan su propia dirección IP. Y estoy intentando usar confd para establecer el nombre de host. Usaría la variable de entorno si estuviera configurada.

Yanana
fuente

Respuestas:

175

La respuesta más simple es asegurarse de que los archivos yaml / json de su pod o controlador de replicación agreguen la IP del pod como variable de entorno agregando el bloque de configuración definido a continuación. (el bloque a continuación también hace que el nombre y el espacio de nombres estén disponibles para el 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

Vuelva a crear el pod / rc y luego intente

echo $MY_POD_IP

también corre envpara ver qué más te ofrece kubernetes.

Salud

PiersyP
fuente
1
Acabo de probar tu solución y funciona muy bien. Estoy 100% seguro de que kubernetes no tiene una variable de entorno de este tipo, porque printenv | grep '10.254.24.167'no devuelve nada excepto la variable definida por el usuario MY_POD_IP. De todos modos, tome mi voto, señor :)
Elouan Keryell-Even
1
¿Alguna vez ha intentado obtener la IP del host status.hostIP?
PEdroArthur
@PEdroArthur No, no lo he hecho, afaik es una adición reciente. Vea la solicitud de extracción aquí - github.com/kubernetes/kubernetes/pull/42717
PiersyP
Esto se llama "API Downwad": kubernetes.io/docs/tasks/inject-data-application/…
Alec Istomin
Muchas gracias, esta respuesta realmente me hizo un gran faver.
Liping Huang
27

Algunas aclaraciones (no es realmente una respuesta)

En kubernetes, a cada pod se le asigna una dirección IP y a cada contenedor en el pod se le asigna la misma dirección IP. Por lo tanto, como dijo Alex Robinson en su respuesta , puede usarlo hostname -identro de su contenedor para obtener la dirección IP del pod.

Probé con un pod que ejecutaba dos contenedores tontos y, de hecho, hostname -iestaba generando la misma dirección IP dentro de ambos contenedores. Además, esa IP era equivalente a la obtenida usando kubectl describe poddesde afuera, lo que valida todo en mi opinión.

Sin embargo, la respuesta de PiersyP me parece más limpia.

Fuentes

De los documentos de Kubernetes :

Todas las aplicaciones de un pod utilizan el mismo espacio de nombres de red (la misma IP y espacio de puerto) y, por lo tanto, pueden "encontrarse" entre sí y comunicarse mediante localhost. Debido a esto, las aplicaciones en un pod deben coordinar el uso de los puertos. Cada pod tiene una dirección IP en un espacio de red compartido plano que tiene comunicación completa con otras computadoras físicas y pods a través de la red.

Otra pieza de los documentos de Kubernetes :

Hasta ahora este documento ha hablado de contenedores. En realidad, Kubernetes aplica direcciones IP en el ámbito del Pod (los contenedores dentro de un Pod comparten sus espacios de nombres de red) incluida su dirección IP. Esto significa que los contenedores dentro de un Pod pueden llegar a los puertos de los demás en localhost.

Elouan Keryell-Even
fuente
25

kubectl describe pods <name of pod> te dará alguna información incluida la IP

mibbit
fuente
12
Creo que la pregunta es sobre cómo obtener la IP desde el interior del pod / contenedor, donde kubectlno está disponible.
Elouan Keryell-Even
16
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})

Este comando le devolverá una IP

Anton
fuente
3
Gracias por tu respuesta. Pero quiero saber la dirección IP en un contenedor en un Pod. Entonces quiero saberlo sin usar kubectl.
Yanana
14

La dirección IP del contenedor debe configurarse correctamente dentro de su espacio de nombres de red, para que cualquiera de las herramientas estándar de Linux pueda obtenerla. Por ejemplo, try ifconfig, ip addr show, hostname -I, etc. de una cáscara de adjunto dentro de uno de sus contenedores para probarlo.

Alex Robinson
fuente
12

Podrías usar

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

que se basa en lo que sugirió @mibbit.

Esto tiene en cuenta los siguientes hechos:

  • El nombre de host se establece en el nombre de POD, pero esto podría cambiar en el futuro
  • kubectl se colocó manualmente en el contenedor (posiblemente cuando se creó la imagen)
  • Kubernetes proporciona una credencial de cuenta de servicio al contenedor implícitamente como se describe en Acceso al clúster / Acceso a la API desde un pod , es decir, /var/run/secrets/kubernetes.io/serviceaccounten el contenedor
Adam Romanek
fuente
No canalice grepa sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (pero awk es mejor para esto que sed)
William Pursell
4

Incluso más simple de recordar que el sedenfoque que es utilizar awk.

Aquí hay un ejemplo, que puede ejecutar en su máquina local:

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

La IP en sí está en la columna 2 de la salida, por lo tanto $2.

torbellino
fuente
4
Supongo que es porque no está respondiendo la pregunta. La pregunta es but how can I acquire the IP address from a container in the Pod? : está asumiendo que la persona en cuestión tiene acceso al kubectlmódulo.
Seivan
4
No canalice grep a awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell
1

En algunos casos, en lugar de depender de la API descendente, también funciona la lectura programática de la dirección IP local (de las interfaces de red) desde el interior del contenedor.

Por ejemplo, en golang: https://stackoverflow.com/a/31551220/6247478

Kevin
fuente
1
kubectl get pods -o wide

Darle una lista de pods con nombre, estado, ip, nodo ...

Belén Martín
fuente