Files
homelab-gitops/apps/descheduler

Odroid CPU rebalancing

The upstream Descheduler chart runs every five minutes. values.yaml is the policy; the bootstrap Application selects its chart version.

The policy uses Metrics Server CPU usage: nodes below 40% are possible receivers and nodes above 75% are possible eviction sources. Kubernetes still chooses replacement placement. It does not live-migrate processes or guarantee that a replacement lands on a different node.

Each cycle permits at most two evictions overall, one per node and namespace. Pods must be at least one hour old, belong to a controller with at least two replicas, have a PodDisruptionBudget, have no PVC, and fit another eligible node. Only the six Odroids are eligible. Storage, networking, monitoring, certificate management, and GitOps namespaces are excluded. EmptyDir alone is not a protection for these replicated stateless workloads.

Start with cmdOptions.dry-run: true, inspect Job logs, then remove that option to allow evictions. To stop balancing, set suspend: true in values and let Argo sync. Existing running Jobs must finish before suspension takes full effect.

Review after changes to workload mix; do not remove PVC and infrastructure protections to force a more even CPU graph. CPU requests determine whether a replacement can fit even when observed utilization is low.