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

Container Service for Kubernetes:ack-descheduler を使用したスケジューリングの最適化 (メンテナンス終了)

最終更新日:Mar 15, 2025

ack-descheduler を使用して、適切なノードと一致しないポッドのスケジューリングを最適化できます。これにより、リソースの浪費を回避し、Container Service for Kubernetes (ACK) クラスタのリソース使用率を向上させることができます。このトピックでは、ack-descheduler を使用してポッドのスケジューリングを最適化する方法について説明します。

重要

ack-descheduler は廃止されました。詳細については、「[コンポーネントに関するお知らせ] ack-descheduler の移行」をご参照ください。ack-descheduler から Koordinator Descheduler への移行をお勧めします。

前提条件

ack-descheduler のインストール

  1. ACK コンソール にログインします。

  2. ACK コンソールの左側のナビゲーションウィンドウで、[マーケットプレイス] > [アプリカタログ] を選択します。

  3. [マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。[ack-descheduler] を見つけてクリックします。

  4. [ack-descheduler] ページで、[デプロイ] をクリックします。

  5. [デプロイ] ウィザードで、クラスタと名前空間を選択し、[次へ] をクリックします。

  6. [パラメーター] ウィザードページで、パラメーターを設定し、[OK] をクリックします。

    ack-descheduler がインストールされると、kube-system 名前空間に CronJob が自動的に作成されます。デフォルトでは、この CronJob は 2 分ごとに実行されます。 ack-descheduler がインストールされると、[ack-descheduler-default] ページにリダイレクトされます。次の図に示すように、すべての関連リソースが作成されると、コンポーネントはインストールされます。ack-descheduler.png

ack-descheduler を使用してポッドのスケジューリングを最適化する

  1. 次のコマンドを実行して、ack-descheduler-default ConfigMap の DeschedulerPolicy 設定を確認します。

    kubectl describe cm ack-descheduler-default -n kube-system

    予想される出力:

    詳細を表示するにはクリックしてください

    Name:         descheduler
    Namespace:    kube-system
    Labels:       app.kubernetes.io/instance=descheduler
                  app.kubernetes.io/managed-by=Helm
                  app.kuberne
    
    
    tes.io/name=descheduler
                  app.kubernetes.io/version=0.20.0
                  helm.sh/chart=descheduler-0.20.0
    Annotations:  meta.helm.sh/release-name: descheduler
                  meta.helm.sh/release-namespace: kube-system
    Data
    ====
    policy.yaml:
    ----
    apiVersion: "descheduler/v1alpha1"
    kind: "DeschedulerPolicy"
    strategies:
      "RemoveDuplicates":  
         enabled: true
      "RemovePodsViolatingInterPodAntiAffinity": 
         enabled: true
      "LowNodeUtilization": 
         enabled: true
         params:
           nodeResourceUtilizationThresholds:
             thresholds:
               "cpu" : 20
               "memory": 20
               "pods": 20
             targetThresholds:
               "cpu" : 50
               "memory": 50
               "pods": 50
      "RemovePodsHavingTooManyRestarts":
         enabled: true
         params:
           podsHavingTooManyRestarts:
             podRestartThreshold: 100
             includingInitContainers: true
    Events:  <none>

    次の表は、上記の出力で返されるスケジューリングポリシーについて説明しています。strategies セクションのポリシー設定の詳細については、「Descheduler」をご参照ください。

    ポリシー

    説明

    RemoveDuplicates

    このポリシーは、重複するポッドを削除し、同じノードで実行されている ReplicaSet、ReplicationController、StatefulSet、または Job に関連付けられているポッドが 1 つだけになるようにします。

    RemovePodsViolatingInterPodAntiAffinity

    このポリシーは、ポッド間のアンチアフィニティルールに違反しているポッドを削除します。

    LowNodeUtilization

    このポリシーは、使用率が低いノードを見つけ、他のノードからポッドをエビクトし、使用率が低いノードにポッドを再作成します。このポリシーのパラメーターは、nodeResourceUtilizationThresholds セクションで設定されます。

    RemovePodsHavingTooManyRestarts

    このポリシーは、指定された回数だけ再起動されたポッドを削除します。

  2. スケジューリングポリシーを変更する前に、ポッドのスケジューリングを確認します。

    1. スケジューリングをテストするためにデプロイメントを作成します。

      nginx.yaml ファイルを作成し、次の内容をファイルにコピーします。

      apiVersion: apps/v1 # 1.8.0 より前のバージョンでは apps/v1beta1 を使用します
      kind: Deployment
      metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9 # 使用するイメージに置き換えます。値は <image_name:tags> 形式である必要があります。
              ports:
              - containerPort: 80

      次のコマンドを実行して、nginx.yaml ファイルを使用してデプロイメントを作成します。

      kubectl apply -f nginx.yaml

      予想される出力:

      deployment.apps/nginx-deployment-basic created
    2. 2 分待ってから、次のコマンドを実行して、ポッドがスケジュールされているノードを確認します。

      kubectl get pod -o wide | grep nginx

      予想される出力:

      NAME                          READY   STATUS     RESTARTS   AGE    IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          36s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          11s    172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX3   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          36s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      出力は、ポッド nginx-deployment-basic-**2 とポッド nginx-deployment-basic-**3 が同じノード cn-hangzhou.172.16.XXX.XX3 にスケジュールされていることを示しています。

      説明

      ack-descheduler-default ConfigMap のデフォルト設定を使用する場合、スケジューリング結果はクラスタの実際の状態によって異なります。

  3. スケジューリングポリシーを変更します。

    複数のスケジューリングポリシーを使用すると、予期しないスケジューリング結果が得られる場合があります。この問題を防ぐには、手順 1 の ConfigMap を変更して、RemoveDuplicates ポリシーのみを保持します。

    説明

    RemoveDuplicates ポリシーは、レプリケーションコントローラーによって管理されるポッドが異なるノードに均等に分散されるようにします。

    この例では、変更後、ConfigMap の名前は newPolicy.yaml に変更されます。変更された ConfigMap には次の内容が含まれています。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: descheduler
      namespace: kube-system
      labels:
        app.kubernetes.io/instance: descheduler
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: descheduler
        app.kubernetes.io/version: 0.20.0
        helm.sh/chart: descheduler-0.20.0  
      annotations:
        meta.helm.sh/release-name: descheduler
        meta.helm.sh/release-namespace: kube-system
    data: 
      policy.yaml: |-
        apiVersion: "descheduler/v1alpha1"
        kind: "DeschedulerPolicy"
        strategies:
          "RemoveDuplicates": # RemoveDuplicates ポリシーのみを保持します。
             enabled: true
  4. スケジューリングポリシーを変更した後、ポッドのスケジューリングを確認します。

    1. 次のコマンドを実行して、新しいスケジューリングポリシーを適用します。

      kubectl apply -f newPolicy.yaml

      予想される出力:

      configmap/descheduler created
    2. 2 分待ってから、次のコマンドを実行して、ポッドがスケジュールされているノードを確認します。

      kubectl get pod -o wide | grep nginx

      予想される出力:

      NAME                          READY   STATUS     RESTARTS   AGE      IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          8m26s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          8m1s     172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX1   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          8m26s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      出力は、ポッド nginx-deployment-basic-**2 が ack-descheduler によって cn-hangzhou.172.16.XXX.XX1 に再スケジュールされたことを示しています。この場合、3 つのテストポッドはそれぞれ異なるノードにスケジュールされます。これにより、複数のノード間でポッドのスケジューリングのバランスが取られます。