Saltar a contenido

10.3 Kubernetes (K8s): Orquestación de Contenedores a Escala


Introducción

Una vez que las aplicaciones se ejecutan en contenedores, surge un problema inmediato en entornos reales: ¿cómo gestionar decenas o cientos de contenedores distribuidos entre múltiples nodos? Aquí es donde entra Kubernetes (K8s).

Kubernetes es una plataforma de orquestación que automatiza el despliegue, escalado y operación de aplicaciones contenerizadas. Permite pasar de ejecutar contenedores individuales a gestionar infraestructuras completas declarativas y resilientes.

Para un Sysadmin senior, Kubernetes no es solo una herramienta, sino un cambio de paradigma operativo: se deja de administrar máquinas para administrar estados deseados.


Objetivos de aprendizaje

Al finalizar este capítulo serás capaz de:

  • Comprender la arquitectura y componentes de Kubernetes.
  • Gestionar clústeres y nodos.
  • Desplegar aplicaciones mediante objetos declarativos.
  • Entender el ciclo de vida de los Pods.
  • Aplicar buenas prácticas en entornos productivos.

Conceptos Teóricos

1. ¿Qué es Kubernetes?

Kubernetes es un sistema de orquestación que permite:

  • desplegar contenedores automáticamente
  • escalar aplicaciones
  • gestionar redes internas
  • garantizar alta disponibilidad

Se basa en un modelo declarativo: defines el estado deseado y Kubernetes se encarga de alcanzarlo.

Concepto clave

En Kubernetes no ejecutas contenedores manualmente; defines cómo deben ejecutarse y el sistema mantiene ese estado.


2. Arquitectura de Kubernetes

Un clúster Kubernetes se compone de:

Plano de control (Control Plane)

  • API Server → punto central de comunicación
  • Scheduler → decide dónde ejecutar los Pods
  • Controller Manager → mantiene el estado deseado
  • etcd → base de datos del clúster

Nodos (Workers)

  • kubelet → agente que ejecuta Pods
  • container runtime → Docker, containerd
  • kube-proxy → gestión de red

3. Objetos principales

Pod

Unidad mínima de ejecución (uno o varios contenedores).

Deployment

Define cómo desplegar Pods y garantiza disponibilidad.

Service

Expone aplicaciones dentro o fuera del clúster.

Namespace

Aislamiento lógico dentro del clúster.


4. Modelo declarativo

Ejemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2

Kubernetes asegura que siempre existan 2 réplicas.


5. Networking

Cada Pod:

  • tiene su propia IP
  • puede comunicarse con otros Pods

Servicios:

  • ClusterIP
  • NodePort
  • LoadBalancer

6. Escalabilidad y autocuración

Kubernetes permite:

  • escalar Pods automáticamente
  • reiniciar contenedores fallidos
  • redistribuir carga

Laboratorio Práctico

Escenario

Desplegar una aplicación web en Kubernetes:

  • crear deployment
  • exponer servicio
  • verificar funcionamiento

Este laboratorio asume un entorno local con minikube o similar.


Parte 1: Verificar clúster

kubectl cluster-info

Ver nodos

kubectl get nodes

Parte 2: Crear Deployment

nano deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

Aplicar configuración

kubectl apply -f deployment.yml

Ver Pods

kubectl get pods

Parte 3: Exponer servicio

kubectl expose deployment web-deploy \
--type=NodePort \
--port=80

Ver servicios

kubectl get svc

Acceso

curl http://<NODE_IP>:<NODE_PORT>

Parte 4: Escalado

kubectl scale deployment web-deploy --replicas=4

Ver resultado:

kubectl get pods

Output esperado

NAME                         READY   STATUS
web-deploy-abc123            1/1     Running
web-deploy-def456            1/1     Running

Errores Comunes y Troubleshooting

1. Pods en estado CrashLoopBackOff

Causa:

  • error en contenedor

Solución:

kubectl logs <pod>

2. Imagen incorrecta

ErrImagePull

Solución:

verificar nombre y acceso al repositorio.


3. Problemas de red

Servicio no accesible.

Solución:

kubectl describe svc

4. Recursos insuficientes

Pods no programados.

Pending

Solución:

verificar capacidad del nodo.


5. YAML inválido

Errores de indentación.

Solución:

validar estructura cuidadosamente.


Buenas Prácticas (Nivel Senior)

1. Uso de namespaces

Separar entornos:

kubectl create namespace prod

2. Definir recursos

resources:
  limits:
    memory: "512Mi"
    cpu: "1"

3. Health checks

livenessProbe:
  httpGet:
    path: /
    port: 80

4. Uso de ConfigMaps y Secrets

Separar configuración:

kubectl create configmap app-config

5. Imágenes versionadas

Evitar latest.


6. Rolling updates

Actualizaciones sin downtime:

kubectl rollout status deployment web-deploy

7. RBAC

Controlar accesos al clúster.


8. Observabilidad

Integrar con:

  • Prometheus
  • Grafana
  • ELK

9. Infraestructura como código

Gestionar manifests en Git + CI/CD.


Resumen y Siguiente Paso

Has comprendido los fundamentos de Kubernetes, incluyendo su arquitectura, modelo declarativo y capacidad para orquestar contenedores a gran escala. Este conocimiento te permite evolucionar desde la ejecución de contenedores individuales hacia la gestión de plataformas completas.

Kubernetes representa el estándar actual en despliegues modernos, especialmente en entornos cloud y microservicios.

Con este capítulo, completas el bloque de virtualización:

  • KVM → virtualización tradicional
  • Docker → contenedores
  • Kubernetes → orquestación

El siguiente paso es profundizar en la observabilidad y operación de sistemas complejos:

➡️ 11-monitorización — rendimiento, métricas y troubleshooting avanzado en Linux.