全部產品
Search
文件中心

Container Service for Kubernetes:通過ElasticQuotaTree與任務隊列提升資源使用率

更新時間:Mar 13, 2025

為了讓不同團隊和任務共用叢集中的計算資源,同時確保資源的合理分配和隔離,您可以基於ack-kube-queue、ElasticQuotaTree和ack-scheduler實現資源的合理、靈活分配。ack-kube-queue能夠管理AI/ML和批處理工作負載的任務隊列;ElasticQuotaTree支援細粒度的資源配額管理;ack-scheduler負責選擇最合適的節點來運行任務。

前提條件

安裝ack-kube-queue組件

通過ElasticQuotaTree提交資源配額

通過在ACK叢集中使用ElasticQuotaTree,可以在限定的資源範圍內高效地安排作業,確保每個團隊充分利用分配資源,避免浪費和競爭。ElasticQuotaTree採用樹形結構,明確每個團隊或個人可使用的資源量或機器數量,在團隊提交對應的作業後,系統會自動檢查該任務作業所屬的資源配額是否足以滿足其需求。只有確保資源配額滿足時, 任務作業才會被分配到相應的計算資源上並開始執行。如果某一資源配額的最低保障無法得到滿足,調度系統將從實際佔用超過其最低保障資源量的其他團隊配額中回收資源來運行任務。

以下圖為例,在某企業中,營運部門、演算法部門的文本團隊和視頻團隊、以及基礎設施部門的測試團隊,分別在各自的命名空間下獲得了不同的CPU、記憶體和GPU資源配額。

ElasticQuotaTree提交資源配額的注意事項及樣本如下。

  • 只有葉子節點可以掛載命名空間,父節點不能掛載。

  • 同一節點Min值小於等於Max值。

  • 父節點Min值必須大於等於對應子節點的Min值之和。

  • 父節點Max值必須大於等於對應任意子節點的Max值。

---
apiVersion: v1
kind: Namespace
metadata:
  name: devops 
---
apiVersion: v1
kind: Namespace
metadata:
  name: text1 
---
apiVersion: v1
kind: Namespace
metadata:
  name: text2 
---
apiVersion: v1
kind: Namespace
metadata:
  name: video 
---
apiVersion: v1
kind: Namespace
metadata:
  name: test1 
---
apiVersion: v1
kind: Namespace
metadata:
  name: test2 
---
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
  name: elasticquotatree # 當前僅支援單一ElasticQuotaTree。
  namespace: kube-system # 只有kube-system下才會生效。
spec:
  root:
    name: root 
    min:       # Min預設值為0,表示沒有保障資源(Guaranteed Resource),但是您依然可以提交作業。
      cpu: 100
      memory: 50Gi
      nvidia.com/gpu: 16
    max:       # Max預設值為NA,表示最大可用的資源數不受限制。
      cpu: 100
      memory: 50Gi
      nvidia.com/gpu: 16
    children:
    - name: devops 
      min:
        cpu: 20
        memory: 10Gi
        nvidia.com/gpu: 4 
      max:
        cpu: 40
        memory: 20Gi
        nvidia.com/gpu: 8 
      namespaces: # 配置對應的Namespace。
      - devops 
    - name: algorithm  
      min:
        cpu: 50
        memory: 25Gi
        nvidia.com/gpu: 10 
      max:
        cpu: 80
        memory: 50Gi
        nvidia.com/gpu: 14 
      children:
      - name: text 
        min:
          cpu: 40
          memory: 15Gi
          nvidia.com/gpu: 8 
        max:
          cpu: 40
          memory: 30Gi
          nvidia.com/gpu: 10 
        namespaces: # 配置對應的Namespace。
        - text1 
        - text2 
      - name: video 
        min:
          cpu: 12
          memory: 12Gi
          nvidia.com/gpu: 2 
        max:
          cpu: 14
          memory: 14Gi
          nvidia.com/gpu: 4 
        namespaces: # 配置對應的Namespace。
        - video 
    - name: infrastructure  
      min:
        cpu: 30
        memory: 15Gi
        nvidia.com/gpu: 2 
      max:
        cpu: 50
        memory: 30Gi
        nvidia.com/gpu: 4 
      children:
      - name: test
        min:
          cpu: 30
          memory: 15Gi
          nvidia.com/gpu: 2 
        max:
          cpu: 50
          memory: 30Gi
          nvidia.com/gpu: 4 
        namespaces: # 配置對應的Namespace。
        - test1 
        - test2

ack-kube-queue管理工作隊列

任務隊列Queue能夠將來自不同部門和團隊的作業分配到相應的隊列。在ElasticQuotaTree提交後,ack-kube-queue會在叢集中自動建立相應的Queue用於任務排隊。每個葉子節點的資源配額映射到叢集中的一個獨立Queue。當作業被提交到叢集時,ack-kube-queue會自動為其建立QueueUnit對象,QueueUnit作為KubeQueue中資源分派的單位,會自動與作業關聯。根據QueueUnit所屬命名空間及其資源配額中的關聯關係,ack-kube-queue會自動將任務分配到相應的隊列中。

以RayJob為例,視頻團隊將video關聯到特定的命名空間,並通過minmax配置資源配額。ack-kube-queue會自動為此配額建立關聯的Queue:root-algorithm-video,後續在video命名空間下提交RayJob對象後,會自動建立對應的QueueUnit資來源物件,並進入root-algorithm-video隊列進行排隊。如果RayJob所請求的資源總量滿足當前的可用配額管理要求,則RayJob會從root-algorithm-video中出隊,並進入調度器邏輯進行處理。

ElasticQuotaTree與Queue自動關聯邏輯

在ack-kube-queue中,有一個控制器邏輯可以自動管理叢集內的隊列資源。這一邏輯會根據ElasticQuotaTree資源來維護,並將ElasticQuotaTree中定義的配額與命名空間的關聯關係映射到相應的隊列上。

Queue隊列操作邏輯

以RayJob為例,當建立一個suspend設定為true的RayJob時,首先會被ack-kube-queue檢測到,並相應建立一個QueueUnit對象。該QueueUnit會在對應的隊列中排隊,按照排隊策略的條件出隊後,ack-kube-queue組件會將該RayJob的suspend欄位設為false。此時,進入KubeRay Operator的調和邏輯,開始建立Pod,最終Pod將進入調度器的調度流程。