Cette page explique comment résoudre les problèmes liés à AlloyDB Omni pour Kubernetes lorsque vous rencontrez les situations suivantes :
- Vous disposez d'un cluster de base de données en boucle de plantage dans Kubernetes, et vous connaissez le nom et l'espace de noms de la base de données, son instance interne et le pod.
- Vous devez accéder à un fichier sur le pod de base de données, mais la boucle de plantage vous en empêche.
Un pod de base de données en boucle de plantage est un pod qui démarre, plante et est ensuite redémarré automatiquement par Kubernetes. Ce cycle se poursuit indéfiniment jusqu'à ce que le problème sous-jacent soit résolu. La base de données devient indisponible et instable pendant ce processus.
Avant de commencer
Avant de suivre les conseils de dépannage de ce document, essayez les solutions suivantes :
- Si la haute disponibilité est disponible, déclenchez un basculement. Avec la haute disponibilité, une instance de secours synchrone est prête à remplacer l'instance principale.
- Récupérez-le à partir d'une sauvegarde, si disponible. Cette approche est automatisée et moins sujette aux erreurs.
Impossible d'accéder aux fichiers sur un pod de base de données en boucle de plantage
Description : un pod de base de données de votre cluster Kubernetes passe à l'état CrashLoopBackOff. Cet état vous empêche d'utiliser kubectl exec pour accéder au système de fichiers du conteneur de base de données à des fins de débogage.
Solution recommandée : pour résoudre ce problème, arrêtez temporairement la boucle de plantage en corrigeant le StatefulSet du pod afin de remplacer la commande du conteneur. Avant de continuer, envisagez des alternatives plus simples, comme le déclenchement d'un basculement ou la récupération à partir d'une sauvegarde, si elles sont disponibles.
Pour accéder au pod, procédez comme suit :
Mettez en veille toutes les ressources AlloyDB Omni associées et destinées aux utilisateurs pour éviter qu'elles n'interfèrent avec le processus de récupération.
Affichez la liste de toutes les définitions de ressources personnalisées Kubernetes AlloyDB Omni :
kubectl get crd | grep alloydbomni.dbadminExaminez la liste des ressources de votre cluster de bases de données. Conservez une liste des ressources que vous mettez en veille afin de pouvoir les réactiver ultérieurement. Vous devez au moins suspendre la ressource
dbclusters.alloydbomni.dbadmin.goog.Mettez en veille chaque ressource séparément en ajoutant l'annotation
ctrlfwk.internal.gdc.goog/pause.kubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=trueRemplacez les éléments suivants :
RESOURCE_TYPE: type de ressource à suspendre (par exemple,dbclusters.alloydbomni.dbadmin.goog).NAMESPACE: espace de noms du cluster de bases de données.RESOURCE_NAME: nom de la ressource à suspendre.
Mettez en pause l'instance interne qui gère le pod en boucle de plantage.
Recherchez le nom de l'instance interne.
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACERemplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.
Mettez l'instance en veille. L'annotation
ctrlfwk.internal.gdc.goog/pause=trueindique au contrôleur AlloyDB Omni de suspendre la gestion de la ressource. Cela empêche le contrôleur de réconcilier ou de modifier automatiquement la ressource pendant que vous effectuez manuellement des étapes de dépannage, comme corriger leStatefulSetsous-jacent.kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=trueRemplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.INSTANCE_NAME: nom de l'instance que vous avez trouvée.
Empêchez le pod de boucler sur les plantages.
Corrigez le
StatefulSetdu pod pour remplacer la commande du conteneur principal. Cette modification empêche l'application de démarrer et de planter, ce qui vous permet d'accéder au pod.Confirmez le nom du pod en boucle de plantage.
kubectl get pod -n NAMESPACERemplacez
NAMESPACEpar le nom de l'espace de noms qui vous intéresse.Recherchez le nom de l'
StatefulSetpropriétaire du pod.kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'Remplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.POD_NAME: nom du pod en boucle de plantage.
Corrigez le
StatefulSetpour remplacer la commande du conteneur de base de données parsleep 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 } ] } } } } 'Remplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.STATEFULSET_NAME: nom duStatefulSet.
Supprimez le pod pour appliquer le correctif.
kubectl delete pod -n NAMESPACE POD_NAMERemplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.POD_NAME: nom du pod en boucle de plantage.
Accédez à la base de données dans le pod.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bashRemplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.POD_NAME: nom du pod en boucle de plantage.
Une fois le nouveau pod démarré, il exécute la commande
sleepau lieu de l'application de base de données. Vous pouvez désormais accéder au shell du pod.Réactivez tous les composants.
Après avoir effectué votre enquête, restaurez l'état d'origine en supprimant les annotations
pause. Vous devez réactiver les ressources dans l'ordre inverse de leur suspension. Par exemple, réactivez l'instance avant de réactiver le DBCluster. Cette action réconcilie les ressources et redémarre le pod de base de données avec sa commande d'origine.Pour chaque ressource que vous avez suspendue, supprimez l'annotation en ajoutant un tiret au nom de l'annotation. L'exemple suivant supprime l'annotation d'une instance :
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-Remplacez les éléments suivants :
NAMESPACE: nom de l'espace de noms qui vous intéresse.INSTANCE_NAME: nom de l'instance que vous avez trouvée à l'étape précédente.
Répétez cette procédure pour toutes les autres ressources que vous avez mises en veille lors de la première étape.