QUÉ ES KUBERNETES: LA GUÍA COMPLETA
Kubernetes es una plataforma de código abierto diseñada para automatizar el despliegue, el escalado y la gestión de aplicaciones en contenedores. Su nombre proviene del griego y significa “timonel” o “piloto”, lo que refleja perfectamente su función: dirigir y controlar la complejidad de ejecutar aplicaciones modernas a gran escala. Kubernetes se ha convertido en el estándar de facto de la industria para la orquestación de contenedores y es mantenido por la Cloud Native Computing Foundation (CNCF)¿Por qué surgió Kubernetes?
Antes de los contenedores, popularizados por Docker, las aplicaciones se desplegaban en máquinas virtuales o servidores físicos. Esto generaba problemas de consistencia, desperdicio de recursos y dificultad para escalar.Los contenedores resolvieron gran parte de estos problemas al empaquetar la aplicación junto con sus dependencias. Sin embargo, cuando se tienen cientos o miles de contenedores, gestionarlos manualmente se vuelve imposible. Ahí es donde entra Kubernetes se encarga de orquestar los contenedores de forma inteligente y automática.
¿Qué hace Kubernetes exactamente?
- Kubernetes permite: Desplegar aplicaciones de forma declarativa, se define el estado deseado y él se encarga de alcanzarlo.
- Escalar automáticamente según la demanda.
- Autorreparación: si un contenedor o un nodo falla, Kubernetes lo reinicia o lo mueve a otro nodo.
- Balanceo de carga y descubrimiento de servicios.
- Actualizaciones sin tiempo de inactividad y rollbacks automáticos.
- Gestión de secretos y configuraciones.
- Almacenamiento persistente.
Conceptos clave de Kubernetes
Para entender cómo funciona, es importante conocer algunos de sus componentes fundamentales:| Concepto | Descripción |
|---|---|
| Cluster | Conjunto de máquinas (nodos) que ejecutan Kubernetes. |
| Nodo | Una máquina (física o virtual) dentro del cluster. Puede ser master (control plane) o worker. |
| Pod | La unidad más pequeña de despliegue. Contiene uno o más contenedores que comparten red y almacenamiento. |
| Deployment | Define cómo se deben desplegar y actualizar los Pods. |
| Service | Expone un conjunto de Pods como un servicio de red estable (con balanceo de carga). |
| Namespace | Permite dividir el cluster en entornos lógicos (por ejemplo: desarrollo, producción). |
| ConfigMap y Secret | Gestionan configuraciones y datos sensibles. |
Arquitectura básica
Un cluster de Kubernetes se divide en dos partes principales:- Control Plane (plano de control): Es el “cerebro” del cluster. Incluye componentes como el API Server, el Scheduler, el Controller Manager y almacenamiento de la configuración.
- Worker Nodes (nodos de trabajo): Son las máquinas donde realmente se ejecutan los Pods. Cada nodo tiene el kubelet, agente de Kubernetes y un runtime de contenedores, como containerd.
¿Qué NO es Kubernetes?
Es importante aclarar algunos malentendidos comunes:- No es una plataforma PaaS completa, como Heroku o Google App Engine. Es más bien una base sobre la que se pueden construir plataformas.
- No crea contenedores, eso lo hace Docker u otros runtimes).
- No es solo para la nube: se puede usar en servidores on-premise, en la nube o en entornos híbridos.
Ventajas de usar Kubernetes
- Portabilidad: SE puedes ejecutar las mismas aplicaciones en cualquier entorno, como AWS, Azure, Google Cloud, etc.
- Escalabilidad: Escala desde aplicaciones pequeñas hasta grandes sistemas.
- Alta disponibilidad y resiliencia.
- Ecosistema enorme: Existe una gran cantidad de herramientas, operadores y extensiones, como Helm, Istio, Prometheus, etc.
- Declarativo: Se defines lo que se quiere hacer y Kubernetes se encarga de hacerlo realidad.
Casos de uso comunes
- Aplicaciones basadas en microservicios.
- Sistemas que necesitan escalar automáticamente según el tráfico.
- Entornos de CI/CD modernos.
- Machine Learning y procesamiento de datos a gran escala. Aplicaciones que requieren alta disponibilidad y recuperación automática de fallos.
Archivos YAML de configuración en Kubernetes
Uno de los pilares de Kubernetes es su enfoque declarativo. Tú defines el estado deseado de las aplicaciones mediante archivos de configuración (llamados manifiestos), casi siempre escritos en YAML, y Kubernetes se encarga de hacerlo realidad.Estos archivos son la forma principal de crear y gestionar casi todos los objetos: "Pods, "Deployments, "Services, "ConfigMaps, "Secrets, "Ingress, etc.Estructura básica de un manifiesto YAML
Casi todos los archivos tienen estas cuatro secciones obligatorias:apiVersion: apps/v1 # Versión de la API
kind: Deployment # Tipo de recurso
metadata: # Nombre, labels, namespace...
name: mi-aplicacion
spec: # Estado deseado
# ... configuración específica del recurso
Ejemplos de los recursos más comunes
Deployment (el más usado)
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.25
ports:
- containerPort: 80
Service (para exponer los Pods)yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP # También puede ser NodePort o LoadBalancer
ConfigMap (configuración no sensible)
apiVersion: v1
kind: ConfigMap
metadata:
name: mi-config
data:
DATABASE_URL: "postgres://db:5432/miapp"
LOG_LEVEL: "info"
config.properties: |
key1=value1
key2=value2
Secret (datos sensibles)
apiVersion: v1
kind: Secret
metadata:
name: mi-secret
type: Opaque
data:
DATABASE_PASSWORD: "password-database" # Base64 encoded
Pod simple (menos recomendado en producción, pero útil para entender)
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Cómo aplicar los archivos
# Un solo archivo
kubectl apply -f deployment.yaml
# Varios archivos
kubectl apply -f deployment.yaml -f service.yaml
# Todo un directorio
kubectl apply -f ./k8s/
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
...
---
apiVersion: v1
kind: Service
...
Buenas prácticas recomendadas
- Guarda siempre los ficheros YAML en Git (control de versiones).
- Usar la última versión estable de la API (apps/v1, v1, etc.).
- Es mejor usar YAML frente a JSON (más legible).
- Agrupar recursos relacionados de la misma aplicación en el mismo archivo o carpeta.
- Separar la configuración sensible en Secrets y el resto en ConfigMaps.
- Evitar poner valores por defecto innecesarios.