Resolver problemas de um pod de banco de dados em crashlooping no AlloyDB Omni usando o orquestrador de contêineres

Selecione uma versão da documentação:

Esta página descreve como resolver problemas com o AlloyDB Omni para Kubernetes quando você encontrar as seguintes situações:

  • Você tem um cluster de banco de dados em loop de falha no Kubernetes e sabe o nome e o namespace do banco de dados, a instância interna e o pod.
  • Você precisa acessar um arquivo no pod do banco de dados, mas o loop de falha impede o acesso.

Um pod de banco de dados em loop de falha é um pod que inicia, falha e é reiniciado automaticamente pelo Kubernetes. Esse ciclo continua indefinidamente até que o problema subjacente seja resolvido. O banco de dados fica indisponível e instável durante esse processo.

Antes de começar

Antes de seguir as orientações de solução de problemas neste documento, tente estas soluções:

  • Se a alta disponibilidade (HA) estiver disponível, acione um failover. Com a HA, uma instância em espera síncrona está pronta para substituir a instância principal.
  • Recupere de um backup, se houver um disponível. Essa abordagem é automatizada e menos propensa a erros.

Não é possível acessar arquivos em um pod de banco de dados em loop de falha

Descrição:um pod de banco de dados no cluster do Kubernetes entra em um estado CrashLoopBackOff. Esse estado impede que você use kubectl exec para acessar o sistema de arquivos do contêiner de banco de dados para depuração.

Correção recomendada:para resolver esse problema, interrompa temporariamente o loop de falha aplicando um patch ao StatefulSet do pod para substituir o comando do contêiner. Antes de continuar, considere alternativas mais simples, como acionar um failover ou recuperar de um backup, se disponível.

Para acessar o pod, siga estas etapas:

  1. Pause todos os recursos do AlloyDB Omni voltados ao usuário relacionados para evitar que eles interfiram no processo de recuperação.

    1. Liste todas as definições de recursos personalizados do AlloyDB Omni Kubernetes:

      kubectl get crd | grep alloydbomni.dbadmin
      
    2. Analise a lista de recursos do cluster de banco de dados. Mantenha uma lista dos recursos que você pausar para poder reativá-los mais tarde. No mínimo, é necessário pausar o recurso dbclusters.alloydbomni.dbadmin.goog.

    3. Pause cada recurso separadamente adicionando a anotação ctrlfwk.internal.gdc.goog/pause.

      kubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=true
      

      Substitua:

      • RESOURCE_TYPE: o tipo de recurso a ser pausado, por exemplo, dbclusters.alloydbomni.dbadmin.goog.
      • NAMESPACE: o namespace do cluster de banco de dados.
      • RESOURCE_NAME: o nome do recurso a ser pausado.
  2. Pause a instância interna que gerencia o pod em loop de falha.

    1. Encontre o nome da instância interna.

      kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
    2. Pause a instância. A anotação ctrlfwk.internal.gdc.goog/pause=true informa ao controlador do AlloyDB Omni para pausar o gerenciamento do recurso. Isso impede que o controlador reconcilie ou altere automaticamente o recurso enquanto você realiza etapas de solução de problemas manualmente, como aplicar um patch ao StatefulSet subjacente.

      kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=true
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
      • INSTANCE_NAME: o nome da instância encontrada.
  3. Impeça que o pod entre em loop de falha.

    Aplique um patch ao StatefulSet do pod para substituir o comando do contêiner principal. Essa mudança impede que o aplicativo seja iniciado e falhe, o que permite acessar o pod.

    1. Confirme o nome do pod em loop de falha.

      kubectl get pod -n NAMESPACE
      

      Substitua NAMESPACE, que é o nome do namespace de seu interesse.

    2. Encontre o nome do StatefulSet que possui o pod.

      kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
      • POD_NAME: o nome do pod em loop de falha.
    3. Aplique um patch ao StatefulSet para substituir o comando do contêiner de banco de dados por sleep infinity:

      kubectl patch statefulset STATEFULSET_NAME -n NAMESPACE --type='strategic' -p '
      {
        "spec": {
          "template": {
            "spec": {
              "containers": [
                {
                  "name": "database",
                  "command": ["sleep"],
                  "args": ["infinity"],
                  "livenessProbe": null,
                  "startupProbe": null
                }
              ]
            }
          }
        }
      }
      '
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
      • STATEFULSET_NAME: o nome do StatefulSet.
    4. Exclua o pod para aplicar o patch.

      kubectl delete pod -n NAMESPACE POD_NAME
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
      • POD_NAME: o nome do pod em loop de falha.
  4. Acesse o banco de dados no pod.

    kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bash
    

    Substitua:

    • NAMESPACE: o nome do namespace de seu interesse.
    • POD_NAME: o nome do pod em loop de falha.

    Depois que o novo pod for iniciado, ele vai executar o comando sleep em vez do aplicativo de banco de dados. Agora você pode acessar o shell do pod.

  5. Reative todos os componentes.

    Depois de investigar, restaure o estado original removendo as anotações pause. Reative os recursos na ordem inversa da pausa. Por exemplo, reative a instância antes de reativar o DBCluster. Essa ação reconcilia os recursos e reinicia o pod de banco de dados com o comando original.

    1. Para cada recurso pausado, remova a anotação anexando um hífen ao nome dela. O exemplo a seguir remove a anotação de uma instância:

      kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-
      

      Substitua:

      • NAMESPACE: o nome do namespace de seu interesse.
      • INSTANCE_NAME: o nome da instância encontrada na etapa anterior.
    2. Repita esse processo para todos os outros recursos pausados na primeira etapa.