Questa pagina descrive come risolvere i problemi relativi ad AlloyDB Omni per Kubernetes quando si verificano le seguenti situazioni:
- Hai un cluster di database in crashloop in Kubernetes e conosci il nome e lo spazio dei nomi del database, la sua istanza interna e il pod.
- Devi accedere a un file nel pod del database, ma il ciclo di crash impedisce l'accesso.
Un pod di database in crashloop è un pod che viene avviato, si arresta in modo anomalo e viene riavviato automaticamente da Kubernetes. Questo ciclo continua all'infinito finché il problema sottostante non viene risolto. Durante questa procedura, il database diventa non disponibile e instabile.
Prima di iniziare
Prima di seguire le indicazioni per la risoluzione dei problemi in questo documento, prova queste soluzioni:
- Se è disponibile l'alta affidabilità (HA), attiva un failover. Con l'alta disponibilità, un'istanza in standby sincrona è pronta a sostituire l'istanza principale.
- Esegui il ripristino da un backup, se disponibile. Questo approccio è automatizzato e meno soggetto a errori.
Impossibile accedere ai file in un pod di database in crashloop
Descrizione: un pod di database nel cluster Kubernetes entra in uno stato CrashLoopBackOff. Questo stato impedisce di utilizzare kubectl exec per accedere al file system del container del database per il debug.
Correzione consigliata: per risolvere il problema, interrompi temporaneamente il ciclo di crash applicando una patch a StatefulSet del pod per sostituire il comando del container. Prima di procedere, valuta alternative più semplici, come l'attivazione di un failover o il ripristino da un backup, se disponibile.
Per accedere al pod:
Metti in pausa tutte le risorse AlloyDB Omni rivolte agli utenti correlate per evitare che interferiscano con la procedura di ripristino.
Elenca tutte le definizioni di risorse personalizzate di AlloyDB Omni Kubernetes:
kubectl get crd | grep alloydbomni.dbadminEsamina l'elenco delle risorse per il cluster di database. Tieni un elenco delle risorse che metti in pausa in modo da poterle riattivare in un secondo momento. Come minimo, devi mettere in pausa la risorsa
dbclusters.alloydbomni.dbadmin.goog.Metti in pausa ogni risorsa separatamente aggiungendo l'annotazione
ctrlfwk.internal.gdc.goog/pause.kubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=trueSostituisci quanto segue:
RESOURCE_TYPE: il tipo di risorsa da mettere in pausa, ad esempiodbclusters.alloydbomni.dbadmin.goog.NAMESPACE: lo spazio dei nomi del cluster di database.RESOURCE_NAME: il nome della risorsa da mettere in pausa.
Metti in pausa l'istanza interna che gestisce il pod in crashloop.
Trova il nome dell'istanza interna.
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACESostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.
Metti in pausa l'istanza. L'annotazione
ctrlfwk.internal.gdc.goog/pause=trueindica al controller AlloyDB Omni di mettere in pausa la gestione della risorsa. In questo modo, il controller non può riconciliare o modificare automaticamente la risorsa mentre esegui manualmente i passaggi di risoluzione dei problemi, ad esempio l'applicazione di patch aStatefulSetsottostante.kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=trueSostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.INSTANCE_NAME: il nome dell'istanza che hai trovato.
Impedisci al pod di entrare in crashloop.
Applica una patch a
StatefulSetdel pod per sostituire il comando del container principale. Questa modifica impedisce l'avvio e l'arresto anomalo dell'applicazione, consentendoti di accedere al pod.Conferma il nome del pod in crashloop.
kubectl get pod -n NAMESPACESostituisci
NAMESPACE, che è il nome dello spazio dei nomi che ti interessa.Trova il nome di
StatefulSetproprietario del pod.kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'Sostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.POD_NAME: il nome del pod in crashloop.
Applica una patch a
StatefulSetper sostituire il comando del container del database consleep 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 } ] } } } } 'Sostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.STATEFULSET_NAME: il nome diStatefulSet.
Elimina il pod per applicare la patch.
kubectl delete pod -n NAMESPACE POD_NAMESostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.POD_NAME: il nome del pod in crashloop.
Accedi al database nel pod.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bashSostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.POD_NAME: il nome del pod in crashloop.
Dopo l'avvio del nuovo pod, viene eseguito il comando
sleepanziché l'applicazione del database. Ora puoi accedere alla shell del pod.Riattiva tutti i componenti.
Dopo aver eseguito l'indagine, ripristina lo stato originale rimuovendo le annotazioni
pause. Riattiva le risorse nell'ordine inverso rispetto a quello in cui le hai messe in pausa. Ad esempio, riattiva l'istanza prima di riattivare il cluster di database. Questa azione riconcilia le risorse e riavvia il pod del database con il comando originale.Per ogni risorsa che hai messo in pausa, rimuovi l'annotazione aggiungendo un trattino al nome dell'annotazione. L'esempio seguente rimuove l'annotazione da un'istanza:
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-Sostituisci quanto segue:
NAMESPACE: il nome dello spazio dei nomi che ti interessa.INSTANCE_NAME: il nome dell'istanza che hai trovato nel passaggio precedente.
Ripeti questa procedura per tutte le altre risorse che hai messo in pausa nel primo passaggio.