本文已超過一年。較舊的文章可能包含過時的內容。檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.26:裝置管理器正式 GA
裝置外掛程式框架在 Kubernetes v1.8 版本中作為供應商獨立框架引入,以實現外部裝置的探索、宣告和分配,而無需修改核心 Kubernetes。此功能在 v1.10 中升級為 Beta 版。隨著最近 Kubernetes v1.26 的發布,裝置管理器現在已正式發布 (GA)。
在 kubelet 內,裝置管理器透過 Unix socket 使用 gRPC 促進與裝置外掛程式的通訊。裝置管理器和裝置外掛程式都充當 gRPC 伺服器和用戶端,分別服務和連接到公開的 gRPC 服務。裝置外掛程式提供 kubelet 連接的 gRPC 服務,用於裝置探索、宣告(作為擴展資源)和分配。裝置管理器連接到 kubelet 提供的 Registration
gRPC 服務,以向 kubelet 註冊自身。
請參閱文件,以取得關於 Pod 如何請求裝置外掛程式向叢集公開的裝置的範例。
以下是一些裝置外掛程式的範例實作
- AMD GPU 裝置外掛程式
- 適用於 Kubernetes 的 Intel 裝置外掛程式集合
- 適用於 Kubernetes 的 NVIDIA 裝置外掛程式
- 適用於 Kubernetes 的 SRIOV 網路裝置外掛程式
裝置外掛程式框架引入以來值得注意的發展
Kubelet API 已移至 kubelet staging repo
外部面向的 deviceplugin
API 套件已從 k8s.io/kubernetes/pkg/kubelet/apis/
移至 v1.17 中的 k8s.io/kubelet/pkg/apis/
。有關此變更背後的理由的更多詳細資訊,請參閱 Move external facing kubelet apis to staging。
裝置外掛程式 API 更新
引入了額外的 gRPC 端點
GetDevicePluginOptions
由裝置外掛程式使用,以向DeviceManager
傳達選項,以指示是否支援PreStartContainer
、GetPreferredAllocation
或其他未來的可選呼叫,並且可以在將裝置提供給容器之前呼叫。GetPreferredAllocation
允許裝置外掛程式將分配偏好轉發到DeviceManager
,以便它可以將此資訊納入其分配決策中。DeviceManager
將在 Pod 准入時呼叫外掛程式,要求從可用裝置清單中優先分配給定大小的裝置,以便做出更明智的決策。例如,指定裝置間約束以指示在將裝置分配給容器時優先考慮最佳連接的裝置集。- 如果在註冊階段由裝置外掛程式指示,則在每個容器啟動之前呼叫
PreStartContainer
。它允許裝置外掛程式對請求的裝置執行裝置特定的操作。例如,在容器開始執行之前重新配置或重新編程 FPGA。
引入這些變更的 Pull Request 在此處
透過引入上述端點,kubelet 中裝置管理器和裝置管理器之間的互動可以如下所示
裝置外掛程式框架概述
裝置外掛程式註冊程序的語義變更
裝置外掛程式程式碼已重構,以在 devicemanager
套件下分離出 'plugin' 套件,為引入 v1beta2
裝置外掛程式 API 奠定基礎。這將允許在 devicemanager
中新增支援,以同時服務多個裝置外掛程式 API。
透過此重構工作,裝置外掛程式現在必須先啟動其 gRPC 服務,然後再向 kubelet 註冊自身。以前,這兩個操作是非同步的,裝置外掛程式可以在啟動其 gRPC 伺服器之前註冊自身,但現在已不再如此。有關更多詳細資訊,請參閱 PR #109016 和 Issue #112395。
動態資源分配
在 Kubernetes 1.26 中,受到 持久卷 在 Kubernetes 中的處理方式的啟發,引入了 動態資源分配,以滿足對裝置具有更複雜資源需求的需求,例如
- 將裝置初始化和分配與 Pod 生命周期分離。
- 促進容器和 Pod 之間裝置的動態共享。
- 支援自訂資源特定參數
- 啟用資源特定的設定和清理動作
- 啟用對網路連接資源(而不僅僅是節點本機資源)的支援
裝置外掛程式 API 現在穩定嗎?
不,裝置外掛程式 API 仍然不穩定;可用的最新裝置外掛程式 API 版本是 v1beta1
。社群中有計畫引入 v1beta2
API,以便一次服務多個外掛程式 API。每個 API 呼叫以及請求/回應類型將允許新增對較新 API 版本的支援,而無需明確地提升 API。
除此之外,社群中還有現有的提案,要引入其他端點 KEP-3162:將 Deallocate 和 PostStopContainer 新增至裝置管理器 API。