下行 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>']
名为 <KEY> 的 pod 注解 的值(例如,metadata.annotations['myannotation']
metadata.labels['<KEY>']
名为 <KEY> 的 pod 标签 的文本值(例如,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 升级到稳定版 (2a93b5e0eb)