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

yan*_*ana 76 kubernetes

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

Pie*_*syP 145

最简单的答案是确保您的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
Run Code Online (Sandbox Code Playgroud)

重新创建pod/rc,然后尝试

echo $MY_POD_IP
Run Code Online (Sandbox Code Playgroud)

还跑去env看看kubernetes为你提供了什么.

干杯

  • 我刚刚测试了您的解决方案,效果非常好。我 100% 确定 kubernetes 没有这样的环境变量,因为 `printenv | grep '10.254.24.167'` 除了用户定义的变量 MY_POD_IP 之外不返回任何内容。无论如何,先生,请投我一票:) (2认同)

Elo*_*ven 22

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

在kubernetes中,每个pod都被分配了一个IP地址,并且pod中的每个容器都被分配了相同的IP地址.因此,正如Alex Robinson在他的回答中所述,您可以hostname -i在容器内使用以获取pod IP地址.

我测试了一个运行两个哑容器的pod,实际上hostname -i是在两个容器内输出相同的IP地址.此外,该IP等同于kubectl describe pod从外部获得的IP ,这证实了整个IMO.

然而,PiersyP的答案对我来说似乎更干净.

来源

来自kubernetes docs:

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

来自kubernetes docs的另一篇文章:

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


mib*_*bit 21

kubectl describe pods <name of pod> 会给你一些信息,包括IP

  • 我认为问题是从pod /容器中获取IP,其中`kubectl`不可用. (9认同)

小智 15

POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})
Run Code Online (Sandbox Code Playgroud)

此命令将返回一个IP

  • 感谢您的回答。但是我想知道Pod中一个容器中的IP地址。所以我想不使用`kubectl`就知道这一点。 (2认同)

Ale*_*son 14

容器的IP地址应该在其网络命名空间内正确配置,因此任何标准的linux工具都可以获得它.例如,尝试ifconfig,ip addr show,hostname -I,等从附接外壳的容器中的一个中对其进行测试.


Ada*_*nek 13

你可以用

kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
Run Code Online (Sandbox Code Playgroud)

这是基于@mibbit的建议.

这需要考虑以下事实:

  • hostname设置为POD的名称,但将来可能会更改
  • kubectl 手动放置在容器中(可能是在构建图像时)
  • Kubernetes隐式提供容器的服务帐户凭证,如从Pod访问群集/访问API,即/var/run/secrets/kubernetes.io/serviceaccount在容器中所述


Bel*_*tin 7

kubectl get pods -o wide
Run Code Online (Sandbox Code Playgroud)

给你一个包含名称、状态、IP、节点的 pod 列表...


whi*_*win 5

记住比使用sed方法更简单awk.

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

kubectl describe pod `<podName>` | grep IP | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是因为你没有回答这个问题.问题是`但是如何从Pod中的容器中获取IP地址?`您假设有问题的人可以访问pod本身的`kubectl`. (4认同)
  • 不要将grep传递给awk:`kubectl describe pod $ POD | awk'/ IP/{print $ 2}'` (4认同)