下行 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
卷中的文件