הסבר על התאימות של Cloud Service Mesh

במדריך הזה מוסבר איך לבדוק את התאימות של צי הרכבים למודרניזציה של מישור הבקרה. כדי לעשות זאת, צריך לוודא שההגדרה, התשתית וההיקף תואמים להטמעה של מישור הבקרה של TRAFFIC_DIRECTOR.

הפעלה או השבתה של בדיקות תאימות

כדי להתחיל את בדיקות התאימות, מפעילים את מצב האימות עבור Fleet. כך מתחיל תהליך ביקורת מתמשך של כל ההגדרות של Istio, הגדרות התשתית ופרמטרים של קנה מידה. הפעלת הבדיקות האלה לא מבצעת שינויים בצי או באשכולות, אלא רק מאפשרת דיווח על תאימות.

הפעלת בדיקות

כדי להתחיל את ביקורת התאימות, מריצים את הפקודה gcloud הבאה:

gcloud alpha container fleet mesh update --modernization-compatibility validation-enabled --project FLEET_PROJECT_ID

מחליפים את FLEET_PROJECT_ID במזהה של פרויקט המארח של Fleet. בדרך כלל, השם של FLEET_PROJECT_ID זהה לשם הפרויקט.

אחרי שמפעילים את Cloud Service Mesh, הוא מתחיל להעריך את ה-Fleet ואת כל האשכולות שהוקצו ב-Cloud Service Mesh ב-Fleet, כדי לבדוק אם הם תואמים למודרניזציה.

השבתת בדיקות

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

gcloud alpha container fleet mesh update --modernization-compatibility validation-disabled --project FLEET_PROJECT_ID

הפקודה הזו מסירה את תנאי התאימות למודרניזציה ממצבי החברות, וגם את הסטטוס ModernizationCompatible מ-CRs ספציפיים של Istio.

הסבר על תאימות

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

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

gcloud container fleet mesh describe --project FLEET_PROJECT_ID

תאימות ברמת הצי

בודקים את סטטוס המודרניזציה הכולל של הצי בstate.servicemesh.conditions.

  • הצי תואם: אם הצי תואם, תופיע לכם התניה עם הקוד MODERNIZATION_COMPATIBLE:

    name: projects/project_id/locations/global/features/servicemesh
    state:
      servicemesh:
        conditions:
        - code: MODERNIZATION_COMPATIBLE
          details: 'Fleet is eligible for modernization.'
          documentationLink: https://cloud.google.com/service-mesh/...
          severity: INFO
    
  • הצי לא תואם: אם הצי שלכם עדיין לא תואם למודרניזציה, תופיע לכם הודעה עם קוד MODERNIZATION_INCOMPATIBLE:

    name: projects/project_id/locations/global/features/servicemesh
    state:
      servicemesh:
        conditions:
        - code: MODERNIZATION_INCOMPATIBLE
          details: 'Fleet is not yet eligible for modernization.'
          documentationLink: https://cloud.google.com/service-mesh/...
          severity: INFO
    

    אם הצי לא תואם, צריך לבדוק את התנאים לפערים ספציפיים. כדי לפתור בעיות שמונעות את השדרוג, בודקים אם יש תנאים נוספים ברמת הצי או ברמת האשכול עם חומרת בעיה WARNING או ERROR בקטע membershipStates.servicemesh.

תאימות ברמת האשכול

מחפשים תנאים עם חומרה ברמה WARNING או ERROR בקטע membershipStates.servicemesh לכל אשכול שהוקצה ב-Cloud Service Mesh בצי. אם יש אי-תאימויות, הפלט ייראה כך:

membershipSpecs:
 projects/project_id/locations/global/memberships/cluster-a:
   mesh:
     management:MANAGEMENT_AUTOMATIC
membershipStates:
  projects/project_id/locations/global/memberships/cluster-a:
    servicemesh:
      conditions:
     - code: MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION
       details: 'Pod pod-a in namespace test-namespace: invalid annotations: ["status.sidecar.istio.io/port": failed to parse port - "invalid", port must be a number and should be in the range 1..65535]; unsupported annotations: ["ambient.istio.io/redirection"] .'
       documentationLink: https://cloud.google.com/service-mesh/...
       severity: WARNING
     - code: WORKLOAD_IDENTITY_REQUIRED
       details: 'Workload Identity is not enabled for the cluster or at least one of the node pools.'
       documentationLink: https://cloud.google.com/...
       severity: ERROR
...

כדי להבין את חוסר התאימות הספציפי ולפתור אותו, פועלים לפי documentationLink שמופיע בכל תנאי.

פתרון בעיות תאימות

פתרון בעיות שקשורות להערות לא תואמות ברצף מודעות

הקוד MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION מציין שלא ניתן לבצע מודרניזציה של האשכול למישור הבקרה TRAFFIC_DIRECTOR כי ל-Pods מסוימים יש הערות Istio לא נתמכות או לא תקינות.

פלט לדוגמה מהפקודה gcloud container fleet mesh describe עם התנאי MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION שמוגדר לחברות:

membershipStates:
  projects/project_id/locations/global/memberships/membership-a:
    servicemesh:
      conditions:
     - code: MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION
       details: 'Pod pod-a in namespace test-namespace: invalid annotations: ["status.sidecar.istio.io/port": failed to parse port - "invalid", port must be a number and should be in the range 1..65535]; unsupported annotations: ["ambient.istio.io/redirection"] .'
       documentationLink: https://cloud.google.com/service-mesh/...
       severity: WARNING

כדי לפתור את הבעיות שקשורות להערות האלה ב-Pod:

  1. זיהוי הערות בעייתיות: בודקים את השדה details של תנאי הסטטוס כדי למצוא את מפתחות ההערות שלא נתמכים או לא תקינים. מציאת כל ה-Pods עם מפתחות ההערות הבעייתיים.

  2. תיקון ואימות:

    1. משנים את מפרטי ה-YAML של הפריסות או של ה-Pods כדי לוודא שהם משתמשים רק בהערות נתמכות (כל ההערות האחרות לא נתמכות). מסירים הערות שלא נתמכות, מתקנים ערכים לא תקינים ומחילים מחדש את קובץ ה-YAML המעודכן על האשכול.
    2. אחרי שמתקנים את כל ההערות על הפוד, התנאי MODERNIZATION_INCOMPATIBLE_POD_ANNOTATION לא יופיע יותר במינוי הזה.

פתרון בעיות שנובעות מהגדרות לא תואמות

הקוד MODERNIZATION_INCOMPATIBLE_CONFIG מציין שלא ניתן לבצע מודרניזציה של האשכול למישור הבקרה TRAFFIC_DIRECTOR בגלל הגדרות לא תואמות. חוסר התאימות יכול לנבוע מהסיבות הבאות:

  • משאבים מותאמים אישית (CR) ספציפיים של Istio שמשתמשים בתכונות או בשדות שלא נתמכים או שמכילים ערכים לא תקינים.
  • הגדרות לא תקינות או לא נתמכות של Istio MeshConfig.
  • חריגה ממגבלות ההתאמה.
  • שימוש בהערות של שירות או מרחב שמות שלא נתמכות.

פלט לדוגמה מהפקודה gcloud container fleet mesh describe עם התנאי MODERNIZATION_INCOMPATIBLE_CONFIG שמוגדר לחברות:

membershipSpecs:
 projects/project_id/locations/global/memberships/membership-a:
   mesh:
     management:MANAGEMENT_AUTOMATIC
membershipStates:
  projects/project_id/locations/global/memberships/membership-a:
    servicemesh:
      conditions:
     - code: MODERNIZATION_INCOMPATIBLE_CONFIG
       details: 'One or more configs have warnings. Due to the following reason(s): Istio sidecar scale exceeds limit, MeshConfig "accessLogFile" is unsupported. Invalid Config Types: [Gateway, ServiceEntry], where more details are shown on individual config resources.See documentation link for more detail.'
       documentationLink: https://cloud.google.com/service-mesh/...
       severity: WARNING

כדי לפתור את הבעיות בהגדרות:

  1. ניתוח פרטי התנאי: בודקים את השדה details של תנאי הסטטוס. הוא מסכם את השגיאות ומזהה את סוגי המשאבים שיש בהם בעיות בהגדרות. לדוגמה, אם הפרטים שסופקו הם כמו בדוגמה, תצטרכו לטפל בבעיות שקשורות לקנה מידה ול-MeshConfig, ולבדוק אם יש שגיאות במשאבי Gateway וServiceEntry.

  2. זיהוי משאבים לא תואמים ובדיקתם: אפשר להשתמש בסקריפט לדוגמה הבא כדי ליצור רשימה של משאבים מותאמים אישית (CR) של Istio שלא עוברים את בדיקות התאימות. הסקריפט הזה מסופק כדוגמה. צריך לבדוק ולנתח אותו כדי לוודא שהוא עומד בדרישות הסביבה והתפעוליות שלכם לפני שמריצים אותו באשכול. כדי להפעיל את הסקריפט, צריך להתקין את kubectl ואת jq. הפלט כולל את פרטי השגיאה הספציפיים שנמצאו בקטע status.conditions (סוג: ModernizationCompatible, סטטוס: "False") של כל משאב.

    for resource in authorizationpolicies destinationrules envoyfilters gateways peerauthentications proxyconfigs requestauthentications serviceentries sidecars telemetries virtualservices wasmplugins workloadentries workloadgroups; do
      echo "--- Checking $resource ---"
      kubectl get $resource --all-namespaces -o json | \
      jq -r '.items[] | select(.status.conditions != null and any(.status.conditions[]; .type == "ModernizationCompatible" and .status == "False")) | {"kind": .kind, "name": .metadata.name, "namespace": .metadata.namespace, "message": [.status.conditions[] | select(.type == "ModernizationCompatible").message]}'
    done
    

    פלט לדוגמה:

    --- Checking serviceentries ---
    {
      "kind": "ServiceEntry",
      "name": "demo-service-entry",
      "namespace": "se",
      "message": [
        "WARNING: unsupported resolution type: DNS_ROUND_ROBIN"
      ]
    }
    ..
    --- Checking workloadentries ---
    {
      "kind": "WorkloadEntry",
      "name": "demo-we",
      "namespace": "default",
      "message": [
        "WARNING: This API is not supported"
      ]
    }
    
  3. תיקון והחלה של הגדרות: משנים את קובץ ה-YAML על ידי הסרת השדות שלא נתמכים או החלפת ערכים לא תקינים בערכים תואמים. למידע נוסף, אפשר לעיין במסמכים תכונות נתמכות של Cloud Service Mesh מנוהל וממשקי API של Istio שלא נתמכים. (לדוגמה, בדוגמה שצוינה, צריך לעדכן את הרזולוציה ServiceEntry מ-DNS_ROUND_ROBIN ל-DNS).

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

    • התנאי ModernizationCompatible במקורות הקבועים צריך להשתנות לסטטוס: "True". בודקים את הסטטוס של המשאב באמצעות:

      kubectl get resource name -n namespace -o yaml
      

      פלט לדוגמה:

      status:
        conditions:
        - lastTransitionTime: "2026-06-05T06:12:52.219963391Z"
          message: Resource is compatible for modernization
          reason: Compatible
          status: "True"
          type: ModernizationCompatible
      
    • מריצים מחדש את הפקודה gcloud container fleet mesh describe. אחרי שכל הבעיות שקשורות למינוי ייפתרו, התנאי MODERNIZATION_INCOMPATIBLE_CONFIG לא יופיע יותר במינוי הזה.

פתרון בעיות שקשורות לגודל הצי

הקוד MODERNIZATION_INCOMPATIBLE_FLEET_SCALE מציין שלא ניתן לבצע מודרניזציה של Fleet למישור הבקרה TRAFFIC_DIRECTOR כי היקף המשאבים ב-Fleet חורג מהמגבלות שנתמכות למודרניזציה.

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