הגדרת Cloud CDN עבור Gateway

במאמר הזה מוסבר איך להשתמש בבקר של Google Kubernetes Engine‏ (GKE) Gateway כדי להגדיר את Cloud CDN. מידע מפורט על מושגים, שיטות מומלצות ופתרון בעיות ב-Cloud CDN זמין בתיעוד של Cloud CDN.

‫Cloud CDN עוזר לשפר את זמן האחזור של משתמשי הקצה ומפחית את עומס המקור על ידי שמירת תוכן במטמון בקרבת המשתמשים. אפשר להפעיל את יכולות השמירה במטמון של Cloud CDN באמצעות GCPHTTPFilter CustomResourceDefinition.

המסמך הזה מיועד למפתחי אפליקציות, לאדריכלי ענן ולמומחי רשתות שתפקידם לתכנן את הרשת של הארגון. כדי לקבל מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם ב Cloud de Confiance תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשים ב-GKE ומשימות.

סקירה כללית

השילוב של GKE Gateway עם Cloud CDN מאפשר לכם להשתמש במשאבים מקוריים של Kubernetes כדי לנהל את אחסון הנתונים במטמון בקצה הרשת. באמצעות המשאב GCPHTTPFilter, אפשר לשנות הגדרות כמו מצבי מטמון וזמן החיים (TTL) של פלחים שונים בתנועה.

כדי להפעיל את Cloud CDN, יוצרים אובייקט GCPHTTPFilter ומפנים לאובייקט בכלל HTTPRoute. אפשר ליצור כמה אובייקטים של GCPHTTPFilter כדי להגדיר התנהגויות שונות של שמירת נתונים במטמון לסוגים שונים של תנועה. לדוגמה, אפשר ליצור מסנן אחד לתמונות סטטיות ומסנן אחר למדיניות ברירת מחדל שמשתמשת בערכי ברירת המחדל המומלצים של Cloud CDN.

משאב ה-GCPHTTPFilter מאפשר לכם להגדיר את הדברים הבאים:

  • מצבי מטמון: שליטה באופן שבו Cloud CDN שומר במטמון תשובות מהמקור.
  • הגדרה של אורך החיים (TTL): הגדרה של משך הזמן שבו אובייקטים נשארים במטמון.
  • מפתחות מטמון: מגדירים אילו אלמנטים של בקשה (כותרות, קובצי Cookie, מחרוזות שאילתה) משמשים ליצירת מפתחות מטמון.
  • שמירת נתונים במטמון של תשובות שליליות: שמירת נתונים במטמון של תשובות שגיאה נפוצות או הפניות לכתובת אחרת כדי להפחית את עומס המקור במהלך כשלים.
  • כללי מדיניות בנושא מטמון: קובעים איך Cloud CDN מטפל בבקשות שניתן לשמור במטמון. לדוגמה, אתם יכולים להפעיל את Cloud CDN כדי לבצע את הפעולות הבאות:
    • שמירה על זמינות גבוהה על ידי המשך הצגת תוכן במטמון גם אם שירותי הקצה העורפי לא זמינים.
    • הגדרת כותרות ספציפיות של בקשות שעוקפות את המטמון כדי לאחזר נתונים ישירות מהקצה העורפי.
    • כדי להפחית את העומס על השרתים, אפשר למזג כמה בקשות בו-זמניות לאותו משאב לבקשה אחת.

משאב ה-GCPHTTPFilter צריך להיות באותו מרחב שמות כמו משאב ה-HTTPRoute שאליו הוא מצורף. אחרי שמגדירים את GCPHTTPFilter, המסנן משולב בשרשרת המסננים של המסלול.

בתרשים הבא אפשר לראות איך אפשר להשתמש ב-GCPHTTPFilter כדי להחיל הגדרות שונות של שמירת נתונים במטמון על חלקים ספציפיים בתנועת הגולשים ב-HTTPRoute:

Figure 1. הגדרות שונות של שמירת נתונים במטמון שנוצרו באמצעות GCPHTTPFilter בתוך HTTPRoute.
איור 1. הגדרות של שמירת נתונים במטמון ב-HTTPRoute.

הארכיטקטורה הזו מאפשרת לכם להגדיר ניהול גרנולרי ואוטומטי של שמירת נתונים במטמון בפריפריה. ההגדרה HTTPRoute קובעת איך המערכת מטפלת בבקשות נכנסות על ידי התאמת התנועה הנכנסת על סמך מאפיינים כמו נתיב הבקשה. כדי להפעיל שמירת נתונים במטמון למסלולים ספציפיים, צריך לצרף GCPHTTPFilters לכללים בתוך HTTPRoute. כל GCPHTTPFilter יכול לציין לוגיקה שונה של שמירת נתונים במטמון לתמונות, לנכסי אינטרנט ולתוכן אחר. הלוגיקה הזו של שמירת נתונים במטמון נאכפת על ידי Cloud CDN, שמציג את התוכן שנשמר במטמון ללקוח.

דרישות ומגבלות

  • האשכול צריך להיות ב-GKE בגרסה 1.35.2-gke.1751000 ואילך.
  • צריך להגדיר שער חיצוני גלובלי באמצעות GatewayClass‏ gke-l7-global-external-managed או gke-l7-global-external-managed-mc.
  • צריך להגדיר משאב HTTPRoute.
  • אי אפשר להפעיל גם שרת proxy לאימות זהויות (IAP) וגם Cloud CDN באותו שער. אם נדרש IAP, צריך להסיר את האובייקט GCPHTTPFilter לפני שמפעילים את GCPBackendPolicy.
  • אפשר לצרף רק אובייקט אחד של GCPHTTPFilter לכלל נתיב ספציפי ב-HTTPRoute.

תמחור

התמחור של Cloud CDN חל כשהאפשרות 'שמירה במטמון' מופעלת. מידע נוסף זמין במאמר בנושא תמחור של Cloud CDN.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

תפקידים והרשאות

  1. כדי להציג משאבים שהוגדרו, צריך לוודא שיש לכם roles/compute.networkViewer תפקיד IAM. Cloud de Confiance

  2. חשוב לוודא שיש לכם גישה לאשכול GKE ושיש לכם הרשאה לבצע את הפעולות הנדרשות. בקטע הקוד הבא מוצגות ההרשאות המינימליות של RBAC שנדרשות:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: gateway-caching-admin
    rules:
    # 1. Full access to manage HTTPRoutes
    - apiGroups: ["gateway.networking.k8s.io"]
      resources: ["httproutes"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    # 2. Read-only access to view the Gateway
    - apiGroups: ["gateway.networking.k8s.io"]
      resources: ["gateways"]
      verbs: ["get", "list", "watch"]
    # 3. Full access to manage caching filters
    - apiGroups: ["networking.gke.io"]
      resources: ["gcphttpfilters"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
    

מידע נוסף על שימוש ב-RBAC וב-IAM זמין במאמר אינטראקציה עם ניהול זהויות והרשאות גישה.

הגדרת שמירת נתונים במטמון באמצעות GCPHTTPFilter

כדי להפעיל ולהגדיר את Cloud CDN, יוצרים משאב GCPHTTPFilter אחד או יותר ואז מפנים אליו באובייקט HTTPRoute.

יצירת GCPHTTPFilter

משאב ה-GCPHTTPFilter מגדיר את מדיניות הקאשינג. בדוגמה הבאה, יוצרים שלושה GCPHTTPFilters:

  • המסנן הראשון שומר במטמון תמונות סטטיות כדי להציג אותן מהר יותר למשתמשי הקצה.
  • המסנן השני שומר במטמון נכסי אינטרנט כמו קובצי CSS.
  • המסנן השלישי משמש כ'מסנן כללי' לתנועת הגולשים שנותרה.
  1. יוצרים את המסנן הראשון על ידי שמירת המניפסט הבא בשם store-caching-images-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-images-filter
    spec:
      cachePolicy:
        cacheKeyPolicy:
          includeQueryString: false
        cacheMode: CACHE_ALL_STATIC
        defaultTTL: 12h
    

    במניפסט הזה, התנאים הבאים חלים:

    • includeQueryString: הנחיה ל-Cloud CDN להתעלם מפרמטרים של שאילתות במפתח המטמון. כך אפשר לוודא שמשתמשים שונים שמבקשים את אותה תמונה יקבלו עותקים זהים של התמונה מהמטמון.
    • cacheMode: מוגדר ל-CACHE_ALL_STATIC, ששומר באופן אוטומטי במטמון תוכן סטטי כמו תמונות.
    • defaultTTL: הנחיה ל-Cloud CDN לשמור תמונות במטמון למשך 12 שעות. אפשר לציין את הזמן בשעות (h), בדקות (m) או בשניות (s).
  2. יוצרים את המסנן השני. שומרים את קובץ המניפסט הבא בשם store-caching-webassets-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-webassets-filter
    spec:
      cachePolicy:
        cacheKeyPolicy:
          includeQueryString: false
        serveWhileStale: 24h
        cacheMode: CACHE_ALL_STATIC
        defaultTTL: 24h
    

    למניפסט הזה יש חלק מההגדרות של המסנן הראשון, אבל יש כמה הבדלים:

    • serveWhileStale: מוגדר ל-24 שעות. אם תוקף של נכס אינטרנט (כמו קובץ CSS) פג אחרי defaultTTL,‏ Cloud CDN ממשיך להציג את הנכס המיושן הזה מהמטמון למשך עד 24 שעות נוספות, ומאמת מחדש את התוכן ברקע.
    • defaultTTL: מוגדר לפרק זמן ארוך יותר של 24 שעות.
  3. יוצרים מסנן שלישי כדי להגדיר מדיניות ברירת מחדל של שמירת נתונים במטמון ללא פרמטרים. שומרים את קובץ המניפסט הבא בשם store-caching-default-filter.yaml:

    apiVersion: networking.gke.io/v1
    kind: GCPHTTPFilter
    metadata:
      name: store-caching-default-filter
    spec:
      cachePolicy: {}
    

    אם לא מציינים פרמטרים במשאב GCPHTTPFilter,‏ GKE משתמש בערכי ברירת המחדל של הנתונים שנשמרים במטמון.

  4. החלת המסננים על האשכול:

    kubectl apply -f store-caching-images-filter.yaml
    kubectl apply -f store-caching-webassets-filter.yaml
    kubectl apply -f store-caching-default-filter.yaml
    

צירוף המסנן ל-HTTPRoute

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

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

  1. משנים את קובץ המניפסט הקיים של HTTPRoute (לדוגמה, store-route-external.yaml) כך שיכלול את הקטע filters בכללי הניתוב:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1
    metadata:
      name: store-external
    spec:
      parentRefs:
      - kind: Gateway
        name: external-http
      hostnames:
      - "store.example.com"
      rules:
      # RULE 1: Default /img/ traffic to store-v1
      - matches:
        - path:
            value: /img/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-images-filter
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 2: Default /web/ traffic to store-v1
      - matches:
        - path:
            value: /web/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-webassets-filter
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 3: Canary /img/ traffic (header + path match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /img/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-images-filter
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 4: Canary /web/ traffic (header + path match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /web/
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-webassets-filter
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 5: Default (catch-all) traffic to store-v1
      - backendRefs:
        - name: store-v1
          port: 8080
        # If you need caching for default traffic, it can be enabled by placing
        # filters directly under backendRefs
        filters:
        - type: ExtensionRef
          extensionRef:
            group: networking.gke.io
            kind: GCPHTTPFilter
            name: store-caching-default-filter
    
  2. מחילים את ההגדרה המעודכנת של HTTPRoute על האשכול:

    kubectl apply -f store-route-external.yaml
    
  3. מוודאים ש-HTTPRoute ו-Gateway נפרסו:

    kubectl describe httproute store-external
    kubectl describe gateway external-http
    

    בפלט אפשר לראות ש-Cloud CDN מופעל עבור משאב ה-HTTPRoute. ‫Cloud CDN מחיל את מדיניות הקאשינג שהוגדרה על התעבורה שלכם ומאיץ את ההצגה של תמונות סטטיות, נכסי אינטרנט ותעבורה אחרת.

ביטול תוקף של תוכן שנשמר במטמון

כדי לנקות תוכן מיושן מהמטמון, צריך לשלוח בקשת ביטול. מידע מפורט על אופן הפעולה של ביטול התוקף זמין במאמר ביטול התוקף של תוכן שנשמר במטמון במאמרי העזרה של Cloud CDN.

  1. מוצאים את מיפוי כתובות ה-URL שמשויך לשער:

    kubectl describe gateway external-http
    

    מחפשים את ההערה networking.gke.io/url-maps. לדוגמה:

    Name: external-http
    Namespace: foo
    API Version: gateway.networking.k8s.io
    Kind: Gateway
    Annotations: networking.gke.io/backend-services: gkegw-service1
                 networking.gke.io/firewalls: gkegw-l7-fw
                 networking.gke.io/forwarding-rules: gkegw-fr1
                 networking.gke.io/health-checks: gkegw-hc1
                 networking.gke.io/ssl-certificates:
                 networking.gke.io/target-proxies: gkegw-tp1
                 networking.gke.io/url-maps: gkegw-url-map1
    
  2. אפשר להגדיר פסילה של תוכן באמצעות כמה כלים להשוואה של פסילה, כולל מארח, נתיב, תגי מטמון, קוד סטטוס של תגובה, סוג MIME וקצה עורפי. לדוגמה, כדי לשלוח את בקשת הביטול באמצעות התאמה של מארח וקוד סטטוס, מריצים את הפקודה הבאה:

    gcloud compute url-maps invalidate-cdn-cache URL_MAP_NAME
        --host="store.example.com" 
        --status=404
    

    מחליפים את URL_MAP_NAME בשם שזוהה בשלב הקודם, לדוגמה, gkegw-url-map1.

מעקב אחרי הביצועים של Cloud CDN

אפשר להשתמש ב-Cloud Logging וב-Cloud Monitoring כדי לעקוב אחרי שיעורי פגיעה במטמון וביצועים.

יומני Cloud CDN משויכים למאזן העומסים שהוקצה על ידי GKE Gateway Controller. היומנים מתווספים לאינדקס לפי כלל ההעברה ומפת כתובות ה-URL של מאזן העומסים. כדי לאחזר יומנים מהזמן האחרון, מריצים את הפקודה הבאה:

gcloud logging read 'resource.type="http_load_balancer" AND 
    resource.labels.url_map_name="URL_MAP_NAME" AND 
    logName="projects/PROJECT_ID/logs/cloudcdn_googleapis_com%2Frequests"' 
    --project PROJECT_ID --limit 100 --format json

‫Cloud CDN מייצא מדדים ל-Cloud Monitoring. אפשר להשתמש במסנן matched_url_path_rule בשאילתות המעקב כדי לצמצם את המדדים ל-HTTPRoute ספציפי.

מידע נוסף על צפייה ביומנים ובנתוני מעקב של Cloud CDN מופיע במאמר יומנים ומדדים של שמירה במטמון.

השבתה של Cloud CDN

כדי להשבית את השמירה במטמון, מסירים את ההפניות ל-GCPHTTPFilter מ-HTTPRoute.

  1. עורכים את קובץ המניפסט של HTTPRoute ומסירים את הבלוק filters שמפנה אל GCPHTTPFilter. בדוגמה הבאה מוצג מניפסט של HTTPRoute עם המסננים שהוסרו:

    kind: HTTPRoute
    apiVersion: gateway.networking.k8s.io/v1
    metadata:
      name: store-external
    spec:
      parentRefs:
      - kind: Gateway
        name: external-http
      hostnames:
      - "store.example.com"
      rules:
      # RULE 1: Default /img/ traffic to store-v1
      - matches:
        - path:
            value: /img/
        backendRefs:
        - name: store-v1
          port: 8080
      # RULE 2: Canary /img/ traffic (header match) to store-v2
      - matches:
        - headers:
          - name: env
            value: canary
          path:
            value: /img/
        backendRefs:
        - name: store-v2
          port: 8080
      # RULE 3: Default (catch-all) traffic to store-v1
      - backendRefs:
        - name: store-v1
          port: 8080
    
  2. מחילים את מניפסט ה-HTTPRoute המעודכן על האשכול:

    kubectl apply -f store-route-external.yaml
    

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