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_HOST
和 FOO_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.
...
我有一个 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_HOST
和 FOO_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.
...