Koordinator Descheduler を有効にすると、ノードの Taint、アフィニティルール、または負荷プロファイルが変更されたときに、Pod を自動的に排除および再調整できます。
以下の手順では、RemovePodsViolatingNodeTaints プラグインを例として使用します。
前提条件
以下を確認してください:
-
Container Service for Kubernetes (ACK) マネージドプロ版クラスターが作成されていること。
-
kubectl がクラスターに接続されていること。
デスケジューリングは仮想ノードではサポートされていません。
注意事項
-
Koordinator Descheduler は Pod を排除するだけで、再作成はしません。排除された Pod は、ワークロードコントローラー (Deployment や StatefulSet など) によって再作成され、標準のスケジューラによって配置されます。
-
新しい Pod が作成される前に古い Pod が排除されます。排除中の可用性を維持するために、ご利用のアプリケーションに十分な
replicasがあることを確認してください。 -
ack-descheduler は廃止されました。まだ使用している場合は、「ack-descheduler から Koordinator Descheduler への移行方法」をご参照ください。
デスケジューリングプラグインの選択
シナリオに合わせてプラグインを選択してください:
| シナリオ | プラグイン | ポリシータイプ |
|---|---|---|
スケジューリング後に NoSchedule Taint が付与されたノードに Pod が残っている |
RemovePodsViolatingNodeTaints |
Deschedule |
| Pod が Pod 間アンチアフィニティルールに違反している | RemovePodsViolatingInterPodAntiAffinity |
Deschedule |
| Pod がノードアフィニティルールを満たさなくなった | RemovePodsViolatingNodeAffinity |
Deschedule |
| Pod の再起動が頻繁すぎる | RemovePodsHavingTooManyRestarts |
Deschedule |
| Pod が Time-to-Live (TTL) を超過した | PodLifeTime |
Deschedule |
| Pod が Failed 状態である | RemoveFailedPod |
Deschedule |
| レプリケーションされた Pod がノード間で不均等に分散している | RemoveDuplicates |
Balance |
| リソース割り当てによってノードが不均等に使用されている | LowNodeUtilization |
Balance |
| Pod がトポロジースプレッド制約に違反している | RemovePodsViolatingTopologySpreadConstraint |
Balance |
| 実際のリソース使用率によってノードが過負荷になっている | LowNodeLoad |
Balance |
以下の例では RemovePodsViolatingNodeTaints を使用します。開始する前に、「デスケジューリングの概念」および「Koordinator Descheduler と Kubernetes Descheduler の比較」をお読みください。
仕組み
RemovePodsViolatingNodeTaints は、設定された間隔で、すべてのノードの NoSchedule Taint をチェックします。実行中の Pod にノードの NoSchedule Taint に対する Toleration がない場合、プラグインはその Pod を排除します。ワークロードコントローラーが Pod を再作成し、スケジューラが Toleration を満たすノードに配置します。
特定の Taint を除外するには excludedTaints を使用します。Taint のキーまたは key=value のペアが excludedTaints 内のエントリと一致する場合、プラグインはその Taint を無視します。
シナリオ例:
3 ノードのクラスターで、ノードごとに 1 つの Pod を持つ Deployment を実行します。デプロイメント後、管理者が 2 つのノードに NoSchedule Taint を追加します:
-
ノード A には
deschedule=not-allow:NoScheduleが付与されます。deschedule=not-allowはexcludedTaintsに含まれているため、この Taint は無視され、Pod はそのまま残ります。 -
ノード B には
deschedule=allow:NoScheduleが付与されます。この Taint は除外されていないため、Pod は排除され、NoScheduleTaint がないノード C に再スケジュールされます。
ステップ 1:ack-koordinator のインストールとデスケジューリングの有効化
ack-koordinator がすでにインストールされている場合は、バージョンが 1.2.0-ack.2 以降であることを確認してください。
-
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[クラスター] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
-
ack-koordinator を見つけて、[インストール] をクリックします。
-
[インストール] ダイアログボックスで、[ACK-Koordinator の Descheduler を有効にする] を選択し、インストールを完了します。
Koordinator Descheduler は、クラスターノード上に Deployment としてデプロイされます。
ステップ 2:RemovePodsViolatingNodeTaints プラグインの有効化
プラグインの設定
koord-descheduler-config.yaml という名前のファイルを作成します。この ConfigMap は RemovePodsViolatingNodeTaints を有効にし、deschedule=not-allow Taint を除外します。
# 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 # descheduler が実行される間隔。ここでは 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 のノードを無視します。
# RemovePodsViolatingNodeTaints を有効にするために必要です。削除しないでください。
- name: MigrationController # 移行コントローラーを設定します。
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
RemovePodsViolatingNodeTaints のパラメーター:
| パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
excludedTaints |
list(string) | — | 無視する Taint キーまたは key=value のペア。これらの Taint を持つノード上の Pod は排除されません。 |
includePreferNoSchedule |
bool | false | true の場合、NoSchedule だけでなく、効果が PreferNoSchedule の Taint もチェックします。 |
namespaces.include |
list(string) | — | デスケジューリングを特定の名前空間に制限します。namespaces.exclude とは相互に排他的です。 |
namespaces.exclude |
list(string) | — | 特定の名前空間でのデスケジューリングをスキップします。namespaces.include とは相互に排他的です。 |
labelSelector |
map | — | 指定されたラベルに一致する Pod にデスケジューリングを制限します。 |
設定の適用
-
ConfigMap をクラスターに適用します:
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 scaled
高度なパラメーターの設定
ConfigMap を使用して、グローバルな動作とテンプレート設定を構成します。
高度な設定例
この ConfigMap は、グローバル設定に DeschedulerConfiguration を使用し、デスケジューリングポリシーとして RemovePodsViolatingNodeTaints を有効にし、エビクターとして MigrationController を使用します。
# 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
dryRun: false # グローバルな読み取り専用モード。このモードを有効にすると、koord-descheduler は一切の操作を実行しません。
deschedulingInterval: 120s # descheduler が実行される間隔。この例では 120 秒に設定されています。
nodeSelector: # デスケジューリングの対象となるノード。デフォルトでは、すべてのノードがデスケジューリングされます。
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # 要件に応じて設定してください。
maxNoOfPodsToEvictPerNode: 10 # 1 つのノードから排除できる Pod の最大数。この制限はグローバルに適用されます。デフォルトでは制限は設定されていません。
maxNoOfPodsToEvictPerNamespace: 10 # 1 つの名前空間から排除できる Pod の最大数。この制限はグローバルに適用されます。デフォルトでは制限は設定されていません。
# 上記はシステム設定です。
# テンプレートリスト。
profiles:
- name: koord-descheduler # テンプレートの名前。
# スコープ:このテンプレートを指定されたノードにのみ適用します。
# 方法 1:1 つのノードプール内のノードを選択します。
nodeSelector:
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # 要件に応じて設定してください
# 方法 2:複数のノードプール内のノードを選択します。
# nodeSelector:
# matchExpressions:
# - key: alibabacloud.com/nodepool-id
# operator: In
# values:
# - nodepool-1
# - nodepool-2
plugins:
deschedule: # すべてのプラグインはデフォルトで無効になっています。有効にするものを指定します。
enabled:
- name: RemovePodsViolatingNodeTaints # ノード Taint 検証プラグインを有効にします。
balance: # すべてのプラグインはデフォルトで無効になっています。
disabled:
- name: "*" # すべての Balance プラグインを無効にします。
evict:
enabled:
- name: MigrationController # MigrationController はデフォルトで有効です。
filter:
enabled:
- name: MigrationController # デフォルトで MigrationController のフィルタリングポリシーを使用します。
pluginConfig:
- name: RemovePodsViolatingNodeTaints
args:
excludedTaints:
- deschedule=not-allow # Taint キーが deschedule で Taint 値が not-allow のノードを無視します。
- reserved # Taint キーが reserved のノードを無視します。
includePreferNoSchedule: false # false の場合、NoSchedule Taint のみをチェックします。
namespaces:
include: # これらの名前空間にデスケジューリングを制限します。
- "namespace1"
- "namespace2"
# exclude: # または、これらの名前空間を除外します。
# - "namespace1"
# - "namespace2"
labelSelector: # これらのラベルに一致する Pod のみをデスケジューリングします。
accelerator: nvidia-tesla-p100
- name: MigrationController
args:
apiVersion: descheduler/v1alpha2
kind: MigrationControllerArgs
defaultJobMode: EvictDirectly
evictLocalStoragePods: false # false の場合、emptyDir または hostPath を使用する Pod はデスケジューリングされません。
maxMigratingPerNode: 1 # ノード上で同時に移行される Pod の最大数。
maxMigratingPerNamespace: 1 # 名前空間内で同時に移行される Pod の最大数。
maxMigratingPerWorkload: 1 # ワークロード内で同時に移行される Pod の最大数。
maxUnavailablePerWorkload: 2 # ワークロードで許容される利用不可能なレプリケーションされた Pod の最大数。
objectLimiters:
workload: # ワークロードレベルの移行を制限します。デフォルト:5 分以内にワークロードごとに 1 Pod のみ。
duration: 5m
maxMigrating: 1
evictionPolicy: Eviction # デフォルトで Eviction API を使用します。
システム設定
DeschedulerConfiguration でグローバルなシステムレベルの動作を設定します。
| パラメーター | タイプ | 有効な値 | 説明 | 例 |
|---|---|---|---|---|
dryRun |
boolean | true / false (デフォルト:false) | 読み取り専用モード。有効にすると、Pod は移行されません。 | false |
deschedulingInterval |
time.Duration | >0s | descheduler が実行される頻度。 | 120s |
nodeSelector |
Structure | — | デスケジューリングの対象となるノードを制限します。matchLabels (1 つのノードプール) または matchExpressions (複数のノードプール) を受け入れます。詳細については、「Kubernetes labelSelector」をご参照ください。 |
上記の YAML 例をご参照ください |
maxNoOfPodsToEvictPerNode |
int | ≥0 (デフォルト:0) | 1 回のデスケジューリング周期で 1 つのノードから排除される Pod の最大数。0 は制限なしを意味します。 | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0 (デフォルト:0) | 1 回のデスケジューリング周期で 1 つの名前空間から排除される Pod の最大数。0 は制限なしを意味します。 | 10 |
テンプレート設定
各テンプレート (profiles) は、以下のフィールドでデスケジューリングポリシーとエビクターをグループ化します:
-
`name`:テンプレートの識別子。
-
`plugins`:デスケジューリングポリシー (
deschedule、balance)、エビクター (evict)、および排除前フィルター (filter) を有効または無効にします。 -
`pluginConfig`:プラグインごとの引数。
nameフィールドをプラグイン名と一致させ、argsを設定します。詳細については、「ポリシー・プラグインの設定」および「エビクター・プラグインの設定」をご参照ください。 -
`nodeSelector`:テンプレートを特定のノードに制限します。設定しない場合、すべてのノードに適用されます。
テンプレートレベルの nodeSelector を使用するには、ack-koordinator v1.6.1-ack.1.16 以降が必要です。
`plugins` フィールドのリファレンス:
| フィールド | サポートされているプラグイン | 説明 |
|---|---|---|
deschedule |
RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod |
デフォルトではすべて無効です。有効にするプラグインを指定します。 |
balance |
RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad |
デフォルトではすべて無効です。有効にするプラグインを指定します。 |
evict |
MigrationController, DefaultEvictor |
Pod エビクター。MigrationController はデフォルトで有効です。複数の evict プラグインを同時に有効にしないでください。 |
filter |
MigrationController, DefaultEvictor |
排除前フィルタリングポリシー。MigrationController はデフォルトで有効です。複数の filter プラグインを同時に有効にしないでください。 |
ポリシー・プラグインの設定
Koordinator Descheduler は、Kubernetes Descheduler の 6 つの Deschedule プラグインと 5 つの Balance プラグインをサポートしています。LowNodeLoad は Koordinator によって提供されます。詳細については、「負荷認識型ホットスポットデスケジューリングの利用」をご参照ください。
| ポリシータイプ | プラグイン | 説明 |
|---|---|---|
| Deschedule | RemovePodsViolatingInterPodAntiAffinity | Pod 間アンチアフィニティルールに違反する Pod を排除します。 |
| Deschedule | RemovePodsViolatingNodeAffinity | ノードアフィニティルールを満たさなくなった Pod を排除します。 |
| Deschedule | RemovePodsViolatingNodeTaints | ノードの Taint を許容できない Pod を排除します。 |
| Deschedule | RemovePodsHavingTooManyRestarts | 再起動が頻繁すぎる Pod を排除します。 |
| Deschedule | PodLifeTime | TTL が期限切れになった Pod を排除します。 |
| Deschedule | RemoveFailedPod | Failed 状態の Pod を排除します。 |
| Balance | RemoveDuplicates | レプリケーションされた Pod をノード間で均等に分散させます。 |
| Balance | LowNodeUtilization | ノードのリソース割り当てに基づいて Pod を再配布します。 |
| Balance | HighNodeUtilization | 使用率の低いノードから使用率の高いノードへ Pod を集約します。 |
| Balance | RemovePodsViolatingTopologySpreadConstraint | トポロジースプレッド制約に違反する Pod を排除します。 |
エビクター・プラグインの設定
Koordinator Descheduler は、DefaultEvictor と MigrationController の 2 つのエビクター・プラグインをサポートしています。
MigrationController
MigrationController は、移行ジョブを通じて詳細な排除制御と可観測性を提供します。
| パラメーター | タイプ | 有効な値 | 説明 | 例 |
|---|---|---|---|---|
evictLocalStoragePods |
boolean | true / false (デフォルト:false) | false の場合、emptyDir または hostPath を使用する Pod はデスケジューリングされません。 |
false |
maxMigratingPerNode |
int64 | ≥0 (デフォルト:2) | ノード上で同時に移行される Pod の最大数。0 は制限なしを意味します。 | 2 |
maxMigratingPerNamespace |
int64 | ≥0 (デフォルト:0) | 名前空間内で同時に移行される Pod の最大数。0 は制限なしを意味します。 | 1 |
maxMigratingPerWorkload |
intOrString | ≥0 (デフォルト:10%) | ワークロード内で同時に移行される Pod の最大数または割合。0 は制限なしを意味します。ワークロードに Pod が 1 つしかない場合、その Pod はデスケジューリングから除外されます。 | 1 or 10% |
maxUnavailablePerWorkload |
intOrString | ≥0 and < replica count (デフォルト:10%) | ワークロードで許容される利用不可能なレプリケーションされた Pod の最大数。0 は制限なしを意味します。 | 1 or 10% |
objectLimiters.workload |
Structure | Duration >0 (デフォルト:5m); MaxMigrating ≥0 (デフォルト:10%) |
タイムウィンドウ内でワークロードレベルの移行を制限します。Duration はウィンドウの長さを設定し、MaxMigrating はそのウィンドウ内で移行される Pod の最大数を設定します。 |
duration: 5m maxMigrating: 1 |
evictionPolicy |
string | Eviction (デフォルト), Delete, Soft |
Pod の排除方法を制御します。Eviction:Eviction API を呼び出して正常な排除を行います。Delete:Delete API を呼び出します。Soft:カスタムの下流処理のために scheduling.koordinator.sh/soft-eviction アノテーションを追加します。 |
Eviction |
DefaultEvictor
DefaultEvictor は、標準の Kubernetes Descheduler エビクターです。設定については、「DefaultEvictor」をご参照ください。
MigrationController と DefaultEvictor の比較
| 機能 | DefaultEvictor | MigrationController |
|---|---|---|
| 排除方法 | Eviction API のみ | Eviction API、Delete API、または Soft アノテーション |
| ノードごとの排除制限 | サポート | サポート |
| 名前空間ごとの排除制限 | サポート | サポート |
| ワークロードごとの排除制限 | 非サポート | サポート |
| ワークロードごとの利用不可制限 | 非サポート | サポート |
| 排除の速度制限 | 非サポート | ワークロードごとのタイムウィンドウベースの速度制限 |
| 排除の可観測性 | コンポーネントログのみ | コンポーネントログと、Pod ごとの移行ステータスを含む Kubernetes イベント |
次のステップ
-
デスケジューリング — 概念、特徴、ワークフロー。
-
コミュニティ版の Kubernetes Descheduler を使用していますか?相違点と移行については、「Koordinator Descheduler と Kubernetes Descheduler の比較」をご参照ください。
-
LowNodeLoadを使用した負荷認識型デスケジューリングの設定:負荷認識型ホットスポットデスケジューリングの利用。 -
クラスターのリソース使用量を分析し、コスト削減の推奨事項を取得:Cost Insight。
-
トラブルシューティング:スケジューリングに関するよくある質問。
-
リリースノートとコンポーネントの概要:ack-koordinator (ack-slo-manager)。