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

Container Service for Kubernetes:ack-deschedulerを使用してスケジューリングを最適化する (中断されたメンテナンス)

最終更新日:Dec 10, 2024

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

重要

ack-deschedulerは維持されなくなりました。 現在管理されているコンポーネントKoordinator Deschedulerに移行することを推奨します。 詳細については、「 [コンポーネント通知] ack-descheduler移行」をご参照ください。

前提条件

ack-deschedulerのインストール

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

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

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

  4. On theack-deschedulerページをクリックします。デプロイ.

  5. では、デプロイウィザードで、クラスターと名前空間を選択し、次へ.

  6. On theパラメータウィザードページで、パラメーターを設定し、OK.

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

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

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

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

    期待される出力:

    クリックして詳細を表示

    名: desculer
    名前空間: kube-system
    ラベル: app.kubernetes.io/instance=descheduler
                  app.kubernetes.io/managed-by=Helm
                  app.kuberne
    
    
    tes.io/name=デスケジューラ
                  app.kubernetes.io/version=0.20.0
                  helm.sh /チャート=descheduler-0.20.0
    注釈: meta.helm.sh/release-name: descheduler
                  meta.helm.sh/release-namespace: kube-system
    データ
    ====
    policy.yaml:
    ----
    apiVersion: "desculer /v1alpha"
    kind: "DeschedulerPolicy"
    戦略:
      "RemoveDuplicates":  
         enabled: true
      "RemovePodsViolatingInterPodAntiAffinity": 
         enabled: true
      「LowNodeUtilization」: 
         enabled: true
         params:
           nodeResourceUtilizationThreshold:
             しきい値:
               "cpu" : 20
               "メモリ": 20
               "ポッド": 20
             targetThreshold:
               "cpu" : 50
               "メモリ": 50
               "ポッド": 50
      「RemovePodsHavingTooManyRestarts」:
         enabled: true
         params:
           podsHavingTooManyRestarts:
             podRestartThreshold: 100
             includingInitContainers: true
    イベント: <none> 

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

    ポリシー

    説明

    RemoveDuplicates

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

    RemovePodsViolatingInterPodAntiAffinity

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

    LowNodeUtilization

    このポリシーは、十分に活用されていないノードを検索し、ポッドを他のノードから追い出し、十分に活用されていないノードでポッドを再作成します。 このポリシーのパラメーターは、nodeResourceUtilizationThresholdセクションで設定します。

    RemovePodsHavingTooManyRestarts

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

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

    1. スケジューリングをテストするための配置を作成します。

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

      apiVersion: apps/v1 #1.8.0以前のバージョンではapps/v1beta1を使用
      kind: 配置
      メタデータ:
        name: nginx-deployment-basic
        ラベル:
          アプリ: nginx
      spec:
        replicas: 3
        セレクタ:
          matchLabels:
            アプリ:nginx
        template:
          metadata:
            labels:
              アプリ:nginx
          仕様:
            containers:
            - name: nginx
              image: nginx:1.7.9# 使用するイメージに置き換えます。 値は <image_name:tags> 形式である必要があります。 
              ポート:
              -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ノードNOMINATED NOMINATED NODE READINESS GATES
      nginx-deployment-basic-**1 1/1実行中0 36s 172.25.XXX.XX1 cn-hangzhou.172.16.XXX.XX2 <none> <none>
      nginx-deployment-basic-**2 1/1実行中0 11s 172.25.XXX.XX2 cn-hangzhou.172.16.XXX.XX3 <none> <none>
      nginx-deployment-basic-**3 1/1実行中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
    メタデータ:
      name: descheduler
      namespace: kube-system
      ラベル:
        app.kubernetes.io/instance: デスケジューラ
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: デスケジューラ
        app.kubernetes.io /バージョン: 0.20.0
        helm.sh /チャート: descheduler-0.20.0  
      アノテーション:
        meta.helm.sh /リリース名: デスケジューラ
        meta.helm.sh/release-namespace: kube-system
    データ: 
      policy.yaml: |-
        apiVersion: "desculer /v1alpha"
        kind: "DeschedulerPolicy"
        戦略:
          "RemoveDuplicates": # RemoveDuplicatesポリシーのみを保持します。 
             enabled: true 
  4. スケジューリングポリシーが変更された後、ポッドのスケジューリングを確認します。

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

      kubectl apply -f newPolicy.yaml

      期待される出力:

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

      kubectl get pod -o wide | grep nginx

      期待される出力:

      NAME READY STATUS RESTARTS AGE IPノードNOMINATED NOMINATED NODE READINESS GATES
      nginx-deployment-basic-**1 1/1実行中0 8m26s 172.25.XXX.XX1 cn-hangzhou.172.16.XXX.XX2 <none> <none>
      nginx-deployment-basic-**2 1/1実行中0 8m1s 172.25.XXX.XX2 cn-hangzhou.172.16.XXX.XX1 <none> <none>
      nginx-deployment-basic-**3 1/1実行中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つのテストポッドのそれぞれが異なるノードにスケジュールされます。 これは、複数のノード間のポッドスケジューリングのバランスを取る。