מעבר מ-Istio 1.11 ואילך ל-Cloud Service Mesh
במדריך הזה נסביר איך להעביר אפליקציה מאשכול Google Kubernetes Engine (GKE) באמצעות Istio לאשכול חדש באמצעות Cloud Service Mesh מנוהל – רשת שירותים מנוהלת במלואה של Google שתואמת ל-Istio.
במדריך הזה תלמדו:
- יוצרים אשכול חדש של Google Kubernetes Engine ומתקינים באשכול את Istio ואת שער הכניסה של Istio. האשכול הזה ישמש כאשכול הקיים שרוצים להעביר ממנו.
- פורסים את אפליקציית הדוגמה Online Boutique באשכול באמצעות Istio.
- יוצרים עוד אשכול Google Kubernetes Engine באותו Google Cloud פרויקט.
- מפעילים את Cloud Service Mesh המנוהל באשכול השני ופורסים את שער הכניסה של Cloud Service Mesh.
- פורסים את Online Boutique באשכול באמצעות Cloud Service Mesh כדי לשכפל את הפריסה מהאשכול באמצעות Istio.
- העברת 50% מתנועת המשתמשים מהאשכול עם Istio לאשכול עם Cloud Service Mesh, באמצעות יכולות פיצול התנועה של Istio באשכול עם Istio.
- כדי להשלים את המיגרציה מ-Istio ל-Cloud Service Mesh, צריך להפנות את רשומת מערכת שמות הדומיינים (DNS) של האשכול עם Istio לאשכול עם Cloud Service Mesh.
פריסה של גרסה ראשונית (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, והשימוש בהם כרוך בתשלום:
כדי להימנע מחיובים שוטפים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.
הפעלת Cloud Shell
במדריך הזה תשתמשו ב-Cloud Shell, סביבת מעטפת שמארחת ב- Google Cloud ומאפשרת לכם לנהל את משאביGoogle Cloud .
ב-Cloud Shell מותקנים מראש כלי שורת הפקודה Google Cloud CLI, kubectl ו-istioctl. ה-CLI של gcloud הוא ה-CLI העיקרי של Google Cloud.
פותחים סשן של Cloud Shell בפינה הימנית העליונה של הדף הזה, לוחצים על terminal ואז על 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. בפועל, אלה יהיו האשכולות שבהם אתם כבר משתמשים.
מחליפים את
PROJECT_IDבמזהה הפרויקט ויוצרים אשכול חדש:gcloud container clusters create cluster-with-istio \ --project=PROJECT_ID \ --zone=us-central1-a \ --machine-type=e2-standard-2 --num-nodes=3משנים את שם ההקשר של האשכול כדי שיהיה קל יותר לעבוד עם האשכול:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-istio \ cluster-with-istioבודקים שההקשר של האשכול קיבל שם חדש:
kubectl config get-contexts --output="name"מתקינים את 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
תפרסו את Online Boutique במרחב שמות נפרד שנקרא
onlineboutique. יוצרים את מרחב השמות:kubectl \ --context cluster-with-istio \ create namespace onlineboutiqueפריסת 12 השירותים של Online Boutique, כולל מחולל עומסים שמדמה תעבורת משתמשים:
kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/release/kubernetes-manifests.yamlבשלב הקודם פרסתם גם שירות בשם
frontend-external(מסוגLoadBalancer), שמוקצית לו כתובת IP חיצונית. עם זאת, אתם רוצים לאפשר תנועה נכנסת ציבורית רק דרך הפריסה של שער הכניסה של Istio. מוחקים את משאב השירותfrontend-external:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ delete service frontend-externalפורסים משאב Istio
Gatewayומשאב IstioVirtualServiceכדי שתעבורת נתונים ציבורית תוכל לגשת ל-Online Boutique:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ apply -f microservices-demo/istio-manifests/frontend-gateway.yamlמקבלים את כתובת ה-IP החיצונית של שער הכניסה של Istio:
kubectl \ --namespace istio-system \ --context=cluster-with-istio \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'מעתיקים את כתובת ה-IP החיצונית של שירות
istio-ingressgateway, ואז ניגשים אליו דרך דפדפן האינטרנט. יופיע יישום לדוגמה של חנות בוטיק באינטרנט.
הגדרת האשכול החדש באמצעות Cloud Service Mesh מנוהל
יצירת האשכול והקצאת Cloud Service Mesh מנוהל
בקטע הזה יוצרים את האשכול שאליו רוצים להעביר את הנתונים. תקצו משאבים ל-Cloud Service Mesh מנוהל ותפרסו את Online Boutique כדי לשכפל את הפריסות מהאשכול שמשתמש ב-Istio.
כדי ליצור אשכול חדש:
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משנים את שם ההקשר של האשכול כדי שיהיה קל יותר לעבוד עם האשכול:
kubectl config rename-context \ gke_PROJECT_ID_us-central1-a_cluster-with-csm \ cluster-with-csmבודקים שההקשר של האשכול קיבל שם חדש:
kubectl config get-contexts --output="name"מפעילים את Cloud Service Mesh בצי בפרויקט. Fleet הוא קיבוץ לוגי של אשכולות Kubernetes ומשאבים אחרים שאפשר לנהל ביחד.
gcloud container fleet mesh enable --project PROJECT_IDהפלט אמור להיראות כך:
Waiting for Feature Service Mesh to be created...done.רושמים את האשכול ב-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.מפעילים את 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.מוודאים ש-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
תפרסו את שער הכניסה של Cloud Service Mesh במרחב שמות נפרד בשם
asm-ingress. יוצרים את מרחב השמות:kubectl \ --context cluster-with-csm \ create namespace asm-ingressמשתמשים בתווית
istio.io/rev=asm-managedכדי להוסיף את מרחב השמותasm-ingressל-Service mesh ולהפעיל הזרקה אוטומטית של קובץ עזר חיצוני מסוג proxy.kubectl \ --context cluster-with-csm \ label namespace asm-ingress 'istio.io/rev=asm-managed'פורסים את שער הכניסה של 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
תפרסו את Online Boutique במרחב שמות נפרד שנקרא
onlineboutique. יוצרים את מרחב השמות:kubectl \ --context cluster-with-csm \ create namespace onlineboutiqueמשתמשים בתווית
istio.io/rev=asm-managedכדי להוסיף את מרחב השמותonlineboutiqueל-Service mesh ולהפעיל הזרקה אוטומטית של קובץ עזר חיצוני.kubectl \ --context cluster-with-csm \ label namespace onlineboutique 'istio.io/rev=asm-managed'פריסת 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מקבלים את כתובת ה-IP החיצונית של שער הכניסה (ingress) של Cloud Service Mesh:
kubectl \ --context cluster-with-csm \ --namespace asm-ingress \ get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'מעתיקים את כתובת ה-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 לפצל את התנועה באופן שווה.
מגדירים את כתובת ה-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פורסים את
ServiceEntryבאשכול באמצעות Istio:kubectl \ --context cluster-with-istio \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yamlפורסים את
VirtualServiceבאשכול באמצעות Istio:kubectl \ --context cluster-with-istio \ --namespace onlineboutique \ apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service.yamlבדפדפן האינטרנט, נכנסים לכתובת ה-IP של שער הכניסה של האשכול עם Istio:
kubectl \ --context cluster-with-istio \ --namespace istio-system \ get serviceמרעננים את דף הבית של חנות הבוטיק אונליין כמה פעמים, ובודקים את הכותרת התחתונה של הדף בכל פעם. שימו לב ש-50% מהבקשות מטופלות על ידי Pod באשכול עם Cloud Service Mesh מנוהל.
מעבר לאשכול עם Cloud Service Mesh מנוהל
בקטע הזה מניחים שיש לכם שם דומיין וגישה להגדרות ה-DNS (שרת שם הדומיין) שלו.
מוסיפים רשומת A להגדרות ה-DNS כדי להפנות את שם הדומיין (למשל example.com) לכתובת ה-IP של שער הכניסה שפועל באשכול עם Istio.
כדי לגשת ל-Online Boutique, עוברים אל שם הדומיין בדפדפן האינטרנט.
כדאי לצמצם את אורך החיים (TTL) של רשומת ה-DNS כדי להבטיח שאפשר יהיה לשחזר במהירות את רשומת ה-DNS אם יהיה צורך לבטל את השינוי.
מגדירים את רשומת ה-A של שם הדומיין לכתובת ה-IP החיצונית של שער הכניסה (ingress) של האשכול עם Cloud Service Mesh מנוהל.
אם ההעברה הצליחה, מוחקים את האשכול באמצעות Istio:
gcloud container clusters delete cluster-with-istio \ --zone=us-central1-a \ --project=PROJECT_ID
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם יכולים למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים הספציפיים.
מחק את הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת המשאבים
מחיקת האשכול עם Cloud Service Mesh מנוהל:
gcloud container clusters delete cluster-with-managed-asm \
--zone=us-central1-a \
--project=PROJECT_ID