1. نظرة عامة
في الجزء الأول من التمرين المعملي، أنشأت تطبيق ASP.NET Core مضمّنًا في حاوية، ونشرته في Google Kubernetes Engine (GKE) وهيّأت عدد الزيارات الخاصة به لتديره من خلال Istio.
ويفترض هذا الجزء الثاني من التمرين المعملي أن لديك بالفعل مجموعة Kubernetes والتطبيق من التمرين المعملي الأول قيد التشغيل. سنشرح لك كيف يمكن أن تساعدك خدمة Istio في إدارة خدماتك ومراقبتها وتأمينها من خلال إجراء تغييرات بسيطة على الرموز البرمجية. وعلى وجه التحديد، ستستكشف ميزات Istio مثل المقاييس والتتبُّع والتمثيل المرئي للخدمة والإدارة الديناميكية للزيارات وإدخال الأخطاء وغير ذلك.
ما ستتعرَّف عليه
- كيفية الاستعلام عن المقاييس باستخدام Prometheus.
- كيفية عرض المقاييس بشكل مرئي باستخدام Grafana
- كيفية إنشاء إصدار جديد من خدمتك
- طريقة تثبيت خدمة على إصدار محدّد
- كيفية تقسيم عدد الزيارات بين الإصدارات المختلفة
- كيفية إدخال أخطاء في طلبات الخدمة.
المتطلبات
كيف ستستخدم هذا البرنامج التعليمي؟
ما هو تقييمك لتجربتك مع Google Cloud Platform؟
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب.)
يُرجى تذكُّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). ستتم الإشارة إليها لاحقًا في هذا الدرس التطبيقي حول الترميز باسم PROJECT_ID
.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "الحذف سريعًا". الذي يقدم لك نصائح حول كيفية إيقاف تشغيل الموارد حتى لا تتكبّد أي فواتير خارج نطاق هذا البرنامج التعليمي. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
بدء Cloud Shell
يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، إلا أنّك تستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في Google Cloud.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell .
إذا لم يسبق لك بدء تشغيل Cloud Shell، ستظهر لك شاشة وسيطة (الجزء السفلي غير المرئي من الصفحة) تصف ماهيتها. إذا كان الأمر كذلك، فانقر على متابعة (ولن تراه مرة أخرى مطلقًا). إليك ما تبدو عليه هذه الشاشة التي تُستخدم لمرة واحدة:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة Cloud Shell، من المفترض أن ترى أنّه قد تمت مصادقتك وأنّ المشروع معيّن سبق أن تم ضبطه على رقم تعريف مشروعك.
- شغِّل الأمر التالي في 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>
:
إذا لم يظهر لك التطبيق، ارجع إلى التمرين المعملي السابق للتأكد من اتباع جميع الخطوات ومن تثبيت كل من التطبيق و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:
ستظهر لك واجهة مستخدم Prometheus في علامة تبويب جديدة:
لمزيد من المعلومات حول خدمة 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 من خلال الانتقال إلى "معاينة الويب":
لمزيد من المعلومات عن Granvana، يُرجى الاطّلاع على مقالة Visualizing Metrics with Grafana
5- إنشاء إصدار جديد من التطبيق
في مرحلة ما، سيتطلب التطبيق الذي نشرته في قناة الإصدار العلني إصلاح أخطاء أو ميزات إضافية. لنرى كيف تبدو هذه العملية.
أولاً، لنبدأ بتعديل التطبيق. افتح أداة تعديل الرموز من Cloud Shell.
يمكنك الانتقال إلى 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":
وفي أوقات أخرى، ستظهر لك الرسالة "تعرّف على كيفية إنشاء تطبيقات ويب باستخدام ASP.NET Core على Google Cloud":
ويرجع ذلك إلى أنّ عمليتَي النشر 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":
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
الخطوات التالية
- اطّلِع على مزيد من المعلومات حول Istio.
- اطّلِع على مزيد من المعلومات حول قناة Kubernetes.
- مزيد من المعلومات حول Google Kubernetes Engine
- مزيد من المعلومات حول .NET على Google Cloud Platform
الترخيص
هذا العمل مرخّص بموجب رخصة المشاع الإبداعي 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