Como saber o endereço IP do próprio pod de dentro de um contêiner no pod?


91

O Kubernetes atribui um endereço IP para cada contêiner, mas como posso adquirir o endereço IP de um contêiner no pod? Não consegui encontrar o caminho nas documentações.

Editar: vou executar o cluster Aerospike no Kubernetes. e os arquivos de configuração precisam de seu próprio endereço IP. E estou tentando usar confd para definir o nome do host. Eu usaria a variável de ambiente se ela estivesse definida.

Respostas:


166

A resposta mais simples é garantir que os arquivos yaml / json do pod ou do controlador de replicação adicionem o IP do pod como uma variável de ambiente adicionando o bloco de configuração definido abaixo. (o bloco abaixo também disponibiliza o nome e o namespace para o 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

Recrie o pod / rc e tente

echo $MY_POD_IP

também execute envpara ver o que mais o kubernetes fornece a você.

Felicidades


1
Acabei de testar sua solução e funciona muito bem. Tenho 100% de certeza que o kubernetes não tem essa variável de ambiente, porque printenv | grep '10.254.24.167'não retorna nada, exceto a variável definida pelo usuário MY_POD_IP. De qualquer forma, faça meu voto, senhor :)
Elouan Keryell-Even

1
Você já tentou buscar o IP do host status.hostIP?
PEdroArthur

@PEdroArthur Não, não, afaik é uma adição recente. Veja a solicitação de pull aqui - github.com/kubernetes/kubernetes/pull/42717
PiersyP


Muito obrigado, esta resposta realmente me torna um grande faver.
Liping Huang

25

Alguns esclarecimentos (não é realmente uma resposta)

No kubernetes, cada pod recebe um endereço IP e cada contêiner no pod recebe o mesmo endereço IP. Assim, como Alex Robinson afirmou em sua resposta , você pode apenas usar hostname -identro do seu contêiner para obter o endereço IP do pod.

Eu testei com um pod executando dois contêineres burros e, de fato, hostname -iestava gerando o mesmo endereço IP em ambos os contêineres. Além disso, aquele IP era equivalente ao obtido usando kubectl describe podde fora, o que valida a coisa toda IMO.

No entanto, a resposta de PiersyP parece mais clara para mim.

Fontes

Dos documentos do kubernetes :

Todos os aplicativos em um pod usam o mesmo namespace de rede (mesmo IP e espaço de porta) e podem, portanto, “encontrar” uns aos outros e se comunicar usando localhost. Por isso, os aplicativos em um pod devem coordenar o uso das portas. Cada pod tem um endereço IP em um espaço de rede compartilhado plano que tem comunicação total com outros computadores físicos e pods na rede.

Outra parte da documentação do Kubernetes :

Até agora, este documento falou sobre contêineres. Na realidade, o Kubernetes aplica endereços IP no escopo do pod - os contêineres em um pod compartilham seus namespaces de rede - incluindo seu endereço IP. Isso significa que todos os contêineres em um pod podem alcançar as portas uns dos outros no localhost.


24

kubectl describe pods <name of pod> lhe dará algumas informações, incluindo o IP


12
Acho que a questão é como obter o IP de dentro do pod / contêiner, onde kubectlnão está disponível.
Elouan Keryell-Even

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

Este comando irá retornar um IP


3
Obrigado pela sua resposta. Mas eu quero saber o endereço IP em um contêiner em um pod. Então eu quero saber sem usar kubectl.
yanana de

14

O endereço IP do contêiner deve ser configurado corretamente dentro de seu namespace de rede, para que qualquer uma das ferramentas padrão do Linux possa obtê-lo. Por exemplo, tentativa ifconfig, ip addr show, hostname -I, etc. a partir de um shell anexado dentro de um dos seus recipientes para testá-lo.


12

Você poderia usar

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

que é baseado no que @mibbit sugeriu.

Isso leva os seguintes fatos em consideração:

  • hostname é definido como o nome do POD, mas isso pode mudar no futuro
  • kubectl foi colocado manualmente no contêiner (possivelmente quando a imagem foi construída)
  • O Kubernetes fornece uma credencial de conta de serviço ao contêiner implicitamente, conforme descrito em Acessando o cluster / Acessando a API de um pod , ou seja, /var/run/secrets/kubernetes.io/serviceaccountno contêiner

Não canalize greppara sed: kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' (mas awk é melhor do que sed)
William Pursell

4

Ainda mais simples de lembrar do que a sedabordagem é usar awk.

Aqui está um exemplo, que você pode executar em sua máquina local:

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

O próprio IP está na coluna 2 da saída, portanto $2.


4
Presumo que seja porque você não está respondendo à pergunta. A pergunta é: but how can I acquire the IP address from a container in the Pod? você está assumindo que a pessoa em questão tem acesso ao kubectlpróprio pod.
Seivan

4
Não canalize grep para awk:kubectl describe pod $POD | awk '/IP/{print $2}'
William Pursell


1
kubectl get pods -o wide

Fornece uma lista de pods com nome, status, ip, nó ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.