1. סקירה כללית
בחלק הראשון של ה-Lab, יצרתם אפליקציית ASP.NET Core, הכנסתם אותה לקונטיינר ופרסתם אותה ב-Google Kubernetes Engine (GKE), והגדרתם את התנועה שלה כך שתנוהל על ידי Istio.
בחלק השני של שיעור ה-Lab הזה מניחים שכבר יש לכם את אשכול Kubernetes ואת האפליקציה משיעור ה-Lab הראשון. תראו איך Istio יכול לעזור לכם לנהל, לנטר ולאבטח את השירותים שלכם עם שינויים מינימליים בקוד. בפרט, נבחן תכונות של Istio כמו מדדים, מעקב, הדמיה של שירותים, ניהול דינמי של תנועת גולשים, הזרקת תקלות ועוד.
מה תלמדו
- איך שולחים שאילתות למדדים באמצעות Prometheus.
- איך ליצור ויזואליזציה של מדדים באמצעות Grafana.
- איך ליצור גרסה חדשה של השירות.
- איך מצמידים שירות לגרסה ספציפית.
- איך לפצל את התנועה בין גרסאות שונות.
- איך להחדיר תקלות לקריאות שירות.
הדרישות
איך תשתמשו במדריך הזה?
איזה דירוג מגיע לדעתך לחוויה שלך עם Google Cloud Platform?
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.
- לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי לא תהיה עלות בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' שבו מוסבר איך להשבית משאבים כדי שלא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300 USD.
מפעילים את Cloud Shell
אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל בשיעור Codelab הזה נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.
הפעלת Cloud Shell
- ב-Cloud Console, לוחצים על Activate Cloud Shell
.
אם זו הפעם הראשונה שאתם מפעילים את Cloud Shell, יוצג לכם מסך ביניים (מתחת לקו הקיפול) עם תיאור של Cloud Shell. במקרה כזה, לוחצים על המשך (והמסך הזה לא יוצג לכם יותר). כך נראה המסך החד-פעמי:
יחלפו כמה רגעים עד שההקצאה והחיבור ל-Cloud Shell יושלמו.
המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות של הרשת. אפשר לבצע את רוב העבודה ב-codelab הזה, אם לא את כולה, באמצעות דפדפן או Chromebook.
אחרי שמתחברים ל-Cloud Shell, אפשר לראות שהאימות כבר בוצע והפרויקט כבר הוגדר לפי מזהה הפרויקט.
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שאתם מאומתים:
gcloud auth list
פלט הפקודה
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
פלט הפקודה
[core] project = <PROJECT_ID>
אם לא, אפשר להגדיר אותו באמצעות הפקודה הזו:
gcloud config set project <PROJECT_ID>
פלט הפקודה
Updated property [core/project].
3. בדיקת האפליקציה
לפני שמתחילים את התרגיל, מוודאים שהאפליקציה עדיין פועלת מהתרגיל הקודם. תזכורת: כך אפשר לראות את כתובת ה-IP החיצונית ואת היציאה של השער, שמופיעות בקטע EXTERNAL-IP:
kubectl get svc istio-ingressgateway -n istio-system
כדי לראות את האפליקציה, אפשר לפתוח את הדפדפן ולנווט לכתובת http://<gatewayurl>:

אם האפליקציה לא מופיעה, צריך לחזור למעבדה הקודמת כדי לוודא שביצעתם את כל השלבים ושהאפליקציה ו-Istio מותקנות ופועלות בצורה תקינה.
בשלב הזה, יכול להיות שאתם שואלים את עצמכם: "מה היתרון של Istio?". אם מאפשרים ל-Istio לנהל את התנועה של האפליקציה, מקבלים בחינם תכונות כמו מדדים, מעקב, ניהול דינמי של תנועה, ויזואליזציה של שירותים, הזרקת תקלות ועוד.
בשלב הבא נסביר איך לעיין במדדים.
4. מדדים עם Grafana ו-Prometheus
כברירת מחדל, Istio יוצר כמה מדדים. תוכלו להשתמש בתוספים כדי להריץ שאילתות על מדדי ברירת המחדל האלה ולהציג אותם באופן חזותי.
Prometheus
Prometheus הוא פתרון קוד פתוח למעקב. אתם יכולים להשתמש ב-Prometheus כדי לשלוח שאילתות למדדים שנוצרו על ידי Istio, אבל קודם צריך להתקין את התוסף Prometheus.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
מוודאים ש-Prometheus פועל:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
כדי לשלוח עומס תנועה קל לאפליקציה, אפשר להיכנס ל-http://<gatewayurl> כמה פעמים או להריץ את פקודת ה-curl.
מגדירים העברה ליציאה אחרת לממשק המשתמש של Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
עכשיו אפשר להריץ שאילתה. לשם כך, לוחצים על הלחצן Web Preview (תצוגה מקדימה בדפדפן) בפינה הימנית העליונה של Cloud Shell ואז על Preview on port 8080 (תצוגה מקדימה ביציאה 8080):

ממשק המשתמש של Prometheus יופיע בכרטיסייה חדשה:

מידע נוסף על Prometheus זמין במאמר שאילתות של מדדים באמצעות Prometheus.
Grafana
Grafana הוא תוסף נוסף להצגת מדדים.
מתקינים את Grafana. מחליפים את istio-version בגרסת Istio הנוכחית,לדוגמה, 1.0.3-gke.3:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
מוודאים ש-Grafana פועל:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
כדי לשלוח עומס תנועה קל לאפליקציה, אפשר להיכנס ל-http://<gatewayurl> כמה פעמים או להריץ את פקודת curl.
מגדירים העברה ליציאה אחרת לממשק המשתמש של Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
כדי לראות את מרכזי הבקרה של Grafana, אפשר להיכנס לתצוגה המקדימה באינטרנט:


מידע נוסף על Grafana זמין במאמר בנושא הדמיה של מדדים באמצעות Grafana.
5. יצירת גרסה חדשה של האפליקציה
בשלב מסוים, האפליקציה שפרסתם בסביבת הייצור תדרוש תיקוני באגים או תכונות נוספות. בואו נראה איך התהליך הזה נראה.
קודם נשנה את האפליקציה. פותחים את עורך הקוד מ-Cloud Shell.
עוברים אל Index.cshtml בקטע HelloWorldAspNetCore > Views > Home ומעדכנים אחת מההודעות בקרוסלה.
מחפשים את השורה הבאה:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
ולשנות אותו כך:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
שומרים את השינויים וחוזרים ל-Cloud Shell. בתוך HelloWorldAspNetCore,, יוצרים את קובץ האימג' של Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
ומבצעים push ל-Container Registry:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
אחרי שמעבירים את קובץ האימג' של הקונטיינר, אפשר לפרוס את הגרסה החדשה בשלב הבא.
6. יצירת הפריסה החדשה
כדי לפרוס את הגרסה החדשה, צריך קודם ליצור פריסה חדשה שלה ב-Kubernetes. מוסיפים את הטקסט הבא בסוף הקובץ aspnetcore.yaml:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-v2
spec:
replicas: 1
selector:
matchLabels:
app: aspnetcore
version: v2
template:
metadata:
labels:
app: aspnetcore
version: v2
spec:
containers:
- name: aspnetcore
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
פורסים את הגרסה החדשה במרחב השמות שמוגדר כברירת מחדל באמצעות kubectl:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
מוודאים שהפודים הצפויים פועלים:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
עכשיו, בודקים שוב את האפליקציה. מקבלים את כתובת ה-IP החיצונית של השער:
kubectl get svc istio-ingressgateway -n istio-system
היא מופיעה בקטע EXTERNAL-IP. פותחים דפדפן במצב פרטי ועוברים אל http://<replace-with-external-ip>
כשמרעננים, לפעמים מופיעה ההודעה 'מידע על בניית אפליקציות אינטרנט באמצעות ASP.NET Core':

במקרים אחרים, תופיע ההודעה 'מידע על פיתוח אפליקציות אינטרנט באמצעות ASP.NET Core ב-Google Cloud':

הסיבה לכך היא שפריסות v1 ו-v2 נחשפות מאחורי אותו שירות Kubernetes (aspnetcore-service), וש-VirtualService שיצרתם במעבדה הקודמת (aspnetcore-virtualservice) משתמש בשירות הזה כמארח.
בשלב הבא, מצמידים את השירות לפריסה של v2 באמצעות DestinationRule.
7. הצמדת השירות לגרסה החדשה
בשלב הזה, מצמידים את השירות לשימוש בפריסה v2. אפשר לעשות את זה באמצעות DestinationRule. ההגדרה DestinationRule קובעת את קבוצת המדיניות שתחול על בקשה אחרי שמתבצע ניתוב של VirtualService.
בנוסף, DestinationRule מגדיר קבוצות משנה שאפשר להפנות אליהן, כלומר גרסאות עם שם של מארח היעד המתאים. קבוצות המשנה האלה משמשות במפרטים של נתיבי VirtualService כששולחים תנועה לגרסאות ספציפיות של השירות.
יוצרים קובץ חדש בשם aspnetcore-destinationrule.yaml:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: aspnetcore-destinationrule
spec:
host: aspnetcore-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
לאחר מכן, יוצרים את DestinationRule. כך נוצרים שני קבוצות משנה (v1 ו-v2) שאפשר להשתמש בהן מ-VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
עכשיו חוזרים לקובץ aspnetcore-virtualservice.yaml כדי לעדכן את VirtualService כך שישתמש בקבוצת המשנה v2:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v2
מעדכנים את VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
פותחים את הדפדפן ועוברים אל http://<replace-with-external-ip>. גם אחרי כמה רענונים, אמורה להופיע ההודעה Learn about building Web apps with ASP.NET Core on Google Cloud (מידע על פיתוח אפליקציות אינטרנט באמצעות ASP.NET Core ב-Google Cloud):

8. חלוקת התנועה בין הגרסאות
לפעמים כדאי לפצל את התנועה בין גרסאות לצורך בדיקה. לדוגמה, יכול להיות שתרצו לשלוח 75% מהתנועה לגרסה v1 ו-25% מהתנועה לגרסה v2 של השירות. אפשר לעשות את זה בקלות באמצעות Istio. יוצרים קובץ aspnetcore-virtualservice-weights.yaml חדש כדי להתייחס לשתי קבוצות המשנה עם משקלים שונים:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v1
weight: 75
- destination:
host: aspnetcore-service
subset: v2
weight: 25
מעדכנים את VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
עכשיו, כשמרעננים את הדפדפן, אמורות להיות מוצגות הגרסאות v1 ו-v2 ביחס של בערך 3:1.
מידע נוסף זמין במאמר בנושא פיצול תנועה ב-Istio.
9. הזרקת תקלות
משימת פיתוח שימושית נוספת שאפשר לבצע לצורך בדיקה היא להחדיר תקלות או עיכובים לתנועה ולראות איך השירותים מתנהגים בתגובה.
לדוגמה, יכול להיות שתרצו להחזיר תגובה של בקשה שגויה (HTTP 400) ל-50% מהתנועה לגרסה v1. יוצרים קובץ aspnetcore-virtualservice-fault-abort.yaml שזהה לזה:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
abort:
percentage:
value: 50
httpStatus: 400
route:
- destination:
host: aspnetcore-service
subset: v1
מעדכנים את VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
עכשיו, כשמרעננים את הדפדפן, אפשר לראות שבמחצית מהמקרים, שירות v1 מחזיר קוד תגובה מסוג HTTP 400s.
או אולי אתם רוצים להוסיף עיכוב של 5 שניות לבקשות. יוצרים קובץ aspnetcore-virtualservice-fault-delay.yaml שזהה לזה:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: aspnetcore-service
subset: v1
מעדכנים את VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
עכשיו, כשמרעננים את הדפדפן, אמורים לראות שהבקשות מתעכבות ב-5 שניות.
מידע נוסף על תכונות של Istio כמו פסק זמן, ניסיונות חוזרים, כללים מותנים, מפסקי זרם ועוד זמין במאמר בנושא תכונות לניהול תנועה.
10. מעולה!
אנחנו מקווים שהשיעור Lab הזה נתן לכם סקירה כללית של מה ש-Istio יכול לעשות לשירותים שלכם מחוץ לקופסה. מידע נוסף על Istio ו-GKE
השלבים הבאים
- Istio
- מידע נוסף על Kubernetes
- מידע נוסף על Google Kubernetes Engine
- מידע נוסף על .NET ב-Google Cloud Platform
רישיון
העבודה הזו בשימוש במסגרת רישיון Creative Commons שמותנה בייחוס כללי מגרסה 2.0.
11. הסרת המשאבים
אפשר למחוק את האפליקציה ולהסיר את Istio, או פשוט למחוק את אשכול Kubernetes.
מחיקת האפליקציה
כדי למחוק את האפליקציה:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
כדי לוודא שהאפליקציה נעלמה:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
הסרת ההתקנה של Istio
כדי למחוק את Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
כדי לוודא ש-Istio הוסר:
kubectl get pods -n istio-system
מחיקת אשכול Kubernetes
gcloud container clusters delete hello-dotnet-cluster