Downward API

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

有时容器需要知道自身的信息,但又不想与 Kubernetes 过度耦合,这会非常有用。Downward API 允许容器无需使用 Kubernetes 客户端或 API Server 即可获取关于自身或集群的信息。

一个例子是,现有应用假定某个知名的环境变量保存着唯一标识符。一种可能是对应用进行封装,但这既繁琐又容易出错,而且违背了低耦合的目标。一个更好的选择是使用 Pod 的名称作为标识符,并将 Pod 的名称注入到那个知名的环境变量中。

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

这两种暴露 Pod 和容器字段的方法统称为 Downward API

可用字段

只有部分 Kubernetes API 字段可通过 Downward API 使用。本节列出了可以使用的字段。

你可以使用 fieldRef 从可用的 Pod 级别字段传递信息。在 API 级别,Pod 的 spec 总是定义至少一个容器。你可以使用 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 被分配到的节点的 Primary IP 地址
status.hostIPs
此 IP 地址是 status.hostIP 的双栈版本,第一个 IP 总是与 status.hostIP 相同。
status.podIP
Pod 的 Primary IP 地址(通常是其 IPv4 地址)
status.podIPs
此 IP 地址是 status.podIP 的双栈版本,第一个 IP 总是与 status.podIP 相同。

以下信息可通过 downwardAPI 卷的 fieldRef 使用,但不能作为环境变量

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 和内存限制,并且你使用 Downward API 尝试暴露这些信息,则 kubelet 会默认根据节点可分配(Node Allocatable)计算暴露 CPU 和内存的最大可分配值。

接下来

你可以阅读关于downwardAPI的内容。

你可以尝试使用 Downward API 来暴露容器或 Pod 级别的信息

上次修改时间 2025 年 4 月 7 日上午 9:46 PST:更新 InPlacePodVerticalScaling v1.33 beta 文档 (#50290) (c014f72fbb)