Kubernetes Pod 定义中的 IP 变量扩展

IP variable expansion in Kubernetes Pod definition

我有一个 docker 镜像需要通过命令行传递容器 IP 地址(或主机名)。

是否可以扩展容器命令定义中的 pod 主机名或 IP?如果没有,在 kuberneted 部署的容器中获取它的更好方法是什么?

在 AWS 中我通常通过联系 EC2 元数据服务来获取它,我可以做一些类似的联系 kubernetes api,只要我可以获得 pod name/id?

谢谢。

在 v1.1(即将发布)中,您可以通过 downward api (note that the published documentation 将 pod 的 IP 作为环境变量公开,v1.0 不在向下 API 中包含 pod IP ).

在 v1.1 之前,获得此信息的最佳方法可能是从 pod 查询 API。有关如何访问 API,请参阅 Accessing the API from a Pod。 pod 名称是您的 $HOSTNAME,您可以通过以下内容找到 IP:

wget -O - ${KUBERNETES_RO_SERVICE_HOST}:${KUBERNETES_RO_SERVICE_PORT}/api/v1/namespaces/default/pods/${HOSTNAME} | grep podIP

尽管我建议您使用 json 解析器,例如 jq

编辑:

只是想补充一点,pod IP 不会在重新启动时保留,这就是为什么通常的建议是设置一个指向您的 pod 的服务。如果您确实使用服务,服务 IP 将被固定并充当 pod 的代理,即使在重新启动时也是如此。服务 IP 以 environment variables 形式提供,例如 FOO_SERVICE_HOSTFOO_SERVICE_PORT.

根据您的 pod 设置,您可以使用 hostname -i

例如

$ kubectl exec ${POD_NAME} hostname -i
10.245.2.109

来自man hostname

...
-i, --ip-address
      Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses instead.

-I, --all-ip-addresses
      Display  all  network  addresses  of  the  host. This option enumerates all configured addresses on all network interfaces. The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this
          option does not depend on name resolution. Do not make any assumptions about the order of the output.
...