Lab 7.1 - StatefulSet para Base de Datos
Objetivos del Lab
Al finalizar este laboratorio, usted será capaz de:
- Desplegar una base de datos (MySQL) con un StatefulSet.
- Configurar el almacenamiento persistente para una base de datos.
- Comprender la importancia del orden de arranque para las bases de datos.
- Configurar un Service headless para la detección.
- Probar la persistencia de los datos de la base de datos.
Duración Estimada
60-75 minutos
Prerrequisitos
- kubectl instalado y configurado.
- Cluster Kubernetes local funcional (minikube o kind).
- Conocimientos sobre StatefulSets (Capítulo 7.1).
Parte 1: Preparación de la StorageClass
Cree una StorageClass para el almacenamiento de la base de datos:
# storageclass-mysql.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mysql-storage
provisioner: k8s.io/minikube-hostpath # Para minikube
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
Aplique la StorageClass:
kubectl apply -f storageclass-mysql.yaml
Parte 2: Creación del Secret para MySQL
Cree un Secret para almacenar la contraseña root de MySQL:
# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: cGFzc3dvcmQxMjM= # "password123" en base64
mysql-password: cGFzc3dvcmQxMjM= # "password123" en base64
Aplique el Secret:
kubectl apply -f mysql-secret.yaml
Parte 3: Creación del Service Headless
Un StatefulSet requiere un Service headless para la detección DNS:
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None # Service headless
selector:
app: mysql
Aplique el Service:
kubectl apply -f mysql-service.yaml
Parte 4: Creación del StatefulSet MySQL
Cree el StatefulSet para MySQL con almacenamiento persistente:
# mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql # Nombre del Service headless
replicas: 1 # Para este laboratorio, solo una instancia MySQL
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: init-mysql
image: busybox:1.35
command:
- sh
- -c
- |
# Crear el directorio de datos si es necesario
if [ ! -d /var/lib/mysql/mysql ]; then
echo "Inicializando el directorio de datos de MySQL"
fi
volumeMounts:
- name: data
mountPath: /var/lib/mysql
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: data
mountPath: /var/lib/mysql
resources:
requests:
cpu: 500m
memory: 512Mi
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: mysql-storage
resources:
requests:
storage: 1Gi
Aplique el StatefulSet:
kubectl apply -f mysql-statefulset.yaml
Parte 5: Verificación del Despliegue
Paso 5.1: Verificar el Pod
Espere a que el Pod esté Running:
kubectl get pods -l app=mysql
Verifique los logs para asegurarse de que MySQL arranca correctamente:
kubectl logs mysql-0
Paso 5.2: Verificar el PVC
Verifique que el PVC ha sido creado:
kubectl get pvc
Debería ver un PVC llamado data-mysql-0.
Parte 6: Prueba de la Base de Datos
Paso 6.1: Crear una Base de Datos y una Tabla
Conéctese a MySQL y cree una base de datos de prueba:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "CREATE DATABASE testdb;"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');"
Paso 6.2: Verificar los Datos
Verifique que los datos han sido insertados:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Parte 7: Prueba de Persistencia
Paso 7.1: Eliminar el Pod
Elimine el Pod para probar la persistencia:
kubectl delete pod mysql-0
El StatefulSet recreará automáticamente el Pod con el mismo nombre.
Espere a que el nuevo Pod esté Running:
kubectl get pods -l app=mysql
Espere unos segundos a que MySQL reinicie completamente:
kubectl logs mysql-0 -f
Presione Ctrl+C una vez que MySQL esté listo.
Paso 7.2: Verificar la Persistencia de los Datos
Verifique que los datos siguen presentes:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Debería ver los tres usuarios (Alice, Bob, Charlie), lo que prueba que los datos han persistido.
Parte 8: Limpieza
Elimine los recursos creados:
kubectl delete statefulset mysql
kubectl delete service mysql
kubectl delete secret mysql-secret
kubectl delete pvc data-mysql-0
kubectl delete -f storageclass-mysql.yaml
Resumen del Lab
En este laboratorio, usted desplegó una base de datos MySQL con un StatefulSet. Aprendió a configurar el almacenamiento persistente para una base de datos, a utilizar Secrets para las contraseñas y a probar la persistencia de los datos durante los reinicios. Los StatefulSets son ideales para aplicaciones con estado como las bases de datos.
Próximos Pasos
El próximo laboratorio le mostrará cómo utilizar los DaemonSets para desplegar agentes en todos los nodos.
Lab 7.2: DaemonSet para Monitoring
Lab creado el: Diciembre 2024