Kubernetes为每个容器分配一个IP地址,但是如何从Pod中的一个容器获取IP地址?我从文档中找不到出路。
编辑:我将在Kubernetes中运行Aerospike集群。并且配置文件需要自己的IP地址。而且我正在尝试使用confd设置主机名。如果设置了环境变量,我将使用它。
Answers:
最简单的答案是通过添加以下定义的配置块,确保您的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还为您提供了什么。
干杯
status.hostIP
?
一些澄清(不是真正的答案)
在kubernetes中,每个容器都被分配了一个IP地址,并且容器中的每个容器都被分配了相同的IP地址。因此,正如Alex Robinson在其回答中所述,您可以只hostname -i
在容器内部使用以获取Pod IP地址。
我测试了一个运行两个哑容器的Pod,确实hostname -i
在两个容器中输出了相同的IP地址。此外,该IP等同于kubectl describe pod
从外部获得的IP ,从而验证了IMO的全部内容。
但是,PiersyP的答案对我来说似乎更干净。
Pod中的所有应用程序都使用相同的网络名称空间(相同的IP和端口空间),因此可以彼此“查找”并使用localhost进行通信。因此,吊舱中的应用程序必须协调其端口使用情况。每个Pod在平坦的共享网络空间中都有一个IP地址,该地址与整个网络上的其他物理计算机和Pod进行了完全通信。
到目前为止,该文档已经讨论了容器。实际上,Kubernetes在Pod范围内应用IP地址-Pod中的容器共享其网络名称空间-包括其IP地址。这意味着Pod中的容器都可以到达本地主机上彼此的端口。
kubectl describe pods <name of pod>
将为您提供一些信息,包括IP
kubectl
没有可用的IP 。
POD_HOST=$(kubectl get pod $POD_NAME --template={{.status.podIP}})
该命令将为您返回IP
kubectl
。
你可以用
kubectl describe pod `hostname` | grep IP | sed -E 's/IP:[[:space:]]+//'
这基于@mibbit的建议。
这考虑到以下事实:
kubectl
手动放置在容器中(可能是在构建图像时)/var/run/secrets/kubernetes.io/serviceaccount
在容器中grep
传送到sed
:(kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p'
但是awk比sed更好)
记住比使用sed
方法更简单awk
。
这是一个示例,您可以在本地计算机上运行它:
kubectl describe pod `<podName>` | grep IP | awk '{print $2}'
IP本身位于输出的第2列$2
。
but how can I acquire the IP address from a container in the Pod?
您假设有问题的人可以访问kubectl
Pod本身。
kubectl describe pod $POD | awk '/IP/{print $2}'
printenv | grep '10.254.24.167'
除了用户定义的变量MY_POD_IP之外,它不会返回任何内容。无论如何,请投票给我先生:)