Downward API
有时容器需要知道自身的信息,但又不想与 Kubernetes 过度耦合,这会非常有用。Downward API 允许容器无需使用 Kubernetes 客户端或 API Server 即可获取关于自身或集群的信息。
一个例子是,现有应用假定某个知名的环境变量保存着唯一标识符。一种可能是对应用进行封装,但这既繁琐又容易出错,而且违背了低耦合的目标。一个更好的选择是使用 Pod 的名称作为标识符,并将 Pod 的名称注入到那个知名的环境变量中。
在 Kubernetes 中,有两种方法可以将 Pod 和容器字段暴露给正在运行的容器:
这两种暴露 Pod 和容器字段的方法统称为 Downward API。
可用字段
只有部分 Kubernetes API 字段可通过 Downward 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 被分配到的节点的 Primary IP 地址
status.hostIPs- 此 IP 地址是
status.hostIP的双栈版本,第一个 IP 总是与status.hostIP相同。 status.podIP- Pod 的 Primary IP 地址(通常是其 IPv4 地址)
status.podIPs- 此 IP 地址是
status.podIP的双栈版本,第一个 IP 总是与status.podIP相同。
以下信息可通过 downwardAPI 卷的 fieldRef 使用,但不能作为环境变量
metadata.labels- 所有 Pod 标签,格式为
label-key="escaped-label-value",每行一个标签 metadata.annotations- 所有 Pod 注解,格式为
annotation-key="escaped-annotation-value",每行一个注解
通过 resourceFieldRef 可用的信息
这些容器级别字段允许你提供关于诸如 CPU 和内存等资源的请求和限制的信息。
注意
Kubernetes v1.33 [beta] (默认启用: true)容器的 CPU 和内存资源可以在容器运行时进行调整。如果发生这种情况,Downward API 卷会更新,但环境变量不会更新,除非容器重启。详见调整为容器分配的 CPU 和内存资源。
resource: limits.cpu- 容器的 CPU 限制
resource: requests.cpu- 容器的 CPU 请求
resource: limits.memory- 容器的内存限制
resource: requests.memory- 容器的内存请求
resource: limits.hugepages-*- 容器的 HugePages 限制
resource: requests.hugepages-*- 容器的 HugePages 请求
resource: limits.ephemeral-storage- 容器的临时存储限制
resource: requests.ephemeral-storage- 容器的临时存储请求
资源限制的备用信息
如果没有为容器指定 CPU 和内存限制,并且你使用 Downward API 尝试暴露这些信息,则 kubelet 会默认根据节点可分配(Node Allocatable)计算暴露 CPU 和内存的最大可分配值。
接下来
你可以阅读关于downwardAPI 卷的内容。
你可以尝试使用 Downward API 来暴露容器或 Pod 级别的信息