Saltar al contenido principal

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