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

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

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

175580 次浏览

容器的 IP 地址应该在其网络名称空间内进行适当的配置,这样任何标准的 Linux 工具都可以获得它。例如,尝试 ifconfigip addr showhostname -I等从一个附加的外壳在您的容器之一,以测试它出来。

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

你可以用

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

这是基于@mibbit 的建议。

这考虑到以下事实:

The simplest answer is to ensure that your pod or replication controller yaml/json files add the pod IP as an environment variable by adding the config block defined below. (the block below additionally makes the name and namespace available to the 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

重建吊舱/RC 然后试试

echo $MY_POD_IP

同时运行 env查看 kubernetes 还为您提供了什么。

干杯

Some clarifications (not really an answer)

在库伯网中,每个分离器都被分配了一个 IP 地址分离器中的每个容器都被分配了相同的 IP 地址。因此,正如 Alex Robinson 在 他的回答中所述,您可以只在容器内使用 hostname -i来获取吊舱 IP 地址。

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

然而,PiersyP 的回答对我来说似乎更干净。

消息来源

来自 Kubernetes 医生:

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 医生的另一篇文章:

到目前为止,这个文档一直在讨论容器。实际上,Kubernetes 在 Pod 范围内应用 IP 地址-Pod 中的容器共享它们的网络名称空间-包括它们的 IP 地址。这意味着 Pod 中的容器都可以到达本地主机上彼此的端口。

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

这个命令会返回一个 IP 地址

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

下面是一个可以在本地机器上运行的示例:

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

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

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

For example, in golang: Https://stackoverflow.com/a/31551220/6247478

kubectl get pods -o wide

给你一个包含名称,状态,ip,节点的豆荚列表。

集装箱和它们所在的分离舱有相同的 IP 地址。

So from inside the container you can just do ip a and the IP you get is the one the pod has also.