تفعيل تطبيق ASP.NET Core في Kubernetes على Google Kubernetes Engine

1. نظرة عامة

ASP.NET Core هو إطار عمل جديد مفتوح المصدر ومتعدد الأنظمة الأساسية لإنشاء تطبيقات حديثة مستندة إلى السحابة الإلكترونية ومتصلة بالإنترنت باستخدام لغة البرمجة C# .

Kubernetes هو مشروع مفتوح المصدر يمكن تنفيذه في العديد من البيئات المختلفة، من أجهزة الكمبيوتر المحمولة إلى المجموعات العنقودية متعددة العُقد عالية التوفّر، ومن السُحب الإلكترونية العامة إلى عمليات النشر داخل المؤسسات، بدءًا من الأجهزة الافتراضية وحتى أجهزة المعدن المجرّد.

في هذا التمرين المعملي، يمكنك نشر تطبيق ASP.NET Core بسيط على Kubernetes الذي يتم تشغيله على Kubernetes Engine. يعتمد هذا الدرس التطبيقي على الترميز إنشاء تطبيق ASP.NET Core وإطلاقه من خلال درس تطبيقي حول الترميز في Google Cloud Shell. قد تحتاج إلى إجراء هذا التمرين أولاً قبل الانتقال إلى هذا التمرين.

يتمثّل الهدف من هذا الدرس التطبيقي في تحويل الرمز (تطبيق Hello World ASP.NET Core هنا) إلى تطبيق منسوخ يتم تشغيله على Kubernetes. ما عليك سوى تحويل الرمز البرمجي الذي طوّرته على جهازك إلى صورة حاوية Docker، ثم تشغيل تلك الصورة على Google Kubernetes Engine.

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

7dbdc973aceef1af.jpeg

لأغراض هذا الدرس التطبيقي، يتيح لك استخدام بيئة مُدارة، مثل Kubernetes Engine (إصدار مستضاف من Google من Kubernetes يعمل على Compute Engine) التركيز بشكل أكبر على تجربة Kubernetes بدلاً من إعداد البنية الأساسية الأساسية.

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

ما ستتعرَّف عليه

  • كيفية تجميع تطبيق ASP.NET Core بسيط كحاوية Docker.
  • كيفية إنشاء مجموعة Kubernetes على Google Kubernetes Engine (GKE)
  • كيفية نشر تطبيق ASP.NET Core على مجموعة متسلسلة.
  • كيفية السماح بدخول الزيارات الخارجية إلى اللوحة.
  • كيفية توسيع نطاق خدمتك وطرح ترقية
  • كيفية تشغيل لوحة بيانات Kubernetes الرسومية

المتطلبات

كيف ستستخدم هذا البرنامج التعليمي؟

القراءة فقط اقرأها وأكمِل التمارين

ما هو تقييمك لتجربتك مع Google Cloud Platform؟

حديث متوسط بارع

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

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.

9f0e51b578fecce5.png

يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير التي تحتاجها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.

بعد الربط بخدمة Cloud Shell، من المفترض أن ترى أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- إنشاء تطبيق ASP.NET Core في Cloud Shell

في موجه Cloud Shell، يمكنك التحقق من تثبيت أداة سطر أوامر dotnet من قبل عن طريق التحقق من إصدارها. من المفترض أن يؤدي ذلك إلى طباعة إصدار أداة سطر أوامر dotnet المثبتة:

dotnet --version

بعد ذلك، قم بإنشاء تطبيق ويب ASP.NET Core جديد.

dotnet new mvc -o HelloWorldAspNetCore

سيؤدي هذا إلى إنشاء مشروع واستعادة تبعياته. من المفترض أن تظهر لك رسالة مشابهة لما يلي.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. تشغيل تطبيق ASP.NET Core

نحن جاهزون تقريبًا لتشغيل تطبيقنا. انتقِل إلى مجلد التطبيق.

cd HelloWorldAspNetCore

وأخيرًا، شغِّل التطبيق.

dotnet run --urls=http://localhost:8080

يبدأ التطبيق الاستماع عبر المنفذ 8080.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

للتحقق من أن التطبيق يعمل، انقر على زر معاينة الويب في أعلى اليسار واختر "معاينة على المنفذ 8080".

Capture.PNG

ستظهر لك صفحة الويب الافتراضية ASP.NET Core:

f42271880ce4d572.png

بعد التحقق من أن التطبيق يعمل، اضغط على Ctrl+C لإيقاف التطبيق.

5- تجميع تطبيق ASP.NET Core كحاوية Docker

بعد ذلك، يمكنك إعداد تطبيقك لتشغيله كحاوية. الخطوة الأولى هي تحديد الحاوية ومحتوياتها.

في الدليل الأساسي للتطبيق، أنشِئ Dockerfile لتحديد صورة Docker.

touch Dockerfile

يمكنك إضافة ما يلي إلى "Dockerfile" باستخدام المحرِّر المفضّل لديك ("vim, nano,emacs" أو أداة تعديل الرموز في Cloud Shell).

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

من بين الإعدادات المهمة المضمنة في ملف Dockerfile هو المنفذ الذي ينتظر التطبيق من خلاله استقبال حركة البيانات الواردة (8080). يتم تحقيق ذلك من خلال ضبط متغيّر البيئة ASPNETCORE_URLS، الذي تستخدمه تطبيقات ASP.NET Core لتحديد المنفذ الذي يجب الاستماع إليه.

حفظ Dockerfile الآن، لنقم بإنشاء الصورة:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .

بعد اكتمال هذا (سيستغرق تنزيل كل البيانات واستخراجها بعض الوقت)، يمكنك رؤية أنّه تم إنشاء الصورة وحفظها على الجهاز:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

اختبِر الصورة محليًا باستخدام الأمر التالي الذي سيشغِّل حاوية Docker محليًا على المنفذ 8080 من صورة الحاوية التي تمّ إنشاؤها حديثًا:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

ومرة أخرى، استفد من ميزة معاينة الويب في CloudShell :

لقطة شاشة من 2015-11-03 17:20:22.png

ستظهر لك صفحة الويب التلقائية الخاصة بـ ASP.NET Core في علامة تبويب جديدة.

f42271880ce4d572.png

بعد التأكّد من أنّ التطبيق يعمل بشكل جيد محليًا في حاوية Docker، يمكنك إيقاف الحاوية قيد التشغيل بحلول Ctrl-> C.

والآن بعد أن أصبحت الصورة تعمل على النحو المطلوب، يمكنك إرسالها إلى Google Container Registry، وهو مستودع خاص لصور Docker يمكن الوصول إليها من كل مشروع على Google Cloud (ولكن أيضًا من خارج Google Cloud Platform) :

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

وإذا سارت الأمور على ما يرام وبعد فترة وجيزة، من المفترض أن تتمكن من الاطّلاع على صورة الحاوية مُدرجة في القسم Container Registry. في هذه المرحلة، لديك الآن صورة Docker على مستوى المشروع يمكن لـ Kubernetes الوصول إليها وتنسيقها كما سيصلك بعد بضع دقائق.

576374602b52f4e4.png

إذا كنت مهتمًا، يمكنك الاطّلاع على صور الحاويات أثناء تخزينها في Google Cloud Storage من خلال اتّباع هذا الرابط: https://console.cloud.google.com/storage/browser/ (يجب أن يكون الرابط الكامل الناتج بهذا النموذج: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).

6- إنشاء مجموعة Kubernetes

حسنًا، أنت الآن جاهز لإنشاء مجموعة GKE، ولكن قبل ذلك، انتقِل إلى قسم Google Kubernetes Engine في وحدة تحكّم الويب وانتظر حتى تتمّ تهيئة النظام (من المفترض أن تستغرق بضع ثوانٍ فقط).

d5f6e3c267feea1a.png

تتكوّن المجموعة العنقودية من خادم واجهة برمجة تطبيقات رئيسي في Kubernetes تديره Google ومجموعة من عُقد العوامل. عُقد العامل هي أجهزة افتراضية في Compute Engine.

لنستخدم واجهة سطر الأوامر gcloud من جلسة CloudShell لإنشاء مجموعة. اضبط منطقتك على مكان قريب منك ( قائمة المناطق). سيستغرق إكمال هذه الخطوة بضع دقائق:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

في النهاية، ينبغي أن ترى المجموعة التي تم إنشاؤها.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

من المفترض أن تكون لديك الآن مجموعة Kubernetes كاملة الأداء وتستند إلى Google Kubernetes Engine:

eefb8d9b7f39598b.png

حان الوقت الآن لنشر تطبيقك المُحوَّل في مجموعة Kubernetes. من الآن فصاعدًا، ستستخدم سطر الأوامر kubectl (الذي تم إعداده بالفعل في بيئة Cloud Shell). يتطلّب باقي هذا الدرس التطبيقي حول الترميز أن يكون إصدار البرنامج وإصدار الخادم kubernetes هو 1.2 أو إصدار أحدث. وسيعرض لك kubectl version الإصدار الحالي من الأمر.

7. إنشاء عملية نشر

مجموعة kubernetes هي مجموعة من الحاويات يتم ربطها معًا لأغراض الإدارة وإنشاء الشبكات. يمكن أن تحتوي على حاوية واحدة أو عدة حاوية. وهنا ستستخدم ببساطة حاوية واحدة تم إنشاؤها باستخدام صورة ASP.NET Core والمخزنة في سجل الحاوية الخاصة. وسيعرض المحتوى على المنفذ 8080.

أنشِئ ملف hello-dotnet.yaml باستخدام المحرِّر المفضّل لديك (vim, nano,emacs أو محرِّر الرموز في Cloud Shell) وحدِّد طريقة نشر Kubernetes للمجموعة، وذلك باتّباع الخطوات التالية:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

النشر إلى مساحة الاسم التلقائية باستخدام kubectl:

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

كما ترى، أنشأت كائن نشر. تُعَدّ عمليات النشر الطريقة المقترَحة لإنشاء مجموعات الإعلانات المتسلسلة وتوسيع نطاقها. هنا، تدير عملية نشر جديدة نسخة طبق الأصل واحدة من المجموعة التي تعرض صورة hello-dotnet:v1.

لعرض عملية النشر التي أنشأتها للتو، ما عليك سوى تشغيل:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

لعرض المجموعة التي تم إنشاؤها من خلال عملية النشر، شغِّل الأمر التالي:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

حان الوقت الآن للتعامل مع بعض أوامر kubectl المثيرة للاهتمام (لن يؤدي أي منها إلى تغيير حالة المجموعة، وتتوفر المستندات الكاملة هنا):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

في هذه المرحلة، من المفترض أن تكون حاويتك قيد التشغيل تحت إدارة Kubernetes، ولكن لا يزال عليك جعلها متاحةً للجميع.

8. السماح بالزيارات الخارجية

لا يمكن الوصول إلى المجموعة تلقائيًا إلا من خلال عنوان IP الداخلي في المجموعة. لإتاحة الوصول إلى حاوية hello-dotnet من خارج شبكة kubernetes الافتراضية، عليك عرض مجموعة الإعلانات المتسلسلة باعتبارها خدمة kubernetes.

من Cloud Shell، يمكنك عرض اللوحة على الإنترنت المتاح للجميع باستخدام الأمر kubectl expose بالإضافة إلى علامة --type="LoadBalancer". هذه العلامة مطلوبة لإنشاء عنوان IP يمكن الوصول إليه خارجيًا :

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

تحدّد العلامة المستخدَمة في هذا الأمر أنّك ستستخدم جهاز موازنة الحمل الذي توفّره البنية الأساسية الأساسية (في هذه الحالة جهاز موازنة الحمل في Compute Engine). يُرجى العِلم أنّك تعرض عملية النشر، وليس المجموعة مباشرةً. سيؤدي هذا إلى تحميل الخدمة الناتجة لموازنة حركة البيانات عبر جميع اللوحات التي تتم إدارتها من خلال عملية النشر (في هذه الحالة مجموعة واحدة فقط، ولكنك ستضيف المزيد من النسخ المكررة لاحقًا).

تنشئ مشرف Kubernetes جهاز موازنة الحمل وقواعد إعادة التوجيه ذات الصلة في Compute Engine ومجموعات الأهداف وقواعد جدار الحماية لإتاحة الوصول الكامل إلى الخدمة من خارج Google Cloud Platform.

للعثور على عنوان IP للخدمة المتاح للجميع، ما عليك سوى طلب من kubectl إدراج جميع خدمات المجموعة:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

يُرجى ملاحظة أنّ هناك عنوانَي IP مُدرَجَين لخدمتك، وهما منفذ العرض 8080. أحدهما هو عنوان IP الداخلي الذي لا يظهر إلا داخل شبكتك الافتراضية على السحابة الإلكترونية، والآخر عنوان IP الخارجي المتوازن بالحمولة. في هذا المثال، عنوان IP الخارجي هو 104.155.20.69.

من المفترض أن يكون بإمكانك الآن الوصول إلى الخدمة من خلال توجيه المتصفح إلى هذا العنوان: http://<EXTERNAL_IP>:8080

6b053874002827fe.png

لقد حصلتَ الآن على العديد من الميزات من خلال الانتقال إلى الحاويات وKubernetes، ولن تحتاج إلى تحديد المضيف الذي تريد تحميل مهام العمل عليه، ويمكنك أيضًا الاستفادة من مراقبة الخدمة وإعادة تشغيلها. لنرَ ما يمكنك الاستفادة منه أيضًا من بنية Kubernetes الجديدة.

9. توسيع نطاق الخدمة

إحدى الميزات الفعّالة التي يقدّمها Kubernetes هي مدى سهولة توسيع نطاق تطبيقك. لنفترض أنك احتجت فجأة إلى سعة أكبر لتطبيقك، يمكنك ببساطة الطلب من وحدة التحكم في النسخ المماثل أن تدير عددًا جديدًا من النسخ المكررة للمجموعة المطابقة:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

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

في ما يلي مخطّط يلخّص حالة مجموعة Kubernetes:

6af0243662464ca9.png

ويمكنك أيضًا خفض حجم خدمتك بسهولة كبيرة. في ما يلي كيفية تقليل عدد المجموعات من 4 مجموعات إلى مجموعتَين.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. اختبار المرونة

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

يجب أولاً الحصول على قائمة اللوحات:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

احذف إحدى المجموعات من خلال إدخال اسم المجموعة:

kubectl delete pod hello-dotnet-714049816-g4azy

إذا راجعت قائمة اللوحات مرة أخرى، سترى مجموعة جديدة يتم إنشاؤها وتعمل مجددًا في الحال:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. طرح ترقية لخدمتك

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

أولاً، لنبدأ بتعديل التطبيق. افتح أداة تعديل الرموز من Cloud Shell.

f487389b8b1cc105.png

يمكنك الانتقال إلى Index.cshtml ضمن HelloWorldAspNetCore > Views > Home وتعديل إحدى رسائل لوحة العرض الدوّارة.

ابحث عن السطر التالي:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core 

وقم بتغييره إلى هذا:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud

احفظ التغييرات ثم ارجع إلى Cloud Shell. داخل HelloWorldAspNetCore,إنشاء صورة Docker:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

ونشره إلى Container Registry:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 

أنت الآن جاهز لتطبيق Kubernetes لتحديث وحدة التحكّم في النسخ المتماثل بسلاسة إلى الإصدار الجديد من التطبيق. لتغيير تصنيف الصورة لحاوية قيد التشغيل، عليك تعديل hello-dotnet deployment الحالية وتغيير الصورة من gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 إلى gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2.

ولإجراء ذلك، عليك استخدام الأمر kubectl edit. سيؤدي ذلك إلى فتح محرِّر نصوص يعرض إعداد yaml للنشر بالكامل. ليس من الضروري فهم إعدادات yaml بالكامل في الوقت الحالي، وبدلاً من ذلك، عليك أن تفهم أنّه من خلال تعديل الحقل spec.template.spec.containers.image في الإعدادات، ستُعلِم عملية النشر بتعديل مجموعات الإعلانات المتسلسلة من أجل استخدام الصورة الجديدة.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

بعد إجراء التغيير، احفظ الملف وأغلقه (يستخدم هذا المفتاح vi، لذا اضغط على "Esc" ثم اكتب :wq واضغط على المفتاح "Enter").

deployment "hello-dotnet" edited

سيؤدي ذلك إلى تعديل عملية النشر بالصورة الجديدة، ما يؤدي إلى إنشاء لوحات جديدة مع الصورة الجديدة وحذف المجموعات القديمة.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

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

fb9f41e814dda653.png

يمكنك العثور على المزيد من التفاصيل حول طرح التعديلات في مستندات Kubernetes.

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

12. Cloud Build

كنّا حتى الآن ننشئ حاويات باستخدام أوامر Docker عادية (إصدار Dock ...)، ثم نقلنا الصورة يدويًا إلى Container Registry في Google Cloud Platform. من الممكن أيضًا تأجيل كلتا الخطوتين إلى Cloud Build من جانب الخادم، والذي يمكنه إنشاء صورة الحاوية وإرسالها بدون الحاجة إلى تثبيت Docker على الجهاز.

أولاً، فعِّل Cloud Build API في مدير واجهة برمجة التطبيقات >. "المكتبة". ابحث عن Cloud Build، وانقر على Cloud Build API:

f8b0239fa7719f29.png

انقر على تفعيل واجهة برمجة التطبيقات إذا لم تكن مفعَّلة. في النهاية، يُفترض أن ترى واجهة برمجة التطبيقات مفعّلة على النحو التالي:

ea6053f9603613b5.png

بعد تفعيل Cloud Build API، يمكنك تشغيل الأمر التالي لإنشاء صورتك وإرسالها كلّها من خدمة Container Builder:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

يتم تخزين الصورة تلقائيًا في Container Registry.

13. تشغيل لوحة بيانات Kubernetes الرسومية

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

لضبط إمكانية الوصول إلى لوحة بيانات مجموعة Kubernetes، اكتب هذه الأوامر من نافذة Cloud Shell :

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

ثم يمكنك استخدام ميزة معاينة Cloud Shell مرة أخرى للانتقال إلى المنفذ 8081:

port8081.png

من المفترض أن ينقلك هذا إلى نقطة نهاية واجهة برمجة التطبيقات. قد تتلقى رسالة "غير مصرّح بها" ولكن لا داعي للقلق. للوصول إلى لوحة البيانات، يجب إزالة "?authuser=3" واستبدِله بـ "/ui".

استفِد من لوحة البيانات الرسومية لـ Kubernetes واستخدمها لنشر التطبيقات المحوّلة إلى حاويات بالإضافة إلى مراقبة المجموعات وإدارتها.

177789527b650f6b.png

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

da1ccc707dd6647.png

a51c7160e237f32f.png

بعد الانتهاء من لوحة البيانات، يمكنك النقر على Control + C لإيقاف الخادم الوكيل. يمكنك الاطّلاع على المزيد من المعلومات حول لوحة بيانات Kubernetes من خلال جولة في لوحة البيانات.

14. التسجيل

يمكنك استخدام الأمر kubectl logs لاسترداد سجلات حاوية يتم تشغيلها داخل Kubernetes. عند استخدام Google Kubernetes Engine لتشغيل مجموعات Kubernetes المُدارة، تتم إعادة توجيه جميع السجلات تلقائيًا وتخزينها في Google Cloud Logging. يمكنك الاطّلاع على جميع مخرجات السجلّات من اللوحات من خلال الانتقال إلى StackdriverLogging ← Logs من خلال وحدة التحكّم في Google Cloud، وذلك باتّباع الخطوات التالية:

b63159b959ba5010.png

بعد الدخول إلى وحدة التحكّم في التسجيل، يمكنك الانتقال إلى حاوية GKE للاطّلاع على كل السجلّات المجمَّعة من STDOUT:

43e9aab3e02358d5.png

من هنا، يمكنك اختياريًا تصدير السجلّات إلى Google BigQuery لإجراء المزيد من تحليل السجلات، أو إعداد تنبيه مستند إلى السجلّ. لن نفعل ذلك أثناء التمرين المعملي اليوم.

15. تهانينا!

بهذه الطريقة، نختتم هذا الدرس التطبيقي البسيط حول بدء استخدام الترميز باستخدام ASP.NET Core وKubernetes. لم نتعرّف بعد الآن على هذه التكنولوجيا، لذا ننصحك باستكشاف المزيد من خلال لوحاتك الخاصة، ووحدات تحكّم النسخ المتماثل، والخدمات الخاصة بك، وكذلك التحقّق من اختبارات الحياة (الفحوصات الصحية) واستخدام واجهة برمجة تطبيقات Kubernetes مباشرةً.

تَنظيم

هذا كل شيء! حان الوقت لتنظيف الموارد المستخدمة (لتوفير التكلفة والتكيف مع السحابة الإلكترونية).

حذف عملية النشر (التي تحذف أيضًا المجموعات قيد التشغيل) والخدمة (التي تؤدي أيضًا إلى حذف جهاز موازنة الحمل الخارجي):

أولاً، احذف الخدمة والنشر، ما يؤدي أيضًا إلى حذف جهاز موازنة الحمل الخارجي:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

بعد ذلك، احذف المجموعة:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

يؤدي ذلك إلى حذف جميع مثيلات Google Compute Engine التي تشغّل المجموعة.

أخيرًا، احذف حزمة تخزين سجلّ Docker التي تستضيف صورك:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

وبالطبع، يمكنك أيضًا حذف المشروع بأكمله، ولكنك ستفقد أي إعدادات فوترة أجريتها (يلزم إيقاف فوترة المشروع أولاً). بالإضافة إلى ذلك، لن يؤدي حذف المشروع إلى إيقاف جميع الفوترة إلا بعد انتهاء دورة الفوترة الحالية.

النقاط التي تناولناها

  • كيفية تجميع تطبيق ASP.NET Core بسيط كحاوية Docker.
  • كيفية إنشاء مجموعة Kubernetes على Google Kubernetes Engine
  • كيفية نشر تطبيق ASP.NET Core على مجموعة متسلسلة.
  • كيفية السماح بدخول الزيارات الخارجية إلى اللوحة.
  • كيفية توسيع نطاق خدمتك وطرح ترقية
  • كيفية تشغيل لوحة بيانات Kubernetes الرسومية

الخطوات التالية

الترخيص

هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 2.0 مع نسب العمل إلى مؤلف عام.