Este análisis se centra en dos clases de incidentes de escalabilidad observados en los controladores de Kubernetes en Amazon EKS: la gestión de estado inconsistente durante el arranque y las consecuencias no intencionadas de las optimizaciones de recursos. Ambos revelan desafíos fundamentales en la operación de sistemas distribuidos a gran escala.

El primer incidente se relaciona con la gestión de acciones irreversibles basadas en un estado de caché potencialmente obsoleto o incompleto. Cuando el VPC Resource Controller se reinicia o cambia de líder, su caché de pods está inicialmente vacía. Si su rutina de limpieza de interfaces de red se ejecuta antes de que la caché se haya poblado completamente con el estado actual del clúster, el controlador puede asumir erróneamente que las interfaces asociadas a pods en ejecución están inactivas y proceder a reclamarlas. Esto resulta en la interrupción del tráfico para los pods afectados, ya que sus interfaces de red son eliminadas mientras aún están en uso. La causa raíz es una falta de sincronización entre la disponibilidad del estado completo y la ejecución de acciones destructivas, una condición de carrera temporal que se manifiesta bajo carga o reinicios.

El segundo incidente ilustra cómo una optimización diseñada para mejorar la densidad y reducir las llamadas a la API puede introducir una nueva restricción no monitoreada. La delegación de prefijos para pods requiere bloques contiguos de direcciones IP. Sin embargo, el VPC Resource Controller, al asignar IPs individuales a pods con security groups dedicados, puede fragmentar el espacio de direcciones IP del subnet con el tiempo. Esto lleva a una situación en la que, a pesar de que los monitores de IPs libres reportan abundancia de recursos, no hay suficientes bloques contiguos disponibles para la delegación de prefijos. El resultado es que los pods no pueden ser programados, lo que lleva a una interrupción silenciosa en la capacidad de escalar, ya que las métricas existentes no reflejan la nueva restricción de contigüidad.

En ambos casos, las salvaguardas existentes fallaron porque no consideraron las complejidades de la escala y la interacción entre componentes. La asunción de que el estado se autocorregirá es válida para muchas operaciones de reconciliación, pero no para acciones irreversibles. De manera similar, las métricas diseñadas para un modelo de asignación de recursos pueden volverse engañosas cuando se introduce una nueva optimización que cambia la naturaleza de la restricción subyacente. Estos incidentes subrayan la necesidad de un diseño robusto que anticipe estas condiciones de borde y la evolución de las restricciones a medida que los sistemas escalan. La lección clave es que la corrección en sistemas distribuidos no es solo sobre la lógica del bucle de reconciliación, sino sobre la fiabilidad del estado en el que se basa esa lógica, especialmente al tomar decisiones críticas. La fragmentación de recursos y la gestión de estado durante el arranque son problemas recurrentes en sistemas distribuidos que requieren atención explícita en el diseño y monitoreo.