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.
- containers: Lista de contenedores en el pod.
- volumeClaimTemplates: Plantillas de reclamaciones de volúmenes persistentes para los pods.
Ejercicio Práctico
Ejercicio 1: Crear un StatefulSet
- Objetivo: Crear un StatefulSet que despliegue una aplicación Redis con 3 réplicas.
- 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
- Objetivo: Escalar el StatefulSet de Redis a 5 réplicas.
- 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:
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
- ¿Qué es Kubernetes?
- Arquitectura de Kubernetes
- Conceptos y Terminología Clave
- Configuración de un Clúster de Kubernetes
- CLI de Kubernetes (kubectl)
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
- Monitoreo con Prometheus
- Registro con Elasticsearch, Fluentd y Kibana (EFK)
- Verificaciones de Salud y Sondas
- Servidor de Métricas
Módulo 8: Seguridad en Kubernetes
- Control de Acceso Basado en Roles (RBAC)
- Políticas de Seguridad de Pods
- Seguridad de Red
- Seguridad de Imágenes
Módulo 9: Escalado y Rendimiento
- Autoescalado Horizontal de Pods
- Autoescalado Vertical de Pods
- Autoescalado de Clúster
- Ajuste de Rendimiento
Módulo 10: Ecosistema y Herramientas de Kubernetes
Módulo 11: Estudios de Caso y Aplicaciones del Mundo Real
- Despliegue de una Aplicación Web
- CI/CD con Kubernetes
- Ejecución de Aplicaciones con Estado
- Gestión Multi-Clúster