下行 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>']
- 名为
<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
相同
以下信息可通过 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
卷中的文件