نشر تطبيق 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 dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

يستغرق توفير 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. المقاييس باستخدام Grafana و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

يمكنك الآن تنفيذ طلب بحث من خلال النقر على زر "معاينة الويب" (Web Preview) في أعلى يسار 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

لمزيد من المعلومات حول Granfana، اطّلِع على عرض المقاييس بشكل مرئي باستخدام 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

تحقَّق من أنّ وحدات pod المتوقّعة تعمل:

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 من الزيارات إلى الإصدار 2 من الخدمة. يمكنك تحقيق ذلك بسهولة باستخدام 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

الآن، عند إعادة تحميل المتصفّح، من المفترض أن ترى الإصدار 1 والإصدار 2 معروضَين بنسبة 3:1 تقريبًا.

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

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

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

على سبيل المثال، قد تريد عرض استجابة طلب غير صالح (HTTP 400) لنسبة% 50 من عدد الزيارات إلى الإصدار v1. أنشئ ملف 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 Generic License.

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