すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:カスタムリソースの優先度スケジューリング

最終更新日:Nov 09, 2025

Alibaba Cloud Container Compute Service (ACS) は、Pod ラベルでコンピュートクラス (compute-class) とコンピュート Quality of Service (QoS) を宣言することをサポートしています。異なるインスタンスタイプの在庫は動的に変化します。特定のタイプのインスタンスは、リソース在庫の不足などの要因により作成に失敗する場合があります。カスタム優先度スケジューリングを使用すると、Pod に複数のコンピュートクラスまたはコンピュート QoS クラスを指定できます。スケジューラは、指定された順序で対応する Pod インスタンスの作成を試みます。この機能は、Pod 削除コストメカニズムを使用して、アプリケーションの逆順スケールインも制御します。このトピックでは、ACS クラスターでカスタム優先度スケジューリングを使用する方法について説明します。

前提条件

  • kube-scheduler がインストールされており、そのバージョンが以下の要件を満たしていること。

    ACK クラスタバージョン

    スケジューラコンポーネントのバージョン

    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 削除コスト機能を使用して、Pod のスケールイン順序を制御します。理論的には、Pod 削除コストが最も低い Pod が最初にスケールインされます。ただし、スケールインアルゴリズムは、Pod コントローラーの実装に依存するさまざまな要因を考慮します。作成した Pod に controller.kubernetes.io/pod-deletion-cost アノテーションがある場合、その値は ACS カスタム優先度リソーススケジューリングポリシーによって上書きされることに注意してください。

警告

デプロイメントの spec.selector.matchLabels などのワークロードのラベルセレクターで、alibabacloud.com/compute-classalibabacloud.com/compute-qos などのシステム予約ラベルを使用しないでください。システムは、カスタム優先度スケジューリング中にこれらのラベルを変更する可能性があります。これにより、コントローラーが Pod を頻繁に再作成し、アプリケーションの安定性に影響を与える可能性があります。

使用方法

ACS クラスターは、仮想ノードの形式でリソースを提供します。Pod の主なリソースプロパティには、ゾーン、コンピュートクラス、およびコンピュート QoS が含まれます。この目的のために、ACS は ResourcePolicy スケジューリングポリシーを定義します。このポリシーを使用すると、spec.selector を使用して Pod のクラスをマークし、複数のリソースプロパティを同時に構成できます。リソース在庫が不十分な場合、スケジューラは構成された順序に基づいて他のタイプのインスタンスを作成します。ResourcePolicy スケジューリングポリシーは次のように使用できます。

  1. ResourcePolicy スケジューリングポリシーを作成します。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: rp-demo
      namespace: default
    spec:
      selector: # セレクターで Pod をマークします。app=stress ラベルを持つ Pod は、このスケジューリングポリシーに従います。
        app: stress
      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 # リソースタイプは 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 状態のままになります。スケジューラは、Pod が作成されるまで、すべてのリソースタイプを継続的に再試行します。次の表に、各要素に含まれるパラメーターを示します。

構成項目

タイプ

説明

resource

string

リソースタイプ。このパラメーターは必須です。`acs` のみがサポートされています。

acs

resource: acs

nodeSelector

map[string]string

ゾーンなどで、ラベルによって仮想ノードをフィルタリングします。

サポートされているラベルの詳細については、「ノードアフィニティスケジューリング」をご参照ください。

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

podLabels[alibabacloud.com/compute-class]

string

Pod によってリクエストされたコンピュートクラスを記述します。

  • general-purpose (デフォルト)

  • performance

general-purpose

podLabels[alibabacloud.com/compute-qos]

string

Pod によってリクエストされたコンピュート QoS を記述します。

  • default (デフォルト)

  • best-effort

default

この例では、ResourcePolicy を使用して、アプリケーションに対して default および best-effort のコンピュート QoS を持つリソースを順次リクエストする方法を示します。

  1. 次の内容で resource-policy.yaml という名前のファイルを作成します。これにより、app=stress ラベルを持つ Pod に対して、コンピュートクラス `performance` とコンピュート QoS `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` とコンピュート QoS `best-effort` を持つリソースをリクエストします。

    2. 上記のリソースの在庫が不十分な場合は、コンピュートクラス `performance` とコンピュート QoS `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` とコンピュート QoS `best-effort` があることがわかります。