במאמר הזה מוסבר איך להכין את סביבת Google Kubernetes Engine (GKE) כדי להפעיל את בקר GKE Gateway מרובה אשכולות. הבקר הזה הוא בקר באירוח Google שמקצה מאזני עומסים חיצוניים ופנימיים לאשכולות GKE. כדי ללמוד איך להשתמש במשאבי Gateway לאיזון עומסים של קונטיינרים, אפשר לעיין במאמרים פריסת Gateways או פריסת Gateways מרובי-אשכולות.
ה-GKE Gateway Controller מרובה האשכולות מתקין את ה-GatewayClasses מרובי האשכולות הבאים באשכולות:
gke-l7-global-external-managed-mcלשערים גלובליים חיצוניים מרובי-אשכולות-
gke-l7-regional-external-managed-mcfor regional external multi-cluster -
gke-l7-cross-regional-internal-managed-mcלשימוש בשערי גישה פנימיים מרובי אשכולות בין אזורים -
gke-l7-rilb-mcעבור שערים פנימיים אזוריים מרובי אשכולות gke-l7-gxlb-mcלשערים גלובליים חיצוניים קלאסיים מרובי אשכולות
מידע נוסף על היכולות של GatewayClasses שונים ב-GKE
תמחור
כל המשאבים של Compute Engine שנפרסים דרך בקרי השער מחויבים על הפרויקט שבו נמצאים אשכולות ה-GKE. במסגרת התמחור של GKE Standard ו-Autopilot, אפשר להשתמש בבקר Gateway של אשכול יחיד ללא תשלום נוסף. התמחור של שערים מרובי-אשכולות מתואר בדף התמחור של שערים מרובי-אשכולות ו-Multi Cluster Ingress.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
דרישות של GKE Gateway controller
- Gateway API נתמך רק באשכולות VPC-native.
- אם אתם משתמשים ב-GatewayClasses אזוריים או חוצי-אזורים, אתם צריכים להפעיל רשת משנה ל-proxy בלבד.
- צריך להפעיל את התוסף
HttpLoadBalancingבאשכול. - אם אתם משתמשים ב-Istio, אתם צריכים לשדרג את Istio לאחת מהגרסאות הבאות:
- גרסה 1.15.2 ואילך
- 1.14.5 ואילך
- גרסה 1.13.9 ואילך.
- אם משתמשים ב-VPC משותף, צריך להקצות את התפקיד
Compute Network Userלחשבון השירות של GKE בפרויקט המארח של פרויקט השירות.
הדרישות לשימוש בשער מרובה אשכולות
בנוסף לדרישות של בקר GKE Gateway, כדי לפרוס Gateway בכמה אשכולות, צריך לוודא שביצעתם את המשימות הבאות:
- מפעילים את Gateway API באשכול ההגדרות.
- מפעילים איחוד זהויות של עומסי עבודה ל-GKE באשכולות.
- משלימים את הדרישות המוקדמות הכלליות ל-Fleet לרישום האשכולות.
מפעילים בפרויקט את ממשקי ה-API הבאים שנדרשים לשערים מרובי אשכולות:
- Cloud Service Mesh API
- Multi-cluster Services API
- Multi Cluster Ingress API
אם ממשקי ה-API הנדרשים לא מופעלים, מריצים את הפקודה הבאה כדי להפעיל אותם:
gcloud services enable \ trafficdirector.googleapis.com \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ --project=PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט שבו פועלים אשכולות GKE.
הגבלות ומגבלות
המגבלות והבעיות הידועות שחלות על שערים של אשכול יחיד חלות גם על שערים של כמה אשכולות.
בנוסף למגבלות של שערים באשכול יחיד, המגבלות הבאות חלות על שערים מרובי אשכולות:
איזון עומסים בשרתי קצה באזורים שונים אינו נתמך עם ה-GatewayClass
gke-l7-rilb-mcהפנימי האזורי. מידע נוסף על התכונות השונות שנתמכות בכל GatewayClass זמין במאמר יכולות של GatewayClass.לא ניתן להשתמש ב-
Serviceכ-backendRefsעם שער רב-אשכולי. שער מרובה אשכולות תומך רק ב-ServiceImportכ-backendRefsחוקי.כל האשכולות ב-Fleet צריכים להיות בפרויקט המארח של ה-Fleet.
איזון עומסים בין פרויקטים אינו נתמך. כל האשכולות (אשכול ההגדרות ואשכולות היעד) שמצורפים לאותו שער מרובה אשכולות צריכים להיות פרוסים באותו פרויקט מארח של VPC משותף או באותו פרויקט שירות. מידע נוסף על טופולוגיות נתמכות של VPC משותף עם Multi-cluster Gateway זמין במאמר שימוש ב-Multi-cluster Gateway עם VPC משותף.
איזון עומסים בין רשתות VPC אינו נתמך. כל האשכולות (אשכול ההגדרה ואשכולות היעד) שמצורפים לאותו שער רב-אשכולי צריכים להיות פרוסים באותו VPC.
שער מרובה אשכולות מסתמך על MCS לטיפול בגילוי שירותים בין אשכולות. לכן, השירותים ששער מרובה אשכולות חושף כפופים לכל הדרישות של שירות מרובה אשכולות.
יכול להיות ששערי Multi-cluster Gateways ידליפו משאבים של מאזני עומסים בתרחישים הבאים:
- התכונה Fleet ingress עודכנה עם אשכול הגדרות חדש
שלא כולל את כל המשאבים של
Gatewayשקיימים באשכול ההגדרות הנוכחי. - התכונה Fleet ingress מושבתת בזמן שמשאבי
Gatewayשמפנים ל-GatewayClassמרובה אשכולות קיימים באשכול התצורה.
- התכונה Fleet ingress עודכנה עם אשכול הגדרות חדש
שלא כולל את כל המשאבים של
שער מרובה אשכולות פועל כשירות גלובלי. אם בקר שער מרובה-אשכולות נתקל בכשל ברמת הבקרה של Fleet (Hub) אזורי, הוא מגיב בכשל סטטי ולא מבצע שינויים נוספים במאזן העומסים עד שהאזור חוזר לפעולה.
מכסות
GKE Gateway משתמש במכסות של Cloud Load Balancing כדי להגביל את מספר המשאבים ש-Gateway Controller יכול ליצור כדי לנהל תעבורת נכנסת שמנותבת לאשכולות GKE.
הגדרת הסביבה לשערים מרובי אשכולות
כדי להשלים את הדוגמאות במאמר פריסת שערים מרובי-אשכולות, צריך כמה אשכולות GKE. כל האשכולות רשומים לאותו צי, כך ששערי כניסה ושירותים מרובי-אשכולות יכולים לפעול ביניהם.
בשלבים הבאים נפרסים שלושה אשכולות GKE בשני אזורים שונים בפרויקט:
us-west1-a/gke-west-1us-west1-a/gke-west-2us-east1-b/gke-east-1
תיצור את טופולוגיית האשכול הבאה:
אשכולות GKE האלה משמשים להדגמה של איזון עומסים במספר אזורים ושל פיצול תנועה בין כמה אשכולות בשיטת Blue-Green באמצעות שערים חיצוניים ופנימיים.
פריסת אשכולות
בשלבים האלה תפרסו שלושה אשכולות GKE באזורים us-east1 ו-us-west1.
האשכולות יירשמו בFleet של הפרויקט. קיבוץ של אשכולות GKE בצי מאפשר להגדיר שער מרובה אשכולות שיפנה אליהם.
יצירת אשכול GKE ב-
us-west1בשםgke-west-1:gcloud container clusters create gke-west-1 \ --gateway-api=standard \ --location=us-west1-a \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_IDמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט שבו פועלים אשכולות GKE. -
VERSION: גרסת GKE, 1.24 ואילך.
-
יוצרים עוד אשכול GKE ב-
us-west1(או באותו אזור כמו האשכול הקודם) בשםgke-west-2:gcloud container clusters create gke-west-2 \ --gateway-api=standard \ --location=us-west1-a \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_IDיוצרים אשכול GKE ב-
us-east1(או באזור ששונה מהאזור הקודם) בשםgke-east-1gcloud container clusters create gke-east-1 \ --gateway-api=standard \ --location=us-east1-b \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_IDמוודאים שהאשכולות נרשמו בהצלחה ב-Fleet:
gcloud container fleet memberships list --project=PROJECT_IDהפלט ייראה בערך כך:
NAME EXTERNAL_ID LOCATION gke-east-1 45a80b37-4b00-49aa-a68b-b430fce1e3f0 us-east1 gke-west-2 ac7087a5-f5ee-401e-b430-57f3af141239 us-west1 gke-west-1 549efe3a-b18e-4eb9-8796-e50b7967cde2 us-west1
הגדרת פרטי הכניסה של האשכול
בשלב הזה מגדירים פרטי כניסה לאשכול עם שמות קלים לזכירה. כך קל יותר לעבור בין אשכולות כשפורסים משאבים בכמה אשכולות.
מאחזרים את פרטי הכניסה לאשכולות
gke-west-1,gke-west-2ו-gke-east-1:gcloud container clusters get-credentials gke-west-1 --location=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-west-2 --location=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-east-1 --location=us-east1-b --project=PROJECT_IDהפרטים האלה נשמרים באופן מקומי כדי שתוכלו להשתמש בלקוח kubectl כדי לגשת לשרתי ה-API של האשכול. כברירת מחדל, המערכת יוצרת שם באופן אוטומטי לפרטי הכניסה.
משנים את השמות של ההקשרים של האשכול כדי שיהיה קל יותר להתייחס אליהם בהמשך:
kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-1 gke-west-1 kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-2 gke-west-2 kubectl config rename-context gke_PROJECT_ID_us-east1-b_gke-east-1 gke-east-1מחליפים את
PROJECT_IDבמזהה הפרויקט שבו נפרסו האשכולות.
הפעלת שירותים מרובי אשכולות בצי
מפעילים שירותים מרובי אשכולות ב-Fleet עבור האשכולות הרשומים. הפעולה הזו מפעילה את בקר ה-MCS בשלושת האשכולות שרשומים בצי שלכם, כדי שהוא יוכל להתחיל להאזין לשירותים ולייצא אותם.
gcloud container fleet multi-cluster-services enable \ --project PROJECT_IDצריך להעניק הרשאות לניהול זהויות והרשאות גישה (IAM) שנדרשות לבקר MCS:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \ --role "roles/compute.networkViewer" \ --project=PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט שבו נפרסו האשכולות.מוודאים ש-MCS מופעל באשכולות הרשומים. יוצגו חברויות בשלושת האשכולות הרשומים. יכול להיות שיחלפו כמה דקות עד שכל האשכולות יופיעו.
gcloud container fleet multi-cluster-services describe --project=PROJECT_IDהפלט אמור להיראות כך:
createTime: '2023-10-12T06:14:33.466903587Z' membershipStates: projects/441323991697/locations/us-east1/memberships/gke-east-1: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:28.395318091Z' projects/441323991697/locations/us-west1/memberships/gke-west-1: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:30.534594027Z' projects/441323991697/locations/us-west1/memberships/gke-west-2: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:29.110582109Z' name: projects/pierre-louis-playground/locations/global/features/multiclusterservicediscovery resourceState: state: ACTIVE spec: {} updateTime: '2023-10-12T06:15:31.027276757Z'
הפעלת שער מרובה אשכולות בצי
ה-GKE Gateway controller מרובה האשכולות שולט בפריסה של שערים מרובי אשכולות.
כשמפעילים את בקר שער מרובה אשכולות, צריך לבחור את אשכול ההגדרות. אשכול ההגדרות הוא אשכול GKE שבו נפרסים משאבי ה-Gateway (Gateway, Routes, Policies). זהו מקום מרכזי שבו אפשר לשלוט בניתוב בין האשכולות. כדי להחליט איזה אשכול לבחור כאשכול ההגדרות, אפשר לעיין במאמר בנושא הגדרת עיצוב האשכול.
מפעילים את השער מרובה האשכולות ומציינים את אשכול ההגדרות בצי. שימו לב: תמיד אפשר לעדכן את אשכול התצורה במועד מאוחר יותר. בדוגמה הזו,
gke-west-1הוא אשכול ההגדרות שיארח את המשאבים של שערים מרובי אשכולות.gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \ --project=PROJECT_IDהקצאת הרשאות לניהול זהויות והרשאות גישה (IAM) שנדרשות לבקר של Multi-cluster Gateway:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \ --role "roles/container.admin" \ --project=PROJECT_IDמחליפים את
PROJECT_IDואתPROJECT_NUMBERבמזהה הפרויקט ובמספר הפרויקט שבהם הפריסה של האשכולות מתבצעת.מוודאים שהבקר של GKE Gateway מופעל בצי שלכם:
gcloud container fleet ingress describe --project=PROJECT_IDהפלט אמור להיראות כך:
createTime: '2023-10-12T06:23:06.732858524Z' membershipStates: projects/441323991697/locations/us-east1/memberships/gke-east-1: state: code: OK updateTime: '2023-10-12T06:30:08.815839024Z' projects/441323991697/locations/us-west1/memberships/gke-west-1: state: code: OK updateTime: '2023-10-12T06:30:08.815837031Z' projects/441323991697/locations/us-west1/memberships/gke-west-2: state: code: OK updateTime: '2023-10-12T06:30:08.815840985Z' name: projects/pierre-louis-playground/locations/global/features/multiclusteringress resourceState: state: ACTIVE spec: multiclusteringress: configMembership: projects/pierre-louis-playground/locations/us-west1/memberships/gke-west-1 state: state: code: OK description: Ready to use updateTime: '2023-10-12T06:23:51.317464415Z' updateTime: '2023-10-12T06:30:09.439319551Z'מוודאים שרכיבי GatewayClasses קיימים באשכול התצורה:
kubectl get gatewayclasses --context=gke-west-1הפלט אמור להיראות כך:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 78m gke-l7-global-external-managed-mc networking.gke.io/gateway True 4m22s gke-l7-gxlb networking.gke.io/gateway True 78m gke-l7-gxlb-mc networking.gke.io/gateway True 4m23s gke-l7-regional-external-managed networking.gke.io/gateway True 78m gke-l7-regional-external-managed-mc networking.gke.io/gateway True 4m22s gke-l7-rilb networking.gke.io/gateway True 78m gke-l7-rilb-mc networking.gke.io/gateway True 4m22sהפלט הזה כולל את GatewayClass gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-gxlb-mc עבור שערים חיצוניים מרובי-אשכולות ואת GatewayClass gke-l7-rilb-mc עבור שערים פנימיים מרובי-אשכולות.
מעבירים את ההקשר של kubectl לאשכול ההגדרות:
kubectl config use-context gke-west-1
עכשיו אפשר להתחיל לפרוס שערים מרובי אשכולות באשכול ההגדרות.
שימוש בשער מרובה אשכולות עם VPC משותף
אפשר גם לפרוס שער רב-אשכולות בסביבת VPC משותף, עם טופולוגיות שונות, בהתאם לתרחיש השימוש.
בטבלה הבאה מתוארות הטופולוגיות הנתמכות של שערים מרובי-אשכולות בסביבת VPC משותף:
| תרחיש | פרויקט המארח של ה-Fleet | אשכול הגדרות | אשכולות של עומסי עבודה |
|---|---|---|---|
| 1 | פרויקט מארח של VPC משותף | פרויקט מארח של VPC משותף | פרויקט מארח של VPC משותף |
| 2 | פרויקט שירות של VPC משותף | פרויקט שירות VPC משותף (זהה לפרויקט שירות של צי) |
פרויקט שירות VPC משותף (זהה לפרויקט שירות של צי) |
כדי ליצור שערים מרובי-אשכולות בסביבת VPC משותפת, מבצעים את השלבים הבאים:
פועלים לפי השלבים להגדרת שירותים מרובי אשכולות עם VPC משותף.
יוצרים ומייצאים את השירותים לאשכול התצורה.
אם אתם מתכננים להשתמש בשער פנימי מרובה אשכולות, צריך ליצור רשת משנה של proxy בלבד.
אחרי שמסיימים את השלבים האלה, אפשר לאמת את הפריסה, בהתאם לטופולוגיה.
פתרון בעיות
בקטע הזה מוסבר איך לפתור בעיות שקשורות להפעלת בקר Gateway מרובה אשכולות.
GatewayClasses לא זמינים באשכול התצורה
יכול להיות שתקבלו את השגיאה הבאה כשמריצים את הפקודה
kubectl get gatewayclasses:
error: the server doesn't have a resource type "gatewayclasses"
כדי לפתור את הבעיה, צריך להתקין את Gateway API באשכול:
gcloud container clusters update CLUSTER_NAME \
--gateway-api=standard \
--location=CONTROL_PLANE_LOCATION
מחליפים את מה שכתוב בשדות הבאים:
-
CLUSTER_NAME: השם של האשכול. -
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
בקר Multi-cluster Gateway לא מופעל
אם מפעילים את Gateway API באשכול התצורה וכוללים את ה-CRD אחרי הפעלת התכונה Fleet ingress, יכול להיות שבקר השער מרובה האשכולות לא יופעל.
כדי להימנע מהבעיה הזו, צריך להפעיל את Gateway API לפני שמפעילים את Fleet ingress. עם זאת, אם כבר הפעלתם את Fleet ingress, תוכלו לפתור את הבעיה על ידי השבתה והפעלה מחדש של Fleet ingress:
משביתים את התכונה Fleet ingress:
gcloud container fleet ingress disableמפעילים את התכונה Fleet ingress:
gcloud container fleet ingress enable \ --config-membership=CONFIG_MEMBERSHIP \ --project=PROJECT_ID
מחליפים את מה שכתוב בשדות הבאים:
- CONFIG_MEMBERSHIP: המזהה של החברות או מזהה מלא של החברות. לדוגמה,
projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1. - PROJECT_ID: מזהה הפרויקט שבו פועלים אשכולות GKE.
המאמרים הבאים
- איך פורסים שער חיצוני מרובה אשכולות
- פריסת שער פנימי מרובה אשכולות.
- פריסת שער מרובה אשכולות לחלוקת תנועה משוקללת.
- פריסת שער מרובה אשכולות לאיזון עומסים מבוסס-קיבולת.