如何从Pod中的容器内部知道Pod自己的IP地址?

时间:2015-06-10 04:03:15

标签: kubernetes

Kubernetes为每个容器分配一个IP地址,但是如何从Pod中的容器中获取IP地址?我无法从文件中找到方法。

9 个答案:

答案 0 :(得分:128)

最简单的答案是确保您的pod或复制控制器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以查看kubernetes为您提供的其他内容。

干杯

答案 1 :(得分:18)

kubectl describe pods <name of pod>会为您提供一些信息,包括IP

答案 2 :(得分:17)

一些澄清(不是真正的答案)

在kubernetes中,每个pod都会分配一个IP地址,并且pod中的每个容器都会被分配相同的IP地址。因此,正如Alex Robinson在his answer中所述,您可以在容器中使用hostname -i来获取pod IP地址。

我测试了一个运行两个哑容器的pod,确实hostname -i在两个容器内输出了相同的IP地址。此外,该IP等同于从外部使用kubectl describe pod获得的IP,它验证了整个IMO。

然而,PiersyP's answer对我来说似乎更干净。

来源

来自kubernetes docs

  

pod中的应用程序都使用相同的网络命名空间(相同的IP和端口空间),因此可以相互“查找”并使用localhost进行通信。因此,pod中的应用程序必须协调它们对端口的使用。每个pod在平面共享网络空间中都有一个IP地址,可以与网络中的其他物理计算机和pod进行完全通信。

来自kubernetes docs的另一篇文章:

  

到目前为止,本文档已经讨论过容器。实际上,Kubernetes在Pod范围应用IP地址 - Pod中的容器共享其网络命名空间 - 包括其IP地址。这意味着Pod中的容器都可以在localhost上到达彼此的端口。

答案 3 :(得分:13)

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

此命令将返回IP

答案 4 :(得分:11)

容器的IP地址应该在其网络命名空间内正确配置,因此任何标准的linux工具都可以获得它。例如,从您的一个容器中的附加shell中尝试ifconfigip addr showhostname -I等来测试它。

答案 5 :(得分:11)

您可以使用

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

基于@mibbit的建议。

这需要考虑以下事实:

答案 6 :(得分:4)

sed方法更容易记住使用awk

以下是一个示例,您可以在本地计算机上运行:

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

IP本身位于输出的第2列,因此$2

答案 7 :(得分:2)

kubectl get pods -o wide

为您提供包含名称,状态,IP,节点...的Pod列表。

答案 8 :(得分:0)

在某些情况下,从容器内部以编程方式(从网络接口)读取本地IP地址也可以,而不是依赖于向下的API。

例如,在golang中: https://stackoverflow.com/a/31551220/6247478