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 和記憶體等資源的請求和限制資訊。
注意
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-*
- 容器的巨頁限制
resource: requests.hugepages-*
- 容器的巨頁請求
resource: limits.ephemeral-storage
- 容器的臨時儲存限制
resource: requests.ephemeral-storage
- 容器的臨時儲存請求
資源限制的備用資訊
如果未為容器指定 CPU 和記憶體限制,並且你使用 Downward API 嘗試暴露該資訊,則 kubelet 預設基於節點可分配計算暴露 CPU 和記憶體的最大可分配值。
下一步
你可以閱讀有關`downwardAPI` 卷的資訊。
你可以嘗試使用 Downward API 暴露容器級或 Pod 級資訊