Guía crítica sobre Kubernetes
- Kubernetes se ha ganado entre algunos técnicos la reputación de ser innecesariamente complejo y una pérdida de tiempo, y usarlo en equipos pequeños suele considerarse sobreingeniería.
- En Jamsocket lo han operado en producción durante varios años y encontraron una forma eficiente de usarlo: aprovechar solo las funciones necesarias e ignorar el resto.
Por qué usar Kubernetes
- Kubernetes es el camino más consolidado cuando quieres estas tres cosas al mismo tiempo:
- Ejecutar múltiples procesos/servidores/trabajos programados.
- Ejecutarlos con redundancia y distribuir la carga.
- Configurar su definición y sus relaciones mutuas como código.
- Kubernetes es una capa de abstracción que permite tratar un pool de computadoras como si fuera una sola computadora sin cabeza (
headless).
- Jamsocket despliega varias veces al día, y si su producto tiene problemas también se ven afectados los productos de sus clientes, así que las implementaciones continuas les dan la confianza para desplegar con frecuencia.
Cómo usan Kubernetes
- Jamsocket es un servicio que crea procesos dinámicos que pueden comunicarse con aplicaciones web, parecido a AWS Lambda, pero la vida del proceso depende de una conexión WebSocket y no de una sola petición/respuesta.
- Usan Kubernetes para operar procesos de larga duración como el servidor API, el registro de contenedores, controladores, recolectores de logs, algunos servicios DNS y la recolección de métricas.
- Cosas para las que no usan Kubernetes: procesos temporales, sitios estáticos/de marketing y cosas que almacenan datos directamente.
- Usan Google Kubernetes Engine para delegar externamente la administración de Kubernetes, y migrar a Amazon EKS sería relativamente sencillo si hiciera falta.
Recursos de Kubernetes que usan activamente
- Deployments: la mayoría de los pods se crean mediante despliegues.
- Services: usan ClusterIP para servicios internos y LoadBalancer para servicios externos.
- CronJobs: los usan para scripts de limpieza y tareas similares.
- ConfigMaps y Secrets: los usan para pasar datos a los recursos anteriores.
Cosas que usan con cautela
- Usan StatefulSet y PersistentVolumeClaim, pero prefieren guardar los datos importantes en servicios administrados fuera de Kubernetes.
- Evitan RBAC en la medida de lo posible porque añade complejidad.
Cosas que evitan activamente
- Escribir YAML a mano: generan las definiciones de recursos de Kubernetes con TypeScript y Pulumi.
- Recursos no estándar y operadores: permiten que software de terceros use la infraestructura de Kubernetes, pero en la práctica son difíciles de manejar.
- Helm: no lo usan por los operadores y las convenciones de YAML.
- Todo lo que tenga "mesh" en el nombre: consideran que no lo necesitan.
- Recursos Ingress: evitan añadir indirección innecesaria.
- Replicar localmente todo el stack de k8s: usan Docker Compose o scripts propios para levantar solo las partes necesarias del sistema.
La gente no debería esperar a un Pod
- Kubernetes fue diseñado poniendo el foco en la robustez y la modularidad por encima del tiempo de arranque de los contenedores, y no es adecuado cuando una persona tiene que esperar a que arranque un Pod.
- Jamsocket usa Plane, un orquestador en Rust con licencia MIT, para programar y ejecutar rápidamente procesos para cargas de trabajo interactivas.
Abstracciones de nivel superior
- Algunas alternativas a Kubernetes son muy buenas, especialmente cuando no necesitas definir la infraestructura como código.
- También se puede elegir otra solución en lugar de Kubernetes usando servicios como Railway, Render y Flight Control.
- Si administras tu enfoque hacia Kubernetes de forma sistemática, nadie puede decir que es demasiado pronto.
Opinión de GN⁺
- Aunque Kubernetes es una herramienta poderosa para manejar complejidad y automatización, especialmente en sistemas a gran escala, esa misma complejidad puede ser una carga para proyectos pequeños o startups.
- Este artículo propone maneras de evitar la complejidad excesiva que puede surgir al usar Kubernetes, ayudando a que principiantes o equipos pequeños también puedan aprovechar sus ventajas.
- Antes de usar Kubernetes, hay que evaluar cuidadosamente si las funciones que realmente se necesitan justifican la complejidad de administración y el costo, considerando también la capacidad técnica del equipo.
- En lugar de Kubernetes, puede ser mejor usar servicios más simples y fáciles de administrar. Por ejemplo, Docker Swarm, Apache Mesos y Nomad, cada uno con sus propias ventajas y desventajas.
- Al adoptar Kubernetes, también hay que considerar la integración con la infraestructura existente, la seguridad, el costo operativo y la curva de aprendizaje.
- Los beneficios de elegir Kubernetes incluyen escalabilidad, alta disponibilidad y una experiencia de despliegue consistente en distintos entornos de nube. Pero para ello hace falta comprender la gestión de recursos y la orquestación.
1 comentarios
Opiniones de Hacker News
Resumen del primer comentario:
stateless) no eran un gran problema de mantenimiento, pero al evangelizar los microservicios se terminaron creando problemas que no existían.Resumen del segundo comentario:
kubectl explain Xes mucho mejor que la documentación de AWS.Resumen del tercer comentario:
Resumen del cuarto comentario:
Resumen del quinto comentario:
Resumen del sexto comentario:
Resumen del séptimo comentario:
Resumen del octavo comentario:
Resumen del noveno comentario:
Resumen del décimo comentario:
deployment,service,configmaps) y que el resto solo debería usarse en situaciones especiales.kustomizepara mantener la configuración clara y explícita.