نشر تطبيق ASP.NET Core على Google Kubernetes Engine باستخدام Istio (الجزء 2)

1. نظرة عامة

في الجزء الأول من التمرين المعملي، أنشأت تطبيق ASP.NET Core مضمّنًا في حاوية، ونشرته في Google Kubernetes Engine (GKE) وهيّأت عدد الزيارات الخاصة به لتديره من خلال Istio.

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

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

  • كيفية الاستعلام عن المقاييس باستخدام Prometheus.
  • كيفية عرض المقاييس بشكل مرئي باستخدام Grafana
  • كيفية إنشاء إصدار جديد من خدمتك
  • طريقة تثبيت خدمة على إصدار محدّد
  • كيفية تقسيم عدد الزيارات بين الإصدارات المختلفة
  • كيفية إدخال أخطاء في طلبات الخدمة.

المتطلبات

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

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

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

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

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

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.

بدء Cloud Shell

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

تفعيل Cloud Shell

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

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0iljA0qS3FXYDKzuk

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 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`
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- اختبار التطبيق

قبل بدء التمرين المعملي، تأكد من أن التطبيق لا يزال يعمل من التمرين المعملي السابق. للتذكير، في ما يلي كيفية الاطلاع على عنوان IP الخارجي ومنفذ المدخل، وتم إدراجهما ضمن EXTERNAL-IP:

kubectl get svc istio-ingressgateway -n istio-system

لعرض التطبيق، يمكنك فتح المتصفّح والانتقال إلى http://<gatewayurl>:

f579a9baedc108a9.png

إذا لم يظهر لك التطبيق، ارجع إلى التمرين المعملي السابق للتأكد من اتباع جميع الخطوات ومن تثبيت كل من التطبيق وIstio تشغيلهما بشكل صحيح.

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

ستبدأ باستكشاف المقاييس في الخطوة التالية.

4. المقاييس مع Gravana وPrometheus

تُنشئ Istio بعض المقاييس تلقائيًا. ويمكنك استخدام الإضافات للاستعلام عن هذه المقاييس التلقائية وعرضها مرئيًا.

Prometheus

Prometheus هو حلّ مفتوح المصدر للمراقبة. يمكنك استخدام Prometheus لطلب البحث عن المقاييس التي يتم إنشاؤها بواسطة Istio، ولكن عليك أولاً تثبيت إضافة Prometheus.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml

تأكَّد من أنّ خدمة Prometheus قيد التشغيل:

kubectl get svc prometheus -n istio-system

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
prometheus   ClusterIP   10.31.243.62   <none>        9090/TCP   1d

يمكنك إرسال بعض البيانات إلى التطبيق من خلال الانتقال إلى http://<gatewayurl> عدة مرات أو تشغيل الأمر curl.

إعداد إعادة توجيه المنفذ لواجهة مستخدم Prometheus:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090

يمكنك الآن تنفيذ طلب بحث من خلال النقر على زر "معاينة الويب" في أعلى يسار Cloud Shell والنقر على معاينة على المنفذ 8080:

772a5248aa493025.png

ستظهر لك واجهة مستخدم Prometheus في علامة تبويب جديدة:

272ee63c1fe0be16.png

لمزيد من المعلومات حول خدمة Prometheus، يُرجى الاطّلاع على طلب البحث عن المقاييس من خلال Prometheus.

Grafana

Grafana هي إضافة أخرى لعرض المقاييس بشكل مرئي.

ثبِّت Grafana. استبدِل istio-version بإصدار Istio الحالي، على سبيل المثال، 1.0.3-gke.3:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml

التحقق من تشغيل Grafana:

kubectl get svc grafana -n istio-system

NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
grafana   ClusterIP   10.31.248.230   <none>        3000/TCP   1d

يمكنك إرسال بعض البيانات إلى التطبيق من خلال الانتقال إلى http://<gatewayurl> عدة مرات أو تشغيل الأمر curl.

إعداد إعادة توجيه المنفذ لواجهة مستخدم Grafana:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000

يمكنك عرض لوحات بيانات Grafana من خلال الانتقال إلى "معاينة الويب":

806d696d85267a37.png

524cb9f6d66f8655.png

لمزيد من المعلومات عن Granvana، يُرجى الاطّلاع على مقالة Visualizing Metrics with Grafana

5- إنشاء إصدار جديد من التطبيق

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

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

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

يمكنك الانتقال إلى 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 

بعد إرسال صورة الحاوية، يمكنك نشر الإصدار الجديد في الخطوة التالية.

6- إنشاء عملية نشر جديدة

لنشر الإصدار الجديد، عليك أولاً إنشاء عملية نشر جديدة له في Kubernetes. أضِف ما يلي في نهاية ملف aspnetcore.yaml:

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

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

kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged
deployment.extensions "aspnetcore-v1" unchanged
deployment.extensions "aspnetcore-v2" created

تأكَّد من أنّ مجموعات الإعلانات المتسلسلة المتوقّعة تعمل:

kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
aspnetcore-v1-6cf64748-mddb   2/2       Running   0          34s
aspnetcore-v2-5d765db-l9xmg   2/2       Running   0          1m

والآن، اختبِر التطبيق مرة أخرى. الحصول على عنوان IP الخارجي للمدخل:

kubectl get svc istio-ingressgateway -n istio-system

وتم إدراجها ضمن EXTERNAL-IP. فتح متصفح التصفح المتخفي والانتقال إلى http://<replace-with-external-ip>

عند إعادة التحميل، ستظهر لك أحيانًا الرسالة "التعرف على كيفية إنشاء تطبيقات ويب باستخدام ASP.NET Core":

11d528132dbb6cee.png

وفي أوقات أخرى، ستظهر لك الرسالة "تعرّف على كيفية إنشاء تطبيقات ويب باستخدام ASP.NET Core على Google Cloud":

3eb0d5be1b4cb40b.png

ويرجع ذلك إلى أنّ عمليتَي النشر v1 وv2 مرتبطتان بخدمة Kubernetes نفسها (aspnetcore-service) وخدمة VirtualService التي أنشأتها في الدرس التطبيقي السابق (aspnetcore-virtualservice) تستخدم هذه الخدمة كمضيف.

في الخطوة التالية، يمكنك تثبيت الخدمة في عملية نشر v2 باستخدام DestinationRule.

7. تثبيت الخدمة على الإصدار الجديد

في هذه الخطوة، يمكنك تثبيت الخدمة لاستخدام عملية نشر v2 ويمكنك إجراء ذلك باستخدام DestinationRule. تهيئ DestinationRule مجموعة السياسات لتطبيقها على طلب بعد حدوث عملية توجيه VirtualService.

وتحدِّد DestinationRule (قاعدة الوجهة) أيضًا المجموعات الفرعية القابلة للتخصيص، بمعنى النُسخ المُسَمّاة، من مضيف الوجهة المقابل. تُستخدَم هذه المجموعات الفرعية في مواصفات مسار VirtualService عند إرسال حركة البيانات إلى إصدارات معيّنة من الخدمة.

إنشاء ملف جديد باسم aspnetcore-destinationrule.yaml:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: aspnetcore-destinationrule
spec:
  host: aspnetcore-service
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

بعد ذلك، أنشئ DestinationRule (قاعدة الوجهة). يؤدي ذلك إلى إنشاء مجموعتين فرعيتين (الإصدار 1 و2) يمكنك استخدامهما من VirtualService:

kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created

الآن، ارجع إلى ملف aspnetcore-virtualservice.yaml لتحديث VirtualService لاستخدام المجموعة الفرعية v2:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service
        subset: v2

تحديث VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

افتح المتصفح وانتقِل إلى http://<replace-with-external-ip>.، حتى بعد إجراء عدة عمليات إعادة تحميل، من المفترض أن تظهر الرسالة "التعرّف على كيفية إنشاء تطبيقات ويب باستخدام ASP.NET Core على Google Cloud":

3eb0d5be1b4cb40b.png

8. تقسيم عدد الزيارات بين الإصدارات

قد تحتاج في بعض الأحيان إلى تقسيم عدد الزيارات بين الإصدارات للاختبار. على سبيل المثال، قد ترغب في إرسال% 75 من الزيارات إلى الإصدار 1 و% 25 من الزيارات إلى الإصدار الثاني من الخدمة. ويمكنك تحقيق ذلك بسهولة باستخدام Istio. أنشئ ملف aspnetcore-virtualservice-weights.yaml جديدًا للإشارة إلى المجموعتين الفرعيتين اللتين بأوزان مختلفة:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service
        subset: v1
      weight: 75
    - destination:
        host: aspnetcore-service
        subset: v2
      weight: 25

تحديث VirtualService:

kubectl apply -f aspnetcore-virtualservice-weights.yaml

الآن، عند إعادة تحميل المتصفح، من المفترض أن يظهر لك الإصداران v1 مقارنةً بالإصدار 2 بنسبة 3:1 تقريبًا.

لمزيد من المعلومات، يمكنك الاطّلاع على تقسيم الزيارات في Istio.

9. أخطاء إدخال الأخطاء

ومن مهام التطوير المفيدة الأخرى التي يتم إجراؤها للاختبار إدخال أخطاء أو تأخيرات في حركة المرور ومعرفة سلوك استجابة الخدمات.

على سبيل المثال، قد ترغب في عرض استجابة طلب غير صالح (HTTP 400) لنسبة 50% من الزيارات إلى الإصدار 1. أنشئ ملف aspnetcore-virtualservice-fault-abort.yaml لمطابقة ما يلي:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - fault:
      abort:
        percentage:
          value: 50
        httpStatus: 400
    route:
    - destination:
        host: aspnetcore-service
        subset: v1

تحديث VirtualService:

kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml

عندما تعيد تحميل المتصفّح، من المفترض أن ترى نصف الوقت أنّ الخدمة v1 تعرض رمز الاستجابة HTTP 400s.

أو ربما تريد إضافة تأخير 5 ثوانٍ إلى الطلبات. أنشئ ملف aspnetcore-virtualservice-fault-delay.yaml لمطابقة ما يلي:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - fault:
      delay:
        fixedDelay: 5s
        percentage:
          value: 100
    route:
    - destination:
        host: aspnetcore-service
        subset: v1

تحديث VirtualService:

kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml

والآن، عند إعادة تحميل المتصفح، من المفترض أن تلاحظ تأخير الطلبات لمدة 5 ثوانٍ.

لمزيد من المعلومات حول ميزات Istio، مثل حالات انتهاء المهلة وعمليات إعادة المحاولة والقواعد المشروطة وقاطعات الدائرة الكهربائية وغيرها، يمكنك الاطّلاع على ميزات إدارة حركة المرور.

10. تهانينا!

نأمل أن يكون هذا الدرس التطبيقي قد منحك نظرة عامة حول المزايا التي يمكن أن يقدّمها Istio لخدماتك بشكل فوري. مزيد من المعلومات حول Istio وGKE

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

الترخيص

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

11. تنظيف

يمكنك حذف التطبيق وإلغاء تثبيت Istio أو حذف مجموعة Kubernetes.

حذف التطبيق

لحذف التطبيق:

kubectl delete -f aspnetcore-gateway.yaml
kubectl delete -f aspnetcore-virtualservice.yaml
kubectl delete -f aspnetcore-destinationrule.yaml
kubectl delete -f aspnetcore.yaml

للتأكد من اختفاء التطبيق:

kubectl get gateway 
kubectl get virtualservices
kubectl get destinationrule
kubectl get pods

إلغاء تثبيت Istio

لحذف Istio، يُرجى اتّباع الخطوات التالية:

kubectl delete -f install/kubernetes/istio-demo-auth.yaml

للتأكّد من إيقاف Istio، اتّبِع الخطوات التالية:

kubectl get pods -n istio-system

حذف مجموعة Kubernetes

gcloud container clusters delete hello-dotnet-cluster