במאמר הזה מוסבר איך להשתמש בבקר של 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:
הארכיטקטורה הזו מאפשרת לכם להגדיר ניהול גרנולרי ואוטומטי של שמירת נתונים במטמון בפריפריה. ההגדרה 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 לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
תפקידים והרשאות
כדי להציג משאבים שהוגדרו, צריך לוודא שיש לכם
roles/compute.networkViewerתפקיד IAM. Cloud de Confianceחשוב לוודא שיש לכם גישה לאשכול 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.
- המסנן השלישי משמש כ'מסנן כללי' לתנועת הגולשים שנותרה.
יוצרים את המסנן הראשון על ידי שמירת המניפסט הבא בשם
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).
-
יוצרים את המסנן השני. שומרים את קובץ המניפסט הבא בשם
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 שעות.
-
יוצרים מסנן שלישי כדי להגדיר מדיניות ברירת מחדל של שמירת נתונים במטמון ללא פרמטרים. שומרים את קובץ המניפסט הבא בשם
store-caching-default-filter.yaml:apiVersion: networking.gke.io/v1 kind: GCPHTTPFilter metadata: name: store-caching-default-filter spec: cachePolicy: {}אם לא מציינים פרמטרים במשאב GCPHTTPFilter, GKE משתמש בערכי ברירת המחדל של הנתונים שנשמרים במטמון.
החלת המסננים על האשכול:
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 כדי להחיל כללי שמירה במטמון באופן עקבי. אפשר גם להשתמש שוב באותו מסנן בכללים שונים, למשל כשמפצלים את התנועה בין גרסאות שונות של קצה העורפי במהלך השקה הדרגתית.
משנים את קובץ המניפסט הקיים של 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מחילים את ההגדרה המעודכנת של HTTPRoute על האשכול:
kubectl apply -f store-route-external.yamlמוודאים ש-HTTPRoute ו-Gateway נפרסו:
kubectl describe httproute store-external kubectl describe gateway external-httpבפלט אפשר לראות ש-Cloud CDN מופעל עבור משאב ה-HTTPRoute. Cloud CDN מחיל את מדיניות הקאשינג שהוגדרה על התעבורה שלכם ומאיץ את ההצגה של תמונות סטטיות, נכסי אינטרנט ותעבורה אחרת.
ביטול תוקף של תוכן שנשמר במטמון
כדי לנקות תוכן מיושן מהמטמון, צריך לשלוח בקשת ביטול. מידע מפורט על אופן הפעולה של ביטול התוקף זמין במאמר ביטול התוקף של תוכן שנשמר במטמון במאמרי העזרה של Cloud CDN.
מוצאים את מיפוי כתובות ה-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אפשר להגדיר פסילה של תוכן באמצעות כמה כלים להשוואה של פסילה, כולל מארח, נתיב, תגי מטמון, קוד סטטוס של תגובה, סוג 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.
עורכים את קובץ המניפסט של 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מחילים את מניפסט ה-HTTPRoute המעודכן על האשכול:
kubectl apply -f store-route-external.yaml
המאמרים הבאים
- מומלץ לקרוא סקירה כללית על Cloud CDN.
- כדאי לקרוא את השיטות המומלצות להצגת תוכן.
- פתרון בעיות ב-Cloud CDN
- מידע על היכולות של GatewayClass