Lab 7.1 - StatefulSet para Banco de Dados
Objetivos do Lab
Ao final deste lab, você será capaz de:
- Fazer o deploy de um banco de dados (MySQL) com um StatefulSet.
- Configurar armazenamento persistente para um banco de dados.
- Compreender a importância da ordem de inicialização para bancos de dados.
- Configurar um Service headless para descoberta.
- Testar a persistência dos dados do banco de dados.
Duração Estimada
60-75 minutos
Pré-requisitos
- kubectl instalado e configurado.
- Cluster Kubernetes local funcional (minikube ou kind).
- Conhecimento sobre StatefulSets (Capítulo 7.1).
Parte 1: Preparação da StorageClass
Crie uma StorageClass para o armazenamento do banco de dados:
# 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 a StorageClass:
kubectl apply -f storageclass-mysql.yaml
Parte 2: Criação do Secret para MySQL
Crie um Secret para armazenar a senha root do MySQL:
# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: cGFzc3dvcmQxMjM= # "password123" em base64
mysql-password: cGFzc3dvcmQxMjM= # "password123" em base64
Aplique o Secret:
kubectl apply -f mysql-secret.yaml
Parte 3: Criação do Service Headless
Um StatefulSet requer um Service headless para descoberta 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 o Service:
kubectl apply -f mysql-service.yaml
Parte 4: Criação do StatefulSet MySQL
Crie o StatefulSet para o MySQL com armazenamento persistente:
# mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql # Nome do Service headless
replicas: 1 # Para este lab, apenas uma instância MySQL
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: init-mysql
image: busybox:1.35
command:
- sh
- -c
- |
# Criar o diretório de dados se necessário
if [ ! -d /var/lib/mysql/mysql ]; then
echo "Inicializando o diretório de dados do 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 o StatefulSet:
kubectl apply -f mysql-statefulset.yaml
Parte 5: Verificação do Deploy
Etapa 5.1: Verificar o Pod
Aguarde até que o Pod esteja Running:
kubectl get pods -l app=mysql
Verifique os logs para garantir que o MySQL iniciou corretamente:
kubectl logs mysql-0
Etapa 5.2: Verificar o PVC
Verifique se o PVC foi criado:
kubectl get pvc
Você deve ver um PVC chamado data-mysql-0.
Parte 6: Teste do Banco de Dados
Etapa 6.1: Criar um Banco de Dados e uma Tabela
Conecte-se ao MySQL e crie um banco de dados de teste:
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');"
Etapa 6.2: Verificar os Dados
Verifique se os dados foram inseridos:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Parte 7: Teste de Persistência
Etapa 7.1: Deletar o Pod
Delete o Pod para testar a persistência:
kubectl delete pod mysql-0
O StatefulSet irá recriar automaticamente o Pod com o mesmo nome.
Aguarde até que o novo Pod esteja Running:
kubectl get pods -l app=mysql
Espere alguns segundos até que o MySQL reinicie completamente:
kubectl logs mysql-0 -f
Pressione Ctrl+C quando o MySQL estiver pronto.
Etapa 7.2: Verificar a Persistência dos Dados
Verifique se os dados ainda estão presentes:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Você deve ver os três usuários (Alice, Bob, Charlie), o que prova que os dados persistiram!
Parte 8: Limpeza
Delete os recursos criados:
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
Resumo do Lab
Neste lab, você fez o deploy de um banco de dados MySQL com um StatefulSet. Você aprendeu a configurar armazenamento persistente para um banco de dados, a usar Secrets para senhas e a testar a persistência dos dados durante reinicializações. Os StatefulSets são ideais para aplicações com estado, como bancos de dados.
Próximos Passos
O próximo lab mostrará como usar DaemonSets para fazer o deploy de agentes em todos os nós.
Lab 7.2: DaemonSet para Monitoramento
Lab criado em: Dezembro 2024