全部產品
Search
文件中心

Container Compute Service:自訂資源優先順序調度

更新時間:Aug 22, 2025

阿里雲容器計算服務ACS支援在Pod標籤中聲明使用計算類型(compute-class)和算力品質(compute-qos)。由於不同類型執行個體的庫存是在動態變化的,可能會因為資產庫存等因素導致某種類型的執行個體無法建立。通過自訂資源優先順序調度,您可以為Pod同時指定多種計算類型或算力品質,調度器將按先後順序依次嘗試建立對應類型的Pod執行個體,並通過Pod deletion cost機制控制應用的逆序縮容。本文介紹如何在ACS叢集中使用自訂資源優先順序調度。

前提條件

  • 已安裝調度器組件kube-scheduler,且版本滿足以下要求。

    ACS叢集版本

    調度器組件版本

    1.31

    v1.31.0-aliyun-1.2.0及以上

    1.30

    v1.30.3-aliyun-1.1.1及以上

    1.28

    v1.28.9-aliyun-1.1.0及以上

  • 已安裝acs-virtual-node組件,版本為v2.12.0-acs.4或以上。

注意事項

  • 自訂資源優先順序調度支援的計算類型,請參見計算類型定義

  • ACS自訂資源優先順序調度基於Kubernetes社區提供的Pod deletion cost功能控制Pod執行個體縮容順序。Pod deletion cost代表了刪除開銷,通常值越小表示會被優先縮容,事實上縮容演算法會考慮多種因素,這取決於應用控制器的具體實現。需要注意的是,若您在建立Pod時已經填寫了controller.kubernetes.io/pod-deletion-cost註解,它的值會被ACS自訂資源優先順序調度策略覆蓋。

警告

請勿在工作負載的標籤選取器(如Deployment的spec.selector.matchLabels)中使用系統保留標籤(如alibabacloud.com/compute-classalibabacloud.com/compute-qos)。這些標籤可能在自訂優先順序調度期間被系統修改,導致控制器頻繁重建Pod,影響應用穩定性。

使用方式

ACS叢集以虛擬節點的形式提供資源。Pod的資源屬性主要包括可用性區域、計算類型和算力品質。為此,ACS定義了ResourcePolicy調度策略,支援在配置中通過spec.selector標記一類Pod,並同時配置多種資源屬性。調度器將在資產庫存不足時,按照配置順序建立其他類型的執行個體。ResourcePolicy調度策略使用方式如下。

  1. 建立ResourcePolicy調度策略。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: rp-demo
      namespace: default
    spec:
      selector: # 在selector中標記Pod,表示帶有app=stress標籤的Pod將遵循此調度策略
        app: stress
      units: # 在units中定義調度順序
      - resource: acs # 優先申請best-effort類型的資源
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs # 前者庫存不足時,申請default類型的資源
        podLabels:
            alibabacloud.com/compute-class: general-purpose
            alibabacloud.com/compute-qos: default
  2. 建立一個任意類型的工作負載(例如Job),其中labels配置與ResourcePolicy的選取器保持一致。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: demo-job
      namespace: default
    spec:
      parallelism: 3
      template:
        metadata:
          labels:
            app: stress # 關聯ResourcePolicy中spec.selector定義的配置
        spec:
          containers:
          - name: demo-job
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            args:
              - 'infinity'
            command:
              - sleep
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
          restartPolicy: Never
      backoffLimit: 4

進階配置參數

以下ResourcePolicy的詳細YAML樣本展示了自訂資源優先順序調度的進階配置參數格式。

說明

以下僅展示了在ACS叢集中使用ResourcePolicy的常用配置,關於ResourcePolicy功能的完整配置,請參見自訂彈性資源優先順序調度

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
  name: rp-demo
  namespace: default
spec:
  # 以下為應用配置,用於標記一部分pod,符合該條件的Pod將遵循此調度策略
  selector:
    app: stress
  # 以上為應用配置

  # 以下為資源配置,用於描述調度順序
  units:
  - resource: acs # resource類型必須指定為acs
    podLabels: # 優先申請"general-purpose"+"best-effort"類型的資源
      alibabacloud.com/compute-class: general-purpose
      alibabacloud.com/compute-qos: best-effort
    nodeSelector: # 支援通過nodeSelector指定虛擬節點的可用性區域
      topology.kubernetes.io/zone: cn-hangzhou-i
  - resource: acs # 前者庫存不足時,再申請"general-purpose"+"default"類型的資源
    podLabels:
      alibabacloud.com/compute-class: general-purpose
      alibabacloud.com/compute-qos: default
  # 以上為資源配置
 # 其他欄位適用於非ACS叢集,ResourcePolicy建立後會有預設值,無需關注

應用配置

應用配置由一組標籤組成,只有帶有該標籤的Pod會遵循此策略,您可以根據應用類型配置不同的資源順序。

配置項

類型

說明

樣本

selector

map[string]string

同時帶有這些標籤的Pod將按本ResourcePolicy規則調度。

selector:
  app: stress
  stage: pre-publish

資源配置

資源配置由一個列表組成,列表中的每個單元描述了詳細的資源屬性,對於符合應用配置條件的Pod,調度器將按每個單元的屬性依次嘗試建立,當庫存不足時自動嘗試下一個單元。當所有單元的庫存都不足時,Pod會處於Pending狀態,調度器會持續按順序重試,直至建立成功。下表中描述了每個單元中配置欄位的詳細含義。

配置項

類型

說明

取值

樣本

resource

string

資源類型,必填。僅支援acs。

acs

resource: acs

nodeSelector

map[string]string

通過label標記篩選虛擬節點,例如可用性區域範圍。

支援的標籤範圍詳見節點親和性調度

nodeSelector:
  topology.kubernetes.io/zone: cn-hangzhou-i

podLabels[alibabacloud.com/compute-class]

string

描述Pod申請的計算類型(Compute Class)。

  • general-purpose(預設值)

  • performance

general-purpose

podLabels[alibabacloud.com/compute-qos]

string

描述Pod申請的算力品質(Compute QoS)。

  • default(預設值)

  • best-effort

default

操作樣本

本樣本示範通過ResourcePolicy為應用依次申請default和best-effort算力品質的資源。

  1. 使用以下內容建立resource-policy.yaml。聲明了對於app=stress標籤的Pod,申請計算類型為performance、算力品質為default的資源。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: stress-demo
      namespace: default
    spec:
      selector:
        app: stress
      units:
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: performance
          alibabacloud.com/compute-qos: default
  2. 執行以下命令,將ResourcePolicy部署到叢集。

    kubectl apply -f resource-policy.yaml
  3. 使用以下內容建立stress-dep.yaml。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: stress
      template:
        metadata:
          labels: # 與ResourcePolicy中的配置保持一致
            app: stress
        spec:
          containers:
          - name: stress
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
            resources:
              limits:
                cpu: '1'
                memory: 1Gi
              requests:
                cpu: '1'
                memory: 1Gi
  4. 執行以下命令,將stress應用部署到叢集。

    kubectl apply -f stress-dep.yaml
  5. 執行以下命令,查看Pod狀態。

    kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos

    預期輸出:

    # 輸出結果受資產庫存等因素影響,請以實際為準
    NAME               READY   STATUS    RESTARTS   AGE   COMPUTE-CLASS   COMPUTE-QOS
    stress-xxxxxxxx1   1/1     Running   0          53s   performance     default
  6. 使用以下內容,更新上述resource-policy.yaml檔案。增加了資源屬性描述,要求按以下順序申請資源:

    1. 先申請計算類型為general-purpose、算力品質為best-effort的資源。

    2. 上述資產庫存不足時,再申請計算類型為performance、算力品質為default的資源。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: stress-demo
      namespace: default
    spec:
      selector:
        app: stress
      units:
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: performance
          alibabacloud.com/compute-qos: default
  7. 執行以下命令,更新叢集內的ResourcePolicy策略。更新後的策略將對後續新建立的Pod生效。

    kubectl apply -f resource-policy.yaml
  8. 執行以下命令,將步驟3建立的stress應用,擴容為2個副本。

    kubectl scale deployment stress --replicas=2
  9. 執行以下命令,查看Pod狀態。

    kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos

    預期輸出:

    # 輸出結果受資產庫存等因素影響,請以實際為準
    NAME                     READY   STATUS    RESTARTS   AGE     COMPUTE-CLASS     COMPUTE-QOS
    stress-xxxxxxxx1         1/1     Running   0          2m14s   performance       default
    stress-xxxxxxxx2         1/1     Running   0          33s     general-purpose   best-effort

    可以看到新擴容的副本,計算類型和算力品質分別為general-purpose和best-effort。