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. المقاييس باستخدام 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:

ستظهر واجهة مستخدم 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 من خلال الانتقال إلى "معاينة الويب":


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

في أحيان أخرى، ستظهر لك الرسالة "التعرّف على كيفية إنشاء تطبيقات ويب باستخدام 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 من الزيارات إلى الإصدار 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.
الخطوات التالية
- Istio
- اطّلِع على مزيد من المعلومات عن Kubernetes.
- مزيد من المعلومات حول Google Kubernetes Engine
- مزيد من المعلومات حول .NET على Google Cloud Platform
الترخيص
يخضع هذا العمل لترخيص المشاع الإبداعي مع نسب العمل إلى مؤلفه 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