叢集管理員動態資源分配最佳實踐

本頁面描述了配置使用動態資源分配 (DRA) 的 Kubernetes 叢集時的最佳實踐。這些說明適用於叢集管理員。

DRA 透過多種不同的 API 進行協調。根據使用者的角色,使用授權工具(如 RBAC 或其他解決方案)來控制對正確 API 的訪問。

通常,DeviceClasses 和 ResourceSlices 應僅限於管理員和 DRA 驅動程式。將使用宣告部署 Pod 的叢集操作員將需要訪問 ResourceClaim 和 ResourceClaimTemplate API;這兩個 API 都是名稱空間範圍的。

DRA 驅動程式的部署和維護

DRA 驅動程式是第三方應用程式,執行在叢集的每個節點上,用於與該節點的硬體和 Kubernetes 的原生 DRA 元件進行介面。安裝過程取決於你選擇的驅動程式,但很可能作為 DaemonSet 部署到叢集中的所有節點或選定節點(使用節點選擇器或類似機制)。

如果可能,請使用無縫升級的驅動程式

DRA 驅動程式實現了 kubeletplugin 包介面。你的驅動程式可能支援**無縫升級**,透過實現此介面的一個屬性,允許同一 DRA 驅動程式的兩個版本在短時間內共存。這僅適用於 kubelet 1.33 及更高版本,並且你的驅動程式可能不支援執行舊版本 Kubernetes 的異構叢集中的附加節點——請查閱你的驅動程式文件以確保。

如果你的情況支援無縫升級,請考慮使用它來最大程度地減少驅動程式更新時的排程延遲。

如果你無法使用無縫升級,在驅動程序升級停機期間,你可能會觀察到:

  • Pods 無法啟動,除非它們所依賴的宣告已準備好使用。
  • 在使用宣告的最後一個 Pod 終止後,清理工作會延遲,直到驅動程式再次可用。該 Pod 未被標記為已終止。這會阻止將 Pod 使用的資源重新用於其他 Pod。
  • 正在執行的 Pod 將繼續執行。

確認您的 DRA 驅動程式暴露了存活探針並加以利用

您的 DRA 驅動程式很可能實現了 gRPC 套接字用於健康檢查,這是 DRA 驅動程式的良好實踐的一部分。利用此 gRPC 套接字的最簡單方法是將其配置為部署 DRA 驅動程式的 DaemonSet 的存活探針。您的驅動程式的文件或部署工具可能已經包含了這一點,但如果您是單獨構建配置或未將 DRA 驅動程式作為 Kubernetes Pod 執行,請確保您的編排工具在健康檢查此 gRPC 套接字失敗時重啟 DRA 驅動程式。這樣做將最大程度地減少 DRA 驅動程式的意外停機時間,併為其提供更多自愈機會,從而減少排程延遲或故障排除時間。

在排空節點時,應儘可能晚地排空 DRA 驅動程式

DRA 驅動程式負責取消準備分配給 Pod 的任何裝置,如果 DRA 驅動程式在包含宣告的 Pod 被刪除之前排空,它將無法完成其清理工作。如果您為節點實現了自定義排空邏輯,請考慮在終止 DRA 驅動程式本身之前檢查是否存在已分配/保留的 ResourceClaim 或 ResourceClaimTemplates。

監控和調整元件以應對更高的負載,尤其是在大規模環境中

控制面元件 kube-scheduler 和由元件 kube-controller-manager 協調的內部 ResourceClaim 控制器在排程帶有宣告的 Pod 時,根據儲存在 DRA API 中的元資料執行繁重的工作。與非 DRA 排程的 Pod 相比,使用 DRA 宣告的 Pod 對這些元件所需的 API 伺服器呼叫次數、記憶體和 CPU 利用率都有所增加。此外,DRA 驅動程式和 kubelet 等節點本地元件利用 DRA API 在 Pod 沙箱建立時分配硬體請求。特別是在叢集節點眾多、或部署大量頻繁使用 DRA 定義的資源宣告的工作負載的大規模環境中,叢集管理員應配置相關元件以應對增加的負載。

元件調優不當可能會導致直接或連鎖效應,從而在 Pod 生命週期中產生不同的症狀。如果 `kube-scheduler` 元件的 QPS 和 Burst 配置過低,排程器可能會快速為 Pod 識別合適的節點,但需要更長時間才能將 Pod 繫結到該節點。對於 DRA,在 Pod 排程期間,`kube-controller-manager` 中 client-go 配置的 QPS 和 Burst 引數至關重要。

調整叢集的具體值取決於多種因素,例如節點/Pod 數量、Pod 建立速率、變更率,即使在非 DRA 環境中也是如此;有關更多資訊,請參閱 SIG 可伸縮性 README 中關於 Kubernetes 可伸縮性閾值。在對啟用 DRA 的 100 節點叢集進行的規模測試中,涉及 720 個長期執行的 Pod(90% 飽和度)和 80 個變更 Pod(10% 變更,10 次),作業建立 QPS 為 10,`kube-controller-manager` QPS 可以低至 75,Burst 可以低至 150,以滿足非 DRA 部署的等效指標目標。在此下限,觀察到客戶端限速器被觸發足以保護 API 伺服器免受爆發式流量影響,同時又足夠高,使得 Pod 啟動 SLO 不受影響。雖然這是一個很好的起點,但您可以透過監控以下指標,更好地瞭解如何調整對部署中 DRA 效能影響最大的不同元件。有關 Kubernetes 中所有穩定指標的更多資訊,請參閱 Kubernetes Metrics Reference

kube-controller-manager 指標

以下指標密切關注由 `kube-controller-manager` 元件管理的內部 ResourceClaim 控制器。

  • 工作佇列新增速率:監控 sum(rate(workqueue_adds_total{name="resource_claim"}[5m])) 以衡量向 ResourceClaim 控制器新增專案的速度。
  • 工作佇列深度:跟蹤 sum(workqueue_depth{endpoint="kube-controller-manager", name="resource_claim"}) 以識別 ResourceClaim 控制器中的任何積壓。
  • 工作佇列工作時長:觀察 histogram_quantile(0.99, sum(rate(workqueue_work_duration_seconds_bucket{name="resource_claim"}[5m])) by (le)) 以瞭解 ResourceClaim 控制器處理工作的速度。

如果您遇到工作佇列新增速率低、工作佇列深度高和/或工作佇列工作時長高的情況,這表明控制器效能不佳。請考慮調整 QPS、突發和 CPU/記憶體配置等引數。

如果您遇到工作佇列新增速率高、工作佇列深度高,但工作佇列工作時長合理的情況,這表明控制器正在處理工作,但併發性可能不足。併發性在控制器中是硬編碼的,因此作為叢集管理員,您可以透過降低 Pod 建立 QPS 來進行調整,從而使資源宣告工作佇列的新增速率更易於管理。

kube-scheduler 指標

以下排程器指標是聚合所有已排程 Pod(不僅僅是使用 DRA 的 Pod)效能的高階指標。需要注意的是,端到端指標最終會受到 `kube-controller-manager` 在大量使用 ResourceClaimTemplates 的部署中建立 ResourceClaim 的效能的影響。

  • 排程器端到端時長:監控 histogram_quantile(0.99, sum(increase(scheduler_pod_scheduling_sli_duration_seconds_bucket[5m])) by (le))
  • 排程器演算法延遲:跟蹤 histogram_quantile(0.99, sum(increase(scheduler_scheduling_algorithm_duration_seconds_bucket[5m])) by (le))

kubelet 指標

當繫結到節點的 Pod 必須滿足 ResourceClaim 時,kubelet 會呼叫 DRA 驅動程式的 `NodePrepareResources` 和 `NodeUnprepareResources` 方法。您可以透過 kubelet 的視角使用以下指標觀察此行為。

  • Kubelet NodePrepareResources:監控 histogram_quantile(0.99, sum(rate(dra_operations_duration_seconds_bucket{operation_name="PrepareResources"}[5m])) by (le))
  • Kubelet NodeUnprepareResources:跟蹤 histogram_quantile(0.99, sum(rate(dra_operations_duration_seconds_bucket{operation_name="UnprepareResources"}[5m])) by (le))

DRA kubeletplugin 操作

DRA 驅動程式實現了 kubeletplugin 包介面,該介面為底層的 gRPC 操作 `NodePrepareResources` 和 `NodeUnprepareResources` 提供了自己的指標。您可以透過內部 kubeletplugin 的角度使用以下指標觀察此行為。

  • DRA kubeletplugin gRPC NodePrepareResources 操作:觀察 histogram_quantile(0.99, sum(rate(dra_grpc_operations_duration_seconds_bucket{method_name=~".*NodePrepareResources"}[5m])) by (le))
  • DRA kubeletplugin gRPC NodeUnprepareResources 操作:觀察 histogram_quantile(0.99, sum(rate(dra_grpc_operations_duration_seconds_bucket{method_name=~".*NodeUnprepareResources"}[5m])) by (le))

下一步

上次修改時間為 2025 年 8 月 8 日上午 6:20 PST:格式化 (9382890f70)