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 في أعلى اليسار للكشف عنها في الجزء السفلي من نافذة وحدة التحكم.
خيارات الضبط البديلة لمجموعة 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.
تشغيل الحاوية على الجهاز للتحقق من الوظائف
في 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). (أو أي منفذ تم تعيين "معاينة الويب" لاستخدامه).
سيؤدي ذلك إلى فتح نافذة متصفح بها عنوان مثل هذا:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0
عرض نموذج تطبيق 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
أخيرًا، ألقِ نظرة على اللوحات. أشارت عملية "النشر" إلى أنّه يجب أن تكون هناك ثلاث حالات. يجب أن يُظهر الأمر أدناه أن هناك ثلاث مثيلات. تتم إضافة الخيار "-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 وشغِّل 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