הגדרת רשת מרובת אשכולות מחוץ ל-Google Cloud
במדריך הזה מוסבר איך להגדיר רשת מרובת אשכולות בפלטפורמות הבאות:
- Google Distributed Cloud
- Google Distributed Cloud
- GKE ב-Azure
- GKE ב-AWS
- אשכולות מצורפים, כולל אשכולות Amazon EKS ואשכולות Microsoft AKS
במדריך הזה מוסבר איך להגדיר שני אשכולות, אבל אפשר להרחיב את התהליך הזה כדי לשלב כל מספר של אשכולות ברשת.
לפני שמתחילים
במדריך הזה אנחנו מניחים שהתקנתם את Cloud Service Mesh באמצעות asmcli install. צריך את asmcli ואת חבילת ההגדרות שasmcli מוריד לספרייה שציינתם ב---output_dir כשמריצים את asmcli install.
אם צריך להגדיר את המערכת, פועלים לפי השלבים במאמר התקנת כלים תלויי-הקשר ואימות האשכול כדי:
צריכה להיות לכם גישה לקובצי kubeconfig של כל האשכולות שאתם מגדירים ברשת.
הגדרה של משתני סביבה ושל placeholder
כשמתקינים את שער east-west, צריך להגדיר את משתני הסביבה הבאים.
יוצרים משתנה סביבה למספר הפרויקט. בפקודה הבאה, מחליפים את FLEET_PROJECT_ID במזהה הפרויקט של פרויקט המארח של ה-Fleet.
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")יוצרים משתנה סביבה למזהה הרשת.
export MESH_ID="proj-${PROJECT_NUMBER}"יוצרים משתני סביבה לשמות האשכולות בפורמט שנדרש ב-
asmcli.export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"כדי לקבל את שם ההקשר של האשכולות, משתמשים בערכים שמופיעים בעמודה
NAMEבפלט של הפקודה הזו:kubectl config get-contexts
מגדירים את משתני הסביבה לשמות של הקשרים של האשכול, שבהם נעשה שימוש בהמשך המדריך הזה:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
התקנה של שער מזרח-מערב
בפקודות הבאות:
מחליפים את
CLUSTER_NAME_1ואתCLUSTER_NAME_2בשמות של האשכולות.מחליפים את
PATH_TO_KUBECONFIG_1ואתPATH_TO_KUBECONFIG_2בקובצי ה-kubeconfig של האשכולות.
אשכולות Anthos
רשות CA של רשת Mesh או שירות CA
מתקינים שער באשכול 1 שמוקדש לתעבורה ממזרח למערב אל
$CLUSTER_2. כברירת מחדל, השער הזה יהיה ציבורי באינטרנט. יכול להיות שבמערכות ייצור יידרשו הגבלות גישה נוספות, למשל כללי חומת אש, כדי למנוע מתקפות חיצוניות.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -מתקינים שער ב-
$CLUSTER_2שמוקדש לתעבורת נתונים מזרח-מערב עבור$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Istio CA
מתקינים שער באשכול 1 שמוקדש לתעבורה ממזרח למערב אל
$CLUSTER_2. כברירת מחדל, השער הזה יהיה ציבורי באינטרנט. יכול להיות שבמערכות ייצור יידרשו הגבלות גישה נוספות, למשל כללי חומת אש, כדי למנוע מתקפות חיצוניות.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -מתקינים שער ב-
$CLUSTER_2שמוקדש לתעבורת נתונים מזרח-מערב עבור$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS וקבצים מצורפים
Mesh CA
מתקינים שער באשכול 1 שמוקדש לתעבורה ממזרח למערב אל
$CLUSTER_2. כברירת מחדל, השער הזה יהיה ציבורי באינטרנט. יכול להיות שבמערכות ייצור יידרשו הגבלות גישה נוספות, למשל כללי חומת אש, כדי למנוע מתקפות חיצוניות.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -מתקינים שער ב-
$CLUSTER_2שמוקדש לתעבורת נתונים מזרח-מערב עבור$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
מתקינים שער באשכול 1 שמוקדש לתעבורה ממזרח למערב אל
$CLUSTER_2. כברירת מחדל, השער הזה יהיה ציבורי באינטרנט. יכול להיות שבמערכות ייצור יידרשו הגבלות גישה נוספות, למשל כללי חומת אש, כדי למנוע מתקפות חיצוניות.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -מתקינים שער ב-
$CLUSTER_2שמוקדש לתעבורת נתונים מזרח-מערב עבור$CLUSTER_1.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1282-4 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
חשיפת שירותים
מכיוון שהאשכולות נמצאים ברשתות נפרדות, צריך לחשוף את כל השירותים (*.local) בשער מזרח-מערב בשני האשכולות. למרות שהשער הזה הוא ציבורי באינטרנט, אפשר לגשת לשירותים שמאחוריו רק באמצעות שירותים עם אישור mTLS מהימן ומזהה עומס עבודה, בדיוק כמו שהם היו באותה רשת.
חשיפת שירותים דרך שער מזרח-מערב עבור
CLUSTER_NAME_1.kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yamlחשיפת שירותים דרך שער מזרח-מערב עבור
CLUSTER_NAME_2.kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
הפעלת גילוי נקודות קצה
מריצים את הפקודה asmcli create-mesh כדי להפעיל את גילוי נקודות הקצה. בדוגמה הזו מוצגים רק שני אשכולות, אבל אפשר להריץ את הפקודה כדי להפעיל את איתור נקודות הקצה באשכולות נוספים, בכפוף למכסת השירות של GKE Hub.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
אימות הקישוריות בין כמה אשכולות
בקטע הזה מוסבר איך פורסים את שירותי הדוגמה HelloWorld ו-Sleep בסביבה מרובת אשכולות כדי לוודא שאיזון העומסים בין האשכולות פועל.
הפעלת החדרת sidecar
מאתרים את הערך של תווית הגרסה, שבו תשתמשו בשלבים הבאים.
משתמשים בפקודה הבאה כדי לאתר את תווית הגרסה, שבה תשתמשו בשלבים הבאים.
kubectl -n istio-system get pods -l app=istiod --show-labels
הפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
בפלט, בעמודה LABELS, שימו לב לערך של istiodתווית הגרסה, שמופיע אחרי התחילית istio.io/rev=. בדוגמה הזו, הערך הוא asm-173-3. משתמשים בערך של הגרסה בשלבים שבקטע הבא.
התקנת השירות HelloWorld
יוצרים את מרחב השמות לדוגמה ואת הגדרת השירות בכל אשכול. בפקודה הבאה, מחליפים את REVISION ב
istiodתווית הגרסה שרשמתם בשלב הקודם.for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite doneכאשר REVISION היא תווית הגרסה
istiodשרשמתם קודם.הפלט שיתקבל:
label "istio-injection" not found. namespace/sample labeled
אפשר להתעלם מההודעה
label "istio-injection" not found.יוצרים את השירות HelloWorld בשני האשכולות:
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n samplekubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
פריסת HelloWorld v1 ו-v2 לכל אשכול
פריסת
HelloWorld v1אלCLUSTER_1ופריסתv2אלCLUSTER_2, כדי שיהיה קל יותר לאמת מאוחר יותר את איזון העומסים בין האשכולות:kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n samplekubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sampleמריצים את הפקודות הבאות כדי לוודא ש-
HelloWorld v1ו-v2פועלים. מוודאים שהפלט דומה לזה שמוצג.:kubectl get pod --context=${CTX_1} -n sampleNAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sampleNAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
פריסת שירות השינה
פורסים את שירות
Sleepבשני האשכולות. ה-Pod הזה יוצר תנועת רשת מלאכותית למטרות הדגמה:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample doneממתינים עד שהשירות
Sleepיופעל בכל אשכול. מוודאים שהפלט דומה לזה שמוצג:kubectl get pod --context=${CTX_1} -n sample -l app=sleepNAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleepNAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
אימות איזון עומסים בין אשכולות
מתקשרים לשירות HelloWorld כמה פעמים ובודקים את הפלט כדי לוודא שמתקבלות תשובות מתחלפות מגרסה 1 ומגרסה 2:
מתקשרים לשירות
HelloWorld:kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'הפלט אמור להיראות כך:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
מתקשרים שוב לשירות
HelloWorld:kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'הפלט אמור להיראות כך:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
האימות של Cloud Service Mesh עם איזון עומסים ומרובה אשכולות הסתיים בהצלחה.
הסרת המשאבים
אחרי שמסיימים לאמת את איזון העומסים, מסירים את שירות HelloWorld ואת שירות Sleep מהאשכול.
kubectl delete ns sample --context ${CTX_1}
kubectl delete ns sample --context ${CTX_2}