הגדרה של 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.

מידע נוסף על פריסת תעבורת נתונים נכנסת (ingress) של אשכול מרובה זמין במאמר פריסת תעבורת נתונים נכנסת (ingress) באשכולות.

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

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

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

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

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

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

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

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

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

  • צריך להפעיל את התוסף HttpLoadBalancing באשכולות. התוסף הזה מופעל כברירת מחדל. אסור להשבית את התוסף הזה כי הוא מנהל את בקר תעבורת הנתונים הנכנסת (ingress), שנדרש כדי שתעבורת נתונים נכנסת (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 זמניות.

סקירה כללית

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

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

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

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

בתרשים, יש שני אשכולות GKE בשמות gke-us ו-gke-eu באזורים europe-west1 ו-us-central1. האשכולות רשומים ב-Fleet כדי שבקר 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 פורס את ה-gke-mcs-importer Pod באשכול.

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

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

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

מפעילים את Multi Cluster Ingress (תעבורת נתונים נכנסת (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 בפרויקטים שונים שמשתמשים באותו VIP של 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 for field config_membership

יש בעיה ידועה שמונעת מ-Google Cloud CLI אינטראקציה עם Multi Cluster Ingress. הבעיה הזו הופיעה בגרסה 346.0.0 ותוקנה בגרסה 348.0.0. אנחנו לא ממליצים להשתמש בגרסאות 346.0.0 ו-347.0.0 של gcloud CLI עם 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"}}]'

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