Downward API
有时,容器拥有关于自身的信息而不与 Kubernetes 过度耦合是很有用的。*下行 API* 允许容器在不使用 Kubernetes 客户端或 API 服务器的情况下使用关于自身或集群的信息。
一个例子是现有应用程序,它假设一个特定的众所周知的环境变量保存着唯一的标识符。一种可能性是包装应用程序,但这既乏味又容易出错,并且违反了低耦合的目标。 更好的选择是将 Pod 的名称用作标识符,并将 Pod 的名称注入到众所周知的环境变量中。
在 Kubernetes 中,有两种方式将 Pod 和容器字段暴露给正在运行的容器:
这两种暴露 Pod 和容器字段的方式合称为 *下行 API*。
可用的字段
只有一些 Kubernetes API 字段可以通过下行 API 使用。本节列出了您可以使其可用的字段。
您可以使用 fieldRef
从可用的 Pod 级字段传递信息。 在 API 级别,Pod 的 spec
始终定义至少一个 Container。 您可以使用 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 的节点的主要 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-*
- 容器的 hugepages 限制
resource: requests.hugepages-*
- 容器的 hugepages 请求
resource: limits.ephemeral-storage
- 容器的临时存储限制
resource: requests.ephemeral-storage
- 容器的临时存储请求
资源限制的后备信息
如果未为容器指定 CPU 和内存限制,并且您使用下行 API 尝试暴露该信息,则 kubelet 默认会暴露基于节点可分配量计算的 CPU 和内存的最大可分配值。
下一步
您可以阅读关于 downwardAPI
卷的信息。
您可以尝试使用下行 API 来暴露容器级或 Pod 级信息