ack-koordinator コンポーネントは、負荷ベースのホットスポットデスケジューリング機能を提供します。この機能は、クラスター内のノード負荷の変動を検出し、安全な負荷しきい値を超えたノードから Pod を自動的にデスケジュールします。これにより、深刻な負荷の不均衡を防ぎます。このトピックでは、負荷ベースのホットスポットデスケジューリングの使用方法と、その詳細設定パラメーターについて説明します。
制限事項
ACK マネージド版 Pro クラスター のみがサポートされています。
関連コンポーネントは、次のバージョン要件を満たす必要があります。
コンポーネント
バージョン要件
ACK Scheduler
v1.22.15-ack-4.0 以降、v1.24.6-ack-4.0 以降
ack-koordinator
v1.1.1-ack.1 以降
Helm
v3.0 以降
K8s Spot Rescheduler は Pod のエビクションのみを行います。Pod はその後、ACK Scheduler によって再スケジュールされます。このデスケジューリング機能は、負荷認識スケジューリングと組み合わせて使用することを推奨します。これにより、ACK Scheduler はホットスポットノードへの Pod の再スケジュールを回避できます。
デスケジューリング中、新しい Pod が作成される前に古い Pod がエビクションされます。エビクションがアプリケーションの可用性に影響を与えないように、ご利用のアプリケーションに十分な冗長レプリカがあることを確認してください。
デスケジューリングは、標準の Kubernetes エビクション API を使用して Pod をエビクトします。エビクション後の再起動によってサービスが中断されないように、アプリケーション Pod のロジックが再入可能であることを確認してください。
課金
ack-koordinator コンポーネントは無料でインストールして使用できます。ただし、次のシナリオでは追加料金が発生する場合があります:
ack-koordinator は自己管理コンポーネントであり、インストール後にワーカーノードのリソースを消費します。コンポーネントのインストール時に、各モジュールのリソースリクエストを設定できます。
デフォルトでは、ack-koordinator はリソースプロファイリングや詳細なスケジューリングなどの機能のモニタリングメトリックを Prometheus 形式で公開します。コンポーネントの設定時に [ACK-Koordinator の Prometheus モニタリングを有効にする] オプションを選択し、Alibaba Cloud Prometheus サービスを使用する場合、これらのメトリックはカスタムメトリックと見なされ、料金が発生します。料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。この機能を有効にする前に、Alibaba Cloud Prometheus の「Prometheus インスタンスの課金」ドキュメントをよく読み、カスタムメトリックの無料クォータと課金ポリシーを理解してください。使用量データをクエリすることで、リソース使用量を監視および管理できます。
負荷ホットスポットデスケジューリングの概要
負荷認識スケジューリング
ACK スケジューラは負荷認識スケジューリングをサポートしており、負荷の低いノードに Pod をスケジュールできます。クラスター環境、トラフィック、リクエストが変化するため、ノード使用率も動的に変化します。これにより、クラスター内のノード間の負荷バランスが崩れ、深刻な負荷の不均衡が生じることさえあります。これは、ワークロードのランタイム品質に影響します。ack-koordinator は、ノード負荷の変化を識別し、安全な負荷しきい値を超えるノードから Pod を自動的にデスケジュールして、深刻な負荷の不均衡を防ぐことができます。負荷認識スケジューリングとホットスポットデスケジューリングを組み合わせることで、ノード間の最適な負荷分散を実現できます。詳細については、「負荷認識 Pod スケジューリングの使用」をご参照ください。
Koordinator Descheduler モジュールの仕組み
ack-koordinator コンポーネントは、Koordinator Descheduler モジュールを提供します。このモジュールでは、LowNodeLoad プラグインが負荷レベルを検出し、負荷ベースのホットスポットデスケジューリングを実行します。ネイティブ Kubernetes Descheduler の LowNodeUtilization プラグインとは異なり、LowNodeLoad プラグインはノードの実際のリソース使用率に基づいてデスケジューリングを決定しますが、LowNodeUtilization プラグインはリソース割り当て率に基づいて決定します。
実行手順
Koordinator Descheduler モジュールは定期的に実行されます。各実行サイクルは、次の 3 つのステージで構成されます。

データ収集:クラスター内のノードとワークロード、およびそれらに関連するリソース使用率に関する情報を取得します。
ポリシープラグインの実行。
次のステップでは、LowNodeLoad プラグインを例として使用します。
ホットスポットノードを識別します。ノードの分類の詳細については、「LowNodeLoad 負荷しきい値パラメーター」をご参照ください。
すべてのホットスポットノードを走査し、移行可能な Pod を識別してソートします。Pod のスコアリングとソートの詳細については、「Pod スコアリングポリシー」をご参照ください。
移行対象のすべての Pod を走査し、クラスターサイズ、リソース使用率、複製された Pod の比率などの制約に基づいて、Pod が移行の要件を満たしているかどうかを確認します。詳細については、「負荷認識ホットスポットデスケジューリングポリシー」をご参照ください。
Pod が条件を満たす場合、移行対象のレプリカとして分類されます。そうでない場合、プロセスは他の Pod とホットスポットノードの走査を続行します。
Pod のエビクションと移行: 移行の要件を満たす Pod をエビクションします。詳細については、「API によって開始されるエビクション」をご参照ください。
LowNodeLoad 負荷しきい値パラメーター
LowNodeLoad プラグインには 2 つの重要なパラメーターがあります。
highThresholds:高負荷しきい値。このしきい値よりも負荷が高いノード上の Pod は、デスケジューリングの対象となります。このしきい値よりも負荷が低いノード上の Pod はデスケジュールされません。スケジューラの負荷認識スケジューリング機能も有効にすることを推奨します。詳細については、「スケジューリングポリシー」をご参照ください。これらの機能を併用する方法の詳細については、「負荷認識スケジューリングと負荷ベースのホットスポットデスケジューリングを併用するにはどうすればよいですか?」をご参照ください。lowThresholds:アイドル負荷しきい値。
すべてのノードの負荷レベルが lowThresholds よりも高い場合、クラスター全体の負荷レベルが高いと見なされます。この場合、一部のノードの負荷レベルが highThresholds よりも高くても、Koordinator Descheduler はデスケジューリングを実行しません。
たとえば、次の図では、lowThresholds は 45% に設定され、highThresholds は 70% に設定されています。ノードは次の基準に基づいて分類されます。同様に、lowThresholds と highThresholds の値が変更されると、ノードの分類基準もそれに応じて変更されます。
デフォルトでは、リソース使用率データは 1 分ごとに更新されます。粒度は過去 5 分間の平均値です。
アイドルノード:リソース使用率が 45% 未満のノード。
通常ノード:リソース使用率が 45% 以上 70% 以下のノード。この負荷レベルが望ましい範囲です。
ホットスポットノード:リソース使用率が 70% を超えるノード。ホットスポットノード上の一部の Pod は、負荷レベルを 70% 以下に下げるためにエビクションされます。
負荷ホットスポットデスケジューリングポリシー
ポリシー名 | 説明 |
ホットスポットチェックリトライポリシー | ホットスポット検出の精度を確保し、モニタリングデータのグリッチによる頻繁なアプリケーション移行を避けるため、Koordinator Descheduler はホットスポットチェックのリトライ設定をサポートしています。ノードは、しきい値を連続して複数回超えた場合にのみホットスポットとして識別されます。 |
ノードソートポリシー | 識別されたホットスポットノードの中で、Koordinator Descheduler はリソース使用量の降順でノードのデスケジューリングを開始します。ノードのソート中、メモリと CPU のリソース使用量が順に比較されます。リソース使用量が高いノードが優先されます。 |
Pod スコアリングポリシー | 各ホットスポットノードに対して、Koordinator Descheduler はその上の Pod をスコアリングしてソートし、その後エビクション操作を開始してアイドルノードに移行します。比較順序は次のとおりです:
説明 Pod のエビクション順序に要件がある場合は、Pod に異なる Priority または QoS クラスを設定してください。 |
フィルターポリシー | Koordinator Descheduler モジュールは、使用中のグレースケール制御を容易にするために、Pod とノードに対する複数のフィルターパラメーターをサポートしています。
|
事前チェックポリシー | Koordinator Descheduler モジュールは、各移行が可能な限り安全であることを保証するために、Pod 移行前の事前チェック機能を提供します。
|
移行スロットリングポリシー | Pod 移行中のアプリケーションの高可用性を確保するために、Koordinator Descheduler は Pod 移行を制御するための複数の機能を提供します。ノード、名前空間、またはワークロードごとに同時に移行できる Pod の最大数を指定できます。Koordinator Descheduler では、同じワークロードに属する Pod があまりにも頻繁に移行されるのを防ぐために、Pod 移行タイムウィンドウを指定することもできます。Koordinator Descheduler は、オープンソース Kubernetes の PDB (Pod Disruption Budgets) メカニズムとも互換性があり、ワークロードの高可用性を確保するためのより詳細な管理ポリシーを設定できます。 |
可観測性ポリシー | イベントを通じてデスケジューリングの移行プロセスを観察し、詳細で移行の具体的な理由と現在のステータスを表示できます。以下はサンプルです。 |
ステップ 1: ack-koordinator でのデスケジューリングの有効化
クラスターに ack-koordinator コンポーネントがインストールされていない場合は、コンポーネントをインストールし、コンポーネント設定ページで [ack-koordinator のデスケジューリングを有効にする] を選択します。詳細については、「ack-koordinator コンポーネントのインストール」をご参照ください。
クラスターに ack-koordinator コンポーネントが既にインストールされている場合は、コンポーネント設定ページで [ack-koordinator のデスケジューリングを有効にする] を選択します。手順については、「ack-koordinator コンポーネントの変更」をご参照ください。
ステップ 2: 負荷ホットスポットデスケジューリングプラグインの有効化
次の YAML コンテンツを使用して `koord-descheduler-config.yaml` ファイルを作成します。
`koord-descheduler-config.yaml` ファイルは、LowNodeLoad デスケジューリングプラグインを有効にするために使用される ConfigMap オブジェクトです。
次のコマンドを実行して、設定をクラスターに適用します。
kubectl apply -f koord-descheduler-config.yaml次のコマンドを実行して、Koordinator Descheduler モジュールを再起動します。
Koordinator Descheduler モジュールを再起動すると、Koordinator Descheduler は最後に変更された設定を使用します。
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 deployment.apps/ack-koord-descheduler scaled
ステップ 3 (任意): スケジューラ負荷分散プラグインの有効化
ノード間の最適な負荷分散のためにスケジューラ負荷分散プラグインを有効にするには、「ステップ 1: 負荷認識スケジューリングの有効化」をご参照ください。
ステップ 4: デスケジューリング機能の検証
次の例では、それぞれ 104 コアと 396 GiB のメモリを持つ 3 つのノードがあるクラスターを使用します。
次の YAML コンテンツを使用して `stress-demo.yaml` ファイルを作成します。
ストレステスト Pod を作成します。
kubectl create -f stress-demo.yaml deployment.apps/stress-demo createdPod が実行中になるまでステータスを監視します。
kubectl get pod -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-588f9646cf-s**** 1/1 Running 0 82s 10.XX.XX.53 cn-beijing.10.XX.XX.53 <none> <none>出力は、Pod
stress-demo-588f9646cf-s****がノードcn-beijing.10.XX.XX.53にスケジュールされたことを示しています。ノード
cn-beijing.10.XX.XX.53の負荷レベルを上げ、各ノードの負荷を確認します。kubectl top node期待される出力:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.10.XX.XX.215 17611m 17% 24358Mi 6% cn-beijing.10.XX.XX.53 63472m 63% 11969Mi 3%出力は、ノード
cn-beijing.10.XX.XX.53の負荷が 63% と高く、設定されたホットスポットしきい値の 50% を超えていることを示しています。ノードcn-beijing.10.XX.XX.215の負荷は 17% と低く、設定されたアイドルしきい値の 20% を下回っています。負荷認識ホットスポットデスケジューリングを有効にします。詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。
Pod の変更を監視します。
Descheduler がホットスポットノードをチェックし、エビクションと移行を実行するのを待ちます。
説明デフォルトでは、ノードが 5 回連続でホットスポットしきい値を超えた場合にホットスポットとして識別され、これには 10 分かかります。
kubectl get pod -w期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-588f9646cf-s**** 1/1 Terminating 0 59s 10.XX.XX.53 cn-beijing.10.XX.XX.53 <none> <none> stress-demo-588f9646cf-7**** 1/1 ContainerCreating 0 10s 10.XX.XX.215 cn-beijing.10.XX.XX.215 <none> <none>イベントを監視します。
kubectl get event | grep stress-demo-588f9646cf-s****期待される出力:
2m14s Normal Evicting podmigrationjob/00fe88bd-8d4c-428d-b2a8-d15bcdeb**** Pod "default/stress-demo-588f9646cf-s****" evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(68.53%)>threshold(50.00%)" 101s Normal EvictComplete podmigrationjob/00fe88bd-8d4c-428d-b2a8-d15bcdeb**** Pod "default/stress-demo-588f9646cf-s****" has been evicted 2m14s Normal Descheduled pod/stress-demo-588f9646cf-s**** Pod evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(68.53%)>threshold(50.00%)" 2m14s Normal Killing pod/stress-demo-588f9646cf-s**** Stopping container stress期待される出力は移行レコードであり、結果が期待通りであることを示しています。ホットスポットノード上の Pod は別のノードにデスケジュールされます。
詳細設定
Koordinator Descheduler モジュールの詳細設定パラメーター
Koordinator Descheduler のすべてのパラメーター設定は ConfigMap で提供されます。以下は、負荷ベースのホットスポットデスケジューリングの詳細設定パラメーターの形式を示しています。
Koordinator Descheduler のシステム設定
パラメーター | タイプ | 値 | 説明 | 例 |
dryRun | boolean |
| 読み取り専用モードのスイッチ。有効にすると、Pod の移行は開始されません。 | false |
deschedulingInterval | time.Duration | >0s | デスケジューリングの実行間隔。負荷ホットスポットデスケジューリング機能を使用する場合、このパラメーターの値が LowNodeLoad プラグインの | 120s |
エビクションと移行の制御設定
パラメーター | タイプ | 値 | 説明 | 例 |
maxMigratingPerNode | int64 | ≥0 (デフォルト:2) | 各ノードで移行状態にできる Pod の最大数。0 は制限なしを示します。 | 2 |
maxMigratingPerNamespace | int64 | ≥0 (デフォルト:無制限) | 各名前空間で移行状態にできる Pod の最大数。0 は制限なしを示します。 | 1 |
maxMigratingPerWorkload | intOrString | ≥0 (デフォルト:10%) | 各ワークロード (デプロイメントなど) で移行状態にできる Pod の最大数または割合。0 は制限なしを示します。 ワークロードにレプリカが 1 つしかない場合、デスケジュールされません。 | 1 または 10% |
maxUnavailablePerWorkload | intOrString | ≥0 (デフォルト:10%)、かつワークロードのレプリカ総数未満 | 各ワークロード (デプロイメントなど) の利用不可能なレプリカの最大数または割合。0 は制限なしを示します。 | 1 または 10% |
evictLocalStoragePods | boolean |
| HostPath または EmptyDir で設定された Pod のデスケジュールを許可するかどうかを指定します。セキュリティ上の理由から、デフォルトでは無効になっています。 | false |
objectLimiters.workload | 次のデータ形式の構造体: |
| ワークロードレベルでの Pod 移行のスロットリング。
| これは、1 つのワークロードに対して 5 分以内に最大 1 つのレプリカが移行できることを示します。 |
LowNodeLoad プラグインの設定
| タイプ | 値 | 説明 | 例 |
| map[string]float64 説明 CPU とメモリのディメンションをサポートします。値はパーセンテージです。 | [0,100] | 負荷のホットスポット水位。このしきい値を超えるノード上の Pod のみがデスケジューリングに参加します。このしきい値を下回るノード上の Pod はデスケジュールされません。スケジューラの負荷認識スケジューリング機能も有効にすることを推奨します。詳細については、「ポリシーの説明」をご参照ください。これら 2 つの機能を組み合わせて使用する方法については、「負荷認識スケジューリングと負荷認識ホットスポットデスケジューリングを組み合わせて使用するにはどうすればよいですか?」をご参照ください。 すべてのノードの負荷レベルが | |
| map[string]float64 説明 CPU とメモリのディメンションをサポートします。値はパーセンテージです。 | [0,100] | アイドル負荷しきい値。 すべてのノードの使用率レベルが | |
| int64 | >0 (デフォルト:5) | ホットスポットチェックのリトライ回数。ノードは、複数の連続した実行サイクルで highThresholds を超えた場合にのみホットスポットとして識別されます。カウンターはホットスポットノードがエビクションされた後にリセットされます。 | 5 |
| *metav1.Duration | Duration 形式の詳細については、「Duration」をご参照ください。(デフォルト値:5m) | ホットスポットチェックのキャッシュ期間。負荷ホットスポットデスケジューリング機能を使用する場合、このパラメーターの値がシステム設定の |
|
|
| クラスター内の名前空間 | デスケジュール可能な名前空間。このパラメーターを空のままにすると、すべての Pod がデスケジュール可能になります。 include と exclude ポリシーがサポートされています。2 つのポリシーは相互排他的です。
| |
| metav1.LabelSelector | LabelSelector 形式の詳細については、「ラベルとセレクター」をご参照ください | LabelSelector を使用してターゲットノードを選択します。 | このパラメーターは 2 つの方法で設定できます。1 つは単一のノードプールを指定する方法、もう 1 つは複数のノードプールを指定する方法です。
|
| PodSelector オブジェクトで構成されるリスト。複数の Pod グループを設定できます。PodSelector のデータ形式は次のとおりです: | LabelSelector 形式の詳細については、「ラベルとセレクター」をご参照ください | LabelSelector を使用して、デスケジューリングが有効になっている Pod を選択します。 | |
よくある質問
ノードの使用率がしきい値に達しても、ノード上の Pod がエビクションされない場合はどうすればよいですか?
この問題は、次の理由で発生する可能性があります。対応するソリューションを参照して問題を解決できます。
原因の分類 | 原因の説明 | ソリューション |
コンポーネント設定が有効でない | 有効範囲が指定されていない。 | Descheduler の設定には、Pod とノードの有効範囲が含まれます。対応する名前空間とノードが有効になっているか確認してください。 |
設定変更後に Descheduler が再起動されていない。 | Descheduler の設定を変更した後、変更を有効にするには再起動する必要があります。Descheduler の再起動方法の詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。 | |
不適切なコンポーネント設定 | Descheduler コンポーネントの実行間隔が LowNodeLoad プラグインのキャッシュ期間より長いため、ホットスポットノードの検出が無効になる。 |
|
ノードの状態が条件を満たさない | ノードの平均使用率が長時間しきい値を下回っている。 | Descheduler は一定期間の使用率を継続的に監視し、モニタリングデータの平滑化された平均値を計算します。そのため、デスケジューリングは、ノードの使用率が継続的にしきい値を超えた場合にのみトリガーされます。デフォルトでは、この期間は約 10 分です。ただし、 |
クラスターの残存容量が不足している。 | Pod をエビクションする前に、Descheduler はクラスター内の他のノードをチェックして、移行に十分な容量があることを確認します。たとえば、8 コアと 16 GiB のメモリを必要とする Pod がエビクション対象として選択されたが、クラスター内の他のすべてのノードの利用可能容量がこの値を下回っている場合、Descheduler はセキュリティ上の理由から Pod を移行しません。この場合、ノードを追加してクラスターの容量を確保することを検討してください。 | |
ワークロードのプロパティ制約 | ワークロードが単一レプリカ版である。 | 単一レプリカアプリケーションの高可用性を確保するため、これらの Pod はデフォルトではデスケジュールされません。そのような単一レプリカアプリケーションを評価し、Pod をデスケジュールしたい場合は、Pod またはデプロイメントや StatefulSet などのワークロードの TemplateSpec にアノテーション 説明 このアノテーション設定は v1.3.0-ack1.6、v1.3.0-ack1.7、または v1.3.0-ack1.8 ではサポートされていません。コンポーネントを最新バージョンにアップグレードするには、「コンポーネントのインストールと管理」をご参照ください。 |
Pod が HostPath または EmptyDir を指定している。 | デフォルトでは、`emptyDir` または `hostPath` で設定された Pod は、データセキュリティを確保するためにデスケジューリングから除外されます。これらの Pod をデスケジュールしたい場合は、`evictLocalStoragePods` 設定をご参照ください。詳細については、「エビクションと移行の制御設定」をご参照ください。 | |
利用不可能なレプリカまたは移行中のレプリカの数が多すぎる。 | デプロイメントや StatefulSet などのワークロードの利用不可能なレプリカまたは移行中のレプリカの数が設定された制限 (maxUnavailablePerWorkload または maxMigratingPerWorkload) を超えると、Descheduler はエビクションを開始しません。たとえば、maxUnavailablePerWorkload と maxMigratingPerWorkload が 20% に設定され、デプロイメントの望ましいレプリカ数が 10 で、2 つの Pod がエビクション中またはリリース中の場合、Descheduler はこれ以上 Pod をエビクションしません。Pod のエビクションまたはリリースが完了するのを待つか、これら 2 つの設定の値を増やしてください。 | |
レプリカ数の制約設定が正しくない。 | ワークロードのレプリカ総数が maxMigratingPerWorkload または maxUnavailablePerWorkload の値以下の場合、Descheduler はセキュリティ上の理由からワークロードをデスケジュールしません。これを解決するには、これら 2 つの設定の値を減らすか、パーセンテージに変更してください。 |
Descheduler が頻繁に再起動するのはなぜですか?
Descheduler は、その ConfigMap が無効であるか存在しない場合に頻繁に再起動することがあります。詳細については、「詳細設定」をご参照ください。ConfigMap の内容と形式を確認し、ConfigMap を変更してから Descheduler を再起動してください。Descheduler の再起動方法の詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。
負荷認識スケジューリングと負荷ホットスポットデスケジューリングを併用するにはどうすればよいですか?
負荷ベースのホットスポットデスケジューリングを有効にすると、ホットスポットノード上の Pod がエビクションされます。ACK スケジューラは、デプロイメントなどの上位コントローラーによって作成された Pod に適切なノードを選択します。最適な負荷分散を実現するために、同時に負荷認識スケジューリングを有効にすることを推奨します。詳細については、「負荷認識スケジューリングの使用」をご参照ください。
負荷認識スケジューリングの loadAwareThreshold パラメーターを、K8s Spot Rescheduler の highThresholds パラメーターと同じ値に設定することを推奨します。詳細については、「スケジューリングポリシー」をご参照ください。ノードの負荷が highThresholds を超えると、K8s Spot Rescheduler はそのノード上の Pod をエビクションします。スケジューラはその後、loadAwareThreshold を使用して、新しい Pod がホットスポットノードにスケジュールされるのを防ぎます。パラメーターを同じ値に設定しない場合、エビクションされた Pod がホットスポットノードに再スケジュールされる可能性があります。この問題は、Pod がスケジュール可能なノードの範囲を指定しているが、利用可能なノードが少なく、これらのノードのリソース使用率が類似している場合に発生しやすくなります。
デスケジューリングが参照する使用率アルゴリズムは何ですか?
Descheduler は一定期間のリソース使用量を継続的に監視し、平均値を計算します。ノードがデスケジュールされるのは、その平均リソース使用量が一定期間 (デフォルトでは 10 分) しきい値を超え続けた場合のみです。メモリについては、オペレーティングシステムがこれらのリソースを再利用できるため、Descheduler の使用量計算ではページキャッシュが除外されます。対照的に、kubectl top node コマンドが返す使用量にはページキャッシュが含まれます。Managed Service for Prometheus を使用して、実際のメモリ使用量を確認できます。