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 级别的信息