スケジュール解除は、ノード上の削除ルールに一致するポッドを別のノードにスケジュールするプロセスです。 この機能は、不均一なクラスターリソース使用率、高負荷ノード、新しいスケジューリングポリシーの需要などのシナリオに適しています。 スケジュール解除機能は、クラスターの健全性の維持、リソース使用の最適化、ワークロードのサービス品質の向上に役立ちます。 このトピックでは、RemovePodsViolatingNodeTaints
という名前のノード汚染検証プラグインを例として使用し、ack-koordinatorコンポーネントに基づいてスケジューリング解除機能を有効にする方法について説明します。
あなたが始める前に
このトピックを読む前に、機能、使用シナリオ、ワークフロー、およびスケジュール解除の基本概念について学ぶことをお勧めします。 詳細については、「スケジュール解除の概要」をご参照ください。
このトピックでは、例として
RemovePodsViolatingNodeTaints
という名前のノード汚染検証プラグインを使用します。 NoScheduleなど、ポッドのスケジュールと削除にテイントと許容範囲を使用する方法の詳細については、「テイントと許容範囲」をご参照ください。Kubernetes Deschedulerを使用する場合は、Koordinator DeschedulerとKubernetes Deschedulerの違いについて学習し、Koordinator Deschedulerに移行することを推奨します。 詳細については、「Koordinator DeschedulerとKubernetes Deschedulerの比較」をご参照ください。
スケジュール解除機能の基本的な操作に精通している場合は、システム構成、テンプレート構成、ポリシープラグイン構成、およびevictorプラグイン構成などの高度な構成を調べることができます。 詳細については、「詳細パラメーターの設定」をご参照ください。
前提条件
ACK Proクラスターが作成されました。 詳細については、「ACK管理クラスターの作成」をご参照ください。
説明スケジュール解除機能は、仮想ノードでは使用できません。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
使用上の注意
Koordinator Deschedulerは実行中のポッドのみを削除し、削除されたポッドを再作成またはスケジュールしません。 ポッドが削除されると、ポッドはDeploymentやStatfulSetなどのワークロードコントローラーによって再作成されます。 再作成されたポッドは引き続きスケジューラによってスケジュールされます。
スケジュール解除プロセス中に、古いポッドが削除され、新しいポッドが作成されます。 削除中にアプリケーションの可用性が影響を受ける場合に備えて、アプリケーションに十分な
レプリカ
があることを確認してください。
例
このトピックでは、ack-koordinatorコンポーネントに基づいて、スケジューリング解除機能を有効にし、スケジューリング解除ポリシーを実装する方法について説明します。 ノード汚染検証プラグインRemovePodsViolatingNodeTaints
を例として使用します。
デフォルトでは、RemovePodsViolatingNodeTaints
ポリシーは、taint効果
がNoSchedule
であるノードのポッドと、taintを許容できないポッドを削除します。 たとえば、ノードは実行中のポッドをホストし、管理者はdeschedule=not-allow:NoSchedule
テイントをノードに追加します。 ノード上のポッドがテイントを許容する許容範囲で構成されていない場合、ポッドはスケジューリング解除ポリシーによって削除されます。 詳細については、「RemovePodsViolatingNodeTaints」をご参照ください。
RemovePodsViolatingNodeTaints
ポリシーでは、ノードの汚染を無視するようにexcludedTaints
フィールドを設定できます。 taint key
またはkey-valueペア (key=value
) がexcludedTaints
リストのtaintと一致する場合、そのtaintは無視されます。
この例では、プラグインは次の方法で汚染を検証するように設定されています。
ノードで
effect
がNoSchedule
に設定されます。NoSchedule
テイント属性では、テイントキー
はスケジュール解除
ではなく、テイント値
はnot-allow
ではありません。
上記の条件を満たすノードで、実行中のポッドに一致する許容範囲がない場合、ポッドはデスケジューラによって追い出されます。
手順1: ack-koordinatorコンポーネントをインストールまたは変更し、スケジューリング解除を有効にする
このセクションの手順に従って、ack-koordinator (FKA ack-slo-manager) コンポーネントをインストールし、Koordinator Deschedulerが提供するスケジューリング解除機能を使用できます。 Koordinator Deschedulerは、デプロイとしてノードにデプロイされます。
ack-koordinatorコンポーネントをインストールしている場合は、コンポーネントのバージョンが1.2.0-ack.2以降であることを確認してください。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
ack-koordinatorコンポーネントを見つけて、右下隅の [インストール] をクリックします。 [ack-koordinatorのインストール] ダイアログボックスで、[ACK-Koordinatorのデスケジューラの有効化] を選択して、スケジューリング解除モジュールを有効にします。 次に、プロンプトに従ってコンポーネントを設定してインストールします。
ステップ2: RemovePodsViolatingNodeTaints
という名前のスケジューリング解除プラグインを有効にする
次のYAMLコンテンツを使用して、koord-descheduler-config.yamlという名前のファイルを作成します。
koord-descheduler-config.yamlファイルは、
RemovePodsViolatingNodeTaints
という名前のスケジューリング解除プラグインを有効化および設定するために使用されるConfigMapです。# koord-descheduler-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: koord-descheduler-config namespace: kube-system data: koord-descheduler-config: | # Do not modify the following system configuration of koord-desheduler. apiVersion: descheduler/v1alpha2 kind: DeschedulerConfiguration leaderElection: resourceLock: leases resourceName: koord-descheduler resourceNamespace: kube-system deschedulingInterval: 120s # The interval at which LowNodeLoad runs. The interval is set to 120 seconds in this example. dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations. # The preceding configuration is the system configuration. profiles: - name: koord-descheduler plugins: deschedule: enabled: -name: RemovePodsViolatingNodeTaints # Enable the node taint verification plug-in. pluginConfig: - name: RemovePodsViolatingNodeTaints # The configurations of the node taint verification plug-in. args: excludedTaints: - deschedule=not-allow # Ignore nodes whose taint key is deschedule and taint value is not-allow.
次のコマンドを実行して、koord-descheduler-config.yamlファイルをクラスターにデプロイします。
kubectl apply -f koord-descheduler-config.yaml
次のコマンドを実行して、デスケジューラーモジュールKoordinator deschedulerを再起動します。
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 # Expected output: # deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 # Expected output: # deployment.apps/ack-koord-descheduler scaled
ack-koord-descheduler
Deploymentのレプリカ数を0
に設定し、1
に設定します。 この操作により、Koordinator Deschedulerモジュールが再起動されます。 再起動後に最新の設定が使用されます。
ステップ3: スケジュール解除機能の確認
3つのノードを含むクラスターを例として使用します。
次のYAMLコンテンツを使用して、stress-demo.yamlという名前のファイルを作成します。
サンプルアプリケーションはstress-demo.yamlファイルで定義されています。
次のコマンドを実行してstress-demo.yamlファイルをデプロイし、テストポッドを作成します。
kubectl create -f stress-demo.yaml
次のコマンドを実行して、実行状態になるまでポッドのステータスを表示します。
kubectl get pod -o wide
期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 10s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 10s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 10s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none>
次のコマンドを実行して、
key=value:NoSchedule
taintをノードに追加します。deschedule=not-allow:NoSchedule
テイントをcn-beijing.192.XX.XX.247
という名前のノードに追加します。kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule
期待される出力:
node/cn-beijing.192.XX.XX.247 tainted
deschedule=allow:NoSchedule
テイントをcn-beijing.192.XX.XX.248
という名前のノードに追加します。kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule
期待される出力:
node/cn-beijing.192.XX.XX.248 tainted
次のコマンドを実行して、ポッドの変更を表示します。
kubectl get pod -o wide -w
デスケジューラーモジュールがノードの汚染を確認し、削除操作を実行するのを待ちます。
期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 5m34s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 5m34s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 5m34s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Terminating 0 7m58s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-j**** 0/1 ContainerCreating 0 0s <none> cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-j**** 1/1 Running 0 2s 192.XX.XX.32 cn-beijing.192.XX.XX.249 <none> <none>
出力は次の情報を示します。
ノード
cn-beijing.192.XX.XX.248
上のポッドのstress-demo-5f6cddf9-v ****
は、taintdeschedule=allow:NoSchedule
で削除されます。ノード
cn-beijing.192.XX.XX.247
上のポッドのstress-demo-5f6cddf9-9 ****
は、taintdeschedule=not-allow:NoSchedule
で削除されません。削除されたポッドの
stress-demo-5f6cddf9-v ****
は、NoSchedule
テントを持たないノードcn-beijing.192.XX.XX.249
にスケジュール解除されます。
次のコマンドを実行して、追い出されたポッドのイベントを表示します。
kubectl get event | grep stress-demo-5f6cddf9-v****
期待される出力:
3m24s Normal Evicting podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 2m51s Normal EvictComplete podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" has been evicted 3m24s Normal Descheduled pod/stress-demo-5f6cddf9-v**** Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 3m24s Normal Killing pod/stress-demo-5f6cddf9-v**** Stopping container stress
を止める
期待される出力は、ポッドの移行レコードを示します。 ノード
cn-beijing.192.XX.XX.248
のtaintdeschedule=not-allow
を許容するように、一致する許容範囲でポッドが構成されていません。 その結果、ポッドは別のノードにスケジュール解除されます。 結果は期待に応えます。
詳細パラメーターの設定
上記の操作に加えて、ConfigMapを使用してKoordinator Deschedulerの詳細パラメーターを設定することもできます。
高度な設定の例
次のYAMLファイルは、Koordinator Deschedulerの高度な設定の例を示しています。 これらの設定は、DeschedulerConfiguration
APIを呼び出してKoordinator Deschedulerの動作を変更し、RemovePodsViolatingNodeTaint
ノードのテイント検証ポリシーを有効にし、MigrationController
をpod evictorとして使用します。
サンプル設定のパラメーターの詳細については、次のセクションを参照してください。
システム構成
DeschedulerConfiguration
で、Koordinator Deschedulerのグローバルなシステムレベルの動作を設定できます。
パラメーター | タイプ | 有効値 | 説明 | 例 |
| Boolean |
| グローバル読み取り専用モード。The global read-only mode. このモードを有効にすると、ポッドは移行できません。 | false |
| time. デュレーション | > 0s | スケジュール解除間隔。 | 120s |
| Structure | 非該当 | スケジュール解除できるノードを制限します。 スケジューリング解除ポリシーは、ノードセレクタで指定されたノードに対してのみ有効です。 ノードセレクタの詳細については、「Kubernetes labelSelector」をご参照ください。 |
|
| int | ≥ 0 (デフォルト値: 0) | ノードで同時に削除できるポッドの最大数を制限します。 このパラメーターは、スケジューリング解除中に有効になります。 | 10 |
| int | ≥ 0 (デフォルト値: 0) | 名前空間で同時に削除できるポッドの最大数を制限します。 このパラメーターは、スケジューリング解除中に有効になります。 | 10 |
テンプレート設定
Koordinator Deschedulerは、スケジュール解除テンプレートを使用してスケジュール解除ポリシーとポッドエビクターを管理します。 DeschedulerConfiguration
のprofiles
フィールドで、1つ以上のスケジューリング解除テンプレートを定義できます。 各スケジュール解除テンプレートでは、スケジュール解除ポリシーとpod evictorがプラグインとして設定されます。 スケジュール解除テンプレートには、次の部分が含まれます。
name
値は文字列です。 スケジュール解除テンプレートの名前をカスタマイズできます。
プラグイン
有効または無効にするスケジュール解除ポリシー (
スケジュール解除
、バランス
) 、ポッド削除プラグイン (evict
) 、およびポッド削除の前に使用するフィルターポリシー (filter
) を設定します。 次の表に、構成可能なパラメーターを示します。パラメーター
タイプ
有効値
説明
例
スケジュール解除
次の形式の構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
Enabled
とDisabled
はプラグイン
構造化リストです。すべてのプラグインはデフォルトで無効になっています。 スケジュール解除ポリシーを有効にするように指定できます。
plugins: deschedule: enabled: - name: PodLifeTime - name: RemovePodsViolatingNodeTaints
RemovePodsViolatingInterPodAntiAffinity
このポリシーは、ポッド間のアフィニティ防止ルールに違反するポッドを削除します。
RemovePodsViolatingNodeAffinity
このポリシーは、ノード類似ルールに一致しないポッドを削除します。
RemovePodsViolatingNodeTaints
このポリシーは、ノードの汚染を許容できないポッドを削除します。
RemovePodsHavingTooManyRestarts
このポリシーは、頻繁に再起動するポッドを削除します。
PodLifeTime
このポリシーは、TTLの有効期限が切れているポッドを削除します。
RemoveFailedPod
このポリシーは、Failed状態のポッドを削除します。
バランス
次の形式の構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
Enabled
とDisabled
はプラグイン
構造化リストです。すべてのプラグインはデフォルトで無効になっています。 有効にするBalanceスケジュール解除ポリシーを指定します。
plugins: balance: enabled: - name: RemoveDuplicates - name: LowNodeLoad
RemoveDuplicates
複製されたポッドを広げる。
LowNodeUtilization
ノードリソース割り当てに基づいてホットスポット拡散を実行します。
HighNodeUtilization
ノードリソース割り当てに基づいて負荷集約を実行します。 ポリシーで許可されている場合、ポッドはリソース使用率の低いノードからリソース使用率の高いノードに移行されます。
RemovePodsViolatingTopologySpreadConstraint
トポロジ分布の制約に一致しないポッドを除外します。
LowNodeLoad
ノードリソース使用率に基づいてホットスポット拡散を実行します。
evict
次の形式の構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
有効および無効は、プラグイン構造化リストです。 [有効] リストでプラグインを有効にし、[無効] リストでプラグインを無効にすることができます。
MigrationController
DefaultEvictor
有効にすることを選択したポッドevictors。
MigrationController
はデフォルトで有効になっています。複数の
削除
プラグインを同時に有効にしないでください。plugins: evict: enabled: - name: MigrationController
フィルター
次の形式の構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
有効および無効は、プラグイン構造化リストです。 [有効] リストでプラグインを有効にし、[無効] リストでプラグインを無効にすることができます。
MigrationController
DefaultEvictor
ポッド削除の前に使用する削除フィルタポリシーを選択します。
MigrationController
はデフォルトで有効になっています。複数の
フィルター
プラグインを同時に有効にしないでください。plugins: filter: enabled: - name: MigrationController
pluginConfig
各プラグインの詳細パラメーターを設定します。
name
フィールドを設定して、設定するプラグインの名前を指定します。args
フィールドでプラグインを設定する方法の詳細については、「ポリシープラグインの設定」および「evictorプラグインの設定」をご参照ください。
ポリシープラグインの設定
Koordinator Deschedulerは、6つのDescheduleポリシープラグインと5つのBalanceポリシープラグインをサポートしています。 LowNodeLoadプラグインは、Koordinatorによって提供されます。 詳細については、「負荷認識型ホットスポットのスケジューリング解除」をご参照ください。 以下のスケジューリング解除プラグインは、Kubernetes Deschedulerによって提供されます。
ポリシータイプ | ポリシー機能 | ポリシー設定 |
Deschedule | このポリシーは、ポッド間のアフィニティ対策ルールに一致しないポッドを削除します。 | |
このポリシーは、ノード類似ルールに一致しないポッドを削除します。 | ||
このポリシーは、ノードの汚染を許容できないポッドを削除します。 | ||
このポリシーは、頻繁に再起動するポッドを削除します。 | ||
このポリシーは、TTLの有効期限が切れているポッドを削除します。 | ||
このポリシーは、Failed状態のポッドを削除します。 | ||
バランス | 複製されたポッドを広げる。 | |
ノードリソース割り当てに基づいてホットスポット拡散を実行します。 | ||
ノードリソース割り当てに基づいて負荷集約を実行します。 | ||
トポロジ分布の制約に一致しないポッドを除外します。 |
evictorプラグインの設定
Koordinator Deschedulerは、DefaultEvictor
とMigrationController
の両方のevictorプラグインをサポートしています。
MigrationController
次の表に、MigrationController
evictorプラグインの詳細設定を示します。
パラメーター | タイプ | 有効値 | 説明 | 例 |
| Boolean |
| emptyDirまたはhostPathで構成されているポッドをスケジュール解除できるかどうかを指定します。 セキュリティ上の理由から、このパラメーターはデフォルトで無効になっています。 | false |
| int64 型 | ≥ 0 (デフォルト値: 2) | ノードで同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。 | 2 |
| int64 型 | ≥ 0 (デフォルト値: 0) | 名前空間内で同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。 | 1 |
| intOrString | ≥ 0 (デフォルト値: 10%) | デプロイなどのワークロードで同時に移行できるポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。 ワークロードにレプリケートされたポッドが1つしか含まれていない場合、そのワークロードはスケジュール解除対象から除外されます。 | 1または10% |
| intOrString | 0 (デフォルト値: 10%) 以上で、ワークロードのレプリケートされたポッドの数より小さい | 展開などのワークロードで許可されている、利用できないレプリケートポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。 | 1または10% |
| 次の形式の構造体:
|
| ワークロード固有のポッド移行制御。
|
この例では、ワークロードで5分以内に移行できるレプリケートポッドは1つだけです。 |
| String | 次のモードがサポートされています。
|
| Eviction |
DefaultEvictor
DefaultEvictorプラグインは、Kubernetes Deschedulerによって提供されています。 詳細については、「DefaultEvictor」をご参照ください。
比較
次の表は、DefaultEvictorとMigrationControllerのポッド削除機能を比較しています。
項目 | DefaultEvictor | MigrationController |
立ち退き方法 | ポッドを削除するには、Eviction APIを呼び出します。 | |
立ち退きの制限 |
|
|
立ち退き抑制 | 非対応 | 同じワークロードに属するポッドが頻繁に移行されないようにするために、時間ウィンドウベースのスロットリングメカニズムが採用されています。 |
立ち退き観察 | コンポーネントログを使用して、ポッドの削除情報を表示できます。 |
|
関連ドキュメント
いくつかのスケジューリング解除機能は、ACKスケジューラに依存する。 詳細については、「負荷認識型ホットスポットのスケジューリング解除」をご参照ください。
クラスターのリソース使用量とコスト配分を取得するために、コストインサイトでスケジュール解除機能を使用できます。 これは、クラスターのリソース利用率を高めるためのコスト削減提案を生成するのに役立ちます。 詳細については、「コストインサイトの概要」をご参照ください。
発生する可能性のある問題のトラブルシューティング方法については、「スケジューリングに関するFAQ」をご参照ください。
ack-koordinatorの概要とリリースノートの詳細については、「ack-koordinator (ack-slo-manager) 」をご参照ください。
ack-deschedulerは中止されます。 ack-deschedulerからKoordinator Deschedulerに移行することを推奨します。 詳細については、「」をご参照ください。ack-deschedulerからKoordinator Deschedulerに移行するにはどうすればよいですか?.