1. نظرة عامة
Microsoft .NET Core هو إصدار مفتوح المصدر ومتوافق مع عدّة منصات من .NET يمكن تشغيله في الحاويات. يتوفّر .NET Core على GitHub وتتولّى Microsoft ومنتدى .NET صيانته. ينشر هذا التمرين تطبيق .NET Core محفوظًا في حاوية في Google Kubernetes Engine (GKE).
يتبع هذا التمرين العملي نمط تطوير نموذجيًا حيث يتم تطوير التطبيقات في بيئة محلية للمطوّرين ثم نشرها في مرحلة الإنتاج. في الجزء الأول من التمرين، يتم التحقّق من صحة نموذج تطبيق .NET core باستخدام حاوية تعمل في Cloud Shell. بعد التحقّق من صحة التطبيق، يتم نشره على Kubernetes باستخدام GKE. يتضمّن التمرين خطوات إنشاء مجموعة GKE.
في الجزء الثاني من التمرين، يتم إجراء تغيير بسيط على التطبيق الذي يعرض اسم مضيف الحاوية التي تشغّل مثيل التطبيق هذا. بعد ذلك، يتم التحقّق من صحة التطبيق المعدَّل في Cloud Shell ويتم تعديل عملية النشر لاستخدام الإصدار الجديد. يعرض الرسم التوضيحي التالي تسلسل الأنشطة في هذا التمرين:

التكاليف
إذا نفّذت هذا التمرين المعملي كما هو مكتوب بالضبط، سيتم تطبيق التكاليف العادية للخدمات التالية
2. الإعداد والمتطلبات
المتطلبات الأساسية
لإكمال هذا التمرين، يجب أن يكون لديك حساب ومشروع على Google Cloud. لمزيد من الإرشادات التفصيلية حول كيفية إنشاء مشروع جديد، يُرجى الرجوع إلى هذا الدرس التطبيقي حول الترميز.
يستخدم هذا التمرين Docker الذي يعمل في Cloud Shell، وهو متاح من خلال Google Cloud Console ويأتي مُعدًّا مسبقًا بالعديد من الأدوات المفيدة، مثل gcloud وDocker. في ما يلي كيفية الوصول إلى 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
- على سبيل المثال، يقدّم هذا المرجع تفاصيل حول إنشاء مجموعة Kubernetes
للحصول على قائمة كاملة بخيارات الإعداد في 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-poolWorkload Identity حتى تتمكّن أعباء عمل 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 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 باستخدام ميزة "معاينة الويب".
4. الوصول إلى الخدمات من Cloud Shell باستخدام "معاينة الويب"
توفّر Cloud Shell ميزة معاينة الويب التي تتيح استخدام متصفّح للتفاعل مع العمليات التي يتم تنفيذها في مثيل Cloud Shell.
استخدام "معاينة الويب" لعرض التطبيقات في Cloud Shell
في Cloud Shell، انقر على زر معاينة الويب واختَر "معاينة على المنفذ 8080" (أو أي منفذ تم ضبط "معاينة الويب" لاستخدامه).

سيؤدي ذلك إلى فتح نافذة متصفّح بعنوان مثل:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/
عرض نموذج تطبيق .NET باستخدام "معاينة الويب"
يمكن الآن عرض نموذج التطبيق الذي تم تشغيله في الخطوة الأخيرة من خلال تشغيل "معاينة الويب" وتحميل عنوان URL المقدَّم. من المفترض أن تظهر بشكلٍ مشابه لما يلي:

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
أخيرًا، ألقِ نظرة على 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. بهذه الطريقة، بمجرد إضافة وحدات Pods جديدة إلى عملية النشر من خلال عملية kubectl scale deployment أعلاه، تصبح وحدات Pods الناتجة متاحة على الفور للطلبات التي تتم معالجتها بواسطة هذه الخدمة.
من المفترض أن يعرض الأمر التالي مورد الخدمة.
$ 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 الخاصة بمجموعات Pods المتاحة حاليًا لهذه الخدمة. قارِن هذه العناوين بعناوين IP الخاصة بوحدات Pods التي تم عرضها أعلاه.
التحقّق من التطبيق قيد التشغيل
في هذه المرحلة، يكون التطبيق متاحًا وجاهزًا لطلبات المستخدمين. للوصول إليه، استخدِم خادمًا وكيلاً. ينشئ الأمر التالي خادم وكيل محلي يقبل الطلبات على المنفذ 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
كما في السابق، يمكن الوصول إلى التطبيق باستخدام "معاينة الويب". هذه المرة، من المفترض أن تظهر مَعلمة "المضيف"، كما هو موضّح هنا:

افتح علامة تبويب جديدة في 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
لاحظ أنّ مورد "النشر" يظهر على أنّه معدَّل، بينما يظهر مورد "الخدمة" على أنّه لم يتغيّر. يمكن الاطّلاع على مجموعات 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
يعرض الناتج أعلاه التحديث المتجدد أثناء حدوثه. أولاً، يتم تشغيل الحاويات الجديدة، وعندما تصبح قيد التشغيل، يتم إيقاف الحاويات القديمة.
التحقّق من التطبيق قيد التشغيل
في هذه المرحلة، يتم تحديث التطبيق ويصبح جاهزًا لطلبات المستخدمين. وكما في السابق، يمكن الوصول إليه باستخدام خادم وكيل.
$ 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
لاحظ أن تحديث نافذة المتصفح نفسها يوضح أن حركة المرور تتم موازنتها الآن عبر جميع وحدات Pods الجديدة.
8. تهانينا!
في هذا التمرين المعملي، تم التحقّق من صحة نموذج تطبيق ويب .NET Core في بيئة مطوّر، ثم تم نشره في Kubernetes باستخدام GKE. تم بعد ذلك تعديل التطبيق لعرض اسم المضيف للحاوية التي كان يعمل فيها. بعد ذلك، تم تحديث عملية نشر Kubernetes إلى الإصدار الجديد وتمت زيادة حجم التطبيق لتوضيح كيفية توزيع الحمل على النُسخ الإضافية.
لمعرفة المزيد حول .NET وKubernetes، يمكنك الاطّلاع على هذه البرامج التعليمية. وتعتمد هذه الدورات على ما تم تعلّمه في هذا التمرين من خلال تقديم شبكة خدمات Istio للحصول على أنماط توجيه ومرونة أكثر تطورًا.
9. تَنظيم
لتجنُّب التكاليف غير المقصودة، استخدِم الأوامر التالية لحذف المجموعة وصورة الحاوية اللتين تم إنشاؤهما في هذا التمرين العملي.
gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine