פתרון בעיות שקשורות למרחב שמות שנתקע במצב 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
    

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