对于容器来说,在不与 Kubernetes 过度耦合的情况下,拥有关于自身的信息有时是很有用的。Downward API 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下获得自己或集群的信息。
例如,现有应用程序假设某特定的周知的环境变量是存在的,其中包含唯一标识符。一种方法是对应用程序进行封装,但这很繁琐且容易出错,并且违背了低耦合的目标。更好的选择是使用 Pod 名称作为标识符,并将 Pod 名称注入到周知的环境变量中。
在 Kubernetes 中,有两种方法可以将 Pod 和容器字段暴露给运行中的容器:
这两种暴露 Pod 和容器字段的方式统称为 Downward API。
只有部分 Kubernetes API 字段可以通过 Downward API 使用。本节列出了你可以使用的字段。
你可以使用 fieldRef 传递来自可用的 Pod 级字段的信息。在 API 层面,一个 Pod 的spec 总是定义了至少一个 Container。你可以使用 resourceFieldRef 传递来自可用的 Container 级字段的信息。
fieldRef 获得的信息对于某些 Pod 级别的字段,你可以将它们作为环境变量或使用 downwardAPI 卷提供给容器。通过这两种机制可用的字段有:
metadata.namemetadata.namespacemetadata.uidmetadata.annotations['<KEY>']<KEY> 的值(例如:metadata.annotations['myannotation'])metadata.labels['<KEY>']<KEY> 的值(例如:metadata.labels['mylabel'])以下信息可以通过环境变量获得,但不能作为 downwardAPI 卷 fieldRef 获得:
spec.serviceAccountNamespec.nodeNamestatus.hostIPstatus.hostIPsstatus.hostIP 的双协议栈版本,第一个 IP 始终与 status.hostIP 相同。status.podIPstatus.podIPsstatus.podIP 的双协议栈版本, 第一个 IP 始终与 status.podIP 相同。以下信息可以通过 downwardAPI 卷 fieldRef 获得,但不能作为环境变量获得:
metadata.labels标签键名="转义后的标签值",每行一个标签metadata.annotations注解键名="转义后的注解值",每行一个注解resourceFieldRef 获得的信息这些容器级别的字段允许你提供关于请求和限制 的资源(如 CPU 和内存)信息。
Kubernetes v1.35 [stable](默认启用)容器的 CPU 和内存资源可以在容器运行时调整大小。如果发生这种情况,Downward API 卷将会被更新,但是环境变量不会被更新,除非容器重启。更多详情请参见调整分配给容器的 CPU 和内存资源。
resource: limits.cpuresource: requests.cpuresource: limits.memoryresource: requests.memoryresource: limits.hugepages-*resource: requests.hugepages-*resource: limits.ephemeral-storageresource: requests.ephemeral-storage如果没有为容器指定 CPU 和内存限制时尝试使用 Downward API 暴露该信息,那么 kubelet 默认会根据节点可分配资源 计算并暴露 CPU 和内存的最大可分配值。
你可以阅读有关 downwardAPI 卷的内容。
你可以尝试使用 Downward API 暴露容器或 Pod 级别的信息: