במדריך הזה נסביר על תרחיש נפוץ לשימוש: הטמעה של פריסה של גרסה ראשונית (canary) באמצעות Cloud Service Mesh באמצעות ממשקי Istio API.
מהי פריסה של גרסה ראשונית (canary)?
פריסה של גרסה ראשונית (canary) מעבירה אחוז קטן של תעבורת נתונים לגרסה חדשה של מיקרו-שירות (microservice), ואז מגדילה בהדרגה את האחוז הזה תוך ביטול והוצאה משימוש של הגרסה הישנה. אם משהו משתבש במהלך התהליך הזה, אפשר להחזיר את התנועה לגרסה הקודמת. בעזרת Cloud Service Mesh, אפשר לנתב תעבורה כדי להבטיח ששירותים חדשים יופעלו בצורה בטוחה.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כדי להימנע מחיובים שוטפים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. מידע נוסף זמין במאמר בנושא הסרת המשאבים.
לפני שמתחילים
מוודאים שהחיוב מופעל בפרויקט Google Cloud . איך מוודאים שהחיוב מופעל בפרויקט?
הקצאת Cloud Service Mesh באשכול GKE או באשכול Kubernetes נתמך אחר.
משכפלים את המאגר:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples cd anthos-service-mesh-samples/docs/canary-service
פריסת Online Boutique
מגדירים את ההקשר הנוכחי של
kubectlלאשכול שבו מתכננים לפרוס את Online Boutique. הפקודה משתנה בהתאם לאופן ההקצאה של Cloud Service Mesh: באשכול GKE או באשכול Kubernetes מחוץ ל-GKE:GKE ב-Google Cloud
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATIONGKE מחוץ ל-Google Cloud
kubectl config use-context CLUSTER_NAMEיוצרים את מרחב השמות עבור אפליקציית הדוגמה ושער הכניסה:
kubectl create namespace onlineboutiqueמתייגים את מרחב השמות
onlineboutiqueכדי להחדיר אוטומטית שרתי proxy של Envoy. פועלים לפי השלבים במאמר איך מפעילים הוספה אוטומטית של קובצי sidecar.מפעילים את האפליקציה לדוגמה. במדריך הזה מפעילים את Online Boutique, אפליקציית הדגמה של מיקרו-שירות.
kubectl apply \ -n onlineboutique \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/shared/online-boutique/kubernetes-manifests.yamlכדי להוסיף תווית
version=v1לפריסתproductcatalog, מריצים את הפקודה הבאה:kubectl patch deployments/productcatalogservice -p '{"spec":{"template":{"metadata":{"labels":{"version":"v1"}}}}}' \ -n onlineboutiqueצופים בשירותים שפרסתם:
kubectl get pods -n onlineboutiqueהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-m84m6 2/2 Running 0 2m7s cartservice-c77f6b866-m67vd 2/2 Running 0 2m8s checkoutservice-654c47f4b6-hqtqr 2/2 Running 0 2m10s currencyservice-59bc889674-jhk8z 2/2 Running 0 2m8s emailservice-5b9fff7cb8-8nqwz 2/2 Running 0 2m10s frontend-77b88cc7cb-mr4rp 2/2 Running 0 2m9s loadgenerator-6958f5bc8b-55q7w 2/2 Running 0 2m8s paymentservice-68dd9755bb-2jmb7 2/2 Running 0 2m9s productcatalogservice-84f95c95ff-c5kl6 2/2 Running 0 114s recommendationservice-64dc9dfbc8-xfs2t 2/2 Running 0 2m9s redis-cart-5b569cd47-cc2qd 2/2 Running 0 2m7s shippingservice-5488d5b6cb-lfhtt 2/2 Running 0 2m7sהסמל
2/2בעמודהREADYמציין שפוד פועל עם Envoy proxy שהוזרק בהצלחה.פריסה של
VirtualServiceושלDestinationRuleלגרסה v1 שלproductcatalog:kubectl apply -f destination-vs-v1.yaml -n onlineboutiqueשימו לב שרק
v1מופיע במקורות המידע.נכנסים לאפליקציה בדפדפן באמצעות כתובת ה-IP החיצונית של שער הכניסה:
kubectl get services -n GATEWAY_NAMESPACE
בקטע הבא נסביר איך לצפות במדדים באמצעות ממשק המשתמש של Cloud Service Mesh.
צפייה בשירותים ב- Google Cloud Console
במסוף Google Cloud , נכנסים לדף Google Kubernetes Engine (GKE) Enterprise edition Services.
מעבר אל Google Kubernetes Engine (GKE) Enterprise edition Services
כברירת מחדל, השירותים מוצגים בתצוגת רשימה.
בסקירה הכללית של הטבלה אפשר לראות את כל השירותים ואת המדדים החשובים במבט מהיר.
בפינה השמאלית העליונה, לוחצים על Topology (טופולוגיה). כאן תוכלו לראות את השירותים ואת האינטראקציה ביניהם.
אפשר להרחיב את Services ולהציג את Requests per second עבור כל אחד מהשירותים על ידי העברת הסמן מעליהם.
חוזרים לתצוגת הטבלה.
בטבלת השירותים, בוחרים באפשרות
productcatalogservice. הפעולה תעביר אתכם לסקירה כללית של השירות.בצד ימין של המסך, לוחצים על תנועה.
מוודאים ש-100% מהתנועה הנכנסת אל
productcatalogserviceמגיעה לשירות של עומס העבודה.
בקטע הבא מוסבר איך ליצור גרסה 2 של שירות productcatalog.
פריסת שירות מגרסה 2
במדריך הזה,
productcatalogservice-v2מוסיף השהיה של 3 שניות לבקשות עם השדהEXTRA_LATENCY. הפעולה הזו מדמה רגרסיה בגרסה החדשה של השירות.החלת המשאב הזה על מרחב השמות
onlineboutique.kubectl apply -f productcatalog-v2.yaml -n onlineboutiqueבודקים את ה-pods של האפליקציה.
kubectl get pods -n onlineboutiqueהפלט אמור להיראות כך:
NAME READY STATUS RESTARTS AGE adservice-85598d856b-8wqfd 2/2 Running 0 25h cartservice-c77f6b866-7jwcr 2/2 Running 0 25h checkoutservice-654c47f4b6-n8c6x 2/2 Running 0 25h currencyservice-59bc889674-l5xw2 2/2 Running 0 25h emailservice-5b9fff7cb8-jjr89 2/2 Running 0 25h frontend-77b88cc7cb-bwtk4 2/2 Running 0 25h loadgenerator-6958f5bc8b-lqmnw 2/2 Running 0 25h paymentservice-68dd9755bb-dckrj 2/2 Running 0 25h productcatalogservice-84f95c95ff-ddhjv 2/2 Running 0 25h productcatalogservice-v2-6df4cf5475-9lwjb 2/2 Running 0 8s recommendationservice-64dc9dfbc8-7s7cx 2/2 Running 0 25h redis-cart-5b569cd47-vw7lw 2/2 Running 0 25h shippingservice-5488d5b6cb-dj5gd 2/2 Running 0 25hשימו לב שמופיעים עכשיו שני
productcatalogservices.משתמשים ב-
DestinationRuleכדי לציין את קבוצות המשנה של שירות. בתרחיש הזה, יש קבוצת משנה לגרסה 1 ואז קבוצת משנה נפרדת לגרסה 2 שלproductcatalogservice.שימו לב לשדה
labels. הגרסאות שלproductcatalogserviceמובחנות אחרי שהתנועה מנותבת על ידיVirtualService.מחילים את
DestinationRule:kubectl apply -f destination-v1-v2.yaml -n onlineboutique
חלוקת התנועה בין גרסה 1 לגרסה 2
משתמשים בערך
VirtualServiceכדי להגדיר אחוז קטן של התנועה שיופנה לגרסה 2 שלproductcatalogservice.בשדה subset מצוינת הגרסה, ובשדה weight מצוין אחוז חלוקת התנועה. 75% מהתנועה מגיעה לגרסה 1 של productcatalog, ו-25% מגיעה לגרסה 2.
מחילים את
VirtualService:kubectl apply -f vs-split-traffic.yaml -n onlineboutique
אם תיכנסו ל-EXTERNAL_IP של ה-Ingress של האשכול, תבחינו מעת לעת שהטעינה של הקצה הקדמי איטית יותר.
בקטע הבא, אפשר לראות את פיצול התנועה במסוף Google Cloud .
מעקב אחר חלוקת התנועה במסוף Google Cloud
חוזרים למסוף Google Cloud ועוברים לדף GKE Enterprise Services. מעבר לשירותי GKE Enterprise
בפינה השמאלית העליונה, לוחצים על Topology (טופולוגיה).
מרחיבים את עומס העבודה
productcatalogserviceורושמים את הפריסותproductcatalogserviceו-productcatalogservice-v2.חוזרים לתצוגת הטבלה.
לוחצים על
productcatalogserviceבטבלת השירותים.חוזרים אל תנועה בסרגל הניווט הימני.
שימו לב שהתנועה הנכנסת מחולקת בין גרסה 1 לגרסה 2 לפי האחוז שצוין בקובץ
VirtualService, ושיש 2 עומסי עבודה של שירות productcatalog.בצד שמאל של הדף מופיעים בקשות, שיעור השגיאות ומדדי השהיה. ב-Cloud Service Mesh, כל שירות כולל את המדדים האלה כדי לספק לכם מדדי יכולת צפייה.
הפצה או חזרה לגרסה
אחרי שבודקים את המדדים במהלך פריסה של גרסה ראשונית (canary), אפשר להשלים את ההשקה של גרסת השירות החדשה או להחזיר לגרסת השירות המקורית באמצעות משאב VirtualService.
השקה
אחרי שאתם מרוצים מההתנהגות של שירות v2, אתם יכולים להגדיל בהדרגה את אחוז התנועה שמופנה לשירות v2. בסופו של דבר, אפשר להפנות 100% מהתעבורה לשירות החדש במשאב VirtualService שיצרתם למעלה, על ידי הסרת פיצול התעבורה מהמשאב הזה.
כדי להפנות את כל התנועה לגרסה 2 של productcatalogservice:
kubectl apply -f vs-v2.yaml -n onlineboutique
הוחזר למצב קודם
אם אתם צריכים לחזור לשירות v1, אתם יכולים להשתמש ב-destination-vs-v1.yaml שצוין קודם. הפעולה הזו מפנה את התנועה רק לגרסה 1 של productcatalogservice.
כדי להפנות את כל התנועה לגרסה 1 של productcatalogservice:
kubectl apply -f vs-v1.yaml -n onlineboutique
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
כדי להימנע מחיובים מתמשכים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם יכולים למחוק את הפרויקט או למחוק את המשאבים הספציפיים.
מחיקת הפרויקט
ב-Cloud Shell, מוחקים את הפרויקט:
gcloud projects delete PROJECT_ID
מחיקת המשאבים
כדי למנוע חיובים נוספים, צריך למחוק את האשכול:
gcloud container clusters delete CLUSTER_NAME \
--project=PROJECT_ID \
--zone=CLUSTER_LOCATION
אם רשמתם את האשכול ב-Fleet באמצעות gcloud container fleet memberships (במקום --enable-fleet או --fleet-project במהלך יצירת האשכול), צריך להסיר את החברות שפג תוקפה:
gcloud container fleet memberships delete MEMBERSHIP \
--project=PROJECT_ID
אם רוצים להשאיר את האשכול מוגדר ל-Cloud Service Mesh אבל להסיר את הדוגמה Online Boutique:
מוחקים את מרחבי השמות של האפליקציה:
kubectl delete -f namespace onlineboutiqueהפלט אמור להיראות כך:
namespace "onlineboutique" deletedמחיקת רשומות השירות:
kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend.yaml -n onlineboutique kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/istio-manifests/frontend-gateway.yaml -n onlineboutiqueהפלט אמור להיראות כך:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
המאמרים הבאים
- מדריך כללי להגדרת מדיניות
PeerAuthenticationזמין במאמר הגדרת אבטחת תעבורה.