Por qué la consolidación de Karpenter puede agotar nodos bien cargados

Fuentes: Karpenter's consolidation behaviour is counter-intuitive

Karpenter, el autoscaler de nodos para Kubernetes creado por AWS, incluye un bucle de control dedicado a la consolidación: mover cargas de trabajo para reducir el número de nodos activos y abaratar la infraestructura. Este artículo técnico explica un comportamiento contraintuitivo observado por el autor en un clúster real: la capacidad disponible de CPU se mantenía prácticamente constante en torno a 5 CPUs, mientras los nodos no paraban de rotar durante más de 12 horas. Tras revisar los logs, se comprobó que Karpenter terminaba nodos continuamente por consolidación, pese a que el sentido común indica que la capacidad libre debería disminuir tras cada evento.

La clave está en los dos únicos parámetros configurables de la consolidación: consolidationPolicy (WhenEmpty o WhenEmptyOrUnderutilized) y consolidateAfter, que define cuánto tiempo espera un nodo antes de ser evaluado. El comportamiento WhenEmptyOrUnderutilized no aplica un umbral de utilización: Karpenter evalúa un nodo independientemente de lo cargado que esté. La única pregunta que importa es si todos sus pods caben en otros nodos. Si caben, el nodo se termina, aunque esté lleno.

Así, un nodo con cien pods en un clúster saturado no será consolidado, pero el mismo nodo en un clúster con huecos sí puede serlo. La consolidación usa estado global (cómo está el clúster) para tomar una decisión local (qué hacer con un nodo), justo al revés de lo habitual en sistemas distribuidos. Además, dado que los pods no pueden rebotar de un nodo a otro indefinidamente, se generan cuellos de botella que obligan a provisionar nuevos nodos, manteniendo la CPU libre estable mientras la rotación continúa.