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

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

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

7dbdc973aceef1af.jpeg

لأغراض هذا الدرس التطبيقي حول الترميز، يتيح لك استخدام بيئة مُدارة، مثل Kubernetes Engine (إصدار من Kubernetes مستضاف على Google ويعمل على 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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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، يمكنك التأكّد من أنّ أداة سطر الأوامر ‎.NET مثبَّتة حاليًا من خلال التحقّق من إصدارها. من المفترض أن يؤدي ذلك إلى طباعة إصدار أداة سطر الأوامر 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 :

Screenshot from 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. إنشاء عملية نشر

وحدة pod في 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

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

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

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

لعرض وحدة pod التي تم إنشاؤها من خلال عملية النشر، نفِّذ الأمر التالي:

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. السماح بالزيارات الخارجية

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

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

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

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

ينشئ خادم 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 إلى 2.

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

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

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 في الإعدادات، أنت تطلب من عملية النشر تعديل وحدات pod لاستخدام الصورة الجديدة.

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.

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

12. Cloud Build

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

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

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.pnga51c7160e237f32f.png

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

14. التسجيل

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

b63159b959ba5010.png

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

43e9aab3e02358d5.png

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

15. تهانينا!

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

تَنظيم

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

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

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

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 الرسومية

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

الترخيص

يخضع هذا العمل لترخيص Creative Commons Attribution 2.0 Generic License.