En este módulo, aprenderemos sobre la ejecución de aplicaciones con estado en Kubernetes. Las aplicaciones con estado son aquellas que mantienen datos persistentes y requieren que los datos se conserven entre reinicios y actualizaciones. Kubernetes proporciona varios mecanismos para gestionar estas aplicaciones de manera eficiente.
Contenido
Introducción a las Aplicaciones con Estado
Las aplicaciones con estado requieren que los datos se mantengan a lo largo del tiempo y no se pierdan cuando los contenedores se reinician o se reprograman. Algunos ejemplos comunes de aplicaciones con estado incluyen bases de datos, sistemas de mensajería y aplicaciones de almacenamiento de archivos.
Características de las Aplicaciones con Estado
- Persistencia de Datos: Los datos deben sobrevivir a los reinicios y actualizaciones.
- Identidad Estable: Cada instancia de la aplicación debe tener una identidad única y estable.
- Orden de Despliegue y Escalado: El orden en el que se despliegan y escalan las instancias puede ser importante.
StatefulSets
StatefulSets es el recurso de Kubernetes diseñado específicamente para gestionar aplicaciones con estado. Proporciona garantías sobre el orden y la estabilidad de las identidades de los pods.
Características de StatefulSets
- Identidad Estable: Cada pod en un StatefulSet tiene un nombre único y estable.
- Persistencia de Almacenamiento: Los volúmenes persistentes se asocian con los pods y se mantienen incluso si los pods se eliminan.
- Orden de Despliegue y Escalado: Los pods se despliegan y escalan en un orden específico.
Ejemplo de StatefulSet
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: 1GiExplicación del Ejemplo
- serviceName: Define el nombre del servicio que gestionará el acceso a los pods del StatefulSet.
- replicas: Número de réplicas del StatefulSet.
- selector: Selector de etiquetas para identificar los pods gestionados por el StatefulSet.
- template: Plantilla de pod que define la configuración de los contenedores.
- volumeClaimTemplates: Plantilla para crear PersistentVolumeClaims (PVC) para cada pod.
Volúmenes Persistentes
Los volúmenes persistentes (Persistent Volumes, PV) y las reclamaciones de volúmenes persistentes (Persistent Volume Claims, PVC) son los mecanismos que Kubernetes utiliza para gestionar el almacenamiento persistente.
Ejemplo de PersistentVolume y PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-mysql
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1GiExplicación del Ejemplo
- PersistentVolume: Define un volumen persistente con una capacidad de 1Gi y un modo de acceso ReadWriteOnce.
- PersistentVolumeClaim: Solicita un volumen persistente con una capacidad de 1Gi y un modo de acceso ReadWriteOnce.
Ejemplo Práctico: Despliegue de una Base de Datos MySQL
Vamos a desplegar una base de datos MySQL utilizando StatefulSets y volúmenes persistentes.
Paso 1: Crear el StatefulSet
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
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword"
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1GiPaso 2: Crear el Servicio
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysqlDespliegue
- Crear el StatefulSet:
kubectl apply -f statefulset.yaml - Crear el Servicio:
kubectl apply -f service.yaml
Ejercicios Prácticos
-
Despliegue de una Base de Datos PostgreSQL:
- Cree un StatefulSet para una base de datos PostgreSQL.
- Asegúrese de que los datos se mantengan persistentes entre reinicios.
-
Escalado de StatefulSets:
- Escale el StatefulSet de MySQL a 5 réplicas.
- Verifique que cada pod tenga su propio volumen persistente.
Soluciones
- Despliegue de una Base de Datos PostgreSQL:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
spec:
serviceName: "postgresql"
replicas: 3
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgresql
image: postgres:12
ports:
- containerPort: 5432
name: postgresql
env:
- name: POSTGRES_PASSWORD
value: "postgrespassword"
volumeMounts:
- name: postgresql-persistent-storage
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgresql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi- Escalado de StatefulSets:
Conclusión
En esta sección, hemos aprendido sobre la ejecución de aplicaciones con estado en Kubernetes utilizando StatefulSets y volúmenes persistentes. Hemos visto cómo desplegar una base de datos MySQL y cómo gestionar el almacenamiento persistente. Estos conceptos son fundamentales para gestionar aplicaciones con estado en un entorno de Kubernetes.
En el próximo módulo, exploraremos cómo gestionar múltiples clústeres de Kubernetes y las mejores prácticas para la gestión multi-clúster.
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
