デスケジューリングは、スケジューラによる不均衡検出を待たずに、 eviction ルールに違反する実行中の Pod を他のノードへ移動します。ノードの Taint、アフィニティルール、または負荷プロファイルが変更された後に誤ってスケジュールされた Pod を修正する際に使用します。
本トピックでは、RemovePodsViolatingNodeTaints プラグインを例として、ack-koordinator コンポーネント経由でデスケジューリングを有効化する手順を説明します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
ACK マネージドクラスター(Pro 版)。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
-
クラスターに接続された kubectl クライアント。 詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
仮想ノードではデスケジューリングはサポートされていません。
注意事項
-
Koordinator Descheduler は実行中の Pod のみをエビクションします。再作成や再スケジューリングは行いません。エビクション後、ワークロードコントローラー(Deployment や StatefulSet など)が Pod を再作成し、標準のスケジューラによって再スケジュールされます。
-
デスケジューリング中は、新しい Pod の作成前に既存の Pod がエビクションされます。エビクション中に可用性を維持するために、アプリケーションの
replicas数が十分であることを確認してください。 -
ack-descheduler は非推奨となりました。現在ご利用中の場合は、Koordinator Descheduler への移行を行ってください。詳細については、「ack-descheduler から Koordinator Descheduler への移行方法」をご参照ください。
デスケジューリングプラグインの選択
解決したい課題に応じてプラグインを選択してください。
| シナリオ | プラグイン | ポリシー種別 |
|---|---|---|
スケジュール後に NoSchedule Taint を取得したノード上に Pod が残っている場合 |
RemovePodsViolatingNodeTaints |
デスケジューリング |
| Pod がポッドアンチアフィニティルールに違反している場合 | RemovePodsViolatingInterPodAntiAffinity |
デスケジューリング |
| Pod がノードアフィニティルールを満たさなくなった場合 | RemovePodsViolatingNodeAffinity |
デスケジューリング |
| Pod の再起動が頻繁に発生している場合 | RemovePodsHavingTooManyRestarts |
デスケジューリング |
| Pod の TTL(Time-to-Live)が期限切れになった場合 | PodLifeTime |
デスケジューリング |
| Pod が Failed 状態になっている場合 | RemoveFailedPod |
デスケジューリング |
| レプリケートされた Pod がノード間で不均等に分散されている場合 | RemoveDuplicates |
バランス調整 |
| ノードのリソース割り当てが不均等になっている場合 | LowNodeUtilization |
バランス調整 |
| Pod がトポロジー分散制約に違反している場合 | RemovePodsViolatingTopologySpreadConstraint |
バランス調整 |
| ノードの実際のリソース使用量により過負荷状態になっている場合 | LowNodeLoad |
バランス調整 |
本トピックでは、RemovePodsViolatingNodeTaints を例として使用します。開始する前に、「デスケジューリングの基本概念」および「Koordinator Descheduler と Kubernetes Descheduler の比較」をご参照ください。
仕組み
RemovePodsViolatingNodeTaints プラグインは、設定された間隔で各ノードの NoSchedule Taint をチェックします。実行中の Pod がノードの NoSchedule Taint に対する Toleration を持っていない場合、プラグインはその Pod をエビクションします。その後、ワークロードコントローラーが Pod を再作成し、スケジューラがその Pod を許容可能なノードに配置します。
excludedTaints フィールドを使用すると、特定の Taint をこのチェック対象から除外できます。key=value 形式の Taint またはそのキーが excludedTaints のエントリと一致する場合、プラグインはその Taint を無視します。
本トピックで使用する例:
3 ノード構成のクラスターに、各ノードに 1 つの Pod を配置する Deployment があります。Pod がすでに実行中である状態で、管理者が 2 つのノードに NoSchedule Taint を追加しました。
-
ノード A には
deschedule=not-allow:NoScheduleが設定されています。deschedule=not-allowがexcludedTaintsに含まれているため、この Taint は無視され、Pod はそのまま実行されます。 -
ノード B には、
deschedule=allow:NoScheduleが設定されます。この Taint は除外されていないため、Pod は削除され、ノード C に再スケジュールされます(ノード C にはNoScheduleTaint がありません)。
ステップ 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 # デスケジューラの実行間隔。本例では 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 の場合、PreferNoSchedule 効果を持つ Taint もチェックします(NoSchedule のみではない)。 |
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 を使用して、Koordinator Descheduler のグローバル動作および細かいテンプレート設定を構成します。
高度な構成の例
以下は、完全に構成された Koordinator Descheduler 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 # デスケジューラの実行間隔。本例では 120 秒に設定しています。
nodeSelector: # デスケジューリング対象となるノード。デフォルトではすべてのノードが対象となります。
matchLabels:
alibabacloud.com/nodepool-id: nodepool-1 # 必要に応じて設定してください。
maxNoOfPodsToEvictPerNode: 10 # ノードあたりの最大エビクション数。グローバルスケールで有効になります。デフォルトでは制限が設定されていません。
maxNoOfPodsToEvictPerNamespace: 10 # 名前空間あたりの最大エビクション数。グローバルスケールで有効になります。デフォルトでは制限が設定されていません。
# 上記はシステム構成です。
# テンプレート一覧。
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 # ワークロード内で許容される unavailable レプリカ 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 | デスケジューラの実行頻度。 | 120s |
nodeSelector |
構造体 | — | デスケジューリング対象となるノードを制限します。matchLabels(1 つのノードプール)または matchExpressions(複数のノードプール)を指定できます。詳細については、「Kubernetes labelSelector」をご参照ください。 |
上記 YAML の例を参照 |
maxNoOfPodsToEvictPerNode |
int | ≥0(デフォルト:0) | 1 回のデスケジューリングサイクルで 1 つのノードからエビクションされる最大 Pod 数。0 の場合、制限なし。 | 10 |
maxNoOfPodsToEvictPerNamespace |
int | ≥0(デフォルト:0) | 1 回のデスケジューリングサイクルで 1 つの名前空間からエビクションされる最大 Pod 数。0 の場合、制限なし。 | 10 |
テンプレート構成
Koordinator Descheduler は、デスケジューリングポリシーおよびエビクターをグループ化するためのテンプレート(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 が提供するものです。詳細については、「負荷認識型ホットスポットデスケジューリングの活用」をご参照ください。
| ポリシー種別 | プラグイン | 説明 |
|---|---|---|
| デスケジューリング | RemovePodsViolatingInterPodAntiAffinity | ポッドアンチアフィニティルールに違反する Pod をエビクションします。 |
| デスケジューリング | RemovePodsViolatingNodeAffinity | ノードアフィニティルールを満たさなくなった Pod をエビクションします。 |
| デスケジューリング | RemovePodsViolatingNodeTaints | ノード Taint を許容できない Pod をエビクションします。 |
| デスケジューリング | RemovePodsHavingTooManyRestarts | 再起動が頻繁に発生する Pod をエビクションします。 |
| スケジュール解除 | PodLifeTime | TTL が期限切れになった Pod をエビクションします。 |
| デスケジューリング | RemoveFailedPod | Failed 状態の Pod をエビクションします。 |
| バランス調整 | RemoveDuplicates | レプリケートされた Pod をノード間で均等に分散します。 |
| バランス調整 | LowNodeUtilization | ノードのリソース割り当てに基づいて Pod を再配分します。 |
| 残高 | HighNodeUtilization | 利用率の低いノードから Pod を集約し、利用率の高いノードへ移動します。 |
| バランス調整 | 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 つしかない場合は、デスケジューリング対象から除外されます。 | 1 または 10% |
maxUnavailablePerWorkload |
intOrString | ≥0 かつレプリカ数未満(デフォルト:10%) | ワークロード内で許容される unavailable レプリカ Pod の最大数。0 の場合、制限なし。 | 1 または 10% |
objectLimiters.workload |
構造体 | 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を使用した負荷認識型ホットスポットデスケジューリングの構成については、「負荷認識型ホットスポットデスケジューリングの活用」をご参照ください。 -
クラスターのリソース使用量を把握し、コスト削減のための推奨事項を取得するには、「コストインサイト」をご参照ください。
-
トラブルシューティングについては、「スケジューリングに関するよくある質問」をご参照ください。
-
ack-koordinator のリリースノートおよびコンポーネント概要については、「ack-koordinator(ack-slo-manager)」をご参照ください。