בדף הזה מוסבר איך לפתור בעיות ב-AlloyDB Omni ל-Kubernetes במצבים הבאים:
- יש לכם אשכול של מסד נתונים ב-Kubernetes שנמצא בלולאת קריסה, ואתם יודעים את השם ואת מרחב השמות של מסד הנתונים, המכונה הפנימית שלו וה-Pod.
- אתם צריכים לגשת לקובץ ב-pod של מסד הנתונים, אבל לולאת הקריסה מונעת את הגישה.
פוד מסד נתונים בלולאת קריסה הוא פוד שמתחיל, קורס ואז מופעל מחדש באופן אוטומטי על ידי Kubernetes. המחזור הזה נמשך ללא הפסקה עד שהבעיה הבסיסית נפתרת. במהלך התהליך הזה, מסד הנתונים לא יהיה זמין ולא יציב.
לפני שמתחילים
לפני שאתם פועלים לפי ההנחיות לפתרון בעיות שמפורטות במסמך הזה, נסו את הפתרונות הבאים:
- אם יש זמינות גבוהה (HA), מפעילים יתירות כשל. בזמינות גבוהה, מכונה סינכרונית במצב המתנה מוכנה להחליף את המכונה הראשית.
- לשחזר מגיבוי, אם יש כזה. הגישה הזו היא אוטומטית ופחות מועדת לשגיאות.
אי אפשר לגשת לקבצים ב-Pod של מסד נתונים שנמצא בלולאת קריסה
תיאור: pod של מסד נתונים באשכול Kubernetes נכנס למצב CrashLoopBackOff. במצב הזה אי אפשר להשתמש ב-kubectl exec כדי לגשת למערכת הקבצים של מאגר מסד הנתונים לצורך ניפוי באגים.
התיקון המומלץ: כדי לפתור את הבעיה, צריך לעצור באופן זמני את הלולאה של קריסת המערכת על ידי תיקון של StatefulSet ב-Pod כדי לבטל את הפקודה של הקונטיינר. לפני שתמשיכו, כדאי לשקול חלופות פשוטות יותר, כמו הפעלת יתירות כשל או שחזור מגיבוי, אם יש כאלה.
כדי לגשת ל-pod, פועלים לפי השלבים הבאים:
משהים את כל המשאבים של AlloyDB Omni שגלויים למשתמשים כדי שהם לא יפריעו לתהליך השחזור.
כדי להציג רשימה של כל ההגדרות של משאבים מותאמים אישית ב-Kubernetes של AlloyDB Omni:
kubectl get crd | grep alloydbomni.dbadminבודקים את רשימת המשאבים של אשכול מסד הנתונים. כדאי לשמור רשימה של המשאבים שהשהיתם כדי שתוכלו לבטל את ההשהיה שלהם בהמשך. לפחות צריך להשהות את המשאב
dbclusters.alloydbomni.dbadmin.goog.משהים כל משאב בנפרד על ידי הוספת ההערה
ctrlfwk.internal.gdc.goog/pause.kubectl annotate RESOURCE_TYPE -n NAMESPACE RESOURCE_NAME ctrlfwk.internal.gdc.goog/pause=trueמחליפים את מה שכתוב בשדות הבאים:
-
RESOURCE_TYPE: סוג המשאב שרוצים להשהות, לדוגמהdbclusters.alloydbomni.dbadmin.goog. -
NAMESPACE: מרחב השמות של אשכול מסד הנתונים. -
RESOURCE_NAME: השם של המשאב שרוצים להשהות.
-
משהים את המכונה הפנימית שמנהלת את הפוד שנתקע בלולאת קריסה.
מאתרים את השם של המכונה הפנימית.
kubectl get instances.alloydbomni.internal.dbadmin.goog -n NAMESPACEמחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: השם של מרחב השמות שאתם רוצים.
-
משהים את המופע. ההערה
ctrlfwk.internal.gdc.goog/pause=trueאומרת לבקר AlloyDB Omni להשהות את הניהול של המשאב. כך הבקר לא יבצע באופן אוטומטי התאמה או שינוי של המשאב בזמן שאתם מבצעים באופן ידני שלבי פתרון בעיות, כמו תיקון שלStatefulSetהבסיסי.kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause=trueמחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
INSTANCE_NAME: השם של המכונה שמצאתם.
-
מונעים את הלולאה האינסופית של הפוד.
מתקנים את ה-
StatefulSetשל ה-pod כדי לשנות את הפקודה של הקונטיינר הראשי. השינוי הזה מונע מהאפליקציה להתחיל ולקרוס, ומאפשר לכם לגשת ל-Pod.מאשרים את השם של הפוד שנתקע בלולאה.
kubectl get pod -n NAMESPACEמחליפים את
NAMESPACEבשם של מרחב השמות שרוצים.מאתרים את השם של
StatefulSetשבבעלותו הפוד.kubectl get pod -n NAMESPACE POD_NAME -ojsonpath='{.metadata.ownerReferences[0].name}'מחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
POD_NAME: השם של הפוד שחוזר על עצמו ללא הפסקה.
-
מתקנים את
StatefulSetכדי להחליף את הפקודה של מאגר מסד הנתונים ב-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 } ] } } } } 'מחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
STATEFULSET_NAME: השם שלStatefulSet.
-
מוחקים את ה-pod כדי להחיל את התיקון.
kubectl delete pod -n NAMESPACE POD_NAMEמחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
POD_NAME: השם של הפוד שחוזר על עצמו ללא הפסקה.
-
גישה למסד הנתונים ב-Pod.
kubectl exec -ti -n NAMESPACE POD_NAME -c database -- bashמחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
POD_NAME: השם של הפוד שחוזר על עצמו ללא הפסקה.
אחרי שה-pod החדש מתחיל, הוא מריץ את הפקודה
sleepבמקום את אפליקציית מסד הנתונים. עכשיו אפשר לגשת למעטפת של ה-pod.-
מבטלים את ההשהיה של כל הרכיבים.
אחרי הבדיקה, מחזירים את המצב המקורי על ידי הסרת ההערות
pause. מבטלים את ההשהיה של המשאבים בסדר הפוך לסדר שבו השהיתם אותם. לדוגמה, מבטלים את ההשהיה של המופע לפני שמבטלים את ההשהיה של DBCluster. הפעולה הזו מתאימה בין המשאבים ומפעילה מחדש את ה-pod של מסד הנתונים באמצעות הפקודה המקורית שלו.לכל משאב שהשהיתם, מסירים את ההערה על ידי הוספת מקף לשם ההערה. בדוגמה הבאה מסירים את ההערה ממכונה:
kubectl annotate instances.alloydbomni.internal.dbadmin.goog -n NAMESPACE INSTANCE_NAME ctrlfwk.internal.gdc.goog/pause-מחליפים את מה שכתוב בשדות הבאים:
-
NAMESPACE: שם מרחב השמות שאתם רוצים. -
INSTANCE_NAME: השם של המכונה שמצאתם בשלב הקודם.
-
חוזרים על התהליך הזה לגבי כל שאר המשאבים שהשהיתם בשלב הראשון.