نشر تطبيق .NET Core وتحديثه في Google Kubernetes Engine

1. نظرة عامة

Microsoft .NET Core هو إصدار مفتوح المصدر من .NET يمكن تشغيله في الأصل في حاويات. يتوفر .NET Core على GitHub ويتم الاحتفاظ به بواسطة Microsoft ومجتمع .NET. يعمل هذا التمرين المعملي على نشر تطبيق .NET Core حاوية في Google Kubernetes Engine (GKE).

يتّبع هذا التمرين المعملي نمط تطوير نموذجي يتم فيه تطوير التطبيقات في بيئة محلية للمطوّرين ثم نشرها في مرحلة الإنتاج. في الجزء الأول من التمرين المعملي، تم التحقق من مثال تطبيق .NET الأساسي باستخدام حاوية يتم تشغيلها في Cloud Shell. بعد التحقُّق من الصحة، يتم نشر التطبيق على Kubernetes باستخدام GKE. يتضمّن التمرين المعملي خطوات إنشاء مجموعة GKE.

وفي الجزء الثاني من التمرين المعملي، يتم إجراء تغيير طفيف على التطبيق يُظهر اسم المضيف للحاوية التي تشغل مثيل التطبيق. بعد ذلك، يتم التحقّق من صحة التطبيق المُعدَّل في Cloud Shell، ثم يتم تعديل عملية النشر لاستخدام الإصدار الجديد. يوضح الشكل التوضيحي التالي تسلسل الأنشطة في هذا التمرين المعملي:

مخطَّط تسلسل العرض التوضيحي

التكاليف

إذا شغّلت هذا التمرين المعملي كما هو مكتوب بالضبط، فسيتم تطبيق التكاليف العادية للخدمات التالية

2. الإعداد والمتطلبات

المتطلبات الأساسية

يجب توفُّر حساب على Google Cloud ومشروع لإكمال هذا التمرين. للحصول على تعليمات أكثر تفصيلاً حول كيفية إنشاء مشروع جديد، يمكنك الاطّلاع على هذا الدرس التطبيقي حول الترميز.

يستخدم هذا التمرين المعملي Docker الذي يتم تشغيله في Cloud Shell، وهو متاح عبر Google Cloud Console ويتم إعداده مسبقًا مع العديد من الأدوات المفيدة، مثل gcloud و Docker. يمكنك الاطّلاع أدناه على طريقة الوصول إلى Cloud Shell. انقر على أيقونة Cloud Shell في أعلى اليسار للكشف عنها في الجزء السفلي من نافذة وحدة التحكم.

Cloud Shell

خيارات الضبط البديلة لمجموعة GKE (اختيارية)

يتطلب هذا التمرين المعملي مجموعة Kubernetes. في القسم التالي، يتم إنشاء مجموعة GKE بإعدادات بسيطة. يعرض هذا القسم بعض أوامر gcloud التي توفّر خيارات إعدادات بديلة لاستخدامها عند إنشاء مجموعة Kubernetes باستخدام GKE. على سبيل المثال، باستخدام الطلبات الواردة أدناه، يمكن تحديد أنواع الأجهزة والمناطق وكذلك وحدات معالجة الرسومات المختلفة (المسرِّعات).

  • يمكنك إدراج أنواع الأجهزة باستخدام هذا الأمر "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.

للحصول على قائمة كاملة بخيارات ضبط 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

3- الاختبار على الجهاز وتأكيد الوظائف المطلوبة

يستخدم هذا التمرين المعملي صور الحاويات التالية من مستودع .NET الرسمي على مركز Docker.

تشغيل الحاوية على الجهاز للتحقق من الوظائف

في 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 باستخدام "معاينة الويب".

4. الوصول إلى الخدمات من خلال Cloud Shell باستخدام ميزة "معاينة الويب"

توفّر Cloud Shell ميزة Web Preview التي تتيح استخدام متصفِّح للتفاعل مع العمليات الجارية في مثيل Cloud Shell.

استخدام "معاينة الويب" لعرض التطبيقات في Cloud Shell

في Cloud Shell، انقر على زر معاينة الويب واختَر "Preview on المنفذ 8080" (معاينة على المنفذ 8080). (أو أي منفذ تم تعيين "معاينة الويب" لاستخدامه).

Cloud Shell

سيؤدي ذلك إلى فتح نافذة متصفح بها عنوان مثل هذا:

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

عرض نموذج تطبيق NET .باستخدام "معاينة الويب"

يمكن الآن عرض نموذج التطبيق الذي تم تشغيله في الخطوة الأخيرة من خلال بدء "معاينة الويب" وتحميل عنوان URL المقدَّم. من المفترض أن تظهر بشكلٍ مشابه لما يلي:

لقطة شاشة من الإصدار 1 من تطبيق .NET

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

لاحِظ الرسائل التي تشير إلى إنشاء الموارد المطلوبة.

استكشاف الموارد الناتجة

يمكننا استخدام واجهة سطر الأوامر 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>

الاطّلاع على مرجع "الخدمة"

مورد الخدمة في Kubernetes هو جهاز موازنة الحمل. يتم تحديد نقاط النهاية عن طريق التسميات على المجموعات. بهذه الطريقة، فور إضافة لوحات جديدة إلى عملية النشر من خلال عملية "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. وهذا يعني أنّ أيّ مجموعة أجهزة داخل المجموعة يمكنها تحويل اسم الخدمة، dotnet-service إلى عنوان IP الخاص بها. سيتم موازنة حمولة الطلبات المرسَلة إلى الخدمة على جميع الأجهزة الافتراضية (Pods). تعرض قيمة Endpoints أعلاه عناوين IP للمجموعات المتوفّرة حاليًا لهذه الخدمة. قارن هذه العناوين بعناوين IP الخاصة باللوحات التي تم توضيحها أعلاه.

التحقق من التطبيق قيد التشغيل

في هذه المرحلة، أصبح التطبيق نشطًا وجاهزًا لطلبات المستخدمين. للوصول إليه، استخدم خادمًا وكيلاً. ينشئ الأمر التالي خادمًا وكيلاً محليًا يقبل الطلبات على المنفذ 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- تعديل التطبيق

في هذا القسم، سيتم تعديل التطبيق لعرض المضيف الذي يتم تشغيل المثيل عليه. سيتيح لك ذلك التأكّد من عمل ميزة موازنة التحميل ومن أنّ مجموعات الصور المتسلسلة المتاحة تستجيب على النحو المتوقّع.

الحصول على رمز المصدر

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

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

لاحِظ أنّه يتم تعديل مورد "النشر" ويظهر مورد "الخدمة" بدون تغيير. يمكن رؤية مجموعات الصور المُعدَّلة كما كان الحال من قبل باستخدام الأمر 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. سيؤدي الأمر التالي إلى توسيع نطاق عملية النشر لما يصل إلى 6 حالات من التطبيق.

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

يمكن الاطّلاع على مجموعات الأجهزة الصغيرة الجديدة وحالتها الحالية باستخدام هذا الأمر.

kubectl get pod -w

يُرجى ملاحظة أنّ إعادة تحميل نافذة المتصفّح نفسها يدل على موازنة عدد الزيارات على مستوى جميع مجموعات النُسخ الجديدة.

8. تهانينا!

في هذا التمرين المعملي، تم التحقق من نموذج ويب .NET Core في بيئة مطور برامج وتم نشره بعد ذلك في Kubernetes باستخدام GKE. تم بعد ذلك تعديل التطبيق لعرض اسم المضيف للحاوية التي كان يتم تشغيله فيها. بعد ذلك، تم تحديث عملية نشر Kubernetes إلى الإصدار الجديد وتم توسيع نطاق التطبيق لتوضيح كيفية توزيع الحِمل على مثيلات إضافية.

للاطّلاع على المزيد من المعلومات حول .NET وKubernetes، ننصحك بالاطّلاع على هذه الفيديوهات التعليمية. وتستند هذه التحسينات إلى ما تم تعلّمه في هذا التمرين المعملي من خلال تقديم شبكة Istio Service Mesh لأنماط توجيه ومرونة أكثر تعقيدًا.

9. تَنظيم

ولتجنُّب التكاليف غير المقصودة، استخدِم الأوامر التالية لحذف المجموعة وصورة الحاوية التي تم إنشاؤها في هذا الدرس التطبيقي.

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