En 2024, Uber culminó una de las transformaciones más importantes en la arquitectura de su plataforma tecnológica al completar la migración de su sistema de orquestación de contenedores sin estado desde Apache Mesos a Kubernetes. Esta transición representa un paso trascendental hacia la adopción de estándares industriales, mejorando la estabilidad, la seguridad y la escalabilidad de la infraestructura que soporta miles de servicios críticos para millones de usuarios en todo el mundo. La historia detrás de esta migración no solo revela la complejidad técnica de operar uno de los mayores ecosistemas de cómputo en la nube, sino también cómo las decisiones estratégicas y de ingeniería dieron forma a una solución robusta, automatizada y amigable para los desarrolladores. Uber gestiona más de 50 clústeres distribuidos en diferentes regiones y zonas que combinan centros de datos propios y servicios en la nube como Google Cloud y Oracle Cloud. Cada clúster incluye entre 5,000 y 7,500 hosts, sumando aproximadamente 250,000 núcleos de procesamiento y 50,000 pods en ejecución simultánea.
Esta infraestructura soporta unas 4,000 aplicaciones implementadas en un ritmo vertiginoso de 100,000 despliegues diarios, lo que se traduce en un promedio de 1.5 millones de inicios de pods por día — una cifra que desafía los límites operativos y planteaba retos singulares para el equipo encargado. Uno de los principales motivadores de la migración fue el hecho de que Apache Mesos había sido descontinuado internamente en Uber desde 2021, lo cual dejó el sistema sin actualizaciones ni soporte comunitario, generando un riesgo significativo a largo plazo. En comparación, Kubernetes se ha consolidado como el estándar de facto para la orquestación de contenedores a nivel mundial, siendo ampliamente adoptado por empresas de primer nivel y respaldado por una activa comunidad open source que aporta innovación continua. Elegir Kubernetes permitió a Uber capitalizar un ecosistema amplio repleto de integraciones listas para usar, actualizaciones periódicas, y políticas de seguridad más estrictas.
Sin embargo, el camino no fue sencillo. La magnitud de la operación, la necesidad de mantener continuidad y la diferencia arquitectónica fundamental entre Mesos y Kubernetes crearon un conjunto de desafíos multidimensionales. Una prioridad durante la migración fue garantizar mejoras progresivas sin afectar la experiencia del desarrollador ni la estabilidad del servicio. Para ello, Uber adoptó principios claros: las actualizaciones debían ser fiables y automatizadas, el proceso debía ser invisible para los usuarios finales y las soluciones personalizadas se implementaron para preservar la funcionalidad crítica previamente disponible en Mesos. Entre los retos técnicos más significativos se destacó la escala inusual de los clústeres manejados.
Mientras que es común en la industria repartir la carga a través de numerosos clústeres pequeños para evitar sobrecarga, Uber optó por operar clústeres de gran tamaño. Esto requirió una reingeniería profunda para optimizar el rendimiento del servidor API, mejorar la capacidad del scheduler y evitar la fragmentación de recursos. El equipo desarrolló una suite de benchmarking avanzada que evaluó el desempeño en clústeres con hasta 7,500 nodos, 200,000 pods y la programación de 150 pods por segundo, pruebas que revelaron la necesidad de ajustar parámetros críticos como el nivel de QPS (consultas por segundo), la paralelización en los controladores y el uso de prioridades para las llamadas costosas a la API. Adicionalmente, la adopción de protocolos de codificación más eficientes como Proto en lugar de JSON ayudó a reducir la latencia y mejorar la respuesta del sistema. La migración también implicó reconstruir las integraciones de Uber con sus sistemas internos clave para mantener la coherencia funcional.
Esto incluyó adaptar los pipelines de CI/CD, el descubrimiento de servicios, las políticas de seguridad, la gestión del ciclo de vida de los hosts y las herramientas de observabilidad. Dado que Mesos y Kubernetes tienen arquitecturas radicalmente distintas, gran parte de estos componentes tuvieron que ser rediseñados y puestos a prueba rigurosamente. Uno de los elementos cruciales fue automatizar la migración misma para manejar la enorme cantidad de núcleos y servicios implicados. Para ello, se aprovechó "Up", una capa global de federación sin estado que abstrae la tecnología de clúster para los desarrolladores y facilita la redistribución automática de cargas de trabajo. Este mecanismo permitió mover servicios discretamente desde Mesos a Kubernetes sin que los propietarios de servicios percibieran cambios o tuvieran que intervenir.
Resultó fundamental igualar la experiencia y capacidades ofrecidas por Mesos para que los servicios continuaran operando con seguridad y rapidez. Algunos ejemplos destacables de personalizaciones de Uber incluyen la gestión de artefactos de contenedores, donde mediante contenedores sidecar y demonios especializados se logró preservar los datos de logs y perfiles después de que los contenedores principales finalizan, algo que en Kubernetes estándar no se maneja de forma predeterminada. Además, Uber implementó un sistema de escalado gradual para servicios sensibles a cambios bruscos en la cantidad de instancias, evitando problemas de estabilidad relacionados con reconfiguraciones rápidas o efectos secundarios en componentes basados en Apache Helix. Este sistema fragmenta la operación de escalado en pequeños lotes que se procesan secuencialmente, garantizando mayor control y seguridad durante el ajuste dinámico. Para acelerar los despliegues, especialmente con contenedores pesados, se adoptaron soluciones como CloneSet, un recurso personalizado para realizar actualizaciones en situ, y un demonio que predescarga imágenes en los nodos de forma anticipada, minimizando los tiempos de inicio en frío.
Otra área de mejora fue la optimización de la interfaz nativa de Kubernetes, que a escala Uber presentaba inestabilidad y lentitud. Se introdujeron sistemas de cache y ajustes que permitieron mantener la interfaz ligera y responsiva, ayudando a los ingenieros a manejar con eficiencia los enormes volúmenes de datos y estado. En el transcurso de la migración surgieron también retos inesperados, como la falta de herramientas integrales de monitoreo para clústeres de gran tamaño. Para cubrir esta necesidad se desarrollaron soluciones propias que proporcionan métricas detalladas sobre la fragmentación de recursos, la salud de los nodos y el impacto de las políticas de actualización y reinicios frecuentes. Se identificaron problemas con el proceso por defecto de reconciliación de informers de Kubernetes, que afectaba la rapidez en reflejar eventos críticos relacionados con despliegues.
Uber implementó un mecanismo personalizado que obliga a una reconciliación frecuente, mitigando retrasos y mejorando la reacción del sistema. También se diseñaron heurísticas para acelerar la detección y reversión de despliegues defectuosos, basadas en el monitoreo del reinicio de contenedores. Esta estrategia permitió superar las limitaciones de los indicadores nativos, que resultaban lentos y poco explícitos, asegurando mayor estabilidad y disponibilidad. La migración técnica se extendió por un periodo de aproximadamente año y medio, con momentos estratégicos de pausa para resolver problemas de confiabilidad y ajustar componentes críticos. Estas pausas fueron vitales para consolidar los avances y seguir con firmeza una migración segura y sin interrupciones.
Una vez superados esos obstáculos, la transición se aceleró considerablemente. Durante su punto máximo, Uber logró migrar cerca de 300,000 núcleos en una sola semana, demostrando que la infraestructura y la automatización estaban adecuadamente preparadas para el desafío. Los próximos pasos para Uber contemplan seguir la convergencia de todas sus tecnologías de gestión de clústeres en Kubernetes, incluidos sistemas para cargas por lotes y cargas con estado, que hoy emplean tecnologías distintas como Apache Hadoop YARN y Odin. Esta unificación simplificará la operativa y elevará la eficiencia global. Uber también planea contribuir activamente con la comunidad open source, compartiendo las soluciones y mejoras desarrolladas durante esta experiencia para beneficiar a otros usuarios y proyectos que enfrentan retos similares.
En síntesis, la migración de Uber a Kubernetes representa un ejemplo destacado de liderazgo e innovación en ingeniería de infraestructura a escala masiva. Implica un balance cuidadoso de adaptación tecnológica, desarrollo de personalizaciones específicas y gestión operacional inteligente, que en conjunto brindan soluciones eficientes, seguras y sostenibles para el futuro del cómputo en contenedores.