本文分享自華為雲社群《Karmada v1.10 - 多叢集宣告式負載重平衡》,作者:雲容器大未來。
Karmada 是開放的多雲多叢集容器編排引擎,旨在幫助使用者在多雲環境下部署和運維業務應用。憑藉相容 Kubernetes 原生 API 的能力,Karmada 可以平滑遷移單叢集工作負載,並且仍可保持與 Kubernetes 周邊生態工具鏈協同。
在最新發布的v1.10版本中,Karmada新增了工作負載重平衡功能:在某些場景下,資源副本的當前分佈狀態可能不是最優,但排程器為了減少對系統的衝擊會盡可能保持排程結果的惰性,不會輕易改變排程結果;此時,使用者可以透過新引入的 WorkloadRebalancer API 針對指定的資源手動觸發全新的重排程,以在叢集間建立最優的副本狀態分佈。
本版本其他新增特性:
-
解除資源模板名稱長度不能超過 63 個字元的限制
- 生產環境中的可用性和可靠性增強
新特性概覽
Workload Rebalance
一般情況下,工作負載類資源一旦被排程,其排程結果通常會保持惰性,不會輕易改變副本分佈狀態。即使透過修改資源模板中的副本數或 PropagationPolicy
的 Placement
來觸發重新排程,系統也只會在必要時進行最小化的調整,以最大程度地減少對系統的影響。
然而,在某些情況下,使用者可能希望能夠主動觸發全新的重排程,完全忽略過去的分配結果,並在叢集之間建立全新的副本分佈狀態,例如:
-
在主備叢集模式下,由於主叢集故障,應用被遷移至備叢集,主叢集恢復後,應用希望重新遷移至主叢集。
-
在應用級別故障遷移場景下,由於叢集資源不足,應用從多個叢集縮減到單個叢集,相應叢集資源充足後,應用希望重新分發到多叢集以確保高可用性。
-
對於聚合排程策略,由於資源限制,副本最初分佈在多個叢集中,當單個叢集足以容納所有副本後,應用希望重新聚合到單叢集。
因此,本版本引入了工作負載重平衡功能,如果當前副本分佈狀態不是最優,使用者可以按需觸發全新的重排程。
例如,使用者想觸發 Deployment/foo
的重排程,只需宣告下述 WorkloadRebalancer
資源:
apiVersion: apps.karmada.io/v1alpha1 kind: WorkloadRebalancer metadata: name: foo-rebalancer spec: workloads: - apiVersion: apps/v1 kind: Deployment name: foo namespace: default
然後,排程器將對該 Deployment
進行重排程。
1)如果成功,您將看到以下結果:
apiVersion: apps.karmada.io/v1alpha1 kind: WorkloadRebalancer metadata: name: foo-rebalancer generation: 1 creationTimestamp: "2024-05-22T11:16:10Z" spec: ... status: finishTime: "2024-05-22T11:16:10Z" observedGeneration: 1 observedWorkloads: - result: Successful workload: apiVersion: apps/v1 kind: Deployment name: foo namespace: default
Deployment/foo
的 ResourceBinding
不存在,您將得到以下結果:apiVersion: apps.karmada.io/v1alpha1 kind: WorkloadRebalancer metadata: name: foo-rebalancer generation: 1 creationTimestamp: "2024-05-22T11:16:10Z" spec: ... status: finishTime: "2024-05-22T11:16:10Z" observedGeneration: 1 observedWorkloads: - reason: ReferencedBindingNotFound result: Failed workload: apiVersion: apps/v1 kind: Deployment name: foo namespace: default
解除資源模板命名長度的限制
由於歷史設計原因,資源模板的名稱被用作 label
的值,從而加速資源的檢索。由於 Kubernetes 限制標籤 value
值不能超過 63 個字元,導致使用者無法將名稱長度超過 63 個字元的資源分發至成員叢集中去,間接限制了資源模板名稱的長度,嚴重阻礙了使用者將工作負載從舊叢集遷移到Karmada。
Karmada社群從 v1.8 版本起著手消除這一限制,並在 v1.8 和 v1.9 版本中做了充足的準備工作,以確保使用舊版本 Karmada 的使用者可以平滑升級到當前新版本,而不用感知這一變化。
更多詳情請參見 [Umbrella] 在資源中使用 permanent-id
替換 namespace/name
標籤:https://github.com/karmada-io/karmada/issues/4711
生產環境中的可用性和可靠性增強
本版本融合了大量生產級使用者的反饋,進行了大量功能性增強以及安全性提升,包括:
1)功能增強:
-
支援分發
kubernetes.io/service-account-token type
的Secret
資源 -
最佳化
PropagationPolicy
降低優先順序時的優先順序搶佔邏輯 -
顯著減少
karmada-metrics-adapter
元件的記憶體使用 -
最佳化了
karmada-webhook
的啟動邏輯,消除了偶現的異常報錯
2)安全增強:
-
將
google.golang.org/protobuf
從 1.31.0 升級到 1.33.0,以解決 CVE-2024-24786 漏洞問題 -
將 Karmada 證書的 RSA 金鑰長度從 2048 升級到 3072,提高秘鑰安全性
-
將
text/template
庫替換為html/template
,增加 HTML 編碼等安全保護功能 -
建立檔案時由預設授予 0666 許可權改為指定授予 0640 許可權,提高檔案安全性
-
採取必要措施以消除安全掃描工具的誤報,如在使用
karmadactl
刪除token
時調整日誌列印內容和消除gosec
警告 G107 等
3)生態整合:
-
為 OpenKruise 中的
CloneSet
資源展示status.labelSelector
,以支援該資源的HPA擴縮容特性 -
在
karmadactl
新增成員叢集時,新增支援 OIDC 認證模式
致謝貢獻者
Karmada v1.10 版本包含了來自32位貢獻者的356次程式碼提交,在此對各位貢獻者表示由衷的感謝:
貢獻者GitHub ID:
參考連結
[1]Release Notes:https://github.com/karmada-io/karmada/releases/tag/v1.10.0
[2]WorkloadRebalancer 指南:https://karmada.io/zh/docs/userguide/scheduling/workload-rebalancer
[3]WorkloadRebalancer 示例教程:https://karmada.io/zh/docs/tutorials/workload-rebalancer
[4]Karmada 1.10升級文件:https://karmada.io/docs/administrator/upgrading/v1.9-v1.10
點選關注,第一時間瞭解華為雲新鮮技術~