下行 API
有时,容器需要了解自身信息,而无需过度依赖 Kubernetes。 下行 API 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下,获取自身或集群的信息。
例如,现有应用程序假设某个众所周知的环境变量包含唯一标识符。 一种可能性是封装应用程序,但这样做既繁琐又容易出错,而且违背了低耦合的目标。 更好的选择是使用 Pod 的名称作为标识符,并将 Pod 的名称注入到众所周知的环境变量中。
在 Kubernetes 中,有两种方法可以将 Pod 和容器字段暴露给正在运行的容器
- 作为 环境变量
- 作为
downwardAPI卷中的文件
这两种暴露 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相同。
以下信息可通过 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-*- 容器的巨页限制
resource: requests.hugepages-*- 容器的巨页请求
resource: limits.ephemeral-storage- 容器的短暂存储限制
resource: requests.ephemeral-storage- 容器的短暂存储请求
资源限制的回退信息
如果未为容器指定 CPU 和内存限制,并且使用下行 API 尝试公开该信息,则 kubelet 会默认根据 节点可分配资源 计算,公开 CPU 和内存的最大可分配值。
下一步
您可以阅读有关 downwardAPI 卷 的内容。
您可以尝试使用下行 API 公开容器或 Pod 级信息
- 作为 环境变量
- 作为
downwardAPI卷中的文件