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


91

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

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

Answers:


166

最简单的答案是通过添加以下定义的配置块,确保您的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
我刚刚测试了您的解决方案,并且效果很好。我100%确信kubernetes没有这样的环境变量,因为printenv | grep '10.254.24.167'除了用户定义的变量MY_POD_IP之外,它不会返回任何内容。无论如何,请投票给我先生:)
Elouan Keryell-Even

1
您是否曾经尝试通过它获取主机的IP status.hostIP
PEdroArthur '17

@PEdroArthur不,我没有,afaik这是最近添加的内容。在此处查看请求请求-github.com/kubernetes/kubernetes/pull/42717
PiersyP '17


非常感谢您,这个回答确实使我大吃一惊。
黄丽萍

25

一些澄清(不是真正的答案)

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

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

但是,PiersyP的答案对我来说似乎更干净。

资料来源

kubernetes docs

Pod中的所有应用程序都使用相同的网络名称空间(相同的IP和端口空间),因此可以彼此“查找”并使用localhost进行通信。因此,吊舱中的应用程序必须协调其端口使用情况。每个Pod在平坦的共享网络空间中都有一个IP地址,该地址与整个网络上的其他物理计算机和Pod进行了完全通信。

kubernetes docs的另一篇文章

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


24

kubectl describe pods <name of pod> 将为您提供一些信息,包括IP


12
我认为问题在于从吊舱/容器内部获取IP,那里kubectl没有可用的IP 。
Elouan Keryell-Even'1

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

该命令将为您返回IP


3
感谢您的回答。但是我想知道Pod中一个容器中的IP地址。所以我想不使用而知道它kubectl
yanana '17

14

容器的IP地址应在其网络名称空间内正确配置,以便任何标准linux工具都可以获取它。例如,尝试ifconfigip addr showhostname -I,等从容器的一个内的附接外壳进行测试了。


12

你可以用

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

这基于@mibbit的建议。

这考虑到以下事实:


不要grep传送到sed:(kubectl describe pod $POD | sed -nE '/IP/s/IP:[[:space:]]+//p' 但是awk比sed更好)
William Pursell

4

记住比使用sed方法更简单awk

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

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

IP本身位于输出的第2列$2


4
我认为这是因为您没有回答问题。问题是but how can I acquire the IP address from a container in the Pod? 您假设有问题的人可以访问kubectlPod本身。
Seivan '17

4
不要将grep传送到awk:kubectl describe pod $POD | awk '/IP/{print $2}'
威廉·珀塞尔

1

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

例如,在golang中:https ://stackoverflow.com/a/31551220/6247478


1
kubectl get pods -o wide

给您列出名称,状态,IP,节点的Pod列表...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.