Implante um cluster MySQL com estado e alta disponibilidade no ACK Serverless
O ACK Serverless permite usar a semântica nativa de agendamento do Kubernetes para distribuir pods por várias zonas de disponibilidade sem gerenciar nós. Este guia orienta a implantação de um StatefulSet MySQL com três réplicas no ACK Serverless, de modo que cada réplica seja executada em uma zona diferente, oferecendo tolerância a falhas no nível de zona para cargas de trabalho com estado.
Os limites de recursos e a configuração do MySQL neste guia são dimensionados para fins de demonstração. Revise e ajuste a CPU, a memória e as flags do MySQL antes de implantar em produção.
Ao final deste guia, você terá:
Um namespace
mysqlcom um Secret e uma StorageClassUm StatefulSet MySQL (
dbc1) com três réplicas distribuídas por três zonasVerificado que cada pod está agendado em um nó virtual diferente, em zonas distintas
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster ACK Serverless com vários nós virtuais. Para mais informações, consulte Criar um cluster ACK Serverless.
Políticas de agendamento de nós virtuais ativadas no cluster. Para mais informações, consulte Ativar políticas de agendamento de nós virtuais para um cluster.
O componente csi-provisioner instalado na versão v1.22.9 ou posterior.
Como funciona
O StatefulSet usa duas restrições de agendamento complementares para alcançar alta disponibilidade no nível de zona:
Restrições de distribuição de topologia (
topologySpreadConstraints): distribuem os pods uniformemente entre as zonas. CommaxSkew: 1etopologyKey: topology.kubernetes.io/zone, o agendador garante que nenhuma zona hospede mais de uma réplica extra em comparação a qualquer outra zona.Anti-afinidade de pod (
podAntiAffinity): impõe separação no nível de nó. Mesmo dentro da mesma zona, cada pod deve ser executado em um nó virtual diferente. Isso evita que duas réplicas compartilhem um único nó.
Ambas as restrições são necessárias porque a distribuição de topologia sozinha controla a alocação por zona, mas não impede que dois pods sejam colocados no mesmo nó dentro de uma zona. A anti-afinidade de pod preenche essa lacuna ao impor uma separação estrita no nível de nó.
A StorageClass fast-storageclass provisiona o armazenamento usando a vinculação WaitForFirstConsumer. Cada PersistentVolumeClaim (PVC) só é criado quando um pod é agendado, o que garante que o disco em nuvem seja provisionado na mesma zona do pod — um requisito para armazenamento com reconhecimento de zona.
reclaimPolicy: Retain
significa que os PVCs não são excluídos automaticamente quando você reduz a escala do StatefulSet. Para liberar o armazenamento, exclua os PVCs manualmente após a redução da escala.
Etapa 1: Clonar o repositório de exemplo
-
Clone o repositório.
git clone https://github.com/AliyunContainerService/serverless-k8s-examples.git -
Acesse o diretório de trabalho e liste os arquivos YAML.
cd serverless-k8s-examples/stateful-mysql ls -alSaída esperada:
README.md secret.yaml stateful-mysql.yaml storageclass.yamlOs três arquivos YAML a serem aplicados:
Arquivo
Cria
secret.yamlSecret para senhas do MySQL
storageclass.yamlStorageClass para provisionamento de discos em nuvem por zona
stateful-mysql.yamlStatefulSet MySQL com agendamento distribuído por zonas
Etapa 2: Criar o namespace, Secret e StorageClass
-
Crie o namespace
mysql.kubectl create namespace mysqlSaída esperada:
namespace/mysql created -
Crie o Secret que armazena as senhas do MySQL.
kubectl apply -n mysql -f secret.yamlSaída esperada:
secret/mysql-secret createdVisualize abaixo o arquivo YAML do Secret.
-
Crie a StorageClass.
kubectl apply -f storageclass.yamlSaída esperada:
storageclass.storage.k8s.io/fast-storageclass createdVisualize abaixo o arquivo YAML da StorageClass.
Etapa 3: Implantar o StatefulSet MySQL
-
Aplique o manifesto do StatefulSet. Esse comando cria três réplicas MySQL distribuídas entre zonas usando restrições de distribuição de topologia e anti-afinidade de pod.
kubectl apply -n mysql -f stateful-mysql.yamlSaída esperada:
statefulset.apps/dbc1 createdVisualize abaixo o arquivo YAML do StatefulSet.
Etapa 4: Verificar a distribuição por zonas
-
Confirme se o StatefulSet está pronto.
kubectl get statefulset -n mysqlSaída esperada:
NAME READY AGE dbc1 3/3 7m21s -
Verifique a alocação dos pods entre as zonas.
kubectl -n mysql get po -o wideSaída esperada:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dbc1-0 1/1 Running 0 2m28s 10.1.214.213 virtual-kubelet-cn-hangzhou-j <none> <none> dbc1-1 1/1 Running 0 106s 10.3.146.113 virtual-kubelet-cn-hangzhou-h <none> <none> dbc1-2 1/1 Running 0 64s 10.4.232.78 virtual-kubelet-cn-hangzhou-g <none> <none>A coluna
NODEcontém o identificador da zona. No exemplo acima, os três pods estão agendados emcn-hangzhou-j,cn-hangzhou-hecn-hangzhou-g, confirmando que o cluster está distribuído por três zonas separadas.