如何从 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 工具都可以获取它。例如,尝试 ifconfig
、ip addr show
、hostname -I
等,从您的其中一个容器中的附加 shell 中进行测试。
kubectl describe pods <name of pod>
会给你一些信息包括 IP
你可以使用
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
这是基于@mibbit 的建议。
这考虑了以下事实:
- 主机名设置为 POD 的名称,但 this might change in the future
kubectl
被手动放入容器中(可能是在构建镜像的时候)
- Kubernetes 向容器隐式提供服务帐户凭证,如 Accessing the Cluster / Accessing the API from a Pod 中所述,即容器中的
/var/run/secrets/kubernetes.io/serviceaccount
最简单的答案是确保您的 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。
但是, 对我来说似乎更干净。
来源
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。
Kubernetes为每个容器分配了一个IP地址,但是如何从Pod中的容器获取IP地址呢?我无法从文档中找到方法。
编辑:我打算 运行 Kubernetes 中的 Aerospike 集群。并且配置文件需要自己的 IP 地址。我正在尝试使用 confd 来设置主机名。如果设置了环境变量,我会使用它。
容器的 IP 地址应在其网络命名空间内正确配置,因此任何标准 linux 工具都可以获取它。例如,尝试 ifconfig
、ip addr show
、hostname -I
等,从您的其中一个容器中的附加 shell 中进行测试。
kubectl describe pods <name of pod>
会给你一些信息包括 IP
你可以使用
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
这是基于@mibbit 的建议。
这考虑了以下事实:
- 主机名设置为 POD 的名称,但 this might change in the future
kubectl
被手动放入容器中(可能是在构建镜像的时候)- Kubernetes 向容器隐式提供服务帐户凭证,如 Accessing the Cluster / Accessing the API from a Pod 中所述,即容器中的
/var/run/secrets/kubernetes.io/serviceaccount
最简单的答案是确保您的 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。
但是,
来源
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。