对于容器来说,在不与 Kubernetes 过度耦合的情况下,拥有关于自身的信息有时是很有用的。 Downward API 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下获得自己或集群的信息。
例如,现有应用程序假设某特定的周知的环境变量是存在的,其中包含唯一标识符。 一种方法是对应用程序进行封装,但这很繁琐且容易出错,并且违背了低耦合的目标。 更好的选择是使用 Pod 名称作为标识符,并将 Pod 名称注入到周知的环境变量中。
在 Kubernetes 中,有两种方法可以将 Pod 和容器字段暴露给运行中的容器:
downwardAPI 卷中的文件这两种暴露 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 级别的信息:
downwardAPI 卷中的文件