تفعيل تطبيق 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.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، يمكنك التأكّد من أنّ أداة سطر الأوامر ‎.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). تتطلّب بقية هذا الدرس التطبيقي حول الترميز توفّر الإصدار 1.2 أو إصدار أحدث من كلّ من خادم Kubernetes وبرنامج العميل. سيُظهر لك 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.

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

a51c7160e237f32f.png

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

14. التسجيل

يمكنك استخدام الأمر kubectl logs لاسترداد سجلّات حاوية تعمل داخل Kubernetes. عند استخدام Google Kubernetes Engine لتشغيل مجموعات Kubernetes المُدارة، يتم تلقائيًا إعادة توجيه جميع السجلات وتخزينها في خدمة "تسجيل الدخول" من Google Cloud. يمكنك الاطّلاع على جميع نواتج السجلّ من الحاويات من خلال الانتقال إلى StackdriverLogging → السجلّات في 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

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

الترخيص

يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 2.0 Generic License.