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

1. סקירה כללית

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

שיעור ה-Lab הזה פועל לפי דפוס פיתוח אופייני שבו אפליקציות פותחות בסביבה מקומית של המפתחים ולאחר מכן נפרסות בסביבת הייצור. בחלק הראשון של שיעור ה-Lab, אפליקציית ליבה לדוגמה של .NET מאומתת באמצעות קונטיינר שרץ ב-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 בפינה הימנית העליונה כדי להציג אותו בחלונית התחתונה של חלון המסוף.

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 היא רשימת אזורים שמופרדת בפסיקים. במקרה הזה נעשה שימוש בתחום (zone) שמזהים במשתנה הסביבה שלמעלה, ובנוסף נעשה שימוש ב-us-central1-b
    • הערה: הרשימה לא יכולה לכלול כפילויות
  • --workload-pool יוצר זהות של עומסי עבודה כדי שעומסי עבודה ב-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 פועל כראוי ושקונטיינר .NET פועל כצפוי על ידי הרצת הפקודה הבאה של Docker:

$ 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 וממפה אותו ליציאה 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 באמצעות Web Preview.

4. גישה לשירותים מהמעטפת של הענן באמצעות Web Preview

Cloud Shell כוללת את Web Preview, תכונה שמאפשרת להשתמש בדפדפן כדי לקיים אינטראקציה עם תהליכים שרצים במכונה של Cloud Shell.

שימוש ב'תצוגה מקדימה של אתר' צפייה באפליקציות ב-Cloud Shell

ב-Cloud Shell, לוחצים על לחצן התצוגה המקדימה לאינטרנט ובוחרים באפשרות Preview on Port 8080 (תצוגה מקדימה ביציאה 8080). (או כל הגדרה אחרת של יציאת האינטרנט בתצוגה המקדימה).

Cloud Shell

פעולה זו תפתח חלון דפדפן עם כתובת כזו:

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

הצגת אפליקציה לדוגמה של .NET באמצעות Web Preview

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

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

5. פריסה ב-Kubernetes

יוצרים את קובץ ה-YAML ומחילים

בשלב הבא נדרש קובץ YAML שמתאר שני משאבים ב-Kubernetes: Deployment (פריסה) ו-Service (שירות). יוצרים קובץ בשם 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>

בדיקת המשאב של השירות

משאב שירות ב-Kubernetes הוא מאזן עומסים. נקודות הקצה נקבעות לפי תוויות ב-Pods. כך, מיד לאחר הוספת קבוצות Pod חדשים לפריסה באמצעות הפעולה kubectl scale deployment שצוינה למעלה, קבוצות ה-Pod שייווצרו יהיו זמינות באופן מיידי לבקשות שמטופלות על ידי השירות הזה.

הפקודה הבאה אמורה להציג את משאב השירות.

$ 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. הפקודה הבאה יוצרת שרת proxy מקומי שמקבל בקשות ביציאה 8080 ומעביר אותן לאשכול kubernetes.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

עכשיו אפשר להשתמש ב-Web Preview ב-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

כמו תמיד, אפשר לגשת לאפליקציה באמצעות התכונה 'תצוגה מקדימה של האתר'. הפעם פרמטר המארח אמור להיות גלוי, כפי שמוצג כאן:

Cloud Shell

פותחים כרטיסייה חדשה ב-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. בעזרת מזהה ה-IMAGE שלמעלה, הוא ייראה כך

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

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

בפלט שלמעלה רואים את העדכון הדרגתי בזמן אמת. ראשית, מאגרי התגים החדשים מופעלים, וכשהם פועלים, הקונטיינרים הישנים נסגרים.

יש לאמת את האפליקציה שפועלת

בשלב הזה האפליקציה מעודכנת ומוכנה לבקשות משתמשים. כמו קודם, ניתן לגשת אליהם באמצעות שרת proxy.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

עכשיו אפשר להשתמש ב-Web Preview ב-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 שלמעלה כדי לראות שכל ה-Pods מקבלים תנועה.

הרחבת מכונות

קל להתאים אפליקציות ב-Kubernetes. פקודת המעקב מתאימה את הפריסה ל-6 מופעים של האפליקציה לכל היותר.

$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled

אפשר להציג את ה-Pods החדשים ואת המצב הנוכחי שלהם באמצעות הפקודה הזו.

kubectl get pod -w

שימו לב שרענון אותו חלון דפדפן מראה שהתנועה מאוזנת בכל קבוצות ה-Pod החדשים.

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