פתרון בעיות שקשורות למרחב שמות שנתקע במצב Terminating

בדף הזה מוסבר איך לפתור בעיות במרחב שמות שנתקע במצב Terminating.

מרחבי שמות משתמשים בfinalizers של Kubernetes כדי למנוע מחיקה אם עדיין קיימים משאבים במרחב השמות. כשמוחקים מרחב שמות באמצעות הפקודה kubectl delete, מרחב השמות עובר למצב Terminating. מרחב השמות נשאר במצב Terminating עד ש-Kubernetes מוחק את המשאבים התלויים שלו ומנקה את כל ה-finalizers. בשלב הראשון, בקר מחזור החיים של מרחב השמות מפרט את כל המשאבים במרחב השמות ש-GKE צריך למחוק.

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

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

  1. חיפוש והסרה של שירותי API לא זמינים.
  2. איך למצוא ולהסיר משאבים שנותרו
  3. מחיקה כפויה של מרחב השמות.

חיפוש והסרה של שירותי API לא זמינים

  1. כדי להציג רשימה של שירותי API לא זמינים:

    kubectl get apiservice | grep False
    
  2. פתרון בעיות בשירותים שלא מגיבים:

    kubectl describe apiservice API_SERVICE
    

    מחליפים את API_SERVICE בשם השירות שלא מגיב.

  3. בודקים אם הסטטוס של מרחב השמות הוא עדיין Terminating:

    kubectl get ns | grep Terminating
    

איתור והסרה של משאבים שנותרו

  1. מציגים את כל המשאבים שנותרו במרחב השמות שמבוטל:

    kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n NAMESPACE
    

    מחליפים את NAMESPACE בשם של מרחב השמות שרוצים למחוק.

  2. מסירים את כל המשאבים שמוצגים בפלט.

  3. בודקים אם הסטטוס של מרחב השמות הוא עדיין Terminating:

    kubectl get ns | grep Terminating
    

מחיקה בכוח של מרחב השמות

מסירים את ה-finalizers שחוסמים את מחיקת מרחב השמות כדי לאלץ את סיום מרחב השמות:

  1. שומרים את מניפסט מרחב השמות כקובץ YAML:

    kubectl get ns NAMESPACE -o yaml > ns-terminating.yml
    
  2. פותחים את קובץ המניפסט בכלי לעריכת טקסט ומסירים את כל הערכים בשדה spec.finalizers:

    vi ns-terminating.yml
    
  3. מוודאים שהשדה finalizers ריק:

    cat ns-terminating.yml
    

    הפלט אמור להיראות כך:

    apiVersion: v1
    kind: Namespace
    metadata:
      annotations:
      name: NAMESPACE
    spec:
      finalizers:
    status:
      phase: Terminating
    
  4. מפעילים שרת proxy ל-HTTP כדי לגשת ל-Kubernetes API:

    kubectl proxy
    
  5. מחליפים את מניפסט מרחב השמות באמצעות curl:

    curl -H "Content-Type: application/yaml" -X PUT --data-binary @ns-terminating.yml http://127.0.0.1:8001/api/v1/namespaces/NAMESPACE/finalize
    
  6. בודקים אם הסטטוס של מרחב השמות הוא עדיין Terminating:

    kubectl get ns | grep Terminating
    

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