במאמר הזה מוסבר איך להשתמש בבקר של 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:
הארכיטקטורה הזו מאפשרת לכם להגדיר ניהול גרנולרי ואוטומטי של שמירה במטמון קצה. ההגדרה 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 לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
תפקידים והרשאות
כדי לראות את המשאבים Google Cloud שהוגדרו, צריך לוודא שיש לכם
roles/compute.networkViewerתפקיד IAM.מוודאים שיש לכם גישה לאשכול 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