Volcano社群新版本釋出!7大功能全面增強佇列能力與排程穩定性

华为云开发者联盟發表於2024-05-24

本文分享自華為雲社群《Volcano 社群 v1.9.0 版本正式釋出!全面增強佇列能力與排程穩定性》,作者:雲容器大未來。

北京時間2024年5月21日,Volcano社群v1.9.0版本正式釋出,此次版本增加了以下新特性:

  • 支援彈性佇列容量capacity排程
  • 支援佇列與節點間的親和排程
  • Volcano支援Kubernetes v1.29
  • GPU共享支援節點打分排程
  • 增強scheduler metrics指標
  • 新增License合規性檢查
  • 提升排程穩定性

Volcano是業界首個雲原生批次計算專案,於2019年6月在上海 KubeCon 正式開源,並在2020年4月成為 CNCF 官方專案。2022年4月,Volcano 正式晉級為CNCF 孵化專案。Volcano 社群開源以來,受到眾多開發者、合作伙伴和使用者的認可和支援。截至目前,累計有600+全球開發者參與社群貢獻。

volcano.png

支援彈性佇列容量capacity排程

Volcano現在使用proportion外掛來進行佇列管理,使用者可以設定佇列的guarantee、capability等欄位來設定佇列的預留資源和容量上限。並透過設定佇列的weight值來實現叢集內的資源共享,佇列按照weight值按比例劃分叢集資源,但這種佇列管理方式存在以下問題:

  • 佇列劃分的資源容量透過權重體現,不夠直觀。
  • 佇列內的所有資源使用相同的比例進行劃分,不能為佇列的每一維資源單獨設定容量。

基於以上考慮,Volcano實現了新的佇列彈性容量管理能力,它支援:

  • 使用者可以直接為佇列設定每一維度資源的容量,而不是設定weigh值來實現。
  • 基於deserved的佇列彈性容量排程,支援佇列的資源共享和回收。

比如在AI大模型訓練中分別為佇列中不同的GPU型號如A100和V100,設定不同的資源容量。同時在叢集資源空閒時,佇列可以複用其他空閒佇列的資源,並在需要時進行資源回收,直到回收到使用者為佇列設定的資源容量為止,即應得資源量deserved,從而實現彈性容量能力。

使用改功能時需要設定佇列的deserved欄位,為每一維資源設定應得資源量。同時需要在排程配置中開啟capacity外掛,並關閉proportion外掛。

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: demo-queue
spec:
  reclaimable: true
  deserved: # set the deserved field.
    cpu: 64
    memeory: 128Gi
    nvidia.com/a100: 40
    nvidia.com/v100: 80

佇列彈性容量排程的完整使用例子,請參考:How to use capacity plugin[1]

關於彈性佇列容量設計文件,請參考Capacity scheduling Design[2]

支援佇列與節點間的親和排程

佇列通常關聯著公司內的部門,而不同部門通常需要使用不同的異構資源型別,比如大模型訓練團隊需要使用NIVDIA的Tesla GPU,而推薦團隊需要使用AMD的GPU,當使用者提交作業到佇列時,需要根據佇列的屬性將作業自動排程到對應資源型別的節點上。

為此Volcano實現了佇列和節點的親和排程能力,使用者只需在佇列的affinity欄位設定需要親和的節點標籤,Volcano會自動將提交到當前佇列的作業排程到佇列關聯的節點上,使用者無需單獨設定作業的親和性,而只需統一設定佇列的親和性,提交到佇列的作業都會根據佇列與節點的親和性將作業排程到對應的節點。

該特性同時支援硬親和、軟親和、反親和排程,使用時需要為節點設定key為volcano.sh/nodegroup-name的標籤,然後設定佇列的affinity欄位,指定硬親和、軟親和和反親和的標籤值。例如如下的佇列設定,表示提交到該佇列的作業需要排程到標籤值為groupname1和groupname2的節點,並優先排程到標籤值為groupname2的節點,同時,作業不能調到到標籤值為groupname3和groupname4的節點,當資源不足時則也可以排程到標籤值為groupname3的節點上。

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: default
  spec:
    reclaimable: true
    weight: 1
    affinity:            # added field
      nodeGroupAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - <groupname1>
        - <groupname2>    
        preferredDuringSchedulingIgnoredDuringExecution:
        - <groupname1>
      nodeGroupAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - <groupname3>
        - <gropuname4>
        preferredDuringSchedulingIgnoredDuringExecution:
        - <groupname3>

該功能對應的排程外掛名為nodegroup,完整使用例子請參考:How to use nodegroup plugin[3]

詳細設計文件請參考:The nodegroup design[4]

GPU共享功能支援節點打分排程

GPU共享是Volcano v1.8版本推出的GPU共享與隔離方案,提供GPU共享、裝置視訊記憶體控制能力,以提升AI訓練推理場景下GPU資源利用率低的問題。v1.9在該功能基礎上新增了對GPU節點打分的策略,從而可以在作業分配時選擇最優的節點,進一步提升資源利用率,使用者可以設定不同的打分策略。目前支援以下兩種策略:

  • Binpack:提供GPU卡粒度的binpack演算法,優先把一個節點上的已經分配了資源的GPU卡佔滿,避免資源碎片和浪費。

  • Spread:優先使用空閒的GPU卡而不是已經分配了資源的共享卡。

詳細使用文件請參考:How to use gpu sharing[5]

Volcano支援Kubernetes v1.29

Volcano版本緊跟Kubernetes社群版本節奏,對Kubernetes的每個大的基數版本都進行支援,目前最新支援的版本為v1.29,並執行了完整的UT、E2E用例,保證功能和可靠性。如果您想參與Volcano適配Kubernetes新版本的開發工作,請參考:https://github.com/volcano-sh/volcano/pull/3459 進行社群貢獻。

增強scheduler metrics指標

Volcano使用了client-go客戶端和Kubernetes互動,儘管客戶端可以設定QPS來避免請求被限流,但是客戶端實際使用的QPS到底達到了多少卻很難觀察到,為了實時觀測到客戶端請求的頻率,Volcano新增了client-go客戶端的metrics指標,使用者可以透過訪問metrics介面,檢視GET、POST等請求在每秒鐘的請求數量,從而確定每秒鐘實際使用的QPS,以此決定是否需要調整客戶端設定的QPS。同時client-go的相關指標還包括客戶端證書輪轉週期統計、每個請求的response size統計等。

使用者可以使用curl http://$volcano_scheduler_pod_ip:8080/metrics 來獲取volcano scheduler的所有詳細指標。

詳細PR見:[feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com)[6]

新增License合規性檢查

為了增強Volcano社群開源license合規治理規範,避免引入傳染性開源協議,規避潛在風險,Volcano社群引入了開源license合規檢查工具,所謂傳染性協議指的是使用了該協議作為開源許可的軟體在修改、使用、複製之後生成的衍生作品,也必須以該協議進行開源。開發者提交的PR會引入的三庫如果包含了傳染性開源協議比如GPL,LGPL等,CI門禁會進行攔截,開發者需要將三方庫替換為松自由軟體許可協議比如MIT、Apache 2.0,BSD等,以透過開源license合規檢查。

提升排程穩定性

Volcano v1.9.0版本在搶佔、排程失敗重試、避免記憶體洩露、安全性增強等方面做了較多最佳化,具體內容包括:

致謝貢獻者

Volcano 1.9.0 版本包含了來自多位社群貢獻者的程式碼提交,在此對各位貢獻者表示由衷的感謝:

貢獻者GitHub ID

Volcano社群新版本釋出!7大功能全面增強佇列能力與排程穩定性
參考資料:

[1] How to use capacity plugin:

https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_capacity_plugin.md

[2] Capacity scheduling Design:

https://github.com/volcano-sh/volcano/blob/master/docs/design/capacity-scheduling.md

[3] How to use nodegroup plugin:

https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_nodegroup_plugin.md

[4] The nodegroup design:

https://github.com/volcano-sh/volcano/blob/master/docs/design/node-group.md

[5] How to use gpu sharing:

https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_gpu_sharing.md

[6] [feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3274

[7] [cherry-pick for release-1.9]fix PodGroup being incorrectly deleted due to frequent creation and deletion of pods by guoqinwill · Pull Request #3376 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3376

[8] ignore PredicateFn err info for preempt & reclaim scheduler plugin by LivingCcj · Pull Request #3458 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3458

[9] fix errTask channel memory leak by bibibox · Pull Request #3435 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3435

[10] Fix queue metrics when there are no jobs in it by Monokaix · Pull Request #3463 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3463

[11] Remove list secret in controller ClusterRole by lekaf974 · Pull Request #3449 · volcano-sh/volcano (github.com):

https://github.com/volcano-sh/volcano/pull/3449

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章