¿Qué es la Orquestación de Contenedores?
La orquestación de contenedores es una tecnología que automatiza la ubicación, escalado, networking y gestión de disponibilidad de múltiples contenedores. Es un mecanismo esencial cuando se operan numerosos contenedores en entornos de producción.
¿Por qué es necesario? Puedes gestionar manualmente unos pocos contenedores, pero cuando tienes cientos o miles de contenedores, necesitas un mecanismo que automatice la ubicación, detección de fallos y escalado.
Problemas que Resuelve la Orquestación
| Problema | Solución |
|---|---|
| Ubicación de contenedores | Decide automáticamente en qué nodo ejecutar |
| Escalado | Ajusta automáticamente el número de contenedores según la carga |
| Recuperación ante fallos | Reinicia automáticamente contenedores caídos |
| Balanceo de carga | Distribuye tráfico entre múltiples contenedores |
| Descubrimiento de servicios | Configura automáticamente la comunicación entre contenedores |
| Actualización gradual | Actualiza aplicaciones sin tiempo de inactividad |
Arquitectura Básica de Kubernetes
flowchart TB
subgraph CP["Control Plane"]
API["API Server"]
SCH["Scheduler"]
CM["Controller Manager"]
ETCD["etcd"]
end
subgraph W1["Worker Node 1"]
K1["kubelet"]
KP1["kube-proxy"]
P1A["Pod"]
P1B["Pod"]
end
subgraph W2["Worker Node 2"]
K2["kubelet"]
KP2["kube-proxy"]
P2A["Pod"]
P2B["Pod"]
end
subgraph W3["Worker Node 3"]
K3["kubelet"]
KP3["kube-proxy"]
P3A["Pod"]
P3B["Pod"]
end
CP --> W1
CP --> W2
CP --> W3
Control Plane (Plano de Control)
- API Server: Punto de entrada para todas las operaciones del cluster
- Scheduler: Decide en qué nodo ejecutar los Pods
- Controller Manager: Conjunto de controladores que mantienen el estado deseado
- etcd: KVS distribuido que almacena el estado del cluster
Worker Node (Nodo de Trabajo)
- kubelet: Gestiona los Pods en el nodo
- kube-proxy: Proxy de red y balanceo de carga
Recursos Principales
Pod
Unidad mínima de despliegue en Kubernetes. Agrupa uno o más contenedores.
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: web
spec:
containers:
- name: app
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
Deployment
Gestiona réplicas de Pods y actualizaciones graduales.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: my-app:1.0.0
ports:
- containerPort: 8080
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
Service
Proporciona acceso de red estable a los Pods.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
type: ClusterIP
Tipos de Service
| Tipo | Descripción |
|---|---|
| ClusterIP | Accesible solo desde dentro del cluster |
| NodePort | Expuesto externamente en el puerto de cada nodo |
| LoadBalancer | Expuesto externamente integrado con LB del cloud |
| ExternalName | Alias a servicio externo |
ConfigMap / Secret
Gestiona configuración e información sensible.
# ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DATABASE_HOST: "db.example.com"
LOG_LEVEL: "info"
---
# Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
DATABASE_PASSWORD: cGFzc3dvcmQxMjM= # codificado en base64
# Uso en Pod
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets
Escalado
Escalado Manual
kubectl scale deployment web-deployment --replicas=5
Escalado Automático (HPA)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Actualización Gradual
flowchart LR
subgraph Before["Antes de la actualización"]
B1["v1"]
B2["v1"]
B3["v1"]
end
subgraph During["Durante la actualización"]
direction TB
D1["v1 v1 v1 v2 ← Nueva versión añadida"]
D2["v1 v1 v2 v2 ← Versión antigua eliminada"]
D3["v1 v2 v2 v2"]
D1 --> D2 --> D3
end
subgraph After["Después de la actualización"]
A1["v2"]
A2["v2"]
A3["v2"]
end
Before --> During --> After
# Actualizar imagen
kubectl set image deployment/web-deployment web=my-app:2.0.0
# Verificar estado de actualización
kubectl rollout status deployment/web-deployment
# Rollback
kubectl rollout undo deployment/web-deployment
Health Checks
spec:
containers:
- name: app
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 3
- livenessProbe: Si falla, reinicia el contenedor
- readinessProbe: Si falla, excluye del Service
Resumen
Kubernetes es una plataforma poderosa que automatiza la operación de aplicaciones contenedorizadas. Comprendiendo los recursos básicos como Pod, Deployment y Service, y combinándolos adecuadamente, puedes construir sistemas escalables y altamente disponibles.
← Volver a la lista