Downward API

有兩種方法可以將 Pod 和容器欄位暴露給正在執行的容器:環境變數,以及透過特殊卷型別填充的檔案。這兩種暴露 Pod 和容器欄位的方式合稱為 Downward API。

有時,容器需要了解自身資訊,而又不想過度耦合 Kubernetes。Downward API 允許容器使用關於自身或叢集的資訊,而無需使用 Kubernetes 客戶端或 API 伺服器。

一個例子是,現有應用程式假定某個知名的環境變數包含一個唯一識別符號。一種可能性是封裝應用程式,但這既繁瑣又容易出錯,並且違反了低耦合的目標。更好的選擇是使用 Pod 的名稱作為識別符號,並將 Pod 的名稱注入到知名的環境變數中。

在 Kubernetes 中,有兩種方法可以將 Pod 和容器欄位暴露給正在執行的容器:

這兩種暴露 Pod 和容器欄位的方式合稱為 **Downward API**。

可用欄位

Downward API 只能暴露部分 Kubernetes 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 的節點的主 IP 地址
status.hostIPs
`status.hostIP` 的雙棧版本,第一個 IP 總是與 `status.hostIP` 相同。
status.podIP
Pod 的主 IP 地址(通常是其 IPv4 地址)
status.podIPs
`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 和記憶體等資源的請求和限制資訊。

resource: limits.cpu
容器的 CPU 限制
resource: requests.cpu
容器的 CPU 請求
resource: limits.memory
容器的記憶體限制
resource: requests.memory
容器的記憶體請求
resource: limits.hugepages-*
容器的巨頁限制
resource: requests.hugepages-*
容器的巨頁請求
resource: limits.ephemeral-storage
容器的臨時儲存限制
resource: requests.ephemeral-storage
容器的臨時儲存請求

資源限制的備用資訊

如果未為容器指定 CPU 和記憶體限制,並且你使用 Downward API 嘗試暴露該資訊,則 kubelet 預設基於節點可分配計算暴露 CPU 和記憶體的最大可分配值。

下一步

你可以閱讀有關`downwardAPI` 卷的資訊。

你可以嘗試使用 Downward API 暴露容器級或 Pod 級資訊

上次修改時間:2025 年 4 月 7 日上午 9:46 (PST):更新 v1.33 beta 的 InPlacePodVerticalScaling 文件 (#50290) (c014f72fbb)