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

۱. مرور کلی

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

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

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

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

هزینه‌ها

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

۲. تنظیمات و الزامات

پیش‌نیازها

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

این آزمایشگاه از داکر در حال اجرا در Cloud Shell استفاده می‌کند، که از طریق کنسول Google Cloud در دسترس است و با ابزارهای مفید بسیاری مانند 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 روش اصلی تعامل با یک کلاستر 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 استفاده می‌کند.

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

در 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 را در معرض دید قرار می‌دهد و آن را به پورت 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 با استفاده از پیش‌نمایش وب نشان می‌دهد.

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

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

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

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

پوسته ابری

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

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

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

برنامه نمونه‌ای که در مرحله قبل اجرا شد، اکنون با اجرای پیش‌نمایش وب و بارگذاری URL ارائه شده قابل مشاهده است. این برنامه باید چیزی شبیه به این باشد:

تصویر از برنامه .NET نسخه ۱

۵. استقرار در 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

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

منابع حاصل را کاوش کنید

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

$ kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
dotnet-deployment   3/3     3            3           80s

حالا نگاهی به ReplicaSetها بیندازید. باید یک ReplicaSet توسط پیاده‌سازی بالا ایجاد شده باشد.

$ kubectl get replicaset
NAME                           DESIRED   CURRENT   READY   AGE
dotnet-deployment-5c9d4cc4b9   3         3         3       111s

در نهایت، نگاهی به Podها بیندازید. Deployment نشان داد که باید سه نمونه وجود داشته باشد. دستور زیر باید نشان دهد که سه نمونه وجود دارد. گزینه -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 یک متعادل‌کننده بار است. نقاط پایانی توسط برچسب‌های روی Podها تعیین می‌شوند. به این ترتیب، به محض اینکه 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های Podهایی را که در حال حاضر برای این سرویس در دسترس هستند، نشان می‌دهد. این IPها را با IPهای Podهایی که در بالا نمایش داده شده‌اند، مقایسه کنید.

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

در این مرحله، برنامه فعال و آماده دریافت درخواست‌های کاربر است. برای دسترسی به آن، از یک پروکسی استفاده کنید. دستور زیر یک پروکسی محلی ایجاد می‌کند که درخواست‌ها را روی پورت 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. در مرحله بعد، تغییری در برنامه ایجاد کرده و آن را مجدداً مستقر خواهیم کرد.

۶. برنامه را تغییر دهید

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

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

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 را اجرا کنید تا ببینید آیا شناسه کانتینر با مقدار میزبان نشان داده شده در بالا مطابقت دارد یا خیر.

$ 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 بتواند آن را دریافت کند، باید تصویر را برچسب‌گذاری و ارسال (push) کرد. با فهرست کردن تصاویر کانتینر شروع کنید و تصویر مورد نظر را شناسایی کنید.

$ 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

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

موارد زیر را به 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 را چندین بار رفرش کنید و توجه داشته باشید که با متعادل‌سازی بار درخواست‌ها در پادهای مختلف توسط سرویس، میزبان تغییر می‌کند. مقادیر میزبان را با لیست پادها از بالا مقایسه کنید تا ببینید که همه پادها ترافیک دریافت می‌کنند.

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

مقیاس‌بندی برنامه‌ها در Kubernetes آسان است. دستور follow، استقرار را تا 6 نمونه از برنامه مقیاس‌بندی می‌کند.

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

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

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