ack-koordinatorは、負荷認識ホットスポットのスケジューリング解除機能を提供します。これにより、クラスターノードの負荷の変化を検出し、安全負荷を超えるノードを自動的に最適化して、極端な負荷の不均衡を防ぎます。 このトピックでは、負荷認識ホットスポットのスケジューリング解除機能を使用する方法と、この機能の詳細設定を構成する方法について説明します。
制限事項
ACK Proクラスターのみが、負荷認識ホットスポットのスケジューリング解除をサポートしています。 詳細については、「ACK管理クラスターの作成」をご参照ください。
負荷認識型ホットスポットのスケジューリング解除機能を使用するには、次の要件が満たされていることを確認します。
コンポーネント
必要なバージョン
ACKスケジューラ
v1.22.15-ack-4.0以降またはv1.24.6-ack-4.0以降
ack-koordinator(ack-slo-manager)
v1.1.1-ack.1以降
ヘルム
3.0以降
デスケジューラはポッドのみを追い出し、ACKスケジューラはポッドを再スケジュールします。 負荷認識スケジューリングと一緒にスケジュール解除機能を使用することを推奨します。 これにより、ACKスケジューラは、ポッドを再びホットスポットにスケジューリングすることを回避できる。
再スケジュールプロセス中に、古いポッドが追い出され、新しいポッドが作成されます。 削除中にアプリケーションの可用性に影響を与えないように、アプリケーションに十分な冗長レプリカがあることを確認します。
スケジュール解除プロセスでは、標準のKubernetes eviction APIを使用してポッドを削除します。 アプリケーションポッドのロジックがリエントラントで、削除後のポッドの再起動によりサービスがダウンしていないことを確認します。 詳細については、「API開始の立ち退き」をご参照ください。
課金ルール
ack-koordinatorコンポーネントをインストールして使用する場合、料金はかかりません。 ただし、次のシナリオでは料金が請求される場合があります。
ack-koordinatorは、インストール後にワーカーノードリソースを占有する管理対象外のコンポーネントです。 コンポーネントのインストール時に、各モジュールが要求するリソースの量を指定できます。
既定では、ack-koordinatorは、リソースプロファイリングやきめ細かいスケジューリングなどの機能のモニタリングメトリックをPrometheusメトリックとして公開します。 ack-koordinatorのPrometheusメトリクスを有効にし、PrometheusのManaged Serviceを使用する場合、これらのメトリクスはカスタムメトリクスと見なされ、料金が課金されます。 料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheusメトリクスを有効にする前に、Prometheusのマネージドサービスの課金概要トピックを読んで、カスタムメトリクスの無料クォータと課金ルールを確認することをお勧めします。 リソース使用量を監視および管理する方法の詳細については、「リソース使用量と請求書」をご参照ください。
負荷認識ホットスポットのスケジューリング解除の概要
このセクションでは、負荷認識ホットスポットのスケジューリング解除で使用される用語について説明します。
負荷認識ポッドのスケジューリング
ACKスケジューラは、低負荷で動作するノードにポッドをスケジュールすることができる負荷認識スケジューリングをサポートする。 クラスタ環境、トラフィック、および要求の変化に起因して、ノードの利用は動的に変化し、クラスタ内のノード間の負荷バランスを破壊する可能性があり、さらには極端な負荷不均衡をもたらす可能性がある。 これは、ワークロードのランタイム品質に影響します。 ack-koordinatorは、ノードの負荷の変化を特定し、安全負荷を超えるノードを自動的に最適化して、極端な負荷の不均衡を防ぎます。 負荷認識スケジューリングとホットスポットのデスケジューリングを組み合わせて使用すると、ノード間で最適な負荷分散を実現できます。 詳細については、「負荷対応のポッドスケジューリングの使用」をご参照ください。
koord-deschedulerの仕組み
koord-deschedulerはack-koordinatorコンポーネントのモジュールです。 LowNodeLoadプラグインは、負荷の変更を識別し、ホットスポットのスケジューリング解除を実行できます。 KubernetesネイティブのデスケジューラープラグインLowNodeUtilizationとは異なり、LowNodeLoadプラグインはノードの実際の使用率に基づいてノードのスケジュールを解除することを決定しますが、LowNodeUtilizationはリソース割り当てに基づいてスケジュール解除することを決定します。
スケジュール解除手順
koord-deskedulerは定期的にスケジューリング解除を実行します。 次の図は、各サイクル内のスケジュール解除の手順を示しています。
データ収集: クラスター内のノードとワークロード、およびリソース使用率統計に関する情報を収集します。
ポリシープラグインによるポリシー実装のスケジュール解除。
このセクションでは、例としてLowNodeLoadを使用します。
ホットスポットノードを識別します。 ノードの分類の詳細については、「負荷しきい値」をご参照ください。
すべてのホットスポットノードを横断し、ポッドを移行できるノードを識別し、ポッドをソートします。 ポッドのスコアリングおよびソート方法の詳細については、「ポッドスコアリングポリシー」をご参照ください。
移行するすべてのポッドを探索し、クラスターのサイズ、リソース使用率、レプリケートされたポッドの比率などの制約に基づいて、ポッドが移行要件を満たしているかどうかを確認します。 詳細については、「負荷対応ホットスポットのスケジューリング解除ポリシー」をご参照ください。
要件を満たすポッドのみが移行されます。 現在のノードの要件を満たすポッドがない場合、LowNodeLoadは他のホットスポットノードのポッドを引き続きトラバースします。
ポッドの削除と移行: 移行の要件を満たすポッドを削除します。 詳細については、「API開始の立ち退き」をご参照ください。
ロードしきい値
LowNodeLoadプラグインを使用すると、次のロードしきい値を設定できます。
highThreshold: 高負荷しきい値を指定します。 負荷がこのしきい値より高いノード上のポッドはスケジュール解除されます。 ACKスケジューラの負荷認識スケジューリング機能を有効にすることを推奨します。 詳細については、「スケジューリングポリシー」をご参照ください。 それらを組み合わせて使用する方法の詳細については、負荷認識スケジューリングと負荷認識ホットスポットのスケジューリング解除の組み合わせを使用するにはどうすればよいですか?
lowThreshold: 低負荷しきい値を指定します。 負荷がこのしきい値より低いノードのポッドはスケジュール解除されません。
次の図では、lowThresholdが45% に設定され、highThresholdが70% に設定されています。 ノードは、その負荷および閾値に基づいて分類される。 lowThresholdsとhighThresholdsの値が変わると、ノード分類の基準も変わります。
リソース使用率の統計は1分ごとに更新され、前の5分間の平均値が表示されます。
アイドルノード: リソース使用率が45% より低いノード。
通常のノード: リソース使用率が45% 以上70% 以下のノード。 これは、クラスターノードの望ましいリソース使用範囲です。
ホットスポットノード: リソース使用率が70より高いノード。 ホットスポットノード上のポッドは、これらのノードのリソース使用率が70% 以下に低下するまで追い出されます。
負荷認識ホットスポットのスケジューリング解除ポリシー
ポリシー | 説明 |
ホットスポット検出周波数ポリシー | ホットスポットノードを正確に識別し、監視データの遅延によるポッドの頻繁な移行を回避するために、koord-deschedulerではホットスポットの検出頻度を指定できます。 ノードは、ノードが連続して負荷しきい値を超える回数が指定された頻度値に達した場合にのみ、ホットスポットノードと見なされます。 |
ノードソートポリシー | ホットスポットノードが識別されると、koord-desschedulerは、リソース使用量の降順でノードをソートし、ノードを順番にデスケジュールします。 koord − deschedulerは、ホットスポットノードのメモリおよびCPU使用量を比較し、好ましくは、リソース使用量がより高いノードをデスケジュールする。 |
ポッドスコアリングポリシー | koord-deschedulerは、各ホットスポットノード上のポッドをスコア化してソートし、次の順序でポッドをアイドルノードに追い出します。
説明 ポッドの削除順序に特定の要件がある場合は、ポッドに異なる優先順位またはQoSクラスを設定することをお勧めします。 |
フィルタリングポリシー | koord-deschedulerを使用すると、さまざまなポッドおよびノードフィルターを設定して、スケジューリング解除を制御できます。
|
Precheckポリシー | koord-deschedulerは、ポッドを移行する前にポッドを事前にチェックできます。
|
移行制御ポリシー | ポッド移行中のアプリケーションの高可用性を確保するために、koord-deschedulerにはポッド移行を制御できる複数の機能が用意されています。 ノード、名前空間、またはワークロードごとに同時に移行できるポッドの最大数を指定できます。 koord-deschedulerでは、ポッド移行時間ウィンドウを指定して、同じワークロードに属するポッドが頻繁に移行されないようにすることもできます。 koord-deschedulerは、オープンソースKubernetesのPod Disruption Budgets (PDB) メカニズムと互換性があり、きめ細かい方法でアプリケーションの高可用性を保証するのに役立ちます。 詳細については、「アプリケーションの中断予算の指定」をご参照ください。 |
Observabilityポリシー | イベントを収集してスケジュール解除手順を監視し、スケジュール解除の理由とステータスをイベントの詳細に表示できます。 次のコードブロックに例を示します。
を止める |
ステップ1: ack-koordinatorをインストールまたは変更し、負荷認識ホットスポットのスケジューリング解除を有効にする
ack-koordinatorのインストール
ack-koordinatorをインストールします。 [ack-koordinator(ack-slo-manager) のインストール] ページで、[ack-koordinatorのデスケジューラの有効化] を選択します。 詳細については、「ack-koordinatorのインストール」をご参照ください。
ack-koordinatorの変更 (ack-koordinatorは既にインストール済み)
ack-koordinatorを変更します。 ack-koordinatorパラメーターページで、ack-koordinatorのデスケジューラの有効化を選択します。 詳細については、「ack-koordinatorの変更」をご参照ください。
ステップ2: LowNodeLoadプラグインの有効化
[koord-descheduler-config.yaml] という名前のファイルを作成し、次のYAMLコンテンツをファイルに追加します。
koord-descheduler-config.yamlファイルは、LowNodeLoadプラグインを有効にするために使用されるConfigMapです。
次のコマンドを実行して、クラスターに設定を適用します。
kubectl apply -f koord-descheduler-config.yaml
次のコマンドを実行して、koord-deschedulerを再起動します。
koord-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: 負荷認識ホットスポットのスケジューリング解除を確認する
このセクションでは、3つのノードを含むクラスターを例として使用します。 各ノードには104 vCoreと396 GBのメモリがあります。
という名前のファイルを作成します。stress-demo.yaml次の内容をファイルに追加します。
次のコマンドを実行して、ストレステスト用のポッドを作成します。
kubectl create -f stress-demo.yaml deployment.apps/stress-demo created
次のコマンドを実行して、実行が開始されるまでポッドのステータスを表示します。
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>
出力は、ポッドの
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: LowNodeLoadプラグインの有効化」をご参照ください。
次のコマンドを実行して、ポッドの変更を表示します。
デスケジューラがホットスポットノードを識別し、ポッドを削除するのを待ちます。
説明ノードが10分以内に5回連続して高リソースしきい値を超える場合、ノードはホットスポットノードと見なされます。
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
を止める
出力は移行結果を示します。 ホットスポットノード上のポッドがアイドルノードに移行されます。
拡張設定
koord-deschedulerの詳細設定
koord-deschedulerの設定はConfigMapに格納されます。 次のコードブロックは、負荷認識ホットスポットのスケジューリング解除の詳細設定を示しています。
koord-deschedulerシステム设定
パラメーター | タイプ | 有効値 | 説明 | 例 |
dryRun | Boolean |
| グローバル読み取り専用モード。The global read-only mode. このモードを有効にすると、ポッドは移行できません。 | false |
deschedulingInterval | time. デュレーション | > 0s | スケジュール解除間隔。 | 120s |
移行制御の設定
パラメーター | タイプ | 有効値 | 説明 | 例 |
maxMigratingPerNode | int64 型 | ≥ 0 (デフォルト値: 2) | ノードで同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。 | 2 |
maxMigratingPerNamespace | int64 型 | ≥ 0 (デフォルト値: 0) | 名前空間内で同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。 | 1 |
maxMigratingPerWorkload | intOrString | ≥ 0 (デフォルト値: 10%) | デプロイなどのワークロードで同時に移行できるポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。 ワークロードにレプリケートされたポッドが1つしか含まれていない場合、そのワークロードはスケジュール解除対象から除外されます。 | 1または10% |
maxUnavailablePerWorkload | intOrString | 0 (デフォルト値: 10%) 以上で、ワークロードのレプリケートされたポッドの数より小さい | 展開などのワークロードで許可されている、利用できないレプリケートポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。 | 1または10% |
evictLocalStoragePods | Boolean |
| emptyDirまたはhostPathで構成されているポッドをスケジュール解除できるかどうかを指定します。 デフォルトでは、データセキュリティを確保するためにこの機能は無効になっています。 | false |
objectLimiters.workload | 次の形式の構造体:
|
| ワークロード固有のポッド移行制御。
|
この例では、ワークロードで5分以内に移行できるレプリケートポッドは1つだけです。 |
LowNodeLoadの設定
パラメーター | タイプ | 有効値 | 説明 | 例 |
highThresholds | map[string]float64 説明 パラメーターをパーセント値に設定します。 このパラメーターは、ポッドまたはノードに指定できます。 | [0,100] | 高いリソースしきい値。 負荷がこのしきい値を超えるノードのポッドはスケジュール解除されます。 説明 負荷認識ホットスポットのスケジューリング解除と負荷認識スケジューリングを併用できます。 このパラメーターとloadAwareThresholdパラメーターを同じ値に設定します。 このように、スケジューラはポッドをホットスポットにスケジュールしません。 詳細については、「スケジューリングポリシー」をご参照ください。 |
|
lowThresholds | map[string]float64 説明 パラメーターをパーセント値に設定します。 このパラメーターは、ポッドまたはノードに指定できます。 | [0,100] | 低いリソースしきい値。 負荷がこのしきい値より低いノードのポッドはスケジュール解除されません。 |
|
anomalyCondition. continuitiveAbnormalities | int64 型 | > 0 (デフォルト値: 5) | ホットスポット検出周波数。 ノードが指定された連続数のホットスポット検出サイクル内でhighThresholdsを超える場合、ノードはホットスポットノードと見なされます。 ホットスポットノードがスケジュール解除され、その後カウンタがリセットされる。 | 5 |
evictableNamespaces |
| クラスター内の名前空間 | スケジュール解除のために含める、または除外する名前空間。 このパラメーターを空のままにすると、すべてのポッドをスケジュール解除できます。 includeまたはexcludeリストを指定できます。 リストは相互に排他的です。
|
|
nodeSelector | metav1.LabelSelector | LabelSelectorの形式の詳細については、「Labels and Selectors」をご参照ください。 | LabelSelectorを使用してノードを選択します。 | このパラメーターを設定するときに、1つのノードプールまたは複数のノードプールを指定できます。
|
podSelectors | 複数のポッドで構成できるリスト。 PodSelectorのフォーマット:
| LabelSelectorの形式の詳細については、「Labels and Selectors」をご参照ください。 | スケジュール解除できるポッドを指定します。 |
|
よくある質問
ノードのリソース使用率が高しきい値に達したが、ノード上のポッドが追い出されない場合はどうすればよいですか?
考えられる原因を次の表に示します。
カテゴリ | 原因 | 解決策 |
無効なコンポーネント構成 | ポッドまたはノードが指定されていない | デスケジューラの構成にポッドまたはノードは指定されていません。 名前空間とノードが指定されているかどうかを確認します。 |
変更後に再起動されないデスケジューラ | デスケジューラの設定を変更した後、変更を有効にするために再起動する必要があります。 デスケジューラを再起動する方法の詳細については、「手順2: LowNodeLoadプラグインを有効にする」をご参照ください。 | |
無効なノードステータス | 長期間の平均ノードリソース使用率がしきい値より低い | デスケジューラは、ある期間内のリソース利用を継続的に監視し、平均値を計算する。 スケジュール解除は、平均値が一定期間閾値を超えたままである場合にのみトリガされる。 デフォルトの期間は10分です。 |
クラスター内の使用可能なリソースが不十分 | デスケジューラは、クラスター内の他のノードをチェックして、デスケジューラがポッドを退去させる前に、ノードが十分な利用可能なリソースを提供できることを確認します。 たとえば、デスケジューラは、8 vCoresと16 GBのメモリを要求するポッドを削除したいとします。 ただし、クラスター内のノードは、ポッドの要件を満たすのに十分なリソースを提供できません。 この場合、デスケジューラはポッドを追い出しません。 この問題を解決するには、クラスターにノードを追加します。 | |
ワークロードの制限 | ワークロード内の1つのレプリケートされたポッドのみ | デフォルトでは、ワークロードにレプリケートされたポッドが1つしか含まれていない場合、ポッドはスケジュール解除の対象から除外されます。 これにより、ポッドで実行されるアプリケーションの高可用性が保証されます。 上記のポッドをスケジュール解除する場合は、 説明 このアノテーション設定は、v1.2.0-ack1.3以前のバージョンのみをサポートします。 |
emptyDirまたはhostPathで構成されたポッド | デフォルトでは、emptyDirまたはhostPathで構成されたポッドは、データのセキュリティを確保するためにスケジュール解除から除外されます。 これらのポッドをスケジュール解除する場合は、evictLocalStoragePods設定を参照してください。 詳細については、「移行制御の設定」をご参照ください。 | |
移行中の利用できないレプリケートポッドまたはレプリケートポッドの数が多すぎる | ワークロード (DeploymentまたはStatefulSet) で移行されている、利用できないレプリケートされたポッドまたはレプリケートされたポッドの数が、maxUnavailablePerWorkloadまたはmaxMigrationPerWorkloadで指定された上限を超えています。 たとえば、maxUnavailablePerWorkloadとmaxMigrationPerWorkloadの両方が20% に設定され、Deploymentのレプリケートされるポッドの予想数が10に設定されているとします。 2つのポッドが移行中またはアプリケーションをリリース中です。 この場合、デスケジューラはこれらのポッドを追い出しません。 ポッドが移行されるか、ポッドがアプリケーションのリリースを完了するまで待つか、上記のパラメーターの値を増やします。 | |
複製ポッドの制限が正しくない | ワークロード内のレプリケートされたポッドの数が、maxMigrationPerWorkloadで指定された移行可能なポッドの最大数、またはmaxUnavailablePerWorkloadで指定された使用不可能なポッドの最大数以下の場合、デスケジューラはワークロード内のポッドのスケジュールを解除しません。 上記のパラメーターの値を減らし、パラメーターをパーセント値に設定します。 |
デスケジューラが頻繁に再起動するのはなぜですか?
デスケジューラのConfigMapの形式が無効であるか、ConfigMapが存在しません。 [詳細設定] を参照して、ConfigMapの内容と形式を確認し、ConfigMapを変更してから、デスケジューラを再起動します。 デスケジューラを再起動する方法の詳細については、「手順2: LowNodeLoadプラグインを有効にする」をご参照ください。
負荷認識スケジューリングと負荷認識ホットスポットのスケジューリング解除の組み合わせを使用するにはどうすればよいですか?
負荷認識型ホットスポットのスケジューリング解除を有効にすると、ホットスポットノード上のポッドが削除されます。 ACKスケジューラは、上位層のコントローラ (デプロイメントなど) によって作成されるポッドに適したノードを選択します。 最適な負荷分散を実現するために、負荷認識スケジューリングを同時に有効にすることをお勧めします。 詳細については、「Use load-aware scheduling」をご参照ください。
スケジューラのloadAwareThresholdパラメーターとデスケジューラのhighThresholdパラメーターを同じ値に設定することを推奨します。 詳細については、「Scheduling policies」をご参照ください。 ノードの負荷がhighThresholdsを超えると、デスケジューラはノード上のポッドを削除します。 loadAwareThresholdのため、スケジューラはホットスポットノードへの新しいポッドのスケジューリングを停止します。 パラメーターを同じ値に設定しない場合、ポッドはホットスポットノードにスケジュールされる可能性があります。 この問題は、ポッドがスケジューリング可能なノードのスコープを指定しているが、使用可能なノードの数が少なく、これらのノードのリソース使用率の値が近い場合に発生する可能性が高くなります。
デスケジューラによって使用される利用アルゴリズムは何ですか?
デスケジューラは、ある期間内のリソース利用を継続的に監視し、平均値を計算する。 スケジュール解除は、平均値が一定期間閾値を超えたままである場合にのみトリガされる。 デフォルトの期間は10分です。 加えて、デスケジューラによってカウントされるメモリ使用率は、ページキャッシュによって使用されるメモリリソースがオペレーティングシステムによってリサイクルされ得るので、ページキャッシュを除外する。 kubectl top node
コマンドを使用して照会されたメモリ使用率には、ページキャッシュが含まれます。 実際のメモリ使用率は、Managed Service for Prometheusコンソールで確認できます。