ack-descheduler を使用して、適切なノードと一致しないポッドのスケジューリングを最適化できます。これにより、リソースの浪費を回避し、Container Service for Kubernetes (ACK) クラスタのリソース使用率を向上させることができます。このトピックでは、ack-descheduler を使用してポッドのスケジューリングを最適化する方法について説明します。
ack-descheduler は廃止されました。詳細については、「[コンポーネントに関するお知らせ] ack-descheduler の移行」をご参照ください。ack-descheduler から Koordinator Descheduler への移行をお勧めします。
前提条件
Kubernetes 1.14 以降を実行する ACK クラスタが作成されていること。必要に応じて、ACK クラスタを手動でアップグレードする。
Helm コンポーネントは v3.0 以降である必要があります。詳細については、「Helm V2 を Helm V3 に更新する」をご参照ください。
ack-descheduler のインストール
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションウィンドウで、 を選択します。
[マーケットプレイス] ページで、[アプリカタログ] タブをクリックします。[ack-descheduler] を見つけてクリックします。
[ack-descheduler] ページで、[デプロイ] をクリックします。
[デプロイ] ウィザードで、クラスタと名前空間を選択し、[次へ] をクリックします。
[パラメーター] ウィザードページで、パラメーターを設定し、[OK] をクリックします。
ack-descheduler がインストールされると、
kube-system名前空間に CronJob が自動的に作成されます。デフォルトでは、この CronJob は 2 分ごとに実行されます。 ack-descheduler がインストールされると、[ack-descheduler-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
このポリシーは、使用率が低いノードを見つけ、他のノードからポッドをエビクトし、使用率が低いノードにポッドを再作成します。このポリシーのパラメーターは、
nodeResourceUtilizationThresholdsセクションで設定されます。RemovePodsHavingTooManyRestarts
このポリシーは、指定された回数だけ再起動されたポッドを削除します。
スケジューリングポリシーを変更する前に、ポッドのスケジューリングを確認します。
スケジューリングをテストするためにデプロイメントを作成します。
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 created2 分待ってから、次のコマンドを実行して、ポッドがスケジュールされているノードを確認します。
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 のデフォルト設定を使用する場合、スケジューリング結果はクラスタの実際の状態によって異なります。
スケジューリングポリシーを変更します。
複数のスケジューリングポリシーを使用すると、予期しないスケジューリング結果が得られる場合があります。この問題を防ぐには、手順 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スケジューリングポリシーを変更した後、ポッドのスケジューリングを確認します。
次のコマンドを実行して、新しいスケジューリングポリシーを適用します。
kubectl apply -f newPolicy.yaml予想される出力:
configmap/descheduler created2 分待ってから、次のコマンドを実行して、ポッドがスケジュールされているノードを確認します。
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 つのテストポッドはそれぞれ異なるノードにスケジュールされます。これにより、複数のノード間でポッドのスケジューリングのバランスが取られます。