מעבר מ-Istio 1.11 ואילך ל-Cloud Service Mesh

במדריך הזה נסביר איך להעביר אפליקציה מאשכול Google Kubernetes Engine ‏ (GKE) באמצעות Istio לאשכול חדש באמצעות Cloud Service Mesh מנוהל – רשת שירותים מנוהלת במלואה של Google שתואמת ל-Istio.

במדריך הזה תלמדו:

  1. יוצרים אשכול חדש של Google Kubernetes Engine ומתקינים באשכול את Istio ואת שער הכניסה של Istio. האשכול הזה ישמש כאשכול הקיים שרוצים להעביר ממנו.
  2. פורסים את אפליקציית הדוגמה Online Boutique באשכול באמצעות Istio.
  3. יוצרים עוד אשכול Google Kubernetes Engine באותו Google Cloud פרויקט.
  4. מפעילים את Cloud Service Mesh המנוהל באשכול השני ופורסים את שער הכניסה של Cloud Service Mesh.
  5. פורסים את Online Boutique באשכול באמצעות Cloud Service Mesh כדי לשכפל את הפריסה מהאשכול באמצעות Istio.
  6. העברת 50% מתנועת המשתמשים מהאשכול עם Istio לאשכול עם Cloud Service Mesh, באמצעות יכולות פיצול התנועה של Istio באשכול עם Istio.
  7. כדי להשלים את המיגרציה מ-Istio ל-Cloud Service Mesh, צריך להפנות את רשומת מערכת שמות הדומיינים (DNS) של האשכול עם Istio לאשכול עם Cloud Service Mesh.

תעבורת המשתמשים מתחלקת 50-50 בין אשכול עם Istio לבין אשכול עם Cloud Service Mesh. כל אשכול מכיל פריסה משלו של Online Boutique.

פריסה של גרסה ראשונית (canary)

'פריסה של גרסה ראשונית (canary)' היא טכניקה שמשמשת בפיתוח תוכנה לבדיקת גרסה חדשה של תוכנה מסוימת לפני שמשחררים את הגרסה החדשה לכל המשתמשים. התהליך כולל הגדלה הדרגתית של אחוז התנועה שנשלח לגרסה החדשה. במדריך הזה תגדירו אשכול חדש עם Cloud Service Mesh מנוהל, ותעבירו אליו בהדרגה את תנועת המשתמשים. תתחילו בהפניית 0% מתנועת המשתמשים לאשכול החדש, אחר כך 50% ובסוף 100%. בסביבת הייצור, מומלץ להשתמש בתוספות קטנות יותר. אם בשלב כלשהו תבחינו שהאשכול החדש לא מסוגל לטפל באחוז מסוים של התנועה, תוכלו לבצע החזרה לגרסה הקודמת על ידי הקטנת האחוז ל-0%.

מישור בקרה של Canary לעומת אשכול Canary

יש שתי אסטרטגיות נפוצות להעברות מ-Istio אל Cloud Service Mesh מנוהל:

  • העברת אשכול Canary: באסטרטגיה הזו, יוצרים אשכול חדש ואז מקצים בו Cloud Service Mesh מנוהל.
  • מיגרציה של מישור הבקרה של Canary: באסטרטגיה הזו, אתם מקצים Cloud Service Mesh מנוהל באותו אשכול שבו מותקן Istio. זו לא דרך העברה נתמכת עם Cloud Service Mesh.

במדריך הזה נסביר את אסטרטגיית ההעברה של אשכול קנרי.

עלויות

במדריך הזה השתמשנו ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

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

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

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

הפעלת Cloud Shell

במדריך הזה תשתמשו ב-Cloud Shell, סביבת מעטפת שמארחת ב- Google Cloud ומאפשרת לכם לנהל את משאביGoogle Cloud .

ב-Cloud Shell מותקנים מראש כלי שורת הפקודה Google Cloud CLI,‏ kubectl ו-istioctl. ה-CLI של gcloud הוא ה-CLI העיקרי של Google Cloud.

פותחים סשן של Cloud Shell בפינה הימנית העליונה של הדף הזה, לוחצים על ואז על Acknowledge (אישור). בחלק התחתון של הדף ייפתח סשן של Cloud Shell בתוך מסגרת. מריצים את הפקודות הבאות באותה סשן של Cloud Shell.

הורדת קוד לדוגמה

משכפלים את מאגרי ה-Git שמכילים את משאבי Kubernetes ו-Istio שבהם תשתמשו:

  git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
  git clone https://github.com/GoogleCloudPlatform/microservices-demo.git

הגדרת האשכול באמצעות Istio

יצירת האשכול והתקנת Istio

בקטע הזה יוצרים את האשכול שמשתמש ב-Istio. בפועל, אלה יהיו האשכולות שבהם אתם כבר משתמשים.

  1. מחליפים את PROJECT_ID במזהה הפרויקט ויוצרים אשכול חדש:

    gcloud container clusters create cluster-with-istio \
      --project=PROJECT_ID \
      --zone=us-central1-a \
      --machine-type=e2-standard-2 --num-nodes=3
    
  2. משנים את שם ההקשר של האשכול כדי שיהיה קל יותר לעבוד עם האשכול:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-istio \
      cluster-with-istio
    
  3. בודקים שההקשר של האשכול קיבל שם חדש:

    kubectl config get-contexts --output="name"
    
  4. מתקינים את Istio באשכול. כדי לפשט את התהליך, תתקינו את הפרופיל שמוגדר כברירת מחדל של Istio ואת הגרסה שתואמת להתקנה של istioctl.

    istioctl install
    

    תתבקשו להקליד 'y' ואז ללחוץ על Enter.

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

    This will install the Istio X.Y.Z default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N)
    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Ingress gateways installed
    ✔ Installation complete
    Making this installation the default for injection and validation.
    

פריסת Online Boutique

  1. תפרסו את Online Boutique במרחב שמות נפרד שנקרא onlineboutique. יוצרים את מרחב השמות:

    kubectl \
      --context cluster-with-istio \
      create namespace onlineboutique
    
  2. פריסת 12 השירותים של Online Boutique, כולל מחולל עומסים שמדמה תעבורת משתמשים:

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      apply -f microservices-demo/release/kubernetes-manifests.yaml
    
  3. בשלב הקודם פרסתם גם שירות בשם frontend-external (מסוג LoadBalancer), שמוקצית לו כתובת IP חיצונית. עם זאת, אתם רוצים לאפשר תנועה נכנסת ציבורית רק דרך הפריסה של שער הכניסה של Istio. מוחקים את משאב השירות frontend-external:

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      delete service frontend-external
    
  4. פורסים משאב Istio Gateway ומשאב Istio VirtualService כדי שתעבורת נתונים ציבורית תוכל לגשת ל-Online Boutique:

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
    
  5. מקבלים את כתובת ה-IP החיצונית של שער הכניסה של Istio:

    kubectl \
      --namespace istio-system \
      --context=cluster-with-istio \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  6. מעתיקים את כתובת ה-IP החיצונית של שירות istio-ingressgateway, ואז ניגשים אליו דרך דפדפן האינטרנט. יופיע יישום לדוגמה של חנות בוטיק באינטרנט.

הגדרת האשכול החדש באמצעות Cloud Service Mesh מנוהל

יצירת האשכול והקצאת Cloud Service Mesh מנוהל

בקטע הזה יוצרים את האשכול שאליו רוצים להעביר את הנתונים. תקצו משאבים ל-Cloud Service Mesh מנוהל ותפרסו את Online Boutique כדי לשכפל את הפריסות מהאשכול שמשתמש ב-Istio.

  1. כדי ליצור אשכול חדש:

    gcloud container clusters create cluster-with-csm \
      --project=PROJECT_ID --zone=us-central1-a \
      --machine-type=e2-standard-4 --num-nodes=2 \
      --workload-pool PROJECT_ID.svc.id.goog
    
  2. משנים את שם ההקשר של האשכול כדי שיהיה קל יותר לעבוד עם האשכול:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-csm \
      cluster-with-csm
    
  3. בודקים שההקשר של האשכול קיבל שם חדש:

    kubectl config get-contexts --output="name"
    
  4. מפעילים את Cloud Service Mesh בצי בפרויקט. Fleet הוא קיבוץ לוגי של אשכולות Kubernetes ומשאבים אחרים שאפשר לנהל ביחד.

    gcloud container fleet mesh enable --project PROJECT_ID
    

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

    Waiting for Feature Service Mesh to be created...done.
    
  5. רושמים את האשכול ב-Fleet של הפרויקט:

    gcloud container fleet memberships register cluster-with-csm-membership \
      --gke-cluster=us-central1-a/cluster-with-csm \
      --enable-workload-identity \
      --project PROJECT_ID
    

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

    Waiting for membership to be created...done.
    Finished registering to the Fleet.
    
  6. מפעילים את Cloud Service Mesh המנוהל באשכול:

    gcloud container fleet mesh update \
      --management automatic \
      --memberships cluster-with-csm-membership \
      --project PROJECT_ID
    

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

    Waiting for Feature Service Mesh to be updated...done.
    
  7. מוודאים ש-Cloud Service Mesh מנוהל הוקצה לאשכול ומוכן לשימוש:

    gcloud container fleet mesh describe --project PROJECT_ID
    

    יכול להיות שיעברו כ-10 דקות עד שהקצאת המשאבים של Cloud Service Mesh תושלם והוא יהיה מוכן לשימוש באשכול. אם רואים את השגיאה controlPlaneManagement.state: DISABLED או את השגיאה controlPlaneManagement.state: PROVISIONING, צריך להריץ מחדש את הפקודה הקודמת כל כמה דקות עד שרואים את השגיאה controlPlaneManagement.state: ACTIVE.

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

    createTime: '2022-07-06T01:05:39.110120474Z'
    membershipSpecs:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-07-06T01:19:24.243993678Z'
    name: projects/your-project-id/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-07-06T01:19:27.475885687Z'
    

פריסת שער הכניסה של Cloud Service Mesh

  1. תפרסו את שער הכניסה של Cloud Service Mesh במרחב שמות נפרד בשם asm-ingress. יוצרים את מרחב השמות:

    kubectl \
      --context cluster-with-csm \
      create namespace asm-ingress
    
  2. משתמשים בתווית istio.io/rev=asm-managed כדי להוסיף את מרחב השמות asm-ingress ל-Service mesh ולהפעיל הזרקה אוטומטית של קובץ עזר חיצוני מסוג proxy.

    kubectl \
      --context cluster-with-csm \
      label namespace asm-ingress 'istio.io/rev=asm-managed'
    
  3. פורסים את שער הכניסה של Cloud Service Mesh:

    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
    

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

    namespace/asm-ingress configured
    serviceaccount/asm-ingressgateway configured
    service/asm-ingressgateway configured
    deployment.apps/asm-ingressgateway configured
    gateway.networking.istio.io/asm-ingressgateway configured
    

פריסת Online Boutique

  1. תפרסו את Online Boutique במרחב שמות נפרד שנקרא onlineboutique. יוצרים את מרחב השמות:

    kubectl \
      --context cluster-with-csm \
      create namespace onlineboutique
    
  2. משתמשים בתווית istio.io/rev=asm-managed כדי להוסיף את מרחב השמות onlineboutique ל-Service mesh ולהפעיל הזרקה אוטומטית של קובץ עזר חיצוני.

    kubectl \
      --context cluster-with-csm \
      label namespace onlineboutique 'istio.io/rev=asm-managed'
    
  3. פריסת 12 השירותים של Online Boutique, כולל מחולל העומסים שמדמה תעבורת משתמשים:

    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
    
  4. מקבלים את כתובת ה-IP החיצונית של שער הכניסה (ingress) של Cloud Service Mesh:

    kubectl \
      --context cluster-with-csm \
      --namespace asm-ingress \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  5. מעתיקים את כתובת ה-IP החיצונית של שירות asm-ingressgateway וניגשים אליה דרך דפדפן האינטרנט. תופיע אפליקציית הדוגמה Online Boutique. בקטע הבא תשתמשו בכתובת ה-IP החיצונית, לכן כדאי להעתיק אותה למשתנה סביבה:

    export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \
      kubectl \
        --context cluster-with-csm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
      )
    

בדיקת האשכול באמצעות Cloud Service Mesh באמצעות פריסה של גרסה ראשונית (canary)

בקטע הזה נגדיר את האשכול עם Istio כך ש-50% מתעבורת המשתמשים אל Online Boutique תועבר למופע של Online Boutique באשכול עם Cloud Service Mesh מנוהל. כדי לעשות את זה, פורסים שני משאבי Istio באשכול עם Istio:

  • ‫ServiceEntry כדי להודיע ל-Istio על נקודת הקצה של Online Boutique באשכול Cloud Service Mesh המנוהל
  • ‫VirtualService כדי להנחות את שער הכניסה של Istio לפצל את התנועה באופן שווה.
  1. מגדירים את כתובת ה-IP של שער הכניסה של אשכול Cloud Service Mesh מנוהל בתוך משאב ServiceEntry:

    sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  2. פורסים את ServiceEntry באשכול באמצעות Istio:

    kubectl \
      --context cluster-with-istio \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  3. פורסים את VirtualService באשכול באמצעות Istio:

    kubectl \
      --context cluster-with-istio \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service.yaml
    
  4. בדפדפן האינטרנט, נכנסים לכתובת ה-IP של שער הכניסה של האשכול עם Istio:

    kubectl \
      --context cluster-with-istio \
      --namespace istio-system \
      get service
    

    מרעננים את דף הבית של חנות הבוטיק אונליין כמה פעמים, ובודקים את הכותרת התחתונה של הדף בכל פעם. שימו לב ש-50% מהבקשות מטופלות על ידי Pod באשכול עם Cloud Service Mesh מנוהל.

מעבר לאשכול עם Cloud Service Mesh מנוהל

בקטע הזה מניחים שיש לכם שם דומיין וגישה להגדרות ה-DNS (שרת שם הדומיין) שלו.

  1. מוסיפים רשומת A להגדרות ה-DNS כדי להפנות את שם הדומיין (למשל example.com) לכתובת ה-IP של שער הכניסה שפועל באשכול עם Istio.

  2. כדי לגשת ל-Online Boutique, עוברים אל שם הדומיין בדפדפן האינטרנט.

  3. כדאי לצמצם את אורך החיים (TTL) של רשומת ה-DNS כדי להבטיח שאפשר יהיה לשחזר במהירות את רשומת ה-DNS אם יהיה צורך לבטל את השינוי.

  4. מגדירים את רשומת ה-A של שם הדומיין לכתובת ה-IP החיצונית של שער הכניסה (ingress) של האשכול עם Cloud Service Mesh מנוהל.

  5. אם ההעברה הצליחה, מוחקים את האשכול באמצעות Istio:‏

    gcloud container clusters delete cluster-with-istio \
      --zone=us-central1-a \
      --project=PROJECT_ID
    

הסרת המשאבים

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

מחק את הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת המשאבים

מחיקת האשכול עם Cloud Service Mesh מנוהל:

  gcloud container clusters delete cluster-with-managed-asm \
    --zone=us-central1-a \
    --project=PROJECT_ID

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