Orquestación de Contenedores - Introducción a Kubernetes

17 min de lectura | 2025.12.09

¿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

ProblemaSolución
Ubicación de contenedoresDecide automáticamente en qué nodo ejecutar
EscaladoAjusta automáticamente el número de contenedores según la carga
Recuperación ante fallosReinicia automáticamente contenedores caídos
Balanceo de cargaDistribuye tráfico entre múltiples contenedores
Descubrimiento de serviciosConfigura automáticamente la comunicación entre contenedores
Actualización gradualActualiza 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

TipoDescripción
ClusterIPAccesible solo desde dentro del cluster
NodePortExpuesto externamente en el puerto de cada nodo
LoadBalancerExpuesto externamente integrado con LB del cloud
ExternalNameAlias 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