コンテンツにスキップ

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 として実行

Terminal window
kubectl create -f kubernetes/base/rbac.yaml
kubectl create -f kubernetes/base/configmap.yaml
kubectl create -f kubernetes/cronjob/cronjob.yaml

Helm から実行

Terminal window
helm repo add descheduler https://kubernetes-sigs.github.io/descheduler/
helm install my-release --namespace kube-system descheduler/descheduler

Policy

Descheduler の Policy は、特定の条件やルールに基づいて Pod を evict させるための設定を定義します。

ポリシーでは以下の3つを設定します。

  1. Top Level Configuration
  2. Evictor Plugin
  3. Strategy Plugin

Top Level Configuration

Descheduler のトップレベル設定には以下が含まれます。
この設定は Descheduler Policy ファイルのルートレベルで定義されます。

名前説明
nodeSelectorDescheduler がアクティブにするノードを選択
maxNoOfPodsToEvictPerNode各ノードから Evict できる Pod の最大数を制限
maxNoOfPodsToEvictPerNamespace各 Namespace から Evict できる Pod の最大数を制限
maxNoOfPodsToEvictTotalDescheduler 全体で Evict する Pod の総数を制限

Evictor Plugin

Evictor Plugin は、Evict 対象の Pod をフィルタリングします。

名前説明
evictLocalStoragePodsローカルストレージを使用している Pod を Evict の対象から除外
evictSystemCriticalPodsシステムクリティカルな Pod を Evict の対象から除外
ignorePvcPodsPersistent Volume Claim(PVC)を使用している Pod を Evict の対象から除外
evictFailedBarePods所有者参照がない、失敗した Pod を Evict の対象から除外
labelSelector特定のラベルを持つ Pod を Evict の対象から除外
priorityThreshold特定の Priority 以上の Pod を Evict の対象から除外
nodeFitPod を 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
RemovePodsViolatingInterPodAntiAffinityInterPodAntiAffinity ルールに違反している Pod を Evict。特定の Pod が互いに近接して配置されないようにする
RemovePodsViolatingTopologySpreadConstraintTopologySpreadConstraints に違反している Pod を Evict。異なるノード間での Pod の分散を最適化する
RemovePodsHavingTooManyRestarts再起動回数が多すぎる Pod を Evict。設定された回数以上再起動した Pod を Evict
PodLifeTime指定の期間を超えた Pod を Evict。長時間稼働している Pod を整理する
RemovePodsViolatingNodeAffinityノードの affinity に違反している Pod を Evict。Pod とノードの適切なマッチングを維持する
RemovePodsViolatingPDBPodDisruptionBudget(PDB)に違反している Pod を Evict。Pod の削除が許可された範囲内にあるかどうかを確認する
UseGoldenRatioノードのリソース使用率を黄金比に近づけるために Pod を Evict