1. نظرة عامة
.NET Core من Microsoft هو إصدار مفتوح المصدر ومتوافق مع أنظمة التشغيل المختلفة من .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-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 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 run أدناه حاوية جديدة تعرض المنفذ 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/?authuser=0
عرض نموذج تطبيق .NET باستخدام "معاينة الويب"
يمكن الآن عرض نموذج التطبيق الذي تم تشغيله في الخطوة الأخيرة من خلال بدء "معاينة الويب" وتحميل عنوان URL المقدَّم. من المفترض أن تظهر بشكلٍ مشابه لما يلي:

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
لاحظ الرسائل التي تشير إلى أنّه تم إنشاء المراجع المطلوبة.
استكشاف المراجع الناتجة
يمكننا استخدام واجهة سطر الأوامر 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 يعمل كموازنة تحميل. يتم تحديد نقاط النهاية من خلال التصنيفات على 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 الخاصة بالحاويات التي تم عرضها أعلاه.
التحقّق من التطبيق الذي يتم تشغيله
في هذه المرحلة، يكون التطبيق متاحًا وجاهزًا لتلقّي طلبات المستخدمين. للوصول إلى هذه الخدمة، استخدِم خادمًا وكيلاً. ينشئ الأمر التالي خادم وكيل محليًا يقبل الطلبات على المنفذ 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. تعديل التطبيق
في هذا القسم، سيتم تعديل التطبيق لعرض المضيف الذي يتم تشغيل الجهاز الافتراضي عليه. سيؤدي ذلك إلى إمكانية التأكّد من أنّ موازنة التحميل تعمل وأنّ وحدات 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 ونفِّذ الأمر 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 هذا عدة مرات ولاحظ أنّ المضيف يتغير مع موازنة تحميل الطلبات على مستوى وحدات Pod مختلفة من خلال الخدمة. قارِن قيم المضيف بقائمة الحاويات من الأعلى للتأكّد من أنّ جميع الحاويات تتلقّى عدد زيارات.
توسيع نطاق الأجهزة الافتراضية
يمكنك توسيع نطاق التطبيقات في Kubernetes بسهولة. سيؤدي الأمر التالي إلى توسيع نطاق عملية النشر لتشمل ما يصل إلى 6 مثيلات من التطبيق.
$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled
يمكن عرض حزم Pods الجديدة وحالتها الحالية باستخدام هذا الأمر
kubectl get pod -w
لاحظ أنّ إعادة تحميل نافذة المتصفّح نفسها توضّح أنّه يتم الآن موازنة عدد الزيارات على جميع وحدات Pod الجديدة.
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