Introducción

En Kubernetes, los StatefulSets son un recurso que se utiliza para gestionar aplicaciones con estado. A diferencia de los Deployments, que se utilizan para aplicaciones sin estado, los StatefulSets garantizan que los pods se desplieguen y escalen de manera ordenada y predecible. Esto es crucial para aplicaciones que requieren una identidad estable y almacenamiento persistente, como bases de datos y sistemas de mensajería.

Conceptos Clave

Identidad Estable

  • Nombre del Pod: Cada pod en un StatefulSet tiene un nombre único que se mantiene constante a lo largo de su ciclo de vida.
  • Orden de Despliegue y Eliminación: Los pods se despliegan y eliminan en un orden específico, garantizando que siempre haya un pod disponible.

Almacenamiento Persistente

  • Volúmenes Persistentes: Cada pod en un StatefulSet puede tener su propio volumen persistente, que se mantiene incluso si el pod se elimina y se vuelve a crear.

Ejemplo Práctico

Definición de un StatefulSet

A continuación, se muestra un ejemplo de un StatefulSet que despliega una aplicación de base de datos MySQL:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: mysql-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Explicación del Código

  • apiVersion: Especifica la versión de la API de Kubernetes que se está utilizando.
  • kind: Define el tipo de recurso, en este caso, StatefulSet.
  • metadata: Contiene información sobre el StatefulSet, como su nombre.
  • spec: Define las especificaciones del StatefulSet.
    • serviceName: Nombre del servicio que gestiona los pods del StatefulSet.
    • replicas: Número de réplicas del pod.
    • selector: Selector de etiquetas para identificar los pods gestionados por el StatefulSet.
    • template: Plantilla del pod que define cómo se deben crear los pods.
      • metadata: Etiquetas del pod.
      • spec: Especificaciones del contenedor dentro del pod.
        • containers: Lista de contenedores en el pod.
          • name: Nombre del contenedor.
          • image: Imagen del contenedor.
          • ports: Puertos expuestos por el contenedor.
          • volumeMounts: Montajes de volúmenes en el contenedor.
    • volumeClaimTemplates: Plantillas de reclamaciones de volúmenes persistentes para los pods.

Ejercicio Práctico

Ejercicio 1: Crear un StatefulSet

  1. Objetivo: Crear un StatefulSet que despliegue una aplicación Redis con 3 réplicas.
  2. Instrucciones:
    • Define un StatefulSet en un archivo YAML.
    • Utiliza la imagen redis:6.0.
    • Configura un volumen persistente de 1Gi para cada pod.

Solución

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: "redis"
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6.0
        ports:
        - containerPort: 6379
          name: redis
        volumeMounts:
        - name: redis-persistent-storage
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: redis-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Ejercicio 2: Escalar un StatefulSet

  1. Objetivo: Escalar el StatefulSet de Redis a 5 réplicas.
  2. Instrucciones:
    • Modifica el archivo YAML del StatefulSet para aumentar el número de réplicas a 5.
    • Aplica los cambios utilizando kubectl.

Solución

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: "redis"
  replicas: 5
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6.0
        ports:
        - containerPort: 6379
          name: redis
        volumeMounts:
        - name: redis-persistent-storage
          mountPath: /data
  volumeClaimTemplates:
  - metadata:
      name: redis-persistent-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Para aplicar los cambios, utiliza el siguiente comando:

kubectl apply -f redis-statefulset.yaml

Resumen

En esta sección, hemos aprendido sobre los StatefulSets en Kubernetes, su importancia para aplicaciones con estado y cómo configurarlos. Hemos visto un ejemplo práctico de un StatefulSet para una base de datos MySQL y hemos realizado ejercicios para crear y escalar un StatefulSet de Redis. Con estos conocimientos, estás preparado para gestionar aplicaciones con estado en Kubernetes de manera efectiva.

Curso de Kubernetes

Módulo 1: Introducción a Kubernetes

Módulo 2: Componentes Principales de Kubernetes

Módulo 3: Gestión de Configuración y Secretos

Módulo 4: Redes en Kubernetes

Módulo 5: Almacenamiento en Kubernetes

Módulo 6: Conceptos Avanzados de Kubernetes

Módulo 7: Monitoreo y Registro

Módulo 8: Seguridad en Kubernetes

Módulo 9: Escalado y Rendimiento

Módulo 10: Ecosistema y Herramientas de Kubernetes

Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real

Módulo 12: Preparación para la Certificación de Kubernetes

© Copyright 2024. Todos los derechos reservados