# 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. Live evictions enabled on 2026-11-01 after successful dry-run cycles. The review selected replicated dashboard/ingress pods and respected the caps.