下行 API

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

有时,容器需要了解自身信息,而无需过度依赖 Kubernetes。 下行 API 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下,获取自身或集群的信息。

例如,现有应用程序假设某个众所周知的环境变量包含唯一标识符。 一种可能性是封装应用程序,但这样做既繁琐又容易出错,而且违背了低耦合的目标。 更好的选择是使用 Pod 的名称作为标识符,并将 Pod 的名称注入到众所周知的环境变量中。

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

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

可用字段

只有部分 Kubernetes API 字段可通过下行 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 的节点的主 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-*
容器的巨页限制
resource: requests.hugepages-*
容器的巨页请求
resource: limits.ephemeral-storage
容器的短暂存储限制
resource: requests.ephemeral-storage
容器的短暂存储请求

资源限制的回退信息

如果未为容器指定 CPU 和内存限制,并且使用下行 API 尝试公开该信息,则 kubelet 会默认根据 节点可分配资源 计算,公开 CPU 和内存的最大可分配值。

下一步

您可以阅读有关 downwardAPI 的内容。

您可以尝试使用下行 API 公开容器或 Pod 级信息

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