ack-deschedulerを使用して、適切なノードと一致できないポッドのスケジューリングを最適化できます。 これにより、リソースの浪費が回避され、Container Service for Kubernetes (ACK) クラスターでのリソース使用率が向上します。 このトピックでは、ack-deskedulerを使用してポッドスケジューリングを最適化する方法について説明します。
ack-deschedulerは維持されなくなりました。 現在管理されているコンポーネントKoordinator Deschedulerに移行することを推奨します。 詳細については、「 [コンポーネント通知] ack-descheduler移行」をご参照ください。
前提条件
Kubernetes 1.14以降を実行するACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
Helmコンポーネントのバージョンはv3.0以降である必要があります。 詳細については、「Helm V2からHelm V3への更新」をご参照ください。
ack-deschedulerのインストール
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。 [ack-descheduler] を見つけてクリックします。
On theack-deschedulerページをクリックします。デプロイ.
では、デプロイウィザードで、クラスターと名前空間を選択し、次へ.
On theパラメータウィザードページで、パラメーターを設定し、OK.
ack-deschedulerがインストールされると、
kube-system
名前空間にCronJobが自動的に作成されます。 デフォルトでは、このCronJobは2分ごとに実行されます。 ack-deskedulerがインストールされると、ack-deskeduler-defaultページに移動します。 次の図に示すように、関連するすべてのリソースが作成されると、コンポーネントがインストールされます。
ack-deschedulerを使用したポッドスケジューリングの最適化
次のコマンドを実行して、ack-descheduler-default ConfigMapのDeschedulerPolicy設定を確認します。
kubectl describe cm ack-descheduler-default -n kube-system
期待される出力:
次の表に、上記の出力で返されるスケジューリングポリシーを示します。
strategies
セクションのポリシー設定の詳細については、「Descheduler」をご参照ください。ポリシー
説明
RemoveDuplicates
このポリシーは、重複するポッドを削除し、同じノードで実行されるReplicaSet、ReplicationController、StatefulSet、またはJobに1つのポッドのみが関連付けられるようにします。
RemovePodsViolatingInterPodAntiAffinity
このポリシーは、ポッド間のアンチアフィニティ規則に違反するポッドを削除します。
LowNodeUtilization
このポリシーは、十分に活用されていないノードを検索し、ポッドを他のノードから追い出し、十分に活用されていないノードでポッドを再作成します。 このポリシーのパラメーターは、
nodeResourceUtilizationThreshold
セクションで設定します。RemovePodsHavingTooManyRestarts
このポリシーは、指定した回数だけ再起動されたポッドを削除します。
スケジューリングポリシーが変更される前に、ポッドのスケジューリングを確認します。
スケジューリングをテストするための配置を作成します。
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分待ってから次のコマンドを実行し、ポッドがスケジュールされているノードを確認します。
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のデフォルト設定を使用する場合、スケジューリング結果はクラスターの実際の状態によって異なります。
スケジューリングポリシーを変更します。
複数のスケジューリングポリシーを使用すると、予期しないスケジューリング結果が得られる可能性があります。 この問題を防ぐには、手順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
スケジューリングポリシーが変更された後、ポッドのスケジューリングを確認します。
次のコマンドを実行して、新しいスケジューリングポリシーを適用します。
kubectl apply -f newPolicy.yaml
期待される出力:
configmap/deschedulerが作成されました
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つのテストポッドのそれぞれが異なるノードにスケジュールされます。 これは、複数のノード間のポッドスケジューリングのバランスを取る。