הגדרת רשת מרובת אשכולות מחוץ ל-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, צריך להגדיר את משתני הסביבה הבאים.

  1. יוצרים משתנה סביבה למספר הפרויקט. בפקודה הבאה, מחליפים את FLEET_PROJECT_ID במזהה הפרויקט של פרויקט המארח של ה-Fleet.

    export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \
    --format="value(projectNumber)")
    
  2. יוצרים משתנה סביבה למזהה הרשת.

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. יוצרים משתני סביבה לשמות האשכולות בפורמט שנדרש ב-asmcli.

    export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1"
    export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
    
  4. כדי לקבל את שם ההקשר של האשכולות, משתמשים בערכים שמופיעים בעמודה NAME בפלט של הפקודה הזו:

    kubectl config get-contexts
  5. מגדירים את משתני הסביבה לשמות של הקשרים של האשכול, שבהם נעשה שימוש בהמשך המדריך הזה:

    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. מתקינים שער באשכול 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 -
    
  2. מתקינים שער ב-$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. מתקינים שער באשכול 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 -
    
  2. מתקינים שער ב-$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. מתקינים שער באשכול 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 -
    
  2. מתקינים שער ב-$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. מתקינים שער באשכול 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 -
    
  2. מתקינים שער ב-$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 מהימן ומזהה עומס עבודה, בדיוק כמו שהם היו באותה רשת.

  1. חשיפת שירותים דרך שער מזרח-מערב עבור CLUSTER_NAME_1.

    kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
        asm/istio/expansion/expose-services.yaml
    
  2. חשיפת שירותים דרך שער מזרח-מערב עבור 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

  1. יוצרים את מרחב השמות לדוגמה ואת הגדרת השירות בכל אשכול. בפקודה הבאה, מחליפים את 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.

  2. יוצרים את השירות HelloWorld בשני האשכולות:

    kubectl create --context=${CTX_1} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    
    kubectl create --context=${CTX_2} \
        -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
        -l service=helloworld -n sample
    

פריסת HelloWorld v1 ו-v2 לכל אשכול

  1. פריסת HelloWorld v1 אל CLUSTER_1 ופריסת v2 אל CLUSTER_2, כדי שיהיה קל יותר לאמת מאוחר יותר את איזון העומסים בין האשכולות:

    kubectl create --context=${CTX_1} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v1 -n sample
    kubectl create --context=${CTX_2} \
      -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \
      -l version=v2 -n sample
  2. מריצים את הפקודות הבאות כדי לוודא ש-HelloWorld v1 ו-v2 פועלים. מוודאים שהפלט דומה לזה שמוצג.:

    kubectl get pod --context=${CTX_1} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v1-86f77cd7bd-cpxhv  2/2       Running   0          40s
    kubectl get pod --context=${CTX_2} -n sample
    NAME                            READY     STATUS    RESTARTS   AGE
    helloworld-v2-758dd55874-6x4t8  2/2       Running   0          40s

פריסת שירות השינה

  1. פורסים את שירות Sleep בשני האשכולות. ה-Pod הזה יוצר תנועת רשת מלאכותית למטרות הדגמה:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl apply --context=${CTX} \
            -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample
    done
    
  2. ממתינים עד שהשירות Sleep יופעל בכל אשכול. מוודאים שהפלט דומה לזה שמוצג:

    kubectl get pod --context=${CTX_1} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-n6bzf           2/2     Running   0          5s
    kubectl get pod --context=${CTX_2} -n sample -l app=sleep
    NAME                             READY   STATUS    RESTARTS   AGE
    sleep-754684654f-dzl9j           2/2     Running   0          5s

אימות איזון עומסים בין אשכולות

מתקשרים לשירות HelloWorld כמה פעמים ובודקים את הפלט כדי לוודא שמתקבלות תשובות מתחלפות מגרסה 1 ומגרסה 2:

  1. מתקשרים לשירות 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
    ...
  2. מתקשרים שוב לשירות 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}