Introducción a Kubernetes: conceptos fundamentales y arquitectura

¿Qué es Kubernetes?

Kubernetes (frecuentemente abreviado como K8s) es una plataforma de código abierto para la orquestación de contenedores, desarrollada originalmente por Google. Automatiza el despliegue, escalado y gestión de aplicaciones en contenedores a través de clústeres de servidores.

¿Cuándo debería usar Kubernetes?

Kubernetes es una buena opción cuando necesita:

  • Ejecutar múltiples contenedores en varios servidores
  • Escalar aplicaciones automáticamente según la demanda
  • Garantizar alta disponibilidad con despliegues sin tiempo de inactividad
  • Gestionar arquitecturas de microservicios
  • Automatizar despliegues y reversiones

Para aplicaciones simples que se ejecutan en un solo servidor, Kubernetes puede ser excesivo. Considere Docker Compose o un PaaS gestionado en su lugar.

Visión general de la arquitectura

Un clúster de Kubernetes consta de dos tipos de componentes:

Plano de control (Master)

El plano de control gestiona el estado general del clúster:

  • API Server (kube-apiserver): La interfaz principal del plano de control de Kubernetes. Toda la comunicación (CLI, dashboard, componentes internos) pasa por esta API.
  • etcd: Un almacén de clave-valor distribuido que contiene toda la configuración y los datos de estado del clúster.
  • Scheduler (kube-scheduler): Asigna Pods recién creados a nodos de trabajo según los requisitos de recursos y restricciones.
  • Controller Manager: Ejecuta controladores que supervisan el estado del clúster y realizan cambios para alcanzar el estado deseado (ej.: reiniciar Pods fallidos).

Nodos de trabajo (Workers)

Los nodos de trabajo ejecutan los contenedores de sus aplicaciones:

  • kubelet: Un agente que se ejecuta en cada nodo y asegura que los contenedores estén funcionando según lo esperado.
  • kube-proxy: Gestiona las reglas de red y el balanceo de carga para los Services en cada nodo.
  • Runtime de contenedores: El software que ejecuta los contenedores (containerd, CRI-O, etc.).

Conceptos fundamentales

Pod

La unidad desplegable más pequeña en Kubernetes. Un Pod envuelve uno o más contenedores que comparten el mismo espacio de nombres de red y almacenamiento. En la mayoría de los casos, un Pod ejecuta un solo contenedor.

apiVersion: v1
kind: Pod
metadata:
  name: mi-app
spec:
  containers:
  - name: app
    image: nginx:latest
    ports:
    - containerPort: 80

Deployment

Un Deployment gestiona un conjunto de Pods idénticos (réplicas). Maneja actualizaciones progresivas, reversiones y escalado. Es la forma más común de ejecutar aplicaciones en Kubernetes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mi-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mi-app
  template:
    metadata:
      labels:
        app: mi-app
    spec:
      containers:
      - name: app
        image: nginx:latest
        ports:
        - containerPort: 80

Service

Un Service proporciona un punto de acceso de red estable (IP y nombre DNS) para acceder a un grupo de Pods. Dado que los Pods son efímeros y sus IPs cambian, los Services actúan como una puerta de entrada estable.

  • ClusterIP: Accesible solo dentro del clúster (predeterminado).
  • NodePort: Expone el Service en un puerto estático en la IP de cada nodo.
  • LoadBalancer: Provisiona un balanceador de carga externo (proveedores cloud).

Namespace

Los Namespaces proporcionan una forma de dividir los recursos del clúster entre múltiples equipos o proyectos. Actúan como clústeres virtuales dentro de un clúster físico.

ConfigMap y Secret

Los ConfigMaps almacenan datos de configuración no sensibles (variables de entorno, archivos de configuración). Los Secrets almacenan datos sensibles (contraseñas, claves API, certificados) en formato codificado.

Comandos clave

Comando Descripción
kubectl get pods Listar todos los Pods en el namespace actual
kubectl get deployments Listar todos los Deployments
kubectl get services Listar todos los Services
kubectl apply -f archivo.yaml Crear o actualizar recursos desde un archivo YAML
kubectl logs nombre-pod Ver logs de un Pod
kubectl describe pod nombre-pod Mostrar información detallada de un Pod
kubectl delete pod nombre-pod Eliminar un Pod
kubectl scale deployment mi-app --replicas=5 Escalar un Deployment a 5 réplicas

Próximos pasos

  • Pruebe los tutoriales oficiales de Kubernetes para práctica guiada.
  • Aprenda sobre controladores Ingress para enrutar tráfico HTTP externo.
  • Explore Helm para gestionar paquetes de aplicaciones en Kubernetes.