פריסה ועדכון של אפליקציית .NET Core ב-Google Kubernetes Engine

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 בפינה הימנית העליונה כדי להציג אותו בחלונית התחתונה של חלון המסוף.

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

רשימה מלאה של אפשרויות ההגדרה של 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 (או בכל יציאה אחרת שהוגדרה לשימוש בתצוגה המקדימה באינטרנט).

Cloud Shell

ייפתח חלון בדפדפן עם כתובת כמו:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0

הצגת אפליקציית .NET לדוגמה באמצעות תצוגה מקדימה באינטרנט

עכשיו אפשר להציג את האפליקציה לדוגמה שהופעלה בשלב הקודם. לשם כך, מפעילים את התצוגה המקדימה באינטרנט וטוענים את כתובת ה-URL שסופקה. הוא אמור להיראות כך:

צילום מסך של אפליקציית .NET V1

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

פותחים כרטיסייה חדשה ב-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