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