デスケジューリングは、ノード上のエビクションルールに一致する Pod を別のノードにスケジュールするプロセスです。この機能は、クラスターのリソース使用率の不均衡、高負荷のノード、新しいスケジューリングポリシーの需要などのシナリオに適しています。デスケジューリング機能は、リソース使用量を最適化し、アプリケーションサービスの品質を向上させるのに役立ちます。このトピックでは、RemovePodsViolatingNodeTaints という名前のノード Taint 検証プラグインを例として、ack-koordinator コンポーネントに基づいてデスケジューリング機能を有効にする方法について説明します。
開始する前に
実装する前に、デスケジューリングの機能、使用シナリオ、ワークフロー、および基本概念について理解しておくことを推奨します。
このトピックでは、
RemovePodsViolatingNodeTaintsという名前のノード Taint 検プラグインを例として使用します。NoSchedule など、Pod のスケジュールとエビクションに Taint と Toleration を使用する方法の詳細については、「Taints and Tolerations」をご参照ください。コミュニティの Kubernetes Descheduler を使用している場合は、「Koordinator Descheduler と Kubernetes Descheduler」をご参照いただき、Koordinator Descheduler と Kubernetes Descheduler の違いを理解し、コンポーネントの移行を完了することを推奨します。
システム構成、テンプレート構成、ポリシーのプラグイン構成、エビクターのプラグイン構成など、詳細なデスケジューリングのための詳細設定については、「詳細パラメーターの設定」をご参照ください。
前提条件
ACK マネージド Pro クラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
デスケジューリング機能は仮想ノードでは使用できません。
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
使用上の注意
Koordinator Descheduler は実行中の Pod のみをエビクションし、エビクションされた Pod を再作成したりスケジュールしたりしません。Pod がエビクションされた後、Pod は Deployment や StatefulSet などのワークロードコントローラーによって再作成されます。再作成された Pod は、引き続きスケジューラによってスケジュールされます。
デスケジューリングプロセス中、古い Pod がエビクションされ、新しい Pod が作成されます。エビクション中にアプリケーションの可用性を維持するために、アプリケーションに十分な
replicasがあることを確認してください。
例
このトピックでは、ack-koordinator コンポーネントに基づいてデスケジューリング機能を有効にし、デスケジューリングポリシーを実装する方法について説明します。ノード Taint 検証プラグイン RemovePodsViolatingNodeTaints を例として使用します。
デフォルトでは、RemovePodsViolatingNodeTaints ポリシーは、Taint の effect が NoSchedule であるノード上の Pod をチェックし、その Taint を許容できない Pod をエビクションします。たとえば、あるノードが実行中の Pod をホストしており、管理者がそのノードに deschedule=not-allow:NoSchedule Taint を追加したとします。ノード上の Pod がその Taint を許容する Toleration で構成されていない場合、Pod はデスケジューリングポリシーによってエビクションされます。詳細については、「RemovePodsViolatingNodeTaints」をご参照ください。
RemovePodsViolatingNodeTaints ポリシーでは、excludedTaints フィールドを設定してノードの Taint を無視できます。Taint の key またはキーと値のペア (key=value) が excludedTaints リスト内の Taint と一致する場合、その Taint は無視されます。
この例では、プラグインは次の方法で Taint を検証するように構成されています。
ノード上で
effectがNoScheduleに設定されている。NoScheduleTaint 属性において、Taint のkeyがdescheduleではなく、Taint のvalueがnot-allowではない。
上記の条件を満たすノード上で、実行中の Pod に一致する Toleration がない場合、Pod は descheduler によってエビクションされます。
ステップ 1: ack-koordinator コンポーネントをインストールまたは変更してデスケジューリングを有効にする
このセクションの手順に従って、ack-koordinator コンポーネントをインストールし、Koordinator Descheduler が提供する descheduling 機能を使用できます。Koordinator Descheduler は、ノード上にデプロイメントとしてデプロイされます。
ack-koordinator コンポーネントをインストールしている場合は、コンポーネントのバージョンが 1.2.0-ack.2 以降であることを確認してください。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
ack-koordinator コンポーネントを見つけ、右下隅にある [インストール] をクリックします。[インストール] ダイアログボックスで、[Enable Descheduler for ACK-Koordinator] を選択してデスケジューリングモジュールを有効にします。次に、プロンプトに従ってコンポーnent を構成してインストールします。
ステップ 2: デスケジューリングプラグイン RemovePodsViolatingNodeTaints を有効にする
次の YAML コンテンツを使用して、koord-descheduler-config.yaml という名前のファイルを作成します。
ConfigMap リソース koord-descheduler-config.yaml を作成して、デスケジューリングプラグイン
RemovePodsViolatingNodeTaintsを有効にして構成します。# koord-descheduler-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: koord-descheduler-config namespace: kube-system data: koord-descheduler-config: | # koord-desheduler の次のシステム構成は変更しないでください。 apiVersion: descheduler/v1alpha2 kind: DeschedulerConfiguration leaderElection: resourceLock: leases resourceName: koord-descheduler resourceNamespace: kube-system deschedulingInterval: 120s # LowNodeLoad が実行される間隔。この例では、間隔は 120 秒に設定されています。 dryRun: false # グローバル読み取り専用モード。このモードを有効にすると、koord-descheduler は操作を実行しません。 # 上記の構成はシステム構成です。 profiles: - name: koord-descheduler plugins: deschedule: enabled: - name: RemovePodsViolatingNodeTaints # ノード Taint 検証プラグインを有効にします。 pluginConfig: - name: RemovePodsViolatingNodeTaints # ノード Taint 検証プラグインの構成。 args: excludedTaints: - deschedule=not-allow # Taint キーが deschedule で Taint 値が not-allow のノードを無視します。 # ノード Taint 検証プラグインを有効にするには、次の構成が必要です。削除しないでください。 - name: MigrationController # 移行コントローラーのパラメーターを構成します。 args: apiVersion: descheduler/v1alpha2 kind: MigrationControllerArgs defaultJobMode: EvictDirectly次のコマンドを実行して、クラスターに koord-descheduler-config.yaml ファイルをデプロイします。
kubectl apply -f koord-descheduler-config.yaml次のコマンドを実行して、デスケジューラーモジュール 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 scaledack-koord-deschedulerDeployment のレプリカ数を0に設定してから1に設定します。この操作により、Koordinator Descheduler モジュールが再起動します。再起動後、最新の構成が使用されます。
ステップ 3: デスケジューリング機能の検証
3 つのノードを含むクラスターを例として使用します。
次の YAML コンテンツを使用して、stress-demo.yaml という名前のファイルを作成します。
stress-demo.yaml ファイルでサンプルアプリケーションが定義されています。
次のコマンドを実行して stress-demo.yaml ファイルをデプロイし、テスト Pod を作成します。
kubectl create -f stress-demo.yaml次のコマンドを実行して、Pod が実行中状態になるまで Pod のステータスを表示します。
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:NoScheduleTaint を追加します。cn-beijing.192.XX.XX.247という名前のノードにdeschedule=not-allow:NoScheduleTaint を追加します。kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule期待される出力:
node/cn-beijing.192.XX.XX.247 taintedcn-beijing.192.XX.XX.248という名前のノードにdeschedule=allow:NoScheduleTaint を追加します。kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule期待される出力:
node/cn-beijing.192.XX.XX.248 tainted
次のコマンドを実行して、Pod の変更を表示します。
kubectl get pod -o wide -wdescheduler モジュールがノードの Taint をチェックし、エビクション操作を実行するのを待ちます。
期待される出力:
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>出力は次の情報を示しています。
Taint
deschedule=allow:NoScheduleを持つノードcn-beijing.192.XX.XX.248上の Podstress-demo-5f6cddf9-v****がエビクションされます。Taint
deschedule=not-allow:NoScheduleを持つノードcn-beijing.192.XX.XX.247上の Podstress-demo-5f6cddf9-9****はエビクションされません。エビクションされた Pod
stress-demo-5f6cddf9-v****は、NoScheduleTaint を持たないノードcn-beijing.192.XX.XX.249にデスケジュールされます。
次のコマンドを実行して、エビクションされた Pod のイベントを表示します。
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期待される出力は、Pod の移行レコードを示しています。Pod は、ノード
cn-beijing.192.XX.XX.248の Taintdeschedule=not-allowを許容する一致する Toleration で構成されていません。その結果、Pod は別のノードにデスケジュールされます。結果は期待どおりです。
詳細パラメーターの設定
前述の操作に加えて、ConfigMap を使用して Koordinator Descheduler の詳細パラメーターを構成することもできます。
詳細設定の例
次の YAML ファイルは、Koordinator Descheduler の詳細設定の例を示しています。この構成は、DeschedulerConfiguration API を呼び出すことによって Koordinator Descheduler の動作を変更し、RemovePodsViolatingNodeTaint ノード Taint 検証ポリシーを有効にし、MigrationController を Pod エビクターとして使用します。
サンプル構成のパラメーターの詳細については、次のセクションをご参照ください。
システム構成
Koordinator Descheduler のグローバルなシステムレベルの動作を DeschedulerConfiguration で構成できます。
パラメーター | タイプ | 有効な値 | 説明 | 例 |
| boolean |
| グローバル読み取り専用モード。このモードを有効にすると、Pod は移行できません。 | false |
| time.Duration | >0s | デスケジューリングの間隔。 | 120s |
| 構造体 | N/A | デスケジュールできるノードを制限します。デスケジューリングポリシーは、ノードセレクターで指定されたノードでのみ有効になります。ノードセレクターの詳細については、「Kubernetes labelSelector」をご参照ください。 | このパラメーターを構成する際に、1 つ以上のノードプールを指定できます。
|
| int | ≥ 0 (デフォルト値: 0) | ノード上で同時にエビクションできる Pod の最大数を制限します。このパラメーターはデスケジューリング中に有効になります。 | 10 |
| int | ≥ 0 (デフォルト値: 0) | 名前空間内で同時にエビクションできる Pod の最大数を制限します。このパラメーターはデスケジューリング中に有効になります。 | 10 |
テンプレート構成
Koordinator Descheduler は、デスケジューリングテンプレートを使用して、デスケジューリングポリシーと Pod エビクターを管理します。DeschedulerConfiguration の profiles フィールドで 1 つ以上のデスケジューリングテンプレートを定義できます。各デスケジューリングテンプレートでは、デスケジューリングポリシーと Pod エビクターがプラグインとして構成されます。デスケジューリングテンプレートには、次の部分が含まれます。
name値は文字列です。デスケジューリングテンプレートの名前をカスタマイズできます。
plugins有効または無効にするデスケジューリングポリシー (
deschedule、balance)、Pod エビクションプラグイン (evict)、および Pod エビクションの前に使用するフィルターポリシー (filter) を構成します。次の表に、構成可能なパラメーターを示します。パラメーター
タイプ
有効な値
説明
例
deschedule次のフォーマットの構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }EnabledとDisabledはPlugin構造体リストであり、有効にするプラグインと無効にするプラグインを示します。デフォルトでは、すべてのプラグインが無効になっています。有効にする Deschedule デスケジューリングポリシーを指定できます。
plugins: deschedule: enabled: - name: PodLifeTime - name: RemovePodsViolatingNodeTaintsRemovePodsViolatingInterPodAntiAffinityこのポリシーは、Pod 間のアンチアフィニティルールに一致しない Pod をエビクションします。
RemovePodsViolatingNodeAffinityこのポリシーは、ノードアフィニティルールに一致しない Pod をエビクションします。
RemovePodsViolatingNodeTaintsこのポリシーは、ノードの Taint を許容できない Pod をエビクションします。
RemovePodsHavingTooManyRestartsこのポリシーは、頻繁に再起動する Pod をエビクションします。
PodLifeTimeこのポリシーは、TTL が期限切れになった Pod をエビクションします。
RemoveFailedPodこのポリシーは、Failed 状態の Pod をエビクションします。
balance次のフォーマットの構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }EnabledとDisabledはPlugin構造体リストであり、有効にするプラグインと無効にするプラグインを示します。デフォルトでは、すべてのプラグインが無効になっています。有効にする Balance デスケジューリングポリシーを指定します。
plugins: balance: enabled: - name: RemoveDuplicates - name: LowNodeLoadRemoveDuplicatesレプリカ Pod を分散させます。
LowNodeUtilizationノードのリソース割り当てに基づいてホットスポットを分散させます。
HighNodeUtilizationノードのリソース割り当てに基づいて負荷を集約します。ポリシーが許可する場合、Pod はリソース使用率の低いノードからリソース使用率の高いノードに移行されます。
RemovePodsViolatingTopologySpreadConstraintトポロジー分散制約に一致しない Pod をエビクションします。
LowNodeLoadノードのリソース使用量に基づいてホットスポットを分散させます。
evict次のフォーマットの構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }Enabled と Disabled は Plugin 構造体リストです。Enabled リストのプラグインを有効にし、Disabled リストのプラグインを無効にできます。
MigrationControllerDefaultEvictor
有効にする Pod エビクター。デフォルトでは
MigrationControllerが有効になっています。複数の
evictプラグインを同時に有効にしないでください。plugins: evict: enabled: - name: MigrationControllerfilter次のフォーマットの構造体:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }Enabled と Disabled は Plugin 構造体リストです。Enabled リストのプラグインを有効にし、Disabled リストのプラグインを無効にできます。
MigrationControllerDefaultEvictor
Pod エビクションの前に使用するエビクションフィルタリングポリシーを選択します。デフォルトでは
MigrationControllerが有効になっています。複数の
filterプラグインを同時に有効にしないでください。plugins: filter: enabled: - name: MigrationControllerpluginConfig各プラグインの詳細パラメーターを構成します。
nameフィールドを設定して、構成するプラグインの名前を指定します。argsフィールドでプラグインを構成する方法の詳細については、「ポリシーのプラグインを構成する」および「エビクターのプラグインを構成する」をご参照ください。nodeSelectorデスケジューリングテンプレートの範囲を制限します。テンプレートで構成されたデスケジューリングポリシーは、ノードセレクターで指定されたノードでのみ有効になります。詳細については、「Kubernetes labelSelector」をご参照ください。このフィールドが指定されていない場合、テンプレートはデフォルトですべてのノードで有効になります。
説明テンプレート構成の
nodeSelectorフィールドは、ack-koordinator コンポーネントバージョン v1.6.1-ack.1.16 以降でのみサポートされます。
ポリシーのプラグインを構成する
Koordinator Descheduler は、6 つの Deschedule ポリシープラグインと 5 つの Balance ポリシープラグインをサポートしています。LowNodeLoad プラグインは Koordinator によって提供されます。詳細については、「負荷認識ホットスポットデスケジューリングの操作」をご参照ください。次のデスケジューリングプラグインは Kubernetes Descheduler によって提供されます。
ポリシータイプ | ポリシーの特徴 | ポリシー設定 |
Deschedule | このポリシーは、Pod 間のアンチアフィニティルールに一致しない Pod をエビクションします。 | |
このポリシーは、ノードアフィニティルールに一致しない Pod をエビクションします。 | ||
このポリシーは、ノードの Taint を許容できない Pod をエビクションします。 | ||
このポリシーは、頻繁に再起動する Pod をエビクションします。 | ||
このポリシーは、TTL が期限切れになった Pod をエビクションします。 | ||
このポリシーは、Failed 状態の Pod をエビクションします。 | ||
Balance | レプリカ Pod を分散させます。 | |
ノードのリソース割り当てに基づいてホットスポットを分散させます。 | ||
ノードのリソース割り当てに基づいて負荷を集約します。 | ||
トポロジー分散制約に一致しない Pod をエビクションします。 |
エビクターのプラグインを構成する
Koordinator Descheduler は DefaultEvictor と MigrationController の両方のエビクタープラグインをサポートしています。
MigrationController
次の表に、MigrationController エビクタープラグインの詳細設定を示します。
パラメーター | タイプ | 有効な値 | 説明 | 例 |
| boolean |
| emptyDir または hostPath で構成された Pod をデスケジュールできるかどうかを指定します。セキュリティ上の理由から、このパラメーターはデフォルトで無効になっています。 | false |
| int64 | ≥ 0 (デフォルト値: 2) | ノード上で同時に移行できる Pod の最大数。値 0 は制限が設定されていないことを示します。 | 2 |
| int64 | ≥ 0 (デフォルト値: 0) | 名前空間内で同時に移行できる Pod の最大数。値 0 は制限が設定されていないことを示します。 | 1 |
| intOrString | ≥ 0 (デフォルト値: 10%) | Deployment などのワークロード内で同時に移行できる Pod の最大数またはパーセンテージ。値 0 は制限が設定されていないことを示します。 ワークロードにレプリカ Pod が 1 つしか含まれていない場合、そのワークロードはデスケジューリングから除外されます。 | 1 または 10% |
| intOrString | 0 以上 (デフォルト値: 10%) で、ワークロードのレプリカ Pod 数未満 | Deployment などのワークロードで許可される利用不可能なレプリカ Pod の最大数またはパーセンテージ。値 0 は制限が設定されていないことを示します。 | 1 または 10% |
| 次のフォーマットの構造体: |
| ワークロード固有の Pod 移行制御。
| この例は、ワークロード内で 5 分以内に 1 つのレプリカ Pod のみを移行できることを示しています。 |
| string | 次のモードがサポートされています。
|
| Eviction |
DefaultEvictor
DefaultEvictor プラグインは Kubernetes Descheduler によって提供されます。詳細については、「DefaultEvictor」をご参照ください。
比較
次の表に、DefaultEvictor と MigrationController の Pod エビクション機能の比較を示します。
項目 | DefaultEvictor | MigrationController |
エビクションメソッド | Eviction API を呼び出して Pod をエビクションします。 | |
エビクションの制限 |
|
|
エビクションのスロットリング | サポートされていません | タイムウィンドウベースのスロットリングメカニズムが採用されており、同じワークロードに属する Pod が頻繁に移行されないようにします。 |
エビクションの監視 | コンポーネントのログを使用して Pod のエビクション情報を表示できます。 |
|
リファレンス
一部のデスケジューリング機能は ACK スケジューラに依存します。詳細については、「負荷認識ホットスポットデスケジューリングの操作」をご参照ください。
Cost Insight 機能を有効にすると、クラスターのリソース使用量とコスト配分を理解し、コスト削減の推奨事項を取得できます。詳細については、「Cost Insight」をご参照ください。
発生する可能性のある問題のトラブルシューティング方法については、「スケジューリングに関する FAQ」をご参照ください。
ack-koordinator の概要とリリースノートの詳細については、「ack-koordinator (ack-slo-manager)」をご参照ください。
ack-descheduler は廃止されました。 ack-descheduler から Koordinator Descheduler へ移行することをお勧めします。 詳細については、「ack-descheduler から Koordinator Descheduler に移行する」をご参照ください。