kubernetes deschedulerの導入

https://github.com/kubernetes-sigs/descheduler

CronJobなどで定期的にPodが配置ルールに従って配置されるように調整してくれるK8sシステム


https://github.com/kubernetes-sigs/descheduler

公式のhelm repoが存在するのでこれをinstallする。


まずはPod配置が満たすためのruleを定義する。


Pod Topology Spread Constraints

https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/

Pod Schedule時に特定のルールに従ってPodを配置させるための設定。

Deschedulerに限らず、Deploymentなどに設定することができ、通常はDeploymentの管理下にあるPodの作成時にのみ参照される。

topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway
labelSelector:
matchLabels:
app.kubernetes.io/name: hoge-app

各nodeに分散させたい場合はこんな感じで設定できる。ScheduledAnywayで設定することで、ルールを満たさない場合にも配置自体を強制することができる。


Pod Topology Spread ConstraintsをDeschedulerで参照する

上記の設定は、通常Pod作成時にのみ参照されるため、node増減などが生じた場合にもPodを設定どおりに分散するためにはDeschedulerPolicyにPodTopologySpreadを組み込む必要がある。


PodTopologySpreadConstraintsに対するPolicyは以下のようになる。このDeschedulerPolicyはKubernetesのCRDではなくConfigMapの中に設定するものであるということに注意。

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
- name: ProfileName
pluginConfig:
- name: "RemovePodsViolatingTopologySpreadConstraint"
args:
constraints:
- DoNotSchedule
plugins:
balance:
enabled:
- "RemovePodsViolatingTopologySpreadConstraint"

ref. https://github.com/kubernetes-sigs/descheduler/tree/master?tab=readme-ov-file#removepodsviolatingtopologyspreadconstraint


Related Articles