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

עלויות
אם תפעילו את ה-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 - מציגים את רשימת המעבדים הגרפיים באמצעות הפקודה
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
ממשק ה-CLI של kubectl הוא הדרך העיקרית לאינטראקציה עם אשכול 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. בדיקה מקומית ואישור הפונקציונליות הרצויה
בשיעור ה-Lab הזה משתמשים בקובצי אימג' של קונטיינרים הבאים מהמאגר הרשמי של .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 שבהמשך יוצרת קונטיינר חדש שחושף את היציאה 80 וממפה אותה ליציאה 8080 של localhost. חשוב לזכור שבמקרה הזה, 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 באמצעות Web Preview.
4. גישה לשירותים מ-Cloud Shell באמצעות "תצוגה מקדימה באינטרנט"
ב-Cloud Shell יש את התכונה Web Preview, שמאפשרת להשתמש בדפדפן כדי לבצע אינטראקציה עם תהליכים שפועלים במכונה של Cloud Shell.
שימוש ב "תצוגה מקדימה באינטרנט" כדי להציג אפליקציות ב-Cloud Shell
ב-Cloud Shell, לוחצים על הלחצן של התצוגה המקדימה באינטרנט ובוחרים באפשרות Preview on port 8080 (או כל יציאה אחרת שמוגדרת לתצוגה המקדימה באינטרנט).

ייפתח חלון דפדפן עם כתובת שנראית כך:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/
הצגת האפליקציה לדוגמה ב- .NET באמצעות Web Preview
עכשיו אפשר לראות את האפליקציה לדוגמה שהתחלתם בשלב הקודם. כדי לעשות את זה, מפעילים את Web Preview וטוענים את כתובת ה-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
לבסוף, בודקים את ה-Pods. הפריסה ציינה שצריכים להיות שלושה מופעים. הפקודה הבאה אמורה להראות שיש שלושה מכונות. האפשרות -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
משאב 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 של ה-Pods שהוצגו למעלה.
אימות האפליקציה שפועלת
בשלב הזה האפליקציה פעילה ומוכנה לבקשות של משתמשים. כדי לגשת אליו, צריך להשתמש בשרת proxy. הפקודה הבאה יוצרת שרת 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
כמו קודם, אפשר לגשת לאפליקציה באמצעות Web Preview. הפעם הפרמטר Host אמור להיות גלוי, כמו שמוצג כאן:

פותחים כרטיסייה חדשה ב-Cloud Shell ומריצים את הפקודה docker ps כדי לוודא שמזהה הקונטיינר תואם לערך של המארח שמוצג למעלה.
$ 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 שונים על ידי השירות. משווים בין הערכים של Host לבין רשימת ה-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. הסרת המשאבים
כדי להימנע מעלויות לא מכוונות, משתמשים בפקודות הבאות כדי למחוק את האשכול ואת קובץ האימג' של הקונטיינר שנוצרו ב-Lab הזה.
gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine