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

How to know a Pod's own IP address from inside a container in the Pod?

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

编辑:我打算 运行 Kubernetes 中的 Aerospike 集群。并且配置文件需要自己的 IP 地址。我正在尝试使用 confd 来设置主机名。如果设置了环境变量,我会使用它。

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

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

你可以使用

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

这是基于@mibbit 的建议。

这考虑了以下事实:

最简单的答案是确保您的 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 还为您提供了什么。

干杯

一些说明(不是真正的答案)

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

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

但是, 对我来说似乎更干净。

来源

来自kubernetes docs

The applications in a pod all use the same network namespace (same IP and port space), and can thus “find” each other and communicate using localhost. Because of this, applications in a pod must coordinate their usage of ports. Each pod has an IP address in a flat shared networking space that has full communication with other physical computers and pods across the network.

来自kubernetes docs的另一篇文章:

Until now this document has talked about containers. In reality, Kubernetes applies IP addresses at the Pod scope - containers within a Pod share their network namespaces - including their IP address. This means that containers within a Pod can all reach each other’s ports on localhost.

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

这个命令会return给你一个IP

sed 方法更容易记住的是使用 awk.

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

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

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

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

例如,在golang中:

kubectl get pods -o wide

给你一个pods的列表,有name, status, ip, node...

容器与其所在的 pod 具有相同的 IP。

因此,您可以从容器内部执行 ip a,您获得的 IP 也是 pod 拥有的 IP。