במדריך הזה נסביר על תרחיש שימוש נפוץ: הטמעה של פריסה של גרסה ראשונית (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מופיע במקורות המידע.לצפייה ב
Destination Ruleשנוצר.kubectl get destinationrules -n onlineboutiqueהפלט אמור להיראות כך:
NAME HOST AGE productcatalogservice productcatalogservice 2mלצפייה ב
VirtualServiceשנוצר.kubectl get virtualservices -n onlineboutiqueהתוצאה הצפויה:
NAME GATEWAYS HOSTS AGE productcatalogservice ["productcatalogservice"] 2mנכנסים לאפליקציה בדפדפן באמצעות כתובת ה-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.
כדי להפנות את כל התנועה לגרסה v1 של 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זמין במאמר הגדרת אבטחת תעבורה.