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

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

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

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

סקירה כללית

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

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

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

  • מצבי מטמון: קובעים איך Cloud CDN שומר במטמון תשובות מהמקור.
  • הגדרת אורך חיים (TTL): קביעת משך הזמן שבו האובייקטים נשארים במטמון.
  • מפתחות מטמון: הגדרה של האלמנטים בבקשה (כותרות, קובצי Cookie, מחרוזות שאילתה) שמשמשים ליצירת מפתחות מטמון.
  • negative caching: שמירה במטמון של תשובות שגיאה נפוצות או הפניות לכתובת אחרת כדי להפחית את עומס המקור במהלך כשלים.
  • מדיניות שמירה במטמון: קובעת איך 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 למשימה הזו, צריך להתקין ואז לאתחל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

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

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

  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
    

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