本文已超過一年。較舊的文章可能包含過時的內容。檢查頁面中的資訊自發布以來是否已變得不正確。

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 如何請求裝置外掛程式向叢集公開的裝置的範例

以下是一些裝置外掛程式的範例實作

裝置外掛程式框架引入以來值得注意的發展

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 端點

  1. GetDevicePluginOptions 由裝置外掛程式使用,以向 DeviceManager 傳達選項,以指示是否支援 PreStartContainerGetPreferredAllocation 或其他未來的可選呼叫,並且可以在將裝置提供給容器之前呼叫。
  2. GetPreferredAllocation 允許裝置外掛程式將分配偏好轉發到 DeviceManager,以便它可以將此資訊納入其分配決策中。DeviceManager 將在 Pod 准入時呼叫外掛程式,要求從可用裝置清單中優先分配給定大小的裝置,以便做出更明智的決策。例如,指定裝置間約束以指示在將裝置分配給容器時優先考慮最佳連接的裝置集。
  3. 如果在註冊階段由裝置外掛程式指示,則在每個容器啟動之前呼叫 PreStartContainer。它允許裝置外掛程式對請求的裝置執行裝置特定的操作。例如,在容器開始執行之前重新配置或重新編程 FPGA。

引入這些變更的 Pull Request 在此處

  1. 如果外掛程式需要,則在容器啟動之前調用 preStart RPC 呼叫
  2. 將 GetPreferredAllocation() 呼叫新增至 v1beta1 裝置外掛程式 API

透過引入上述端點,kubelet 中裝置管理器和裝置管理器之間的互動可以如下所示

Representation of the Device Plugin framework showing the relationship between the kubelet and a device plugin

裝置外掛程式框架概述

裝置外掛程式註冊程序的語義變更

裝置外掛程式程式碼已重構,以在 devicemanager 套件下分離出 'plugin' 套件,為引入 v1beta2 裝置外掛程式 API 奠定基礎。這將允許在 devicemanager 中新增支援,以同時服務多個裝置外掛程式 API。

透過此重構工作,裝置外掛程式現在必須先啟動其 gRPC 服務,然後再向 kubelet 註冊自身。以前,這兩個操作是非同步的,裝置外掛程式可以在啟動其 gRPC 伺服器之前註冊自身,但現在已不再如此。有關更多詳細資訊,請參閱 PR #109016Issue #112395

動態資源分配

在 Kubernetes 1.26 中,受到 持久卷 在 Kubernetes 中的處理方式的啟發,引入了 動態資源分配,以滿足對裝置具有更複雜資源需求的需求,例如

  1. 將裝置初始化和分配與 Pod 生命周期分離。
  2. 促進容器和 Pod 之間裝置的動態共享。
  3. 支援自訂資源特定參數
  4. 啟用資源特定的設定和清理動作
  5. 啟用對網路連接資源(而不僅僅是節點本機資源)的支援

裝置外掛程式 API 現在穩定嗎?

不,裝置外掛程式 API 仍然不穩定;可用的最新裝置外掛程式 API 版本是 v1beta1。社群中有計畫引入 v1beta2 API,以便一次服務多個外掛程式 API。每個 API 呼叫以及請求/回應類型將允許新增對較新 API 版本的支援,而無需明確地提升 API。

除此之外,社群中還有現有的提案,要引入其他端點 KEP-3162:將 Deallocate 和 PostStopContainer 新增至裝置管理器 API