Kubernetes v1.33:可變的 CSI 節點可分配計數

有狀態應用的可靠排程在很大程度上依賴於節點上資源可用性的準確資訊。Kubernetes v1.33 引入了一個名為“可變的 CSI 節點可分配計數”(mutable CSI node allocatable count)的 Alpha 特性,允許容器儲存介面(CSI)驅動程式動態更新節點可處理的卷數量上限報告。這一功能顯著提高了 Pod 排程決策的準確性,並減少了因過時的卷容量資訊而導致的排程失敗。

背景

傳統上,Kubernetes CSI 驅動程式在初始化時報告一個靜態的最大卷掛載限制。然而,在節點的生命週期中,實際的掛載容量可能會因各種原因發生變化,例如:

  • 手動或外部操作在 Kubernetes 控制之外掛載/解除安裝卷。
  • 動態掛載的網路介面或專用硬體(如 GPU、NIC 等)佔用了可用插槽。
  • 多驅動程式場景,其中一個 CSI 驅動程式的操作影響了另一個驅動程式報告的可用容量。

靜態報告可能導致 Kubernetes 將 Pod 排程到看起來有容量但實際上沒有的節點上,從而導致 Pod 卡在 ContainerCreating 狀態。

動態調整 CSI 卷限制

透過新的特性門控 MutableCSINodeAllocatableCount,Kubernetes 使 CSI 驅動程式能夠在執行時動態調整和報告節點掛載容量。這確保了排程器能夠獲得關於節點容量的最準確、最新的檢視。

工作原理

啟用此特性後,Kubernetes 支援兩種機制來更新報告的節點卷限制:

  • 定期更新: CSI 驅動程式指定一個時間間隔來定期重新整理節點的可分配容量。
  • 反應式更新: 當卷掛載因資源耗盡(ResourceExhausted 錯誤)而失敗時觸發立即更新。

啟用該特性

要使用此 Alpha 特性,您必須在以下元件中啟用 MutableCSINodeAllocatableCount 特性門控:

  • kube-apiserver
  • kubelet

CSI 驅動程式配置示例

以下是配置 CSI 驅動程式以啟用每 60 秒定期更新的示例:

apiVersion: storage.k8s.io/v1
kind: CSIDriver
metadata:
  name: example.csi.k8s.io
spec:
  nodeAllocatableUpdatePeriodSeconds: 60

此配置指示 Kubelet 每 60 秒定期呼叫 CSI 驅動程式的 NodeGetInfo 方法,以更新節點的可分配卷計數。為了在準確性和資源使用之間取得平衡,Kubernetes 強制執行了 10 秒的最小更新間隔。

掛載失敗時立即更新

除了定期更新外,Kubernetes 現在還會對掛載失敗做出反應。具體來說,如果卷掛載失敗並返回 ResourceExhausted 錯誤(gRPC 程式碼 8),則會觸發立即更新,以迅速糾正可分配計數。

這種主動糾正措施可防止重複的排程錯誤,並有助於維護叢集的健康狀況。

開始使用

要在您的 Kubernetes v1.33 叢集中試用“可變的 CSI 節點可分配計數”特性:

  1. kube-apiserverkubelet 元件上啟用 MutableCSINodeAllocatableCount 特性門控。
  2. 透過設定 nodeAllocatableUpdatePeriodSeconds 來更新您的 CSI 驅動程式配置。
  3. 監控並觀察排程準確性和 Pod 放置可靠性的改善。

後續步驟

此特性目前處於 Alpha 階段,Kubernetes 社群歡迎您的反饋。請測試它,分享您的經驗,並幫助指導其向 Beta 和正式釋出(GA)版本的穩定性演進。

歡迎加入 Kubernetes 儲存特別興趣小組(SIG-Storage)的討論,共同塑造 Kubernetes 儲存能力的未來。