Para aplicações com estado, como bancos de dados e filas de mensagens, um StatefulSet do Kubernetes utiliza o campo volumeClaimTemplates para criar e anexar dinamicamente uma Persistent Volume Claim (PVC) dedicada a cada pod. Essa PVC se vincula a um Persistent Volume (PV) independente. Quando um pod é recriado ou reagendado, a PVC remonta automaticamente seu PV original, garantindo a persistência dos dados e a continuidade do serviço.
Abaixo está um exemplo de configuração de volumeClaimTemplates:
apiVersion: apps/v1
kind: StatefulSet
# ...
spec:
# ...
volumeClaimTemplates:
- metadata:
name: data-volume # Name of the PVC template
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-essd" # Specify the storage type
resources:
requests:
storage: 20Gi # The requested storage capacity
Como funciona
-
Criação e scale-out
Durante a criação inicial ou o scale-out, o controlador do StatefulSet usa o
volumeClaimTemplatespara criar e vincular uma PVC com nome exclusivo para cada réplica de pod. As PVCs seguem o padrão de nomenclatura[template-name]-[pod-name]. Por exemplo, se o modelo se chamardata-volume, o controlador criará as PVCsdata-volume-web-0edata-volume-web-1para os podsweb-0eweb-1, respectivamente, estabelecendo um mapeamento estável entre o pod e seu armazenamento.Com base nos parâmetros do modelo (como
storageClassName,storageeaccessModes), a Container Storage Interface (CSI) cria automaticamente um PV correspondente com o tipo, tamanho e modo de acesso corretos e, em seguida, vincula e monta esse PV. -
Scale-in
Ao realizar o scale-in de um StatefulSet, o controlador exclui apenas o pod em si. A PVC associada e o PV subjacente são mantidos para proteger os dados.
-
Redimensionamento e recuperação de falhas
Quando você faz scale-out novamente (aumenta o número de réplicas) ou durante a recuperação de falhas (um pod é excluído e recriado), o controlador localiza e reutiliza automaticamente a PVC retida anteriormente que possui o mesmo nome.
Se a PVC existir, o novo pod com o mesmo nome montará automaticamente o PV existente, permitindo a rápida recuperação de seu estado e dados.
Caso a PVC não exista, por exemplo, se a operação de scale-out ultrapassar o pico histórico de réplicas, uma nova PVC e um PV correspondente serão criados.
Etapa 1: Implantar um StatefulSet com armazenamento persistente
Este exemplo implanta um Service e um StatefulSet com duas réplicas. O StatefulSet usa volumeClaimTemplates para criar automaticamente um disco de nuvem de 20 GiB para cada réplica.
-
Crie um arquivo chamado
statefulset.yaml.A tabela a seguir descreve os parâmetros em
volumeClaimTemplates:Parâmetro
Descrição
accessModesModo de acesso do volume.
ReadWriteOnceindica que o volume pode ser montado como leitura e escrita por um único nó por vez.storageClassNameNome da StorageClass a ser utilizada.
alicloud-disk-essdé uma StorageClass padrão fornecida pelo Container Service for Kubernetes (ACK) para criar SSDs empresariais (ESSDs) com nível de desempenho (PL) padrão PL1.NotaEsses discos utilizam o faturamento pagamento conforme o uso. Para mais informações, consulte Faturamento de block storage e Preços de block storage.
storageCapacidade do volume de disco.
-
Implante o StatefulSet.
kubectl create -f statefulset.yaml -
Verifique se os pods estão em execução.
kubectl get pod -l app=nginx -
Visualize as PVCs para confirmar que o sistema criou e vinculou automaticamente uma PVC correspondente para cada pod.
kubectl get pvcSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 3m31s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 48s
Etapa 2: Validar o ciclo de vida do armazenamento
Observe a criação, retenção e reutilização das PVCs associadas ao fazer scale-out, scale-in e, em seguida, scale-out novamente.
Fazer scale-out da aplicação
-
Aumente o número de réplicas do StatefulSet para 3.
kubectl scale sts web --replicas=3 -
Verifique se os pods estão em execução.
kubectl get pod -l app=nginx -
Visualize as PVCs para confirmar que o sistema criou automaticamente o pod
web-2e sua PVC correspondentedisk-essd-web-2.kubectl get pvcSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m1s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 78s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 16s
Fazer scale-in da aplicação
-
Diminua o número de réplicas do StatefulSet para 2.
kubectl scale sts web --replicas=2 -
Verifique se os pods estão em execução.
kubectl get pod -l app=nginx -
Visualize as PVCs.
kubectl get pvcSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m21s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 98s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 36sNotaNeste ponto, o pod
web-2foi excluído, mas a PVCdisk-essd-web-2ainda existe para garantir a persistência dos dados.
Fazer scale-out da aplicação novamente
-
Aumente o número de réplicas do StatefulSet de volta para 3.
kubectl scale sts web --replicas=3 -
Verifique se os pods estão em execução.
kubectl get pod -l app=nginx -
Visualize as PVCs.
kubectl get pvcSaída esperada:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m50s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 2m7s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 65sO pod recém-criado
web-2foi automaticamente vinculado e está utilizando a PVCdisk-essd-web-2retida anteriormente.
Etapa 3: Validar a persistência de dados após falha de pod
Verifique se os dados armazenados no disco persistem após a recriação de um pod escrevendo dados, excluindo o pod e, em seguida, verificando a existência dos dados.
-
Escreva dados de teste no pod.
Usando o pod
web-1como exemplo, crie um arquivotestno caminho de montagem do disco/data.kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /dataSaída esperada:
lost+found test -
Simule uma falha de pod excluindo-o.
kubectl delete pod web-1Execute
kubectl get pod -l app=nginxnovamente e você verá que um novo pod chamadoweb-1é criado automaticamente. -
Verifique os dados no novo pod.
Verifique o diretório
/datano novo podweb-1.kubectl exec web-1 -- ls /dataO arquivo
testque você criou ainda existe. Isso confirma que os dados persistem mesmo se o pod for excluído e recriado.lost+found test
Considerações para produção
Gerenciamento de custos e recursos: Ao fazer scale-in ou excluir um StatefulSet, as PVCs e discos associados são retidos por padrão. Esses recursos retidos continuam a gerar taxas. Certifique-se de limpar manualmente quaisquer PVCs e PVs não utilizados para evitar cobranças desnecessárias.
Segurança de dados e backup: O armazenamento persistente garante alta disponibilidade durante falhas de pod, mas não é uma solução de backup de dados. Para dados críticos, utilize o Cloud Backup para realizar backups regulares.
Alta disponibilidade e recuperação de desastres: Discos são recursos zonais e não podem ser montados entre zonas. Para recuperação de desastres entre zonas, utilize um tipo de disco que suporte replicação de dados entre zonas, como Regional ESSDs.