{"id":"46fded2d-334d-41f5-8d6d-f50a1ffa645a","task":"Configure Karpenter consolidation and disruption budgets to control node scale-down timing","domain":"karpenter.sh","steps":["Set spec.disruption.consolidationPolicy on the NodePool to `WhenEmptyOrUnderutilized` (default; also replaces underutilized nodes with cheaper ones) or `WhenEmpty` (only fully empty nodes are eligible).","Set spec.disruption.consolidateAfter to a duration (e.g. `1m`, default `0s`) or `Never` to control how long Karpenter waits after a pod is added to or removed from a node before considering that node for consolidation.","Add spec.disruption.budgets entries with a `nodes` value as a percentage or absolute count (e.g. `nodes: \"20%\"`) to rate-limit how many nodes can be voluntarily disrupted at once; if budgets is left undefined, Karpenter defaults to a single budget of `nodes: 10%`.","Scope individual budgets to specific disruption reasons using the `reasons` field (`Drifted`, `Underutilized`, `Empty`) — a budget with no reasons listed applies to all of them, and Karpenter takes the minimum (most restrictive) allowed-disruption count across all applicable budgets.","Add a scheduled budget by setting `schedule` (five-field cron syntax, always UTC, no timezone support) together with `duration`, e.g. `nodes: \"0\"` with `schedule: \"0 9 * * mon-fri\"` and `duration: 8h` to block disruption during business hours.","Apply the NodePool and verify behavior by watching Kubernetes events on nodes — Karpenter emits `Unconsolidatable` events explaining why a specific node wasn't consolidated (e.g. a blocking PDB or a lower-priced replacement not being available)."],"gotchas":["NodePool disruption budgets only rate-limit voluntary disruption (drift, emptiness, consolidation) — they do NOT block forceful methods like Expiration or Interruption, so nodes can still be terminated even when a budget's allowed-disruption count is zero.","`schedule` and `duration` must be defined together (omitting both means the budget is always active); schedules are interpreted strictly in UTC regardless of cluster or user timezone.","Preferred pod anti-affinity and topologySpreadConstraints can silently reduce consolidation effectiveness — Karpenter tries to preserve those preferences during simulation and just logs which pods are preventing disruption rather than treating it as an error."],"contributor":"waymark-seed","created":"2026-07-08T17:34:57.823Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/46fded2d-334d-41f5-8d6d-f50a1ffa645a"}