Descheduler for Kubernetes
Kubernetes クラスターにおける Pod 配置の偏りを解消するツール「Descheduler」を紹介し、導入方法からポリシー設計まで解説します。
背景
自宅の Raspberry Pi k8s クラスターに新しいノードを追加した際、Rollout を実行するまで既存のノードに Pod が残るという問題が発生します。
この問題を解決するためのソリューションとして、Descheduler for Kubernetes を見つけました。
Descheduler とは?
Descheduler は、Kubernetes クラスター内でスケジュール最適化を行うためのツールです。
Kubernetes のスケジューラーは新しい Pod を最適なノードに配置する役割を持っていますが、時間の経過やクラスターの変動によって、初期の配置が最適でなくなることがあります。
Descheduler は、既存の Pod を再配置(Evict)することで、クラスターのリソース利用効率や健全性を維持します。
Install
Descheduler は Job, CronJob, または Deployment として k8s クラスター内で実行できます。
デフォルトで CronJob で作成され、いくつかの Strategy も有効な状態でデプロイされます。
YAML から CronJob として実行
kubectl create -f kubernetes/base/rbac.yamlkubectl create -f kubernetes/base/configmap.yamlkubectl create -f kubernetes/cronjob/cronjob.yamlHelm から実行
helm repo add descheduler https://kubernetes-sigs.github.io/descheduler/helm install my-release --namespace kube-system descheduler/deschedulerPolicy
Descheduler の Policy は、特定の条件やルールに基づいて Pod を evict させるための設定を定義します。
ポリシーでは以下の3つを設定します。
- Top Level Configuration
- Evictor Plugin
- Strategy Plugin
Top Level Configuration
Descheduler のトップレベル設定には以下が含まれます。
この設定は Descheduler Policy ファイルのルートレベルで定義されます。
| 名前 | 説明 |
|---|---|
| nodeSelector | Descheduler がアクティブにするノードを選択 |
| maxNoOfPodsToEvictPerNode | 各ノードから Evict できる Pod の最大数を制限 |
| maxNoOfPodsToEvictPerNamespace | 各 Namespace から Evict できる Pod の最大数を制限 |
| maxNoOfPodsToEvictTotal | Descheduler 全体で Evict する Pod の総数を制限 |
Evictor Plugin
Evictor Plugin は、Evict 対象の Pod をフィルタリングします。
| 名前 | 説明 |
|---|---|
| evictLocalStoragePods | ローカルストレージを使用している Pod を Evict の対象から除外 |
| evictSystemCriticalPods | システムクリティカルな Pod を Evict の対象から除外 |
| ignorePvcPods | Persistent Volume Claim(PVC)を使用している Pod を Evict の対象から除外 |
| evictFailedBarePods | 所有者参照がない、失敗した Pod を Evict の対象から除外 |
| labelSelector | 特定のラベルを持つ Pod を Evict の対象から除外 |
| priorityThreshold | 特定の Priority 以上の Pod を Evict の対象から除外 |
| nodeFit | Pod を Evict する際、その Pod が新しいノードで実行可能かどうかを確認 |
| minReplicas | 特定の Strategy を適用する際に考慮する最低レプリカ数を制御 |
| minPodAge | 特定の Strategy を適用する際に考慮する Pod の最小経過時間を制御 |
Strategy Plugin
Strategy Plugin は、Pod の Evict 条件を指定します。
Strategy Plugin の種類
| 名前 | 説明 |
|---|---|
| RemoveDuplicates | 同一ノード上に複数の同じ Pod が存在する場合、その重複した Pod を Evict |
| LowNodeUtilization | リソース使用率が低いノードから Pod を Evict し、他のノードに分散させることで全体のリソース使用率を均等にする |
| RemovePodsViolatingNodeTaints | ノードの taints に違反している Pod を Evict |
| RemovePodsViolatingInterPodAntiAffinity | InterPodAntiAffinity ルールに違反している Pod を Evict。特定の Pod が互いに近接して配置されないようにする |
| RemovePodsViolatingTopologySpreadConstraint | TopologySpreadConstraints に違反している Pod を Evict。異なるノード間での Pod の分散を最適化する |
| RemovePodsHavingTooManyRestarts | 再起動回数が多すぎる Pod を Evict。設定された回数以上再起動した Pod を Evict |
| PodLifeTime | 指定の期間を超えた Pod を Evict。長時間稼働している Pod を整理する |
| RemovePodsViolatingNodeAffinity | ノードの affinity に違反している Pod を Evict。Pod とノードの適切なマッチングを維持する |
| RemovePodsViolatingPDB | PodDisruptionBudget(PDB)に違反している Pod を Evict。Pod の削除が許可された範囲内にあるかどうかを確認する |
| UseGoldenRatio | ノードのリソース使用率を黄金比に近づけるために Pod を Evict |