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

Container Compute Service:カスタム優先度に基づくリソーススケジューリング

最終更新日:Dec 26, 2024

コンテナサービス Kubernetes版 (ACS)では、Podラベルを追加して、PodのコンピューティングクラスとコンピューティングQoSクラスを指定できます。異なるタイプのインスタンスの在庫は動的です。特定のタイプのインスタンスは、さまざまな理由で在庫切れになる可能性があります。カスタム優先度に基づいてリソースをスケジューリングするには、作成するPodに複数のコンピューティングクラスまたはコンピューティングQoSクラスを指定できます。スケジューラーは、指定されたタイプのPodを順に作成しようと試み、Pod削除コストメカニズムに基づいて逆の順序でPodをスケールインします。このトピックでは、ACSクラスターでカスタム優先度に基づいてリソースをスケジューリングする方法について説明します。

前提条件

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

    ACSクラスターバージョン

    スケジューラーバージョン

    1.30

    v1.30.3-aliyun-1.1.1 以降 (すべての現行バージョン)

    1.28

    v1.28.9-aliyun-1.1.0 以降

    1.26

    v1.26.3-aliyun-1.1.0 以降

  • acs-virtual-node がインストールされており、そのバージョンが v2.12.0-acs.4 以降であること。

使用方法に関する注意事項

カスタム優先度に基づくリソーススケジューリングは、汎用およびパフォーマンス強化コンピューティングクラスをサポートしています。詳細については、ACS Podの概要 を参照してください。

カスタム優先度に基づくリソーススケジューリングは、KubernetesのPod削除コスト機能を使用して、Podのスケールイン順序を制御します。理論的には、Pod削除コストが最も低いPodが最初にスケールインされます。ただし、スケールインアルゴリズムは、Podコントローラーの実装に依存するさまざまな要因を考慮します。Podに controller.kubernetes.io/pod-deletion-cost アノテーションが設定されている場合、その値はカスタム優先度ベースのリソーススケジューリングポリシーによって上書きされます。詳細については、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 # ベストエフォートリソースを優先的に適用します。
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs # 前のリソースの在庫が不足している場合は、デフォルトリソースを適用します。
        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

詳細設定

次のYAMLコンテンツは、ResourcePolicyのカスタム優先度ベースのスケジューリングのいくつかの詳細設定を示しています。

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
  name: rp-demo
  namespace: default
spec:
  # 次のPod設定は、選択したPodにスケジューリングポリシーを適用するために使用されます。
  selector:
    app: stress
  # 上記はPod設定です。

  # 次のリソース設定は、スケジューリング順序を定義するために使用されます。
  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クラスターに適しており、これらのパラメーターはすべてデフォルト値を持っています。無視しても構いません。

Pod設定

Pod設定にはラベルが含まれています。スケジューリングポリシーは、指定されたラベルを持つPodにのみ適用されます。必要に応じてリソースの順序を指定できます。

パラメーター

タイプ

説明

selector

map[string]string

指定されたラベルを持つPodは、ResourcePolicyに基づいてスケジューリングされます。

selector:
  app: stress
  stage: pre-publish

リソース設定

リソース設定はリストです。リストの各要素はリソースプロパティを表します。スケジューラーは、各要素で定義されたリソースプロパティに基づいて、ResourcePolicy に一致する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

この例では、デフォルトおよびベストエフォートコンピューティングQoSクラスのPodを順番に作成するResourcePolicyを作成する方法を示します。

  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を更新します。更新されたResourcePolicyは、新しく作成されたPodに有効になります。

    kubectl apply -f resource-policy.yaml
  8. 次のコマンドを実行して、stressアプリケーションを2つのPodにスケールします。

    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

    新しく追加されたPodのコンピューティングクラスとコンピューティングQoSクラスは、general-purposeとbest-effortです。