استقرار و به‌روزر کردن برنامه ‎.NET Core در Google Kubernetes Engine

۱. نمای کلی

‫Microsoft .NET Core نسخه‌ای متن‌باز و چندسکویی از .NET است که می‌تواند به‌طور بومی در محفظه‌ها اجرا شود. ‫.NET Core در GitHub دردسترس است و Microsoft و انجمن .NET آن را نگهداری می‌کنند. این آزمایشگاه برنامه ‎ .NET Core کانتینرسازی‌شده را در Google Kubernetes Engine‏ (GKE) مستقر می‌کند.

این آزمایشگاه از یک الگوی توسعه معمول پیروی می‌کند که در آن برنامه‌ها در محیط محلی توسعه‌دهندگان توسعه می‌یابند و سپس برای تولید مستقر می‌شوند. در بخش اول آزمایشگاه، یک برنامه نمونه .NET core بااستفاده از محفظه‌ای که در Cloud Shell اجرا می‌شود اعتبارسنجی می‌شود. پس‌از اعتبارسنجی، برنامه بااستفاده از GKE در Kubernetes مستقر می‌شود. این آزمایشگاه شامل مراحل ایجاد خوشه GKE است.

در بخش دوم آزمایشگاه، تغییر کوچکی در برنامه ایجاد می‌شود که نام میزبان محفظه‌ای را که آن نمونه برنامه را اجرا می‌کند نشان می‌دهد. سپس برنامه به‌روزشده در پوسته ابری اعتبارسنجی می‌شود و استقرار برای استفاده از نسخه جدید به‌روز می‌شود. تصویر زیر توالی فعالیت‌ها را در این آزمایشگاه نشان می‌دهد:

نمودار توالی نمایشی

هزینه‌ها

اگر این آزمایشگاه را دقیقاً همان‌طور که نوشته شده است اجرا کنید، هزینه‌های معمول برای سرویس‌های زیر اعمال خواهد شد

۲. راه‌اندازی و الزامات

پیش‌نیازها

برای تکمیل این آزمایشی، حساب و پروژه Google Cloud لازم است. برای دستورالعمل‌های دقیق‌تر درباره نحوه ایجاد پروژه جدید، به این Codelab مراجعه کنید.

این آزمایشگاه از Docker درحال اجرا در Cloud Shell استفاده می‌کند که ازطریق Google Cloud Console دردسترس است و با ابزارهای مفید بسیاری، مانند gcloud و Docker، ازپیش پیکربندی شده است. نحوه دسترسی به پوسته ابری در زیر نشان داده شده است. روی نماد Cloud Shell در بالا سمت چپ کلیک کنید تا در قاب پایین پنجره کنسول نشان داده شود.

Cloud Shell

گزینه‌های پیکربندی جایگزین برای خوشه GKE (اختیاری)

این آزمایشگاه به خوشه 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

ازآنجایی‌که این آزمایشگاه برنامه ‎ .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 هویت بار کاری را ایجاد می‌کند تا بارهای کاری 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

۳. آزمایش محلی و تأیید عملکرد مطلوب

این آزمایشگاه از تصاویر محتوی زیر از مخزن رسمی .NET در Docker hub استفاده می‌کند.

اجرای محفظه به‌صورت محلی برای تأیید عملکرد

در پوسته ابری، با اجرای فرمان 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

تأیید عملکرد برنامه وب

یک برنامه وب نمونه را می‌توان در پوسته ابری نیز اعتبارسنجی کرد. فرمان Docker run زیر محفظه جدیدی ایجاد می‌کند که درگاه 80 را نمایان می‌کند و آن را به درگاه localhost 8080 نگاشت می‌کند. به‌خاطر داشته باشید که localhost در این مورد در پوسته ابری است.

$ 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 بااستفاده از «پیش‌نمایش وب» نشان می‌دهد.

۴. دسترسی به سرویس‌ها از پوسته ابری بااستفاده از «پیش‌نمایش وب»

Cloud Shell پیش‌نمایش وب را ارائه می‌دهد، ویژگی‌ای که امکان استفاده از مرورگر را برای تعامل با فرایندهای درحال اجرا در نمونه Cloud Shell فراهم می‌کند.

از «پیش‌نمایش وب» برای مشاهده برنامه‌ها در Cloud Shell استفاده کنید

در Cloud Shell، روی دکمه پیش‌نمایش وب کلیک کنید و «پیش‌نمایش در درگاه ۸۰۸۰» (یا هر درگاهی که «پیش‌نمایش وب» برای استفاده تنظیم شده است) را انتخاب کنید.

Cloud Shell

با این کار، پنجره مرورگری با نشانی‌ای شبیه به این باز می‌شود:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/

مشاهده برنامه نمونه .NET بااستفاده از «پیش‌نمایش وب»

برنامه نمونه‌ای که در مرحله آخر شروع شد اکنون با شروع «پیش‌نمایش وب» و بار کردن نشانی وب ارائه‌شده قابل‌مشاهده است. باید چیزی شبیه به این باشد:

نماگرفت از برنامه .NET نسخه ۱

۵. مستقر کردن در Kubernetes

ساختن فایل YAML و اعمال کردن

مرحله بعدی به فایل YAML نیاز دارد که دو منبع Kubernetes، یعنی Deployment و Service را توصیف کند. فایلی با نام dotnet-app.yaml در پوسته ابری ایجاد کنید و محتوای زیر را به آن اضافه کنید.

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

به پیام‌هایی که نشان می‌دهند منابع موردنظر ایجاد شده‌اند توجه کنید.

کاوش منابع حاصل

می‌توانیم از kubectl CLI برای بررسی منابعی که در بالا ایجاد شده‌اند استفاده کنیم. ابتدا، بیایید به منابع «استقرار» نگاه کنیم و مطمئن شویم که استقرار جدید آنجا است.

$ 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 آن تبدیل کند. درخواست‌های ارسال‌شده به سرویس در همه نمونه‌ها (Pod) توازن بار خواهند داشت. مقدار Endpoints در بالا IPهای Pods را که درحال‌حاضر برای این سرویس دردسترس است نشان می‌دهد. این‌ها را با IPهای Pods که در بالا برونداد شده‌اند مقایسه کنید.

درستی‌سنجی برنامه درحال اجرا

در این مرحله، برنامه فعال و آماده درخواست‌های کاربر است. برای دسترسی به آن، از پراکسی استفاده کنید. فرمان زیر یک پراکسی محلی ایجاد می‌کند که درخواست‌ها را در درگاه 8080 می‌پذیرد و آن‌ها را به خوشه kubernetes منتقل می‌کند.

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

اکنون از «پیش‌نمایش وب» در Cloud Shell برای دسترسی به برنامه وب استفاده کنید.

موارد زیر را به نشانی وب تولیدشده توسط «پیش‌نمایش وب» اضافه کنید: /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 مستقر کردید. سپس تغییری در برنامه ایجاد می‌کنیم و آن را دوباره مستقر می‌کنیم.

‫۶. اصلاح برنامه

در این بخش، برنامه اصلاح می‌شود تا میزبانی را که نمونه در آن اجرا می‌شود نشان دهد. این کار امکان تأیید عملکرد صحیح توازن بار و پاسخ‌دهی Podهای دردسترس طبق انتظار را فراهم می‌کند.

دریافت کد منبع

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 ارسال کنید. بااستفاده از شناسه تصویر بالا، که به این شکل خواهد بود

docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine

‫۷. برنامه به‌روزشده را دوباره مستقر کنید

ویرایش فایل 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

توجه کنید که منبع «پیاده‌سازی» به‌روزرسانی‌شده و منبع «سرویس» بدون تغییر نشان داده می‌شود. 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

خروجی بالا به‌روزرسانی تدریجی را درحین انجام نشان می‌دهد. ابتدا، محفظه‌های جدید راه‌اندازی می‌شوند و وقتی درحال اجرا باشند، محفظه‌های قدیمی خاتمه می‌یابند.

درستی‌سنجی برنامه درحال اجرا

در این مرحله، برنامه به‌روز شده و برای درخواست‌های کاربر آماده است. مثل قبل، بااستفاده از پراکسی می‌توان به آن دسترسی داشت.

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

اکنون از «پیش‌نمایش وب» در Cloud Shell برای دسترسی به برنامه وب استفاده کنید.

موارد زیر را به نشانی وب تولیدشده توسط «پیش‌نمایش وب» اضافه کنید: /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» بار را توزیع می‌کند

این نشانی وب را چند بار بازآوری کنید و توجه داشته باشید که با توزیع بار درخواست‌ها در Podهای مختلف توسط «سرویس»، «میزبان» تغییر می‌کند. مقادیر «میزبان» را با فهرست Pods در بالا مقایسه کنید تا ببینید همه Pods ترافیک دریافت می‌کنند.

افزایش مقیاس نمونه‌ها

مقیاس‌بندی برنامه‌ها در Kubernetes آسان است. فرمان زیر استقرار را تا ۶ نمونه از برنامه مقیاس‌بندی می‌کند.

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

با این فرمان می‌توان Pods جدید و وضعیت فعلی آن‌ها را مشاهده کرد

kubectl get pod -w

توجه داشته باشید که بازآوری همان پنجره مرورگر نشان می‌دهد که ترافیک اکنون در همه Podهای جدید متعادل شده است.

‫۸. تبریک!

در این آزمایشگاه، یک برنامه وب نمونه ‎ .NET Core در محیط توسعه‌دهنده اعتبارسنجی شد و سپس بااستفاده از GKE در Kubernetes مستقر شد. سپس برنامه اصلاح شد تا نام میزبان محفظه‌ای را که در آن اجرا می‌شد نمایش دهد. سپس استقرار Kubernetes به نسخه جدید به‌روزرسانی شد و برنامه مقیاس‌بندی شد تا نشان دهد چگونه بار در نمونه‌های اضافی توزیع می‌شود.

برای کسب اطلاعات بیشتر درباره NET .و Kubernetes، این آموزش‌های گام‌به‌گام را درنظر بگیرید. این موارد براساس آنچه در این آزمایشگاه آموخته شده است، با معرفی Istio Service Mesh برای الگوهای مسیریابی و انعطاف‌پذیری پیچیده‌تر ساخته شده‌اند.

‫۹. مرتب‌سازی

برای جلوگیری از هزینه‌های ناخواسته، از فرمان‌های زیر برای حذف خوشه و تصویر محفظه ایجادشده در این آزمایشگاه استفاده کنید.

gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine