עדכון הגדרות של דחיסת EnvoyFilter

כמה שדות ברמה העליונה בממשק ה-API של המסנן envoy.extensions.filters.http.compressor.v3.Compressor יצאו משימוש ב-Envoy (ראו את הגדרת המקור). ההגדרות האלה הועברו לבלוקים ייעודיים של response_direction_config.common_config ו-request_direction_config.common_config.

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

הסבר על הצורך במודרניזציה

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

כדי להשתמש ב-Cloud Service Mesh עם מישור הבקרה TRAFFIC_DIRECTOR (ראו בדיקת ההטמעה של מישור הבקרה), צריך להשתמש בגרסה הנתמכת של EnvoyFilter API. פריסות מדור קודם שמשתמשות בשדות ברמה העליונה שהוצאו משימוש (למשל content_length, ‏ content_type,‏ disable_on_etag_header, ‏ remove_accept_encoding_header או runtime_enabled) ימשיכו לפעול, אבל מומלץ לעדכן אותן באופן מיידי כדי להבטיח את מהימנותן.

כשמשתמשים בשדות האלה שהוצאו משימוש, האימותים מופצים בהדרגה בערוצי ההפצה (Rapid, אחר כך Regular, אחר כך Stable). האימותים במישור הבקרה חלים בהתאם למועד הפריסות:

סוג הפריסה התנהגות האימות
פריסות מדור קודם (פריסות שבוצעו לפני הפעלת האימותים) מישור הבקרה מגדיר סטטוס של אזהרה במשאב המותאם אישית (CR) EnvoyFilter עם הטקסט: found usage of unsupported fields: [...]. ההגדרה עדיין תחול לצורך תאימות לאחור, אבל כדי להבטיח שהתמיכה תימשך, צריך להעביר את ההגדרות לשדות הנתמכים.
פריסות נתמכות (נפרסו אחרי שהופעל אימות) מישור הבקרה חוסם באופן מוחלט את השימוש בשדות שלא נתמכים. החלת ההגדרה גורמת לשגיאה במשאב EnvoyFilter עם ההודעה: found usage of unsupported fields: [...], וההגדרה שלא נתמכת תידחה.

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

זיהוי הגדרות שהוצאו משימוש

צריך לעדכן את ההגדרה של EnvoyFilter אם מגדירים אחד מהשדות הבאים ישירות מתחת לבלוק typed_config:

  • min_content_length
  • content_length
  • content_type
  • disable_on_etag_header
  • remove_accept_encoding_header

אפשר להציג רשימה של EnvoyFilter באמצעות:

kubectl get envoyfilters --all-namespaces -o yaml

בודקים את הפלט של תיקון EnvoyFilters envoy.filters.http.compressor.

פורמטים של הגדרות

בקטעים הבאים מופיעות דוגמאות להגדרות של מסנן Compressor Envoy במשאב EnvoyFilter, גם כאלה שיצאו משימוש וגם כאלה שעברו מודרניזציה.

דוגמה להגדרה שהוצאה משימוש

אם קטע התיקון של EnvoyFilter נראה כמו הקטע הבא, הוא משתמש בפורמט שיצא משימוש:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: compressor-filter-update
  namespace: istio-system
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
            subFilter:
              name: envoy.filters.http.router
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.compressor
        typed_config:
          '@type': type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
          # These top-level fields are DEPRECATED
          min_content_length: 1024
          content_type:
          - "application/javascript"
          - "application/json"
          disable_on_etag_header: true
          remove_accept_encoding_header: true
          compressor_library:
            name: gzip
            typed_config:
              '@type': type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip

דוגמה להגדרה מודרנית

צריך להעביר את השדות שהוצאו משימוש לאובייקט response_direction_config (או request_direction_config אם רלוונטי):

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: compressor-filter-update
  namespace: istio-system
spec:
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
            subFilter:
              name: envoy.filters.http.router
    patch:
      operation: INSERT_BEFORE
      value:
        name: envoy.filters.http.compressor
        typed_config:
          '@type': type.googleapis.com/envoy.extensions.filters.http.compressor.v3.Compressor
          compressor_library:
            name: gzip
            typed_config:
              '@type': type.googleapis.com/envoy.extensions.compression.gzip.compressor.v3.Gzip
          response_direction_config:
            disable_on_etag_header: true # MOVED
            remove_accept_encoding_header: true # MOVED
            common_config:
              min_content_length: 1024  # MOVED
              content_type:          # MOVED
              - "application/javascript"
              - "application/json"
              enabled:
                default_value: true
                runtime_key: "compressor.enabled"

שדות נתמכים ונתיבי העברה

רשימה מלאה של השדות הנתמכים מופיעה במדריך Data plane extensibility using EnvoyFilter. בטבלה הבאה מפורט המיפוי להעברת השדות הכי נפוצים שהוצאו משימוש.

נתיב שדה שיצא משימוש נתיב שדה מודרני הערות
typed_config.min_content_length typed_config.response_direction_config.common_config.min_content_length
או
typed_config.request_direction_config.common_config.min_content_length
היא מגדירה את הגודל המינימלי של התגובה או הבקשה בהתאמה, כדי להפעיל דחיסה.
typed_config.content_length typed_config.response_direction_config.common_config.min_content_length
או
typed_config.request_direction_config.common_config.min_content_length
כתובת חלופית קודמת של min_content_length. משנים את השם ל-min_content_length בנתיב החדש.
typed_config.content_type typed_config.response_direction_config.common_config.content_type
או
typed_config.request_direction_config.common_config.content_type
מערך של סוגי תוכן לדחיסה.
typed_config.disable_on_etag_header typed_config.response_direction_config.disable_on_etag_header הדחיסה מושבתת אם התשובה מכילה כותרת ETag.
typed_config.remove_accept_encoding_header typed_config.response_direction_config.remove_accept_encoding_header מסיר את הכותרת Accept-Encoding מהבקשות לפני השליחה לשרת במעלה הזרם.

תוכנית העברה

מומלץ לעדכן את ההגדרות של EnvoyFilter בהתאם לשיטות המומלצות לפריסה ולבדיקה של הארגון. כדאי לבצע את השלבים הכלליים הבאים במהלך ההעברה:

  • זיהוי: מאתרים את כל המשאבים מסוג EnvoyFilter באמצעות המסנן Compressor עם שדות שהוצאו משימוש, כפי שמתואר במאמר זיהוי הגדרות שהוצאו משימוש.
  • לבדוק: משנים את קובץ ה-YAML של משאבי EnvoyFilter ובודקים את השינויים בסביבת טרום-ייצור. מוודאים שהדחיסה פעילה עבור סוגי התוכן והגדלים הצפויים.
  • מעקב ואימות:
    • בודקים את EnvoyFilterסטטוס המשאבfound usage of unsupported fields: [...] כדי לוודא שהאזהרות או השגיאות כבר לא מופיעות.
    • מעקב אחרי מדדים מרכזיים: שימוש במעבד, חביון וצריכת רוחב פס.
    • בודקים את הכותרות של התגובות (למשל, Content-Encoding: gzip) ומוודאים שהדחיסה פועלת.
  • פריסה: החלת ההגדרות הנתמכות של EnvoyFilter על עומסי עבודה בסביבת הייצור.

היתרונות של מודרניזציה

  • הבהרת סטטוס המשאב: הסרת found usage of unsupported fields: [...]אזהרות ושגיאות מסטטוס המשאב של הכלי לדחיסת תמונות EnvoyFilter.
  • תקנון: בהתאם לשיטות המומלצות הנוכחיות להגדרת Envoy ולTRAFFIC_DIRECTORאימותים.
  • תאימות עתידית: מוודא שההגדרות שלכם פועלות בצורה חלקה עם גרסאות עתידיות של Envoy ו-Cloud Service Mesh.

פתרון בעיות ותמיכה

אם נתקלים בבעיות, כדאי לבדוק את הדברים הבאים:

  • כדאי לבדוק שוב את תחביר ה-YAML ואת מיקום השדות.
  • בודקים את היומנים של שרת ה-proxy של Envoy כדי לראות הודעות שגיאה מפורטות: kubectl logs -l app=your-app -c istio-proxy -n your-namespace.
  • במקרה הצורך, אפשר לבצע Rollback להגדרות הקודמות של EnvoyFilter.
  • לקבלת עזרה נוספת, אפשר לפנות לתמיכה של Google Cloud .