Downward API

有两种方法可以将 Pod 和容器字段暴露给正在运行的容器:环境变量和由特殊卷类型填充的文件。 这两种暴露 Pod 和容器字段的方式合称为下行 API。

有时,容器拥有关于自身的信息而不与 Kubernetes 过度耦合是很有用的。*下行 API* 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下使用关于自身或集群的信息。

一个例子是现有应用程序,它假设一个特定的众所周知的环境变量保存着唯一的标识符。一种可能性是包装应用程序,但这既乏味又容易出错,并且违反了低耦合的目标。 更好的选择是将 Pod 的名称用作标识符,并将 Pod 的名称注入到众所周知的环境变量中。

在 Kubernetes 中,有两种方式将 Pod 和容器字段暴露给正在运行的容器:

这两种暴露 Pod 和容器字段的方式合称为 *下行 API*。

可用的字段

只有一些 Kubernetes API 字段可以通过下行 API 使用。本节列出了您可以使其可用的字段。

您可以使用 fieldRef 从可用的 Pod 级字段传递信息。 在 API 级别,Pod 的 spec 始终定义至少一个 Container。 您可以使用 resourceFieldRef 从可用的容器级字段传递信息。

通过 fieldRef 可用的信息

对于某些 Pod 级字段,您可以将其作为环境变量或使用 downwardAPI 卷提供给容器。通过这两种机制可用的字段是:

metadata.name
Pod 的名称
metadata.namespace
Pod 的命名空间
metadata.uid
Pod 的唯一 ID
metadata.annotations['<KEY>']
Pod 的注解的值,名为 <KEY> (例如,metadata.annotations['myannotation']
metadata.labels['<KEY>']
Pod 的标签的文本值,名为 <KEY>(例如,metadata.labels['mylabel']

以下信息通过环境变量提供,**但不能作为 downwardAPI 卷 fieldRef**

spec.serviceAccountName
Pod 的服务帐户的名称
spec.nodeName
Pod 执行所在节点的名称
status.hostIP
分配给 Pod 的节点的主要 IP 地址
status.hostIPs
IP 地址是 status.hostIP 的双栈版本,第一个始终与 status.hostIP 相同。
status.podIP
Pod 的主要 IP 地址(通常是其 IPv4 地址)
status.podIPs
IP 地址是 status.podIP 的双栈版本,第一个始终与 status.podIP 相同

以下信息可通过 downwardAPIfieldRef 获取,**但不能作为环境变量**

metadata.labels
Pod 的所有标签,格式为 label-key="escaped-label-value",每行一个标签
metadata.annotations
Pod 的所有注解,格式为 annotation-key="escaped-annotation-value",每行一个注解

通过 resourceFieldRef 可用的信息

这些容器级字段允许您提供关于诸如 CPU 和内存等资源的请求和限制的信息。

resource: limits.cpu
容器的 CPU 限制
resource: requests.cpu
容器的 CPU 请求
resource: limits.memory
容器的内存限制
resource: requests.memory
容器的内存请求
resource: limits.hugepages-*
容器的 hugepages 限制
resource: requests.hugepages-*
容器的 hugepages 请求
resource: limits.ephemeral-storage
容器的临时存储限制
resource: requests.ephemeral-storage
容器的临时存储请求

资源限制的后备信息

如果未为容器指定 CPU 和内存限制,并且您使用下行 API 尝试暴露该信息,则 kubelet 默认会暴露基于节点可分配量计算的 CPU 和内存的最大可分配值。

下一步

您可以阅读关于 downwardAPI的信息。

您可以尝试使用下行 API 来暴露容器级或 Pod 级信息

上次修改时间:太平洋标准时间 2024 年 2 月 22 日下午 4:30:KEP-2681 PodHostIPs to stable (2a93b5e0eb)