הסרת צמתים שנחסמו על ידי PodDisruptionBudgets

פתרון של התנגשויות ב-PodDisruptionBudget‏ (PDB) מאפשר להשלים הסרות של צמתים מאשכולות של Google Distributed Cloud כשהמחיקות חסומות. כשה-PDB מונע פינוי של Pods, אי אפשר לרוקן את הצומת והוא נשאר באשכול בסטטוס Ready,SchedulingDisabled, למרות שהסרתם אותו מההגדרות של מאגר הצמתים. כדי להשלים את הסרת הצומת, אפשר לזהות את המדיניות שמתנגשת ולהשבית אותה באופן זמני.

יש התנגשות בין ה-PDB לבין מספר ה-Pods הזמינים

כללי מדיניות של PDB עוזרים להבטיח את ביצועי האפליקציה על ידי מניעת השבתה של Pods בו-זמנית כשמבצעים שינויים במערכת. לכן, כללי המדיניות של PDB מגבילים את מספר ה-Pods שלא זמינים בו-זמנית באפליקציה משוכפלת.

עם זאת, לפעמים מדיניות ה-PDB יכולה למנוע מחיקות של צמתים שאתם רוצים לבצע, אם הסרת צומת תפר את המדיניות.

לדוגמה, מדיניות PDB יכולה להגדיר שתמיד צריכים להיות שני Pods זמינים במערכת (.spec.minAvailable הוא 2). אבל אם יש לכם רק שני Pods, ואתם מנסים להסיר את הצומת שמכיל אחד מהם, מדיניות ה-PDB נכנסת לתוקף ומונעת את הסרת הצומת.

באופן דומה, כשמדיניות ה-PDB מגדירה שאף Pod לא יהיה זמין (.spec.maxUnavailable הוא 0), המדיניות גם מונעת את המחיקה של כל הצמתים המשויכים. גם אם תנסו להסיר Pod אחד בכל פעם, מדיניות ה-PDB תמנע מכם למחוק את הצומת המושפע.

השבתה והפעלה מחדש של מדיניות ה-PDB

כדי לפתור התנגשות של PDB, צריך לגבות את מדיניות ה-PDB ואז להסיר אותה. אחרי שה-PDB נמחק, הצומת מתרוקן וה-Pods שמשויכים אליו מוסרים. אחרי זה אתם יכולים לבצע את השינויים הרצויים ולהפעיל מחדש את מדיניות ה-PDB.

בדוגמה הבאה מוסבר איך למחוק צומת במצב הזה, שיכול להשפיע על כל סוגי האשכולות של Google Distributed Cloud: אשכולות של אדמין, היברידיים, עצמאיים ושל משתמשים.

אותו תהליך כללי פועל בכל סוגי האשכולות. עם זאת, הפקודות הספציפיות למחיקת צומת ממאגר צמתים של אשכול אדמין (לאשכולות אדמין, היברידיים או עצמאיים) שונות מעט מהפקודות למחיקת צומת ממאגר צמתים של אשכול משתמש.

  1. כדי שיהיה קל יותר לקרוא, המשתנה ${KUBECONFIG} משמש בפקודות הבאות.

    בהתאם לסוג האשכול, מייצאים את הנתיב של kubeconfig של אשכול האדמין (ADMIN_KUBECONFIG) או של kubeconfig של אשכול המשתמש (USER_CLUSTER_CONFIG) אל $(KUBECONFIG), ומבצעים את השלבים הבאים:

    • כדי למחוק צומת מאשכול משתמש, מגדירים את export KUBECONFIG=USER_CLUSTER_CONFIG
    • כדי למחוק צומת מאשכול אדמין, מגדירים את export KUBECONFIG=ADMIN_KUBECONFIG.
  2. אופציונלי: אם אתם מוחקים צומת ממאגר צמתים של אשכול משתמש, הריצו את הפקודה הבאה כדי לחלץ את קובץ ה-kubeconfig של אשכול המשתמש:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \
      get secret USER_CLUSTER_NAME-kubeconfig  \
      -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    

    מחליפים את הרשומות הבאות במידע שספציפי לסביבת האשכול:

    • ‫ADMIN_KUBECONFIG: הנתיב לקובץ kubeconfig של אשכול האדמין.
    • ‫CLUSTER_NAME: שם האשכול שרוצים ליצור לו קובץ snapshot.
    • ‫USER_CLUSTER_CONFIG: הנתיב לקובץ התצורה של אשכול המשתמש.
  3. אחרי שמסירים את הצומת ממאגר הצמתים, בודקים את הסטטוס של הצומת. הצומת המושפע מדווח על Ready, SchedulingDisabled:

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    סטטוס הצומת נראה דומה לפלט שבדוגמה הבאה:

    NAME   STATUS                    ROLES      AGE      VERSION
    CP2    Ready                     Master     11m      v.1.18.6-gke.6600
    CP3    Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    CP4    Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  4. בודקים את תקציבי ה-PDB באשכול:

    kubectl get pdb --kubeconfig ${KUBECONFIG} -A
    

    המערכת מדווחת על תקציבי PDB שדומים לאלה שמוצגים בפלט לדוגמה הבא:

    NAMESPACE     NAME             MIN AVAILABLE    MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    gke-system    istio-ingress    1                N/A               1                     19m
    gke-system    istiod           1                N/A               1                     19m
    kube-system   coredns          1                N/A               0                     19m
    kube-system   log-aggregator   N/A              0                 0                     19m
    kube-system   prometheus       N/A              0                 0                     19m
    
  5. בודקים את ה-PDB. מוצאים התאמה בין התווית של ה-Pod ב-PDB לבין ה-Pods התואמים בצומת. כך תוכלו לוודא שאתם משביתים את ה-PDB הנכון כדי להסיר את הצומת:

    kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
    

    המערכת מחזירה תוצאות של תוויות תואמות במדיניות ה-PDB:

    {"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
    
  6. חיפוש Pods שתואמים לתווית המדיניות של ה-PDB:

    kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator  \
      -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
    

    הפקודה מחזירה רשימה של Pods שתואמים לתווית ה-PDB, ומאמתת את מדיניות ה-PDB שצריך להסיר:

    stackdriver-log-aggregator-0    CP3
    stackdriver-log-aggregator-1    CP3
    
  7. אחרי שמוודאים מהו ה-Pod המושפע, יוצרים עותק גיבוי של מדיניות ה-PDB. בדוגמה הבאה מגבים את המדיניות log-aggregator:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
      -o yaml >> log-aggregator.yaml
    
  8. מוחקים את מדיניות ה-PDB הספציפית. בדוגמה הבאה נמחקת המדיניות log-aggregator:

    kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
    

    אחרי שמוחקים את מדיניות ה-PDB, הצומת ממשיך להתרוקן. עם זאת, יכול להיות שיעברו עד 30 דקות עד שהצומת יימחק לגמרי. ממשיכים לבדוק את סטטוס הצומת כדי לוודא שהתהליך הושלם בהצלחה.

    אם רוצים להסיר את הצומת באופן סופי, וגם להסיר את משאבי האחסון שמשויכים לצומת, אפשר לעשות את זה לפני שמשחזרים את מדיניות ה-PDB. מידע נוסף זמין במאמר הסרת משאבי אחסון.

  9. משחזרים את מדיניות ה-PDB מהעותק:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  10. מוודאים שה-Pods שנמחקו נוצרו מחדש. בדוגמה הזו, אם היו שני פודים של stackdriver-log-aggregator-x, הם נוצרים מחדש:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    
  11. כדי לשחזר את הצומת, צריך לערוך את ההגדרות של מאגר הצמתים המתאים ולשחזר את כתובת ה-IP של הצומת.

הסרת משאבי אחסון מצמתים שנמחקו באופן סופי

אם אתם מוחקים צומת באופן סופי ולא רוצים לשחזר אותו במערכת, אתם יכולים גם למחוק את משאבי האחסון שמשויכים לצומת הזה.

  1. בודקים את השם של אמצעי האחסון הקבוע (PV) שמשויך לצומת ומקבלים אותו:

    kubectl get pv --kubeconfig ${KUBECONFIG}  \
      -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t"}  \
      {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
    
  2. מוחקים את ה-PV שמשויך לצומת:

    kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
    

    מחליפים את PV_NAME בשם של אמצעי האחסון הקבוע שרוצים למחוק.

המאמרים הבאים

אם אתם צריכים עזרה נוספת, תוכלו לפנות אל Cloud Customer Care. במאמר קבלת תמיכה תוכלו לקרוא מידע נוסף על מקורות המידע לתמיכה, כולל:

  • הדרישות לפתיחת בקשת תמיכה.
  • כלים שיעזרו לכם לפתור בעיות, כמו הגדרת הסביבה, יומנים ומדדים.
  • רכיבים נתמכים.