352.4 Orquestación de Contenedores
Introducción
La orquestación de contenedores automatiza el despliegue, escalado, gestión y recuperación de aplicaciones contenerizadas en clústeres de múltiples hosts. Los dos principales orquestadores son Docker Swarm (integrado en Docker) y Kubernetes (estándar de la industria).
Docker Swarm
Docker Swarm es el orquestador nativo de Docker, integrado directamente en el Docker Engine.
Arquitectura
┌─────────────────────────────────────────┐
│ Docker Swarm Cluster │
├─────────────┬─────────────┬─────────────┤
│ Manager 1 │ Manager 2 │ Manager 3 │
│ (Leader) │ (Follower) │ (Follower) │
├─────────────┼─────────────┼─────────────┤
│ Worker 1 │ Worker 2 │ Worker 3 │
│ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │
│ │Task 1 │ │ │Task 2 │ │ │Task 3 │ │
│ │Task 4 │ │ │Task 5 │ │ │Task 6 │ │
│ └────────┘ │ └────────┘ │ └────────┘ │
└─────────────┴─────────────┴─────────────┘
Inicializar y unirse al Swarm
# Inicializar Swarm en el primer manager
docker swarm init --advertise-addr 192.168.1.10
# Obtener token para añadir workers
docker swarm join-token worker
# Obtener token para añadir managers
docker swarm join-token manager
# Unirse como worker
docker swarm join --token SWMTKN-1-xxx 192.168.1.10:2377
# Listar nodos del clúster
docker node ls
# Abandonar el Swarm
docker swarm leave
docker swarm leave --force # En un managerServicios en Swarm
# Crear un servicio
docker service create --name web --replicas 3 -p 8080:80 nginx
# Listar servicios
docker service ls
# Ver tareas de un servicio
docker service ps web
# Escalar servicio
docker service scale web=5
# Actualizar imagen
docker service update --image nginx:latest web
# Eliminar servicio
docker service rm web
# Ver logs del servicio
docker service logs webStack Deploy
Permite desplegar aplicaciones multi-servicio usando archivos Compose:
# Desplegar stack desde archivo compose
docker stack deploy -c docker-compose.yml mi-app
# Listar stacks
docker stack ls
# Listar servicios de un stack
docker stack services mi-app
# Eliminar stack
docker stack rm mi-appPara el examen: Docker Swarm es más sencillo de configurar que Kubernetes y está integrado en Docker. Sin embargo, Kubernetes domina el mercado para orquestación en producción a gran escala.
Kubernetes
Kubernetes (K8s) es la plataforma estándar de la industria para orquestación de contenedores, desarrollada originalmente por Google.
Arquitectura
┌─────────────────────────────────────────────────┐
│ Control Plane │
│ ┌──────────┐ ┌──────────┐ ┌─────────────────┐ │
│ │kube-api │ │etcd │ │kube-scheduler │ │
│ │server │ │(almacén) │ │ │ │
│ └──────────┘ └──────────┘ └─────────────────┘ │
│ ┌────────────────────┐ │
│ │kube-controller-mgr │ │
│ └────────────────────┘ │
├─────────────────────────────────────────────────┤
│ Worker Nodes │
│ ┌──────────────────────────────────────┐ │
│ │ Node 1 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │kubelet │ │kube-proxy│ │Container│ │ │
│ │ │ │ │ │ │Runtime │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │Pod 1│ │Pod 2│ │Pod 3│ │ │
│ │ └─────┘ └─────┘ └─────┘ │ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
Conceptos Fundamentales
| Concepto | Descripción |
|---|---|
| Pod | Unidad mínima de despliegue. Uno o más contenedores que comparten red y almacenamiento. |
| Deployment | Gestiona réplicas de Pods con actualizaciones declarativas y rollbacks. |
| Service | Expone Pods como servicio de red con IP estable y balanceo de carga. |
| Namespace | Aislamiento lógico de recursos dentro del clúster. |
| ConfigMap | Almacena configuración como pares clave-valor (no sensible). |
| Secret | Almacena datos sensibles (contraseñas, tokens) codificados en base64. |
| Volume | Almacenamiento para Pods (emptyDir, hostPath, PV/PVC, etc.). |
| Ingress | Gestión de acceso HTTP/HTTPS externo con reglas de enrutamiento. |
YAML Manifests
Pod
apiVersion: v1
kind: Pod
metadata:
name: mi-pod
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24
ports:
- containerPort: 80Service
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP # ClusterIP, NodePort, LoadBalancerPara el examen: Los tipos de Service son:
ClusterIP(solo accesible dentro del clúster),NodePort(expone en un puerto de cada nodo),LoadBalancer(provisiona un LB externo en cloud).
Comandos kubectl
# Ver recursos
kubectl get pods
kubectl get pods -o wide
kubectl get deployments
kubectl get services
kubectl get nodes
kubectl get all
kubectl get all -n mi-namespace
# Información detallada
kubectl describe pod mi-pod
kubectl describe deployment web-deployment
kubectl describe service web-service
# Aplicar manifiesto YAML
kubectl apply -f mi-recurso.yaml
kubectl apply -f directorio/
# Eliminar recursos
kubectl delete pod mi-pod
kubectl delete -f mi-recurso.yaml
kubectl delete deployment web-deployment
# Logs
kubectl logs mi-pod
kubectl logs -f mi-pod
kubectl logs mi-pod -c mi-contenedor # Multi-container pod
# Ejecutar comando en pod
kubectl exec -it mi-pod -- bash
# Escalar deployment
kubectl scale deployment web-deployment --replicas=5
# Ver historial de rollout
kubectl rollout history deployment web-deployment
# Rollback
kubectl rollout undo deployment web-deployment
# Crear recursos imperativamente
kubectl create namespace mi-namespace
kubectl create configmap mi-config --from-literal=clave=valor
kubectl create secret generic mi-secret --from-literal=password=s3cr3tNamespaces
# Listar namespaces
kubectl get namespaces
# Crear namespace
kubectl create namespace desarrollo
# Usar namespace por defecto
kubectl config set-context --current --namespace=desarrollo
# Operar en un namespace específico
kubectl get pods -n desarrolloContainer Registries
Los registros almacenan y distribuyen imágenes de contenedores:
| Registro | Descripción |
|---|---|
| Docker Hub | Registro público por defecto de Docker |
| Harbor | Registro empresarial de código abierto |
| Amazon ECR | Registro de AWS |
| Google GCR/GAR | Registro de Google Cloud |
| Azure ACR | Registro de Azure |
| Quay.io | Registro de Red Hat |
# Login a un registry
docker login registry.ejemplo.com
# Etiquetar para registry privado
docker tag mi-app:v1 registry.ejemplo.com/mi-app:v1
# Subir imagen
docker push registry.ejemplo.com/mi-app:v1
# Kubernetes: crear secret para registry privado
kubectl create secret docker-registry mi-registry-secret \
--docker-server=registry.ejemplo.com \
--docker-username=usuario \
--docker-password=claveResumen
| Concepto | Detalle clave |
|---|---|
| Docker Swarm | Orquestador integrado en Docker, fácil de configurar |
docker swarm init | Inicializar clúster Swarm |
docker service create | Crear servicio en Swarm |
| Kubernetes | Estándar de la industria para orquestación |
| Pod | Unidad mínima en K8s (1+ contenedores) |
| Deployment | Gestión declarativa de réplicas de Pods |
| Service | Exposición de red estable para Pods |
kubectl apply -f | Aplicar configuración declarativa |
kubectl get/describe | Consultar estado de recursos |
| Registries | Almacenes de imágenes (Docker Hub, Harbor, etc.) |
Trampas del examen
Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:
- Docker Swarm
docker servicevsdocker run—docker runejecuta un contenedor individual.docker service createcrea un servicio replicado gestionado por Swarm con autorecuperacion y escalado. El examen puede preguntar que comando se usa para desplegar en un cluster Swarm (respuesta:docker service create, NOdocker run). - Pod no es un contenedor — Un Pod en Kubernetes es la unidad minima de despliegue que puede contener uno o MAS contenedores que comparten red y almacenamiento. Todos los contenedores de un Pod comparten la misma IP. El examen puede preguntar como se comunican contenedores dentro del mismo Pod (respuesta: via
localhost). - Service types: ClusterIP vs NodePort vs LoadBalancer —
ClusterIP(por defecto) solo es accesible DENTRO del cluster.NodePortexpone el servicio en un puerto (30000-32767) de TODOS los nodos.LoadBalancerprovisiona un balanceador externo en cloud. El examen preguntara que tipo usar para acceso externo sin cloud (respuesta: NodePort). kubectl applyvskubectl create—applyes declarativo e idempotente: si el recurso existe, lo actualiza; si no, lo crea.createes imperativo y falla si el recurso ya existe. Para gestion declarativa (IaC) siempre se usaapply -f. El examen puede preguntar cual comando usar en un pipeline CI/CD.- Secrets en Kubernetes solo estan codificados en base64, NO cifrados — Los Secrets almacenan datos en base64, que es una codificacion reversible, NO cifrado. Cualquier persona con acceso al cluster puede decodificarlos. Para cifrado real se necesita encryption at rest o herramientas como Vault. El examen puede preguntar si los Secrets son seguros por defecto.
kubectl rollout undovskubectl delete—rollout undorevierte un Deployment a la version anterior manteniendo el servicio activo.deleteelimina completamente el recurso. No son equivalentes. El examen puede presentar un escenario de rollback y preguntar el comando correcto.- Swarm managers: numero impar — Se recomienda un numero impar de managers (3, 5, 7) para el consenso Raft. Con 3 managers se tolera 1 fallo, con 5 se toleran 2. Un numero par no mejora la tolerancia a fallos. El examen puede preguntar cuantos managers se necesitan para tolerar N fallos.
docker stack deployvsdocker compose up—docker stack deploydespliega en modo Swarm usando un compose file.docker compose updespliega localmente en un solo host. No son intercambiables. Algunas opciones del compose file (comobuild:) no se soportan en stacks.- Namespace de Kubernetes vs namespace del kernel — Los namespaces de Kubernetes son divisiones logicas dentro del cluster para organizar recursos. Los namespaces del kernel Linux (pid, net, mnt) son mecanismos de aislamiento de procesos. Son conceptos completamente diferentes que comparten nombre.
- etcd es el almacen de estado de Kubernetes — Toda la configuracion y estado del cluster se almacena en etcd. Si etcd se pierde sin backup, se pierde todo el cluster. El examen puede preguntar donde se almacena el estado de los Deployments y Services (respuesta: etcd, no en los nodos worker).