Pular para o conteúdo principal

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