Escalonar uma implantação do Kubernetes

Os ambientes do Kubernetes permitem escalonar os recursos do banco de dados de forma dinâmica à medida que as demandas de carga de trabalho mudam. Use esses procedimentos de escalonamento se você implantou o Spanner Omni usando o gráfico do Helm.

Antes de começar

Antes de escalonar a implantação do Kubernetes, faça o seguinte:

Como prática recomendada, escalone verticalmente até pelo menos 32 GB de memória por servidor antes de adicionar mais servidores para escalonar horizontalmente.

Limitações

O escalonamento no Kubernetes tem as seguintes limitações:

  • Somente servidores não raiz: o escalonamento horizontal é compatível com instâncias não raiz. O escalonamento de servidores raiz não é compatível.

  • Restrições de armazenamento do StatefulSet: como os volumeClaimTemplates do Kubernetes são imutáveis, não é possível expandir os discos de pods usando um único helm upgrade comando. Em vez disso, o escalonamento do armazenamento exige etapas manuais de expansão de volume.

Escalonar verticalmente

Para ajustar os recursos de CPU ou memória dos servidores, atualize a configuração usando um upgrade do Helm:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set resources.cpu=CPU_CORES \
  --set resources.memory=MEMORY_LIMIT \
  -n NAMESPACE

Substitua:

  • HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: a versão do gráfico do Helm, por exemplo, 0.2.0.
  • CPU_CORES: o número de núcleos de vCPU a serem atribuídos a cada pod de servidor, por exemplo, 8.
  • MEMORY_LIMIT: o limite de RAM para cada pod de servidor, por exemplo, 32Gi.
  • NAMESPACE: o namespace do Kubernetes da implantação, por exemplo, spanner-ns.

Escalonar horizontalmente

Para escalonar horizontalmente, adicione mais servidores à implantação. O escalonamento horizontal é compatível com servidores não raiz.

Adicionar servidores não raiz

Para adicionar servidores não raiz, aumente a contagem de réplicas na configuração do gráfico do Helm. É possível escalonar todas as zonas de maneira uniforme ou escalonar uma zona específica.

Escalonar de maneira uniforme

Para escalonar cada zona na implantação para 15 servidores, execute o seguinte comando:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set deployment.replicasPerZone=REPLICAS \
  -n NAMESPACE

Substitua:

  • HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
  • VERSION: a versão do gráfico do Helm, por exemplo, 0.2.0.
  • REPLICAS: o número de réplicas de servidor por zona, por exemplo, 15.
  • NAMESPACE: o namespace do Kubernetes, por exemplo, spanner-ns.

Escalonar uma zona específica

Se a implantação inicial configurou contagens de servidores diferentes para zonas individuais, é possível segmentar uma única zona. Por exemplo, para aumentar as réplicas da primeira zona no primeiro local para 15, execute o seguinte comando:

helm upgrade spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --reuse-values \
  --set locations[0].zones[0].replicas=REPLICAS \
  -n NAMESPACE

Substitua REPLICAS pela contagem de réplicas da zona de destino, por exemplo, 15.

Para verificar se os novos servidores foram adicionados à implantação, consulte a CLI do Spanner Omni para listar os servidores de implantação ou visualizar seu painel do Grafana.

spanner deployment servers list \
  --zone=ZONE \
  --deployment-endpoint=ENDPOINT

Substitua:

  • ZONE: a zona que você quer listar, por exemplo, us-central1-a.
  • ENDPOINT: o endpoint externo da sua implantação, por exemplo, ${ENDPOINT}:15000.

Remover servidores não raiz

O escalonamento de servidores exige etapas adicionais porque o sistema precisa realocar com segurança as partições de dados de servidores desativados. Como os StatefulSets do Kubernetes removem pods do índice mais alto para o mais baixo, é necessário segmentar primeiro os servidores não raiz de índice mais alto para remoção.

Para reduzir escala vertical o número de servidores, siga estas etapas:

  1. Liste os servidores na sua zona para identificar candidatos à remoção:

    spanner deployment servers list \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    Exemplo de saída:

    NAME                                                          HOST                        PORT_BASE  ROOT  STATE
    zones/us-central1-a/servers/spanner-a-0.pod.spanner-ns:15000  spanner-a-0.pod.spanner-ns  15000      true  -
    zones/us-central1-a/servers/spanner-a-1.pod.spanner-ns:15000  spanner-a-1.pod.spanner-ns  15000      -     -
    

    Exclua o servidor não raiz desativado com o índice mais alto (por exemplo, spanner-a-1.pod.spanner-ns:15000):

    spanner deployment servers delete SERVER_NAME \
      --zone=ZONE \
      --deployment-endpoint=ENDPOINT
    

    Substitua SERVER_NAME pelo identificador do servidor, por exemplo, spanner-a-1.pod.spanner-ns:15000.

    Verifique a lista de servidores até que o servidor de destino seja removido da listagem. Após a exclusão, o servidor faz a transição para um estado não íntegro no sistema e é removido do caminho de serviço ativo.

  2. Reduza a implantação do Helm executando um comando de upgrade do Helm para corresponder à contagem de réplicas de destino. Por exemplo, para diminuir as réplicas por zona para 1 pod, execute o seguinte comando:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set deployment.replicasPerZone=REPLICAS \
      -n NAMESPACE
    

    Substitua REPLICAS pela contagem de réplicas atualizada, por exemplo, 1.

  3. Exclua as declarações de volume permanente (PVCs, na sigla em inglês) do Kubernetes associadas aos pods removidos. Para evitar a perda acidental de dados, o Helm e o Kubernetes não excluem automaticamente as PVCs ao reduzir um StatefulSet. Exclua manualmente as PVCs para recuperar completamente o armazenamento:

    kubectl delete pvc LOGS_PVC DATA_PVC -n NAMESPACE
    

    Por exemplo, para excluir os registros e volumes de dados de spanner-a-1 no namespace spanner-ns:

    kubectl delete pvc logs-volume-spanner-a-1 data-volume-spanner-a-1 -n spanner-ns
    

Adicionar uma zona

A adição de uma nova zona à implantação aumenta a disponibilidade e protege o banco de dados contra interrupções de zona única.

Por exemplo, o comando a seguir inicializa uma implantação em execução de zona única no Google Kubernetes Engine (GKE) na zona us-east1-b da região us:

helm upgrade --install spanner-omni HELM_CHART_PATH \
  --version VERSION \
  --set resources.cpu=2 \
  --set resources.memory=8Gi \
  --set global.platform=gke \
  --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
  -n NAMESPACE

Adicione a zona us-east1-c a essa configuração seguindo estas etapas:

  1. Inicie os pods na nova zona executando o comando helm upgrade e transmitindo um bloco JSON atualizado que inclua a nova zona de local:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"},{"name":"us-east1-c","shortName":"east-c"}]}]' \
      -n NAMESPACE
    
  2. Adicione a nova zona usando a CLI do Spanner Omni. Aguarde até que os pods do servidor raiz na zona recém-criada entrem no estado Running e pronto. Em seguida, execute o comando de criação de zona:

    spanner deployment zones create NEW_ZONE \
      --location=LOCATION \
      --root-servers=ROOT_SERVERS_LIST \
      --deployment-endpoint=ENDPOINT
    

    Substitua:

    • NEW_ZONE: o identificador da zona a ser adicionada, por exemplo, us-east1-c.
    • LOCATION: o local da implantação, por exemplo, us.
    • ROOT_SERVERS_LIST: uma lista separada por vírgulas de endpoints de servidor raiz na nova zona, por exemplo, spanner-east-c-0.pod.spanner-ns:15000,spanner-east-c-1.pod.spanner-ns:15000,spanner-east-c-2.pod.spanner-ns:15000.
    • ENDPOINT: o endpoint de implantação externo, por exemplo, ${ENDPOINT}:15000.
  3. Aguarde a conclusão da criação da zona. A replicação de esquemas e tabelas de banco de dados atuais para uma nova zona leva tempo. Monitore o progresso da sincronização da zona listando as zonas de implantação:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    

Remover uma zona

É possível desativar uma zona ativa da implantação de várias zonas para reduzir os recursos ou se alinhar às mudanças de topologia.

Remova a zona us-east1-c criada na seção anterior seguindo estas etapas:

  1. Exclua a zona e inicie a desmontagem da zona no Spanner Omni:

    spanner deployment zones delete ZONE --deployment-endpoint=ENDPOINT
    

    Substitua ZONE pela zona a ser removida, por exemplo, us-east1-c.

  2. Verifique se a zona foi removida. Execute um comando de lista e aguarde até que a zona não apareça mais na saída:

    spanner deployment zones list --deployment-endpoint=ENDPOINT
    
  3. Remova os servidores do cluster do Kubernetes executando um comando de upgrade do Helm e transmitindo um bloco JSON de locais atualizado que exclua a zona removida:

    helm upgrade spanner-omni HELM_CHART_PATH \
      --version VERSION \
      --reuse-values \
      --set-json 'locations=[{"name":"us","zones":[{"name":"us-east1-b","shortName":"east-b"}]}]' \
      -n NAMESPACE
    

Escalonar o armazenamento

Como os volumeClaimTemplates do Kubernetes são imutáveis, não é possível escalonar verticalmente as capacidades de armazenamento de pods usando o comando helm upgrade diretamente. Em vez disso, é necessário realizar uma expansão manual do volume. Para mais informações, consulte o guia de expansão de volume do StatefulSet do GKE.

Para expandir o armazenamento em disco, siga estas etapas:

  1. Defina os parâmetros para a expansão do volume como variáveis de ambiente no terminal:

    NEW_SIZE="NEW_SIZE"
    NAMESPACE="NAMESPACE"
    RELEASE_NAME="spanner-omni"
    STATEFULSET_NAMES="STATEFULSET_NAME_1 STATEFULSET_NAME_2 STATEFULSET_NAME_3"
    HELM_CHART_PATH="HELM_CHART_PATH"
    VERSION="VERSION"
    

    Substitua:

    • NEW_SIZE: o tamanho da capacidade de armazenamento de destino, por exemplo, 200Gi.
    • NAMESPACE: o namespace do Kubernetes, por exemplo, spanner-ns.
    • STATEFULSET_NAME_1, STATEFULSET_NAME_2, ...: os nomes dos StatefulSets na implantação, normalmente correspondentes aos nomes abreviados das zonas (por exemplo, spanner-east-b spanner-east-c).
    • HELM_CHART_PATH: o caminho para o gráfico do Helm, por exemplo, oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni.
    • VERSION: a versão do gráfico do Helm, por exemplo, 0.2.0.
  2. Execute os comandos para corrigir as PVCs, excluir os StatefulSets (deixando os pods de back-end intactos) e fazer upgrade da implantação do Helm:

    # Patch all associated PVCs directly.
    for pvc in $(kubectl get pvc -n $NAMESPACE \
      -l app.kubernetes.io/instance=$RELEASE_NAME \
      -o name | grep "data-volume"); do
      kubectl patch $pvc -n $NAMESPACE -p "{\"spec\":{\"resources\":{\"requests\":{\"storage\":\"$NEW_SIZE\"}}}}"
    done
    
    # Delete the StatefulSet while leaving backend pods intact (orphan cascade).
    kubectl delete statefulset $STATEFULSET_NAMES -n $NAMESPACE --cascade=orphan
    
    # Run Helm upgrade to align the templates with the expanded size.
    helm upgrade $RELEASE_NAME $HELM_CHART_PATH \
      --version $VERSION \
      --reuse-values \
      --set storage.data.size=$NEW_SIZE \
      -n $NAMESPACE
    

Próximas etapas