1. סקירה כללית
Microsoft .NET Core היא גרסה של .NET עם קוד פתוח ופלטפורמה חוצת-מערכות, שאפשר להפעיל אותה באופן מקורי במאגרי תמונות. .NET Core זמין ב-GitHub ומתוחזק על ידי מיקרוסופט וקהילת .NET. בשיעור ה-Lab הזה תלמדו איך לפרוס אפליקציית .NET Core בקונטיינר ב-Google Kubernetes Engine (GKE).
בשיעור ה-Lab הזה נשתמש בתבנית פיתוח טיפוסית שבה מפתחים אפליקציות בסביבה מקומית של מפתחים, ואז פורסים אותן בסביבת ייצור. בחלק הראשון של ה-Lab, אפליקציית .NET Core לדוגמה מאומתת באמצעות קונטיינר שפועל ב-Cloud Shell. אחרי האימות, האפליקציה נפרסת ב-Kubernetes באמצעות GKE. ה-Lab כולל את השלבים ליצירת אשכול GKE.
בחלק השני של הסדנה, מתבצע שינוי קל באפליקציה שמציגה את שם המארח של הקונטיינר שמריץ את מופע האפליקציה הזה. לאחר מכן, האפליקציה המעודכנת מאומתת ב-Cloud Shell והפריסה מתעדכנת לשימוש בגרסה החדשה. באיור הבא מוצג רצף הפעילויות בשיעור ה-Lab הזה:

עלויות
אם תפעילו את המעבדה הזו בדיוק כמו שהיא כתובה, יחולו עלויות רגילות על השירותים הבאים
2. הגדרה ודרישות
דרישות מוקדמות
כדי להשלים את ה-Lab הזה, צריך חשבון ופרויקט ב-Google Cloud. הוראות מפורטות יותר ליצירת פרויקט חדש זמינות ב-Codelab הזה.
בשיעור ה-Lab הזה נעשה שימוש ב-Docker שפועל ב-Cloud Shell, שזמין דרך מסוף Google Cloud ומגיע עם הגדרות מראש של הרבה כלים שימושיים, כמו gcloud ו-Docker. בהמשך מוסבר איך מקבלים גישה ל-Cloud Shell. לוחצים על סמל Cloud Shell בפינה הימנית העליונה כדי להציג אותו בחלונית התחתונה של חלון המסוף.

אפשרויות הגדרה חלופיות לאשכול GKE (אופציונלי)
כדי לבצע את שיעור ה-Lab הזה, צריך אשכול Kubernetes. בקטע הבא נוצר אשכול GKE עם הגדרה פשוטה. בקטע הזה מוצגות כמה פקודות gcloud שמספקות אפשרויות חלופיות להגדרה כשיוצרים אשכול Kubernetes באמצעות GKE. לדוגמה, באמצעות הפקודות שבהמשך אפשר לזהות סוגים שונים של מכונות, אזורים ואפילו יחידות GPU (מאיצים).
- כדי להציג רשימה של סוגי מכונות, מריצים את הפקודה
gcloud compute machine-types list - מציגים את רשימת ה-GPU באמצעות הפקודה
gcloud compute accelerator-types list - מציגים את אזורי המחשוב באמצעות הפקודה
gcloud compute zones list - קבלת עזרה לגבי כל פקודת gcloud
gcloud container clusters --help- לדוגמה, כאן מוסבר איך ליצור אשכול Kubernetes
gcloud container clusters create --help
- לדוגמה, כאן מוסבר איך ליצור אשכול Kubernetes
רשימה מלאה של אפשרויות ההגדרה של GKE מופיעה במאמר הזה.
הכנה ליצירת אשכול Kubernetes
ב-Cloud Shell, צריך להגדיר כמה משתני סביבה ולהגדיר את לקוח gcloud. אפשר לעשות זאת באמצעות הפקודות הבאות.
export PROJECT_ID=YOUR_PROJECT_ID
export DEFAULT_ZONE=us-central1-c
gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${DEFAULT_ZONE}
יצירת אשכול GKE
ב-Lab הזה פורסים את אפליקציית .NET Core ב-Kubernetes, ולכן צריך ליצור אשכול. כדי ליצור אשכול Kubernetes חדש ב-Google Cloud באמצעות GKE, משתמשים בפקודה הבאה.
gcloud container clusters create dotnet-cluster \
--zone ${DEFAULT_ZONE} \
--num-nodes=1 \
--node-locations=${DEFAULT_ZONE},us-central1-b \
--enable-stackdriver-kubernetes \
--machine-type=n1-standard-1 \
--workload-pool=${PROJECT_ID}.svc.id.goog \
--enable-ip-alias
-
--num-nodesהוא מספר הצמתים שרוצים להוסיף לכל אזור, ואפשר לשנות את המספר הזה בהמשך. -
--node-locationsהיא רשימה של אזורים שמופרדים בפסיקים. במקרה הזה, האזור שציינתם במשתנה הסביבה שלמעלה והאזורus-central1-bמשמשים- הערה: הרשימה לא יכולה להכיל כפילויות
-
--workload-poolמגדיר Workload Identity כדי שעומסי עבודה ב-GKE יוכלו לגשת לשירותי Google Cloud
בזמן בניית האשכול מוצגות ההודעות הבאות
Creating cluster dotnet-cluster in us-central1-b... Cluster is being deployed...⠼
הגדרת kubectl
kubectl CLI היא הדרך העיקרית לאינטראקציה עם אשכול Kubernetes. כדי להשתמש בו עם האשכול החדש שנוצר, צריך להגדיר אותו כך שיאמת את האשכול. מבצעים את הפעולה באמצעות הפקודה הבאה.
$ gcloud container clusters get-credentials dotnet-cluster --zone ${DEFAULT_ZONE}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for dotnet-cluster.
עכשיו אמורה להיות אפשרות להשתמש ב-kubectl כדי ליצור אינטראקציה עם האשכול.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-dotnet-cluster-default-pool-02c9dcb9-fgxj Ready <none> 2m15s v1.16.13-gke.401
gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 Ready <none> 2m24s v1.16.13-gke.401
3. בדיקה מקומית ואישור הפונקציונליות הרצויה
במעבדה הזו נעשה שימוש בקובצי האימג' של הקונטיינרים הבאים ממאגר .NET הרשמי ב-Docker Hub.
הרצת קונטיינר באופן מקומי כדי לאמת את הפונקציונליות
ב-Cloud Shell, מריצים את פקודת Docker הבאה כדי לוודא ש-Docker פועל כמו שצריך ושהקונטיינר של .NET פועל כמצופה:
$ docker run --rm mcr.microsoft.com/dotnet/samples
Hello from .NET!
__________________
\
\
....
....'
....
..........
.............'..'..
................'..'.....
.......'..........'..'..'....
........'..........'..'..'.....
.'....'..'..........'..'.......'.
.'..................'... ......
. ......'......... .....
. ......
.. . .. ......
.... . .......
...... ....... ............
................ ......................
........................'................
......................'..'...... .......
.........................'..'..... .......
........ ..'.............'..'.... ..........
..'..'... ...............'....... ..........
...'...... ...... .......... ...... .......
........... ....... ........ ......
....... '...'.'. '.'.'.' ....
....... .....'.. ..'.....
.. .......... ..'........
............ ..............
............. '..............
...........'.. .'.'............
............... .'.'.............
.............'.. ..'..'...........
............... .'..............
......... ..............
.....
Environment:
.NET 5.0.1-servicing.20575.16
Linux 5.4.58-07649-ge120df5deade #1 SMP PREEMPT Wed Aug 26 04:56:33 PDT 2020
אישור תכונות אפליקציית האינטרנט
אפשר גם לאמת אפליקציית אינטרנט לדוגמה ב-Cloud Shell. הפקודה Docker run שמופיעה למטה יוצרת מאגר חדש שחושף את יציאת 80 וממפה אותה ליציאה localhost ביציאה 8080. חשוב לזכור שבמקרה הזה localhost נמצא ב-Cloud Shell.
$ docker run -it --rm -p 8080:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {64a3ed06-35f7-4d95-9554-8efd38f8b5d3} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
מכיוון שמדובר באפליקציית אינטרנט, צריך להציג אותה ולאמת אותה בדפדפן אינטרנט. בקטע הבא מוסבר איך עושים את זה ב-Cloud Shell באמצעות תצוגה מקדימה של אתר.
4. גישה לשירותים מ-Cloud Shell באמצעות 'תצוגה מקדימה באינטרנט'
ב-Cloud Shell יש תכונה בשם תצוגה מקדימה באינטרנט, שמאפשרת להשתמש בדפדפן כדי ליצור אינטראקציה עם תהליכים שפועלים במופע של Cloud Shell.
שימוש בתצוגה מקדימה של אתרים כדי להציג אפליקציות ב-Cloud Shell
ב-Cloud Shell, לוחצים על לחצן התצוגה המקדימה באינטרנט ובוחרים באפשרות תצוגה מקדימה ביציאה 8080 (או בכל יציאה אחרת שהוגדרה לשימוש בתצוגה המקדימה באינטרנט).

ייפתח חלון בדפדפן עם כתובת כמו:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0
הצגת אפליקציית .NET לדוגמה באמצעות תצוגה מקדימה באינטרנט
עכשיו אפשר להציג את האפליקציה לדוגמה שהופעלה בשלב הקודם. לשם כך, מפעילים את התצוגה המקדימה באינטרנט וטוענים את כתובת ה-URL שסופקה. הוא אמור להיראות כך:

5. פריסה ב-Kubernetes
יוצרים את קובץ ה-YAML ומחילים אותו
בשלב הבא נדרש קובץ YAML שמתאר שני משאבי Kubernetes: פריסה ושירות. יוצרים קובץ בשם dotnet-app.yaml ב-Cloud Shell ומוסיפים לו את התוכן הבא.
apiVersion: apps/v1
kind: Deployment
metadata:
name: dotnet-deployment
labels:
app: dotnetapp
spec:
replicas: 3
selector:
matchLabels:
app: dotnetapp
template:
metadata:
labels:
app: dotnetapp
spec:
containers:
- name: dotnet
image: mcr.microsoft.com/dotnet/samples:aspnetapp
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: dotnet-service
spec:
selector:
app: dotnetapp
ports:
- protocol: TCP
port: 8080
targetPort: 80
עכשיו משתמשים בפקודה kubectl כדי להחיל את הקובץ הזה על Kubernetes.
$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment created
service/dotnet-service created
שימו לב להודעות שמציינות שהמשאבים הרצויים נוצרו.
עיון במשאבים שנוצרו
אפשר להשתמש ב-CLI kubectl כדי לבדוק את המשאבים שנוצרו למעלה. קודם כול, נבדוק את משאבי הפריסה ונוודא שהפריסה החדשה מופיעה שם.
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dotnet-deployment 3/3 3 3 80s
לאחר מכן, בודקים את ReplicaSets. אחרי הפריסה שלמעלה אמור להיווצר ReplicaSet.
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
dotnet-deployment-5c9d4cc4b9 3 3 3 111s
לבסוף, כדאי לעיין בפודים. הפריסה מציינת שצריכות להיות שלוש מכונות. הפקודה הבאה אמורה להראות שיש שלוש דוגמאות. האפשרות -o wide נוספת כדי שהצמתים שבהם המופעים האלה פועלים יוצגו.
$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Running 0 2m25s 10.16.0.8 gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 <none> <none>
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Running 0 2m25s 10.16.1.7 gke-dotnet-cluster-default-pool-02c9dcb9-fgxj <none> <none>
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Running 0 2m25s 10.16.0.7 gke-dotnet-cluster-default-pool-ed09d7b7-xdx9 <none> <none>
בדיקת משאב השירות
משאב Service ב-Kubernetes הוא מאזן עומסים. נקודות הקצה נקבעות לפי תוויות ב-Pods. כך, ברגע שמוסיפים פודים חדשים לפריסה באמצעות הפעולה kubectl scale deployment שלמעלה, הפודים שנוצרים זמינים באופן מיידי לבקשות שמטופלות על ידי השירות הזה.
הפקודה הבאה אמורה להציג את משאב השירות.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dotnet-service ClusterIP 10.20.9.124 <none> 8080/TCP 2m50s
...
אפשר לראות פרטים נוספים על השירות באמצעות הפקודה הבאה.
$ kubectl describe svc dotnet-service
Name: dotnet-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=dotnetapp
Type: ClusterIP
IP: 10.20.9.124
Port: <unset> 8080/TCP
TargetPort: 80/TCP
Endpoints: 10.16.0.7:80,10.16.0.8:80,10.16.1.7:80
Session Affinity: None
Events: <none>
שימו לב שהשירות הוא מסוג ClusterIP. כלומר, כל Pod באשכול יכול לפתור את שם השירות, dotnet-service, לכתובת ה-IP שלו. הבקשות שנשלחות לשירות יאזנו את העומס בכל המופעים (Pods). הערך Endpoints שלמעלה מציג את כתובות ה-IP של ה-Pods שזמינים כרגע לשירות הזה. משווים את כתובות ה-IP האלה לכתובות ה-IP של ה-Pods שמופיעות בפלט שלמעלה.
אימות האפליקציה שפועלת
בשלב הזה האפליקציה פעילה ומוכנה לבקשות של משתמשים. כדי לגשת אליו, צריך להשתמש בשרת proxy. הפקודה הבאה יוצרת פרוקסי מקומי שמקבל בקשות ביציאה 8080 ומעביר אותן לאשכול Kubernetes.
$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080
עכשיו משתמשים בתצוגה מקדימה של אתר ב-Cloud Shell כדי לגשת לאפליקציית האינטרנט.
מוסיפים את המחרוזת הבאה לכתובת ה-URL שנוצרה על ידי תצוגה מקדימה של דף אינטרנט: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. התוצאה תיראה בערך כך:
https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/
הצלחת לפרוס אפליקציית .NET Core ב-Google Kubernetes Engine. בשלב הבא נבצע שינוי באפליקציה ונפרוס אותה מחדש.
6. שינוי האפליקציה
בקטע הזה, האפליקציה תשתנה כך שיוצג בה המארח שבו פועל המופע. כך תוכלו לוודא שאיזון העומסים פועל ושה-Pods הזמינים מגיבים כמצופה.
קבלת קוד המקור
git clone https://github.com/dotnet/dotnet-docker.git
cd dotnet-docker/samples/aspnetapp/
צריך לעדכן את האפליקציה כדי לכלול את שם המארח
vi aspnetapp/Pages/Index.cshtml
<tr>
<td>Host</td>
<td>@Environment.MachineName</td>
</tr>
פיתוח קובץ אימג' של קונטיינר חדש ובדיקה מקומית
יוצרים את קובץ האימג' החדש בקונטיינר עם הקוד המעודכן.
docker build --pull -t aspnetapp:alpine -f Dockerfile.alpine-x64 .
כמו קודם, בודקים את האפליקציה החדשה באופן מקומי
$ docker run --rm -it -p 8080:80 aspnetapp:alpine
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {f71feb13-8eae-4552-b4f2-654435fff7f8} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
כמו קודם, אפשר לגשת לאפליקציה באמצעות תצוגה מקדימה באינטרנט. הפעם הפרמטר Host אמור להיות גלוי, כמו שמוצג כאן:

פותחים כרטיסייה חדשה ב-Cloud Shell ומריצים את הפקודה docker ps כדי לוודא שמזהה הקונטיינר זהה לערך Host שמוצג למעלה.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab85ce11aecd aspnetapp:alpine "./aspnetapp" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp relaxed_northcutt
מתייגים את התמונה ושולחים אותה כדי שתהיה זמינה ל-Kubernetes
כדי ש-Kubernetes יוכל למשוך את התמונה, צריך לתייג אותה ולדחוף אותה. מתחילים ברשימה של תמונות הקונטיינר ומזהים את התמונה הרצויה.
$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
aspnetapp alpine 95b4267bb6d0 6 days ago 110MB
לאחר מכן, מתייגים את התמונה ומעבירים אותה בדחיפה אל Google Container Registry. לפי מזהה התמונה שלמעלה, זה ייראה כך
docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine
7. פריסה מחדש של האפליקציה המעודכנת
עריכת קובץ ה-YAML
חוזרים לספרייה שבה נשמר הקובץ dotnet-app.yaml. מחפשים את השורה הבאה בקובץ ה-YAML
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
צריך לשנות את זה כך שיפנה לקובץ האימג' של הקונטיינר שנוצר והועלה אל gcr.io למעלה.
image: gcr.io/PROJECT_ID/aspnetapp:alpine
אל תשכחו לשנות את הקוד כך שישתמש ב-PROJECT_ID שלכם. בסיום, זה אמור להיראות כך
image: gcr.io/myproject/aspnetapp:alpine
החלת קובץ ה-YAML המעודכן
$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment configured
service/dotnet-service unchanged
שימו לב שמשאב הפריסה מציג עדכון ומשאב השירות לא מציג שינוי. אפשר לראות את ה-Pods המעודכנים כמו קודם באמצעות הפקודה kubectl get pod, אבל הפעם נוסיף את -w, שיעקוב אחרי כל השינויים בזמן שהם קורים.
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Running 0 34m
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Running 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Running 0 34m
dotnet-deployment-85f6446977-tmbdq 0/1 ContainerCreating 0 4s
dotnet-deployment-85f6446977-tmbdq 1/1 Running 0 5s
dotnet-deployment-5c9d4cc4b9-vvdln 1/1 Terminating 0 34m
dotnet-deployment-85f6446977-lcc58 0/1 Pending 0 0s
dotnet-deployment-85f6446977-lcc58 0/1 Pending 0 0s
dotnet-deployment-85f6446977-lcc58 0/1 ContainerCreating 0 0s
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-lcc58 1/1 Running 0 6s
dotnet-deployment-5c9d4cc4b9-cspqd 1/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 0s
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 0s
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-vvdln 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 0/1 Pending 0 2s
dotnet-deployment-85f6446977-hw24v 0/1 ContainerCreating 0 2s
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-cspqd 0/1 Terminating 0 34m
dotnet-deployment-85f6446977-hw24v 1/1 Running 0 3s
dotnet-deployment-5c9d4cc4b9-httw6 1/1 Terminating 0 34m
dotnet-deployment-5c9d4cc4b9-httw6 0/1 Terminating 0 34m
הפלט שלמעלה מראה את העדכון בהדרגה (rolling) בזמן שהוא מתבצע. קודם כל, קונטיינרים חדשים מופעלים, וכשהם פועלים, הקונטיינרים הישנים מופסקים.
אימות האפליקציה שפועלת
בשלב הזה האפליקציה מעודכנת ומוכנה לבקשות משתמשים. כמו קודם, אפשר לגשת אליו באמצעות שרת proxy.
$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080
עכשיו משתמשים בתצוגה מקדימה של אתר ב-Cloud Shell כדי לגשת לאפליקציית האינטרנט.
מוסיפים את המחרוזת הבאה לכתובת ה-URL שנוצרה על ידי תצוגה מקדימה של דף אינטרנט: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. התוצאה תיראה בערך כך:
https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/
אישור ששירות Kubernetes מפזר את העומס
מרעננים את כתובת ה-URL הזו כמה פעמים ורואים שהמארח משתנה כי הבקשות מאוזנות בין פודים שונים על ידי השירות. משווים את ערכי המארח לרשימת ה-Pods שלמעלה כדי לוודא שכל ה-Pods מקבלים תנועה.
הגדלת המכונות
קל לשנות את גודל האפליקציות ב-Kubernetes. הפקודה הבאה תגדיל את הפריסה עד ל-6 מופעים של האפליקציה.
$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled
אפשר לראות את ה-Pods החדשים ואת המצב הנוכחי שלהם באמצעות הפקודה הזו
kubectl get pod -w
שימו לב שאחרי רענון של אותו חלון בדפדפן, התנועה מתחלקת באופן שווה בין כל ה-Pods החדשים.
8. מעולה!
בשיעור ה-Lab הזה, אפליקציית אינטרנט לדוגמה ב- .NET Core אומתה בסביבת פיתוח ולאחר מכן נפרסה ב-Kubernetes באמצעות GKE. לאחר מכן האפליקציה שונתה כך שיוצג בה שם המארח של הקונטיינר שבו היא פועלת. לאחר מכן, פריסת Kubernetes עודכנה לגרסה החדשה והאפליקציה הוגדלה כדי להדגים איך העומס מתחלק בין מופעים נוספים.
כדי לקבל מידע נוסף על .NET ו-Kubernetes, אפשר לעיין במדריכים הבאים. התרגילים האלה מתבססים על מה שלמדתם בשיעור ה-Lab הזה, ומציגים את Istio Service Mesh כדי ליצור דפוסי ניתוב ועמידות מתוחכמים יותר.
9. הסרת המשאבים
כדי למנוע עלויות לא מכוונות, משתמשים בפקודות הבאות כדי למחוק את האשכול ואת קובץ האימג' של הקונטיינר שנוצרו במעבדה הזו.
gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine