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:
Pause todos os recursos do AlloyDB Omni voltados ao usuário relacionados para evitar que eles interfiram no processo de recuperação.
Liste todas as definições de recursos personalizados do AlloyDB Omni Kubernetes:
kubectl get crd | grep alloydbomni.dbadminAnalise 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.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=trueSubstitua:
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.
Pause a instância interna que gerencia o pod em loop de falha.
Encontre o nome da instância interna.
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACESubstitua:
NAMESPACE: o nome do namespace de seu interesse.
Pause a instância. A anotação
ctrlfwk.internal.gdc.goog/pause=trueinforma 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 aoStatefulSetsubjacente.kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=trueSubstitua:
NAMESPACE: o nome do namespace de seu interesse.INSTANCE_NAME: o nome da instância encontrada.
Impeça que o pod entre em loop de falha.
Aplique um patch ao
StatefulSetdo 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.Confirme o nome do pod em loop de falha.
kubectl get pod -n NAMESPACESubstitua
NAMESPACE, que é o nome do namespace de seu interesse.Encontre o nome do
StatefulSetque 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.
Aplique um patch ao
StatefulSetpara substituir o comando do contêiner de banco de dados porsleep 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 doStatefulSet.
Exclua o pod para aplicar o patch.
kubectl delete pod -n NAMESPACE POD_NAMESubstitua:
NAMESPACE: o nome do namespace de seu interesse.POD_NAME: o nome do pod em loop de falha.
Acesse o banco de dados no pod.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bashSubstitua:
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
sleepem vez do aplicativo de banco de dados. Agora você pode acessar o shell do pod.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.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.
Repita esse processo para todos os outros recursos pausados na primeira etapa.