הגדרה של Multi Cluster Ingress

בדף הזה נסביר איך לנתב תעבורה בין כמה אשכולות Google Kubernetes Engine ‏ (GKE) באזורים שונים באמצעות Multi Cluster Ingress. נציג גם דוגמה לשימוש בשני אשכולות.

השוואה מפורטת בין Multi Cluster Ingress ‏ (MCI),‏ Multi-cluster Gateway ‏(MCG) ומאזן עומסים עם Standalone Network Endpoint Groups ‏ (LB ו-Standalone NEGs) זמינה במאמר בחירת API לאיזון עומסים בין כמה אשכולות ב-GKE.

מידע נוסף על פריסת Multi Cluster Ingress זמין במאמר פריסת Ingress באשכולות.

כדי לבצע את השלבים האלה, צריך הרשאות גבוהות, ואדמין של GKE צריך לבצע אותם.

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

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

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

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

יש דרישות מסוימות לשימוש ב-Multi Cluster Ingress.

  • דרישות לגבי גרסת Google Cloud CLI:

    ‫Multi Cluster Ingress נתמך ב-CLI של Google Cloud בגרסה 290.0.0 ואילך. עם זאת, כדי לרשום את האשכולות שלכם לצי, אתם צריכים להשתמש ב-Google Cloud CLI בגרסה 450.0.0 ומעלה. לכן, לפני שמצרפים את האשכולות לצי, צריך לוודא שגרסת Google Cloud CLI שמותקנת אצלכם היא 450.0.0 ומעלה. מידע נוסף זמין במאמר התקנת Google Cloud CLI.

אם אתם משתמשים באשכולות במצב רגיל, אתם צריכים לוודא שאתם עומדים בדרישות הבאות. אשכולות Autopilot כבר עומדים בדרישות האלה.

  • צריך להפעיל את התוסף HttpLoadBalancing באשכולות. התוסף הזה מופעל כברירת מחדל. אסור להשבית אותו כי התוסף הזה מנהל את בקר ה-Ingress, שנדרש כדי ש-Multi Cluster Ingress תפעל.
  • האשכולות צריכים להיות מותאמים ל-VPC.
  • צריך להפעיל באשכולות את התכונה איחוד זהויות של עומסי עבודה ל-GKE.

ל-Multi Cluster Ingress יש את המגבלות הבאות:

  • התמיכה קיימת רק במאזן עומסים חיצוני של אפליקציות (ALB).
  • אל תיצרו מאזני עומסים של Compute Engine באותו פרויקט עם הקידומת mci- שלא מנוהלים על ידי Multi Cluster Ingress, אחרת הם יימחקו. Google Cloud משתמש בקידומת mci-[6 char hash] כדי לנהל את המשאבים של Compute Engine שנפרסים על ידי Multi Cluster Ingress.
  • כדי להגדיר HTTPS, צריך להקצות מראש כתובת IP סטטית. HTTPS לא אפשרי עם כתובות IP זמניות.

סקירה כללית

בשיעור ה-Lab הזה תבצעו את השלבים הבאים:

  1. בוחרים את התמחור שבו רוצים להשתמש.
  2. פריסת אשכולות.
  3. הגדרת פרטי הכניסה של האשכול.
  4. רישום האשכולות ל-Fleet.
  5. מציינים אשכול הגדרות. האשכול הזה יכול להיות מישור בקרה ייעודי, או שהוא יכול להריץ עומסי עבודה אחרים.

בתרשים הבא מוצג איך הסביבה תיראה אחרי שתשלימו את התרגיל:

טופולוגיית אשכול שמציגה את הקשרים בין אזורים, צי ופרויקט.

בתרשים, יש שני אשכולות GKE בשמות gke-us ו-gke-eu באזורים europe-west1 ו-us-central1. האשכולות רשומים בצי כדי שבקר Multi Cluster Ingress יוכל לזהות אותם. צי מאפשר לקבץ ולנרמל את אשכולות GKE באופן לוגי, וכך מפשט את ניהול התשתית ומאפשר שימוש בתכונות של ריבוי אשכולות, כמו Multi Cluster Ingress. מידע נוסף על היתרונות של צי מכשירים ועל אופן היצירה שלהם זמין בתיעוד לניהול צי מכשירים.

הפעלת ממשקי ה-API

מפעילים את ממשקי ה-API הנדרשים בפרויקט:

gcloud services enable \
    multiclusteringress.googleapis.com \
    gkehub.googleapis.com \
    container.googleapis.com \
    multiclusterservicediscovery.googleapis.com \
    --project=PROJECT_ID

פריסת אשכולות

יוצרים שני אשכולות GKE בשמות gke-us ו-gke-eu באזורים europe-west1 ו-us-central1.

טייס אוטומטי

  1. יוצרים את אשכול gke-us באזור us-central1:

    gcloud container clusters create-auto gke-us \
        --location=us-central1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud.

  2. יוצרים את אשכול gke-eu באזור europe-west1:

    gcloud container clusters create-auto gke-eu \
        --location=europe-west1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

רגילה

יוצרים את שני האשכולות עם איחוד זהויות של עומסי עבודה ל-GKE מופעל.

  1. יוצרים את אשכול gke-us באזור us-central1:

    gcloud container clusters create gke-us \
        --location=us-central1 \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud.

  2. יוצרים את אשכול gke-eu באזור europe-west1:

    gcloud container clusters create gke-eu \
        --location=europe-west1 \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

הגדרת פרטי הכניסה של האשכול

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

  1. מאחזרים את פרטי הכניסה של האשכולות:

    gcloud container clusters get-credentials gke-us \
        --location=us-central1 \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --location=europe-west1 \
        --project=PROJECT_ID
    

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

  2. משנים את השם של ההקשרים של האשכול:

    kubectl config rename-context gke_PROJECT_ID_us-central1_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1_gke-eu gke-eu
    

רישום אשכולות ב-Fleet

כך רושמים את האשכולות ב-Fleet של הפרויקט.

  1. רושמים את האשכולות:

    gcloud container fleet memberships register gke-us \
        --gke-cluster us-central1/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-eu \
        --gke-cluster europe-west1/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. מוודאים שהאשכולות נרשמו בהצלחה בצי:

    gcloud container fleet memberships list --project=PROJECT_ID
    

    הפלט אמור להיראות כך:

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

אחרי שרושמים את האשכולות, GKE פורס את ה-Pod gke-mcs-importerבאשכול.

מידע נוסף על רישום אשכולות זמין במאמר רישום אשכול GKE לצי.

ציון אשכול הגדרות

אשכול התצורה הוא אשכול GKE שבוחרים בו כנקודת הבקרה המרכזית של Ingress באשכולות החברים. האשכול הזה צריך להיות רשום כבר ב-Fleet. מידע נוסף זמין במאמר בנושא הגדרת עיצוב אשכול.

מפעילים את Multi Cluster Ingress ובוחרים באפשרות gke-us בתור אשכול ההגדרות:

gcloud container fleet ingress enable \
    --config-membership=gke-us \
    --location=us-central1 \
    --project=PROJECT_ID

תהליך הרישום של אשכול ההגדרות נמשך עד 15 דקות. פלט מוצלח ייראה כך:

Waiting for Feature to be created...done.
Waiting for controller to start...done.

הפלט של ניסיון לא מוצלח ייראה כך:

Waiting for controller to start...failed.
ERROR: (gcloud.container.fleet.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.

אם אירע כשל בשלב הקודם, צריך לבדוק את מצב התכונה:

gcloud container fleet ingress describe \
    --project=PROJECT_ID

הפלט של פעולה מוצלחת ייראה כך:

createTime: '2021-02-04T14:10:25.102919191Z'
membershipStates:
 projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
 state:
   code: ERROR
   description: '...is not a VPC-native GKE Cluster.'
   updateTime: '2021-08-10T13:58:50.298191306Z'
 projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
 state:
   code: OK
   updateTime: '2021-08-10T13:58:08.499505813Z'

במאמר הזה מוסבר איך לפתור בעיות שקשורות ל-Multi Cluster Ingress.

ההשפעה על אשכולות פעילים

אפשר להפעיל בבטחה את Multi Cluster Ingress באמצעות gcloud container fleet ingress enable באשכול פעיל, כי הפעולה הזו לא גורמת להשבתה או להשפעה על התנועה באשכול.

VPC משותף

אפשר לפרוס משאב MultiClusterIngress לאשכולות ברשת VPC משותפת, אבל כל אשכולות ה-GKE של ה-Backend שמשתתפים צריכים להיות באותו פרויקט. אין תמיכה באשכולות GKE בפרויקטים שונים שמשתמשים באותו כתובת IP וירטואלית של Cloud Load Balancing.

ברשתות VPC לא משותפות, בקר Multi Cluster Ingress מנהל את כללי חומת האש כדי לאפשר לבדיקות התקינות לעבור ממאזן העומסים לעומסי העבודה של הקונטיינרים.

ברשת VPC משותפת, אדמין של פרויקט מארח צריך ליצור באופן ידני את כללי חומת האש לתנועה של איזון עומסים בשם בקר Multi Cluster Ingress.

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

אם האשכולות שלכם נמצאים ברשת VPC משותפת, צריך ליצור את כלל חומת האש:

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --project=HOST_PROJECT \
    --network=SHARED_VPC \
    --direction=INGRESS \
    --allow=tcp:0-65535 \
    --source-ranges=130.211.0.0/22,35.191.0.0/16

מחליפים את מה שכתוב בשדות הבאים:

  • FIREWALL_RULE_NAME: השם של כלל חומת האש החדש שבוחרים.
  • HOST_PROJECT: מזהה הפרויקט המארח של ה-VPC המשותף.
  • SHARED_VPC: השם של רשת ה-VPC המשותפת.

בעיות מוכרות

בקטע הזה מתוארות בעיות מוכרות ב-Multi Cluster Ingress

InvalidValueError בשדה config_membership

בעיה ידועה מונעת מ-Google Cloud CLI ליצור אינטראקציה עם Multi Cluster Ingress. הבעיה הזו הופיעה בגרסה 346.0.0 ותוקנה בגרסה 348.0.0. אנחנו לא ממליצים להשתמש בגרסאות 346.0.0 ו-347.0.0 של ה-CLI של gcloud עם Multi Cluster Ingress.

ערך לא תקין בשדה 'resource'

‫Google Cloud Armor לא יכול לתקשר עם Multi Cluster Ingress config clusters שפועלים בגרסאות GKE הבאות:

  • ‫1.18.19-gke.1400 ואילך
  • ‫1.19.10-gke.700 ואילך
  • ‫1.20.6-gke.700 ואילך

כשמגדירים מדיניות אבטחה ב-Google Cloud Armor, מופיעה ההודעה הבאה:

Invalid value for field 'resource': '{"securityPolicy": "global/securityPolicies/"}': The given policy does not exist

כדי למנוע את הבעיה הזו, צריך לשדרג את אשכול התצורה לגרסה 1.21 ואילך, או להשתמש בפקודה הבאה כדי לעדכן את BackendConfig CustomResourceDefinition:

kubectl patch crd backendconfigs.cloud.google.com --type='json' -p='[{"op": "replace", "path": "/spec/versions/1/schema/openAPIV3Schema/properties/spec/properties/securityPolicy", "value":{"properties": {"name": {"type": "string"}}, "required": ["name" ],"type": "object"}}]'

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