פתרון בעיות ב-Policy Controller

בדף הזה מוסבר איך לפתור בעיות ב-Policy Controller.

טיפים כלליים

בקטע הבא מפורטות עצות כלליות לפתרון בעיות ב-Policy Controller.

הפסקת Policy Controller

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

בדיקת המדדים

בדיקת המדדים של Policy Controller יכולה לעזור לכם לאבחן בעיות ב-Policy Controller.

אימות ההתקנה

אפשר לוודא שהתקנתם את Policy Controller ואת ספריית תבניות האילוצים בהצלחה.

ניתוק Policy Controller

במקרים נדירים, יכול להיות שתצטרכו לנתק את Policy Controller מהאשכולות. הפעולה הזו משביתה לחלוטין את הניהול של Policy Controller. כדאי לנסות להפסיק באופן זמני את Policy Controller כדי לראות אם אפשר לפתור את הבעיות לפני השימוש בפקודה detach.

  1. מנתקים את Policy Controller מכלל המכשירים:

    gcloud container fleet policycontroller detach
    
  2. מצרפים מחדש את Policy Controller:

    gcloud container fleet policycontroller enable
    

שגיאה ביצירת תבנית אילוצים

אם מופיעה שגיאה שכוללת את disallowed ref, צריך לוודא שהפעלתם אילוצים שלמות נתונים. לדוגמה, אם משתמשים ב-data.inventory בתבנית אילוצים בלי להפעיל קודם אילוצי הפניה, השגיאה תהיה דומה לזו:

admission webhook "validation.gatekeeper.sh" denied the request: check refs failed on module {templates["admission.k8s.gatekeeper.sh"]["MyTemplate"]}: disallowed ref data.inventory...

האילוץ לא נאכף

בקטע הבא מפורטות הנחיות לפתרון בעיות אם אתם חושדים שההגבלות שלכם לא נאכפות או אם אתם יודעים שהן לא נאכפות.

איך בודקים אם האילוץ נאכף

אם אתם חוששים שהאילוץ לא נאכף, אתם יכולים לבדוק את spec.status של האילוץ ואת תבנית האילוץ. כדי לבדוק את הסטטוס, מריצים את הפקודה הבאה:

kubectl describe CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

מחליפים את מה שכתוב בשדות הבאים:

  • CONSTRAINT_TEMPLATE_NAME: השם של תבנית האילוץ שרוצים לבדוק. לדוגמה, K8sNoExternalServices.
  • CONSTRAINT_NAME: ה-Name של האילוץ שרוצים לבדוק.

    במקרה הצורך, מריצים את הפקודה kubectl get constraint כדי לראות אילו תבניות של אילוצים ואילו אילוצים מותקנים במערכת.

בפלט של הפקודה kubectl describe, רושמים את הערכים בשדות metadata.generation ו-status.byPod.observedGeneration. בדוגמה הבאה הערכים האלה מודגשים:

Name:         no-internet-services
Namespace:
API Version:  constraints.gatekeeper.sh/v1beta1
Kind:         K8sNoExternalServices
Metadata:
  Creation Timestamp:  2021-12-03T19:00:06Z
  Generation:          1
  Managed Fields:
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:config.k8s.io/owning-inventory:
          f:configmanagement.gke.io/cluster-name:
          f:configmanagement.gke.io/managed:
          f:configmanagement.gke.io/source-path:
          f:configmanagement.gke.io/token:
          f:configsync.gke.io/declared-fields:
          f:configsync.gke.io/git-context:
          f:configsync.gke.io/manager:
          f:configsync.gke.io/resource-id:
        f:labels:
          f:app.kubernetes.io/managed-by:
          f:configsync.gke.io/declared-version:
      f:spec:
        f:parameters:
          f:internalCIDRs:
    Manager:      configsync.gke.io
    Operation:    Apply
    Time:         2022-02-15T17:13:20Z
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
    Manager:         gatekeeper
    Operation:       Update
    Time:            2021-12-03T19:00:08Z
  Resource Version:  41460953
  UID:               ac80849d-a644-4c5c-8787-f73e90b2c988
Spec:
  Parameters:
    Internal CID Rs:
Status:
  Audit Timestamp:  2022-02-15T17:21:51Z
  By Pod:
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-audit-5d4d474f95-746x4
    Observed Generation:  1
    Operations:
      audit
      status
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-controller-manager-76d777ddb8-g24dh
    Observed Generation:  1
    Operations:
      webhook
  Total Violations:  0
Events:              <none>

אם רואים שכל ה-Pods של Policy Controller עם ערך observedGeneration שווה לערך metadata.generation (כמו בדוגמה הקודמת), סביר להניח שהאילוץ נאכף. עם זאת, אם הערכים האלה זהים, אבל אתם עדיין נתקלים בבעיות באכיפת ההגבלה, כדאי לעיין בטיפים בקטע הבא. אם אתם רואים שרק חלק מהערכים תואמים, או שחלק מה-Pods לא מופיעים, הסטטוס של האילוץ לא ידוע. יכול להיות שהאילוץ לא ייאכף באופן עקבי בכל ה-Pods של Policy Controller, או שהוא לא ייאכף בכלל. אם אין ערכים תואמים, האילוץ לא נאכף.

האילוץ לא נאכף, אבל תוצאות הביקורת מדווחות

אם הבדיקה observedGeneration שמתוארת בקטע הקודם מצאה ערכים תואמים ותוצאות הביקורת שדווחו על האילוץ מראות הפרות צפויות (עבור אובייקטים קיימים, לא עבור בקשות נכנסות), אבל האילוץ עדיין לא נאכף, סביר להניח שהבעיה קשורה ל-webhook. יכול להיות שנתקלתם באחת מהבעיות הבאות ב-webhook:

  • יכול להיות ש-Pod של Policy Controller webhook לא פועל. טכניקות לניפוי באגים ב-Kubernetes יכולות לעזור לכם לפתור בעיות ב-Pod של ה-Webhook.
  • יכול להיות שיש חומת אש בין שרת ה-API לבין שירות ה-webhook. כדי לדעת איך לתקן את חומת האש, צריך לעיין במאמרי העזרה של ספק חומת האש.

לא נאכף אילוץ שלמות נתונים

אם האילוץ הוא אילוץ הפניה, צריך לוודא שהמשאבים הנדרשים נשמרים במטמון. פרטים על שמירת משאבים במטמון זמינים במאמר הגדרת Policy Controller לאילוצים של הפניות.

בדיקת התחביר של תבנית האילוצים

אם כתבתם תבנית אילוצים משלכם והיא לא נאכפת, יכול להיות שיש שגיאה בתחביר של תבנית האילוצים.

אפשר לבדוק את התבנית באמצעות הפקודה הבאה:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

מחליפים את CONSTRAINT_TEMPLATE_NAME בשם התבנית שרוצים לבדוק. צריך לדווח על שגיאות בשדה status.

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