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 manager

Servicios 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 web

Stack 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-app

Para 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

ConceptoDescripción
PodUnidad mínima de despliegue. Uno o más contenedores que comparten red y almacenamiento.
DeploymentGestiona réplicas de Pods con actualizaciones declarativas y rollbacks.
ServiceExpone Pods como servicio de red con IP estable y balanceo de carga.
NamespaceAislamiento lógico de recursos dentro del clúster.
ConfigMapAlmacena configuración como pares clave-valor (no sensible).
SecretAlmacena datos sensibles (contraseñas, tokens) codificados en base64.
VolumeAlmacenamiento para Pods (emptyDir, hostPath, PV/PVC, etc.).
IngressGestió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: 80

Service

apiVersion: v1
kind: Service
metadata:
  name: web-service
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP    # ClusterIP, NodePort, LoadBalancer

Para 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=s3cr3t

Namespaces

# 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 desarrollo

Container Registries

Los registros almacenan y distribuyen imágenes de contenedores:

RegistroDescripción
Docker HubRegistro público por defecto de Docker
HarborRegistro empresarial de código abierto
Amazon ECRRegistro de AWS
Google GCR/GARRegistro de Google Cloud
Azure ACRRegistro de Azure
Quay.ioRegistro 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=clave

Resumen

ConceptoDetalle clave
Docker SwarmOrquestador integrado en Docker, fácil de configurar
docker swarm initInicializar clúster Swarm
docker service createCrear servicio en Swarm
KubernetesEstándar de la industria para orquestación
PodUnidad mínima en K8s (1+ contenedores)
DeploymentGestión declarativa de réplicas de Pods
ServiceExposición de red estable para Pods
kubectl apply -fAplicar configuración declarativa
kubectl get/describeConsultar estado de recursos
RegistriesAlmacenes 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 service vs docker rundocker run ejecuta un contenedor individual. docker service create crea 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, NO docker 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 LoadBalancerClusterIP (por defecto) solo es accesible DENTRO del cluster. NodePort expone el servicio en un puerto (30000-32767) de TODOS los nodos. LoadBalancer provisiona un balanceador externo en cloud. El examen preguntara que tipo usar para acceso externo sin cloud (respuesta: NodePort).
  • kubectl apply vs kubectl createapply es declarativo e idempotente: si el recurso existe, lo actualiza; si no, lo crea. create es imperativo y falla si el recurso ya existe. Para gestion declarativa (IaC) siempre se usa apply -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 undo vs kubectl deleterollout undo revierte un Deployment a la version anterior manteniendo el servicio activo. delete elimina 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 deploy vs docker compose updocker stack deploy despliega en modo Swarm usando un compose file. docker compose up despliega localmente en un solo host. No son intercambiables. Algunas opciones del compose file (como build:) 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).