Kubernetes为每个容器分配一个IP地址,但是如何从Pod中的容器中获取IP地址?我无法从文件中找到方法。
答案 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对我来说似乎更干净。
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中尝试ifconfig
,ip addr show
,hostname -I
等来测试它。
答案 5 :(得分:11)
您可以使用
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
基于@mibbit的建议。
这需要考虑以下事实:
kubectl
被手动放置在容器中(可能是在构建图像时)/var/run/secrets/kubernetes.io/serviceaccount
答案 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