Si trabajas en el mundo del desarrollo de software, seguramente has oído hablar de Kubernetes. Pero, ¿qué es exactamente y por qué se ha convertido en el estándar de facto para la gestión de aplicaciones en contenedores? Esta guía te llevará desde los conceptos básicos hasta los fundamentales, con ejemplos prácticos y diagramas para ayudarte a entender.
Antes de Kubernetes: Un poco de historia
Para entender por qué Kubernetes es tan revolucionario, demos un paso atrás.
- Despliegue tradicional: Inicialmente, las aplicaciones se ejecutaban en servidores físicos. Este enfoque era costoso, difícil de escalar y propenso a conflictos de recursos.
- Despliegue virtualizado: Luego llegaron las máquinas virtuales (VM). Las VM permitieron ejecutar múltiples aplicaciones aisladas en el mismo hardware, mejorando la utilización de recursos y la seguridad. Sin embargo, cada VM ejecuta un sistema operativo completo, consumiendo muchos recursos.
- Despliegue en contenedores: Los contenedores (como Docker) son la siguiente evolución. Comparten el mismo sistema operativo anfitrión pero ejecutan procesos aislados. Son ligeros, rápidos de iniciar y portátiles.
Los contenedores resolvieron el problema de la portabilidad, pero crearon otro: ¿cómo gestionar cientos (o miles) de contenedores en un entorno de producción? ¿Cómo garantizar que siempre estén en funcionamiento, que puedan comunicarse entre sí y que escalen según la carga?
Aquí es donde entra en juego Kubernetes.
¿Qué es Kubernetes?
Kubernetes (a menudo abreviado como K8s) es una plataforma de código abierto para la orquestación de contenedores. En términos simples, automatiza el despliegue, el escalado y la gestión de aplicaciones en contenedores. Creado por Google y ahora mantenido por la Cloud Native Computing Foundation (CNCF), Kubernetes se ha convertido en la herramienta de referencia para cualquiera que trabaje con microservicios a gran escala.
La arquitectura de un clúster de Kubernetes
Un entorno de Kubernetes se llama clúster. Un clúster está compuesto por un conjunto de máquinas, llamadas nodos, que ejecutan nuestras aplicaciones. La arquitectura se divide en dos partes principales: el Control Plane y los Worker Nodes.
Control Plane
El Control Plane es el "cerebro" del clúster. Toma decisiones globales (como la programación) y detecta y responde a los eventos del clúster. Sus componentes principales son:
- API Server (
kube-apiserver
): Es la puerta de entrada al clúster. Expone la API de Kubernetes, que es utilizada por los usuarios (a través dekubectl
), los componentes del clúster y herramientas externas para comunicarse. - etcd: Una base de datos clave-valor consistente y de alta disponibilidad. Almacena todos los datos del clúster, representando el estado deseado y actual del sistema.
- Scheduler (
kube-scheduler
): Asigna los Pods recién creados a un Worker Node disponible, teniendo en cuenta los requisitos de recursos, las políticas y otras restricciones. - Controller Manager (
kube-controller-manager
): Ejecuta los controladores, que son bucles de control que observan el estado del clúster y trabajan para llevarlo al estado deseado. Por ejemplo, elNode Controller
gestiona los nodos, mientras que elReplication Controller
se asegura de que se esté ejecutando el número correcto de Pods.
Worker Node
Los Worker Nodes son las máquinas (físicas o virtuales) donde se ejecutan realmente las aplicaciones. Cada nodo es gestionado por el Control Plane y contiene los siguientes componentes:
- Kubelet: Un agente que se ejecuta en cada nodo. Se asegura de que los contenedores descritos in los Pods se estén ejecutando y estén en buen estado.
- Kube-proxy: Un proxy de red que gestiona las reglas de red en los nodos. Permite la comunicación de red hacia los Pods desde sesiones de red dentro o fuera del clúster.
- Container Runtime: El software responsable de ejecutar los contenedores. Docker es el más famoso, pero Kubernetes también soporta otros runtimes como
containerd
yCRI-O
.
Objetos fundamentales de Kubernetes
En Kubernetes, todo se representa mediante objetos. Estos objetos son "registros de intención": una vez que creas un objeto, Kubernetes trabaja constantemente para asegurar que exista y coincida con el estado deseado.
Aquí están los más importantes:
Pod
El Pod es la unidad de ejecución más pequeña en Kubernetes. Representa uno o más contenedores que se ejecutan juntos en el mismo nodo, compartiendo recursos como la red y el almacenamiento.
Generalmente, se ejecuta un solo contenedor por Pod, pero en escenarios avanzados (como los "contenedores sidecar" para el registro o la monitorización), puedes tener más.
Casi nunca creas Pods directamente. Usas abstracciones de nivel superior como los Deployments.
Deployment
Un Deployment es el objeto que usarás más a menudo. Describe el estado deseado para un grupo de Pods idénticos. El controlador del Deployment es responsable de:
- Crear y gestionar un ReplicaSet (otro objeto que asegura que un número específico de réplicas de un Pod esté siempre en ejecución).
- Escalar el número de Pods hacia arriba o hacia abajo.
- Gestionar las actualizaciones de la aplicación de manera controlada (p. ej., Rolling Update), sin tiempo de inactividad.
Aquí hay un archivo YAML de ejemplo para un Deployment que ejecuta 3 réplicas de un servidor NGINX:
# nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Service
Los Pods en Kubernetes son efímeros: pueden ser creados y destruidos en cualquier momento. Cada Pod tiene su propia dirección IP, pero esta IP no es estable. Entonces, ¿cómo exponemos nuestra aplicación de manera fiable?
Con un Service. Un Service es una abstracción que define un conjunto lógico de Pods y una política para acceder a ellos. Proporciona un punto de acceso estable (una dirección IP virtual y un nombre DNS) para un grupo de Pods.
El Service utiliza un selector
basado en labels
para encontrar los Pods a los que debe dirigir el tráfico.
Aquí se muestra cómo crear un Service para nuestro Deployment de NGINX:
# nginx-service.yaml apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: ClusterIP # Por defecto - expone el servicio solo dentro del clúster
Hay diferentes tipos de Services:
ClusterIP
: Expone el servicio en una IP interna del clúster (por defecto).NodePort
: Expone el servicio en un puerto estático en cada Worker Node.LoadBalancer
: Crea un balanceador de carga externo en el proveedor de la nube (p. ej., AWS, GCP) y asigna una IP pública al servicio.
Ingress
Un Service de tipo LoadBalancer
es genial, pero crear uno para cada servicio puede ser costoso. Para exponer múltiples servicios HTTP/HTTPS al mundo exterior, se utiliza un Ingress.
Un Ingress actúa como un "enrutador inteligente" para el tráfico externo. Permite definir reglas de enrutamiento basadas en el host (p. ej., api.misitio.com
) o la ruta (p. ej., misitio.com/api
).
Aquí hay un ejemplo de un Ingress:
# example-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: misitio.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 - path: /ui pathType: Prefix backend: service: name: ui-service port: number: 3000
Otros objetos útiles
- Namespace: Permite crear "clústeres virtuales" dentro de un clúster físico. Útil para aislar entornos (p. ej.,
development
,staging
,production
) o equipos. - ConfigMap y Secret: Para gestionar datos de configuración y secretos (como contraseñas o claves de API) desacoplados de la imagen del contenedor.
- StatefulSet: Similar a un Deployment, pero específico para aplicaciones con estado (como bases de datos) que requieren identidades de red estables y almacenamiento persistente.
- PersistentVolume (PV) y PersistentVolumeClaim (PVC): Para gestionar el almacenamiento persistente en el clúster.
Conclusión
Kubernetes es una herramienta increíblemente poderosa, pero su curva de aprendizaje puede ser pronunciada. Esta guía solo ha arañado la superficie, pero esperamos que te haya dado una sólida comprensión de los conceptos básicos.
¿Qué hacer ahora?
- Experimenta localmente: Instala Minikube o Kind para crear un clúster de Kubernetes en tu ordenador.
- Usa
kubectl
: Familiarízate con el comandokubectl
, tu herramienta principal para interactuar con el clúster. Intenta crear el Deployment y el Service de NGINX de este artículo. - Explora los tutoriales oficiales: La documentación de Kubernetes es un recurso fantástico lleno de ejemplos.
La orquestación de contenedores es una habilidad fundamental en el mundo nativo de la nube, y dominar Kubernetes te abrirá un mundo de posibilidades. ¡Diviértete!