1. نظرة عامة
لا يمكن دائمًا إعادة كتابة التطبيقات الحالية أو إعادة تصميمها لتعمل على Kubernetes، كما أنّ تنفيذ ذلك يدويًا ليس ممكنًا أو عمليًا دائمًا. يمكن أن يساعدك Migrate for Anthos في تطوير تطبيقاتك الحالية وتشغيلها في Kubernetes. في هذا الدرس التطبيقي حول الترميز، ستنقل تطبيق ويب حالي مستضاف على Compute Engine إلى Kubernetes Engine باستخدام Migrate for Anthos.
ما ستتعلمه
- كيفية نشر Migrate for Anthos على مجموعة Kubernetes
- كيفية إنشاء حاوية في مجموعة حالات من مثيل Compute Engine حالي
- كيفية نشر الحاوية على Kubernetes وإعدادها باستخدام أداة موازنة التحميل
المتطلبات
- مشروع على Google Cloud تم إعداد الفوترة له إذا لم يكن لديك حساب، عليك إنشاء حساب.
2. الإعداد
يمكن تشغيل هذا الدرس التطبيقي حول الترميز بالكامل على Google Cloud Platform بدون الحاجة إلى أي عملية تثبيت أو إعداد على الجهاز.
تفعيل واجهات برمجة التطبيقات
قبل البدء، احرص على تفعيل واجهات برمجة التطبيقات المطلوبة في مشروعك على Google Cloud:
إنشاء خادم ويب على آلة افتراضية في Compute Engine
لننشئ آلة افتراضية للحوسبة سنستخدمها لاستضافة خادم الويب الأوّلي nginx، بالإضافة إلى قواعد جدار الحماية التي ستتيح لنا عرض الصفحة المقصودة التلقائية لخادم الويب. يمكننا إجراء ذلك بعدة طرق، ولكن لتسهيل الاستخدام، سنستخدم Cloud Shell.
في Cloud Shell، نفِّذ ما يلي:
gcloud compute instances create webserver --zone=us-central1-a && \ gcloud compute firewall-rules create default-allow-http --allow=tcp:80
سيؤدي الجزء الأول من هذا الأمر إلى إنشاء آلة افتراضية على Google Cloud في المنطقة us-central1-a، بينما سيؤدي الجزء الثاني إلى إنشاء قاعدة جدار حماية باسم "default-allow-http" تسمح بمرور حركة بيانات http إلى شبكتنا.
عند إنشاء الجهاز الافتراضي بنجاح، سيتم عرض جدول يتضمّن تفاصيل الجهاز الافتراضي. دوِّن عنوان IP الخارجي، لأنّنا سنحتاج إليه لاحقًا للتأكّد من أنّ خادم الويب يعمل.

بعد تشغيل الجهاز الافتراضي، يمكننا استخدام بروتوكول النقل الآمن (SSH) للوصول إلى الجهاز الافتراضي من Cloud Shell لتثبيت nginx وبدء تشغيل خادم الويب:
gcloud compute ssh --zone us-central1-a webserver
بعد تسجيل الدخول إلى آلة Compute الافتراضية، ثبِّت nginx:
sudo apt install nginx
تسجيل الخروج من جلسة SSH باستخدام الأمر logout
لنتأكّد من أنّ خادم الويب يعمل من خلال إدخال عنوان IP الخارجي الخاص بالجهاز الظاهري الذي تم إنشاؤه سابقًا في المتصفّح. من المفترض أن تظهر لك شاشة الترحيب التلقائية في nginx:

سيعمل خادم الويب هذا كتطبيق ويب قديم سننقله إلى Kubernetes باستخدام Migrate for Anthos.
3- مجموعة Kubernetes باستخدام Migrate for Anthos
بعد ذلك، سننشئ مجموعة GKE، وهي المكان الذي سننقل إليه في النهاية خادم الويب على Compute Engine. في Cloud Console، نفِّذ ما يلي:
gcloud container clusters create my-gke-cluster \ --zone us-central1-a \ --cluster-version 1.13 \ --machine-type n1-standard-4 \ --image-type "UBUNTU" \ --num-nodes 1 \ --enable-stackdriver-kubernetes
يُرجى الانتظار بضع دقائق حتى يكتمل تنفيذ هذا الأمر. بعد إنشاء المجموعة، ستتلقّى بعض النتائج التي تتضمّن تفاصيلها:

بعد ذلك، انتقِل إلى GCP Marketplace لتفعيل Migrate for Anthos:

في صفحة السوق الخاصة بأداة Migrate for Anthos، انقر على "إعداد"، واختَر مشروعك من القائمة إذا طُلب منك ذلك. ستعرض الصفحة التالية نموذجًا يتضمّن بعض القيم التلقائية. تأكَّد من أنّ المجموعة التي تم اختيارها هي المجموعة التي أنشأناها للتو، ثم انقر على نشر:

من المفترض الآن أن يتم نشر Migrate for Anthos على مجموعة Kubernetes. عند الانتهاء من عملية النشر، ستظهر لك الحالة "موافق" في صفحة تطبيقات Kubernetes Engine:

4. من آلة افتراضية إلى مجموعة ذات حالة
لدينا مجموعة Kubernetes تشغّل Migrate for Anthos، لذا يمكننا الآن بدء عملية نقل البيانات. لنشر الجهاز الافتراضي في مجموعة Kubenetes، علينا إيقاف جهاز Compute Engine الافتراضي حتى نتمكّن من أخذ لقطات من الأقراص. قبل المتابعة، سجِّل معرّف المثيل الذي سنحتاج إليه لاحقًا:
gcloud compute instances describe webserver --zone us-central1-a | grep ^id
لنوقف تشغيل الجهاز الظاهري:
gcloud compute instances stop webserver --zone us-central1-a
بعد إيقاف المثيل، يمكننا أخذ لقطة آمنة من الأقراص من خلال تشغيل النص البرمجي التالي. احرص على إدراج رقم تعريف مشروعك ورقم تعريف مثيلك:
python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \ -p <project-id> -i <instance-id> \ -z us-central1-a \ -T us-central1-a \ -A webserver-statefulset \ -o containerized-webserver.yaml
باستخدام هاتين العلامتين، سيتمكّن clone_vm_disks.py من إجراء ما يلي:
- التأكّد من إيقاف مثيل GCE
- إنشاء لقطة من كل قرص في الجهاز الظاهري
- إنشاء قرص جديد من كل لقطة
- حذف اللقطات التي أنشأها
- إنشاء ملف YAML في دليل العمل الحالي لنشر مجموعة ذات حالة تستضيف خادم الويب
سيوفّر ملف yaml الذي تم إنشاؤه مجموعة ذات حالة في مجموعة kubernetes، بالإضافة إلى مطالبات وحدة التخزين الثابتة المطلوبة لتركيب الأقراص المنسوخة في حاوية خادم الويب. يمكننا تطبيق هذه التغييرات باستخدام kubectl:
kubectl apply -f containerized-webserver.yaml
تحقَّق من حالة webserver-statefulset في صفحة "أحمال العمل":
من الطبيعي أن تظهر الحالة "في انتظار الموافقة على الحزم" لبضع دقائق بعد تنفيذ الأمر kubectl apply. انتقِل إلى الخطوة التالية بعد أن تظهر الحالة "حسنًا".
5- عرض المجموعة على جهاز موازنة الحمل
في هذه المرحلة، من المفترض أن يشغّل نظام مجموعة Kubernetes خادم الويب كمجموعة ذات حالة، ولكننا سنحتاج أيضًا إلى عرض الحاوية على موازن الحمل للوصول إلى خادم الويب عبر عنوان IP خارجي. في Cloud Shell، أنشئ ملفًا جديدًا باسم loadbalancer.yaml يتضمّن المحتوى التالي:
loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: webserver-loadbalancer
spec:
type: LoadBalancer
selector:
app: webserver-statefulset
ports:
- protocol: TCP
port: 80
targetPort: 80
والآن، طبِّقها باستخدام kubectl:
kubectl apply -f loadbalancer.yaml
يمكننا استخدام kubectl لاسترداد عنوان IP الخارجي لخدمة webserver-container:
kubectl get services
إذا أدخلنا عنوان IP الخارجي في المتصفّح، من المفترض أن تظهر لنا شاشة الترحيب التلقائية نفسها من nginx التي ظهرت سابقًا:

لقد نجحنا! تتم الآن استضافة خادم الويب GCE على Kubernetes. أحسنت.
6. مراقبة Stackdriver
المقاييس
بما أنّ Kubernetes Engine هي خدمة Kubernetes مُدارة، يتم إعدادها تلقائيًا لتسجيل البيانات ومراقبتها باستخدام Stackdriver. لنلقِ نظرة على بعض المقاييس التي تسجّلها Stackdriver تلقائيًا.
انقر على الرابط "المراقبة" في قائمة المنتجات. قد يستغرق الوصول إلى هذا الرابط للمرة الأولى من مشروعك بضع دقائق أثناء إعداد مساحة العمل.
بعد التحميل، مرِّر مؤشر الماوس فوق "الموارد" (Resources) في اللوحة اليمنى واختَر "Kubernetes Engine NEW" من القائمة.
يمثّل كل صف في لوحة البيانات المعروضة هنا أحد موارد Kubernetes. يمكنك التبديل بين عرض البنية الأساسية أو أحمال العمل أو الخدمات باستخدام الروابط أعلى لوحة البيانات.

في "طريقة عرض أحمال العمل"، وسِّع my-gke-cluster ثم انتقِل إلى default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset. انقر على حاوية المجموعة الثابتة للحالة لخادم الويب. ستجد هنا بعض المقاييس الجاهزة التي يتم تسجيلها بواسطة Stackdriver، بما في ذلك استخدام الذاكرة واستخدام وحدة المعالجة المركزية.

الرسومات البيانية المعروضة في لوحة البيانات هذه هي تلك التي سنتمكّن من استخدامها لإنشاء لوحة بيانات مخصّصة.
لوحات البيانات المخصّصة
تتيح لنا Stackdriver إنشاء لوحات بيانات مخصّصة يمكننا استخدامها لتنظيم المخططات والرسوم البيانية لأي بيانات مقاييس متاحة لنا. لننشئ لوحة بيانات مخصّصة لتقديم نظرة سريعة على بعض مقاييس خادم الويب.
في اللوحة الجانبية اليمنى، مرِّر مؤشر الماوس فوق "لوحات البيانات"، ثم انقر على "إنشاء لوحة بيانات".

بعد أن أصبح لدينا لوحة بيانات فارغة، يمكننا إضافة المقاييس التي نريد مراقبتها. لنمنح لوحة البيانات التي تحمل الاسم Untitled Dashboard اسمًا مفيدًا مثل My Web Server Containers، ثم ننقر على Add Chart في أعلى يسار الصفحة:

هل تتذكر المقاييس الجاهزة للاستخدام؟ لنضِف رسمًا بيانيًا لاستخدام وحدة المعالجة المركزية للحاوية. في حقل "عنوان الرسم البياني" (Chart Title)، أدخِل "استخدام وحدة المعالجة المركزية" (CPU Utilization). في المربّع "العثور على نوع المورد والمقياس" (Find resource type and metric)، اكتب request_utilization واختَر "استخدام طلب وحدة المعالجة المركزية" (CPU request utilization) من القائمة التي تمّت فلترتها. سيؤدي هذا الاختيار إلى ملء الحقلَين "نوع المرجع" و"المقياس" نيابةً عنك.
بعد ذلك، سنحتاج إلى الفلترة حسب project_id (إذا كان لدينا مشاريع متعددة) وcontainer_name. في مربّع "الفلتر"، اكتب project_id، واختَره من القائمة المُفلترة، ثم اختَر مشروعك في حقل "القيمة". نحتاج أيضًا إلى الفلترة حسب container_name. في مربّع "الفلتر"، اكتب container_name، واختَره من القائمة التي تمّت فلترتها، ثمّ اختَر webserver-statefulset في حقل "القيمة". انقر على "حفظ".
لدينا الآن لوحة بيانات تتضمّن المخطط الأول.

7. سياسة التنبيه والتحقّق من وقت التشغيل
باستخدام Stackdriver، يمكننا إعداد تنبيهات لإعلامنا عندما تبلغ أي مقاييس أي قيم حدود نحدّدها. على سبيل المثال، يمكننا أن نطلب من Stackdriver إرسال رسالة إلكترونية إلينا عندما يكون استخدام وحدة المعالجة المركزية من الخطوة الأخيرة أعلى من حدّ معيّن لفترة زمنية مستمرة، ما قد يشير إلى وجود مشكلة في تطبيقنا. لتوضيح شكل هذه التنبيهات، لنعدّ عملية تحقّق من وقت التشغيل ثم نحاكي انقطاعًا.
من اللوحة اليمنى، اختَر Uptime Checks (عمليات الفحص في وقت التشغيل) ثمّ Uptime Checks Overview (نظرة عامّة على عمليات الفحص في وقت التشغيل):

كما تقترح صفحة "عمليات الفحص في وقت التشغيل"، لنبدأ بإعداد عملية الفحص الأولى في وقت التشغيل. انقر على الزر إضافة فحص وقت التشغيل في أعلى يسار الصفحة.
في النموذج التالي، أدخِل "وقت تشغيل نقطة النهاية" (Endpoint Uptime) كعنوان، وعنوان IP الخارجي لموازن التحميل كاسم مضيف.

انقر على حفظ وسيُطلب منك إنشاء سياسة تنبيه مصاحبة:

انقر على إنشاء سياسة تنبيه.
لنسمِّ هذه السياسة "سياسة وقت تشغيل نقطة النهاية". في قسم الإعداد، اضبط "يتم تفعيل الشرط في حال" على "انتهاك أي سلسلة زمنية"، ثم انقر على حفظ.

لم ننتهِ بعد. بعد ذلك، سنحدّد "قناة إشعارات" لنتلقّى إشعارًا عند مخالفة سياسة التنبيه. في القائمة المنسدلة "نوع قناة الإشعارات"، اختَر "البريد الإلكتروني" متبوعًا بعنوان بريد إلكتروني صالح.

انقر على إضافة قناة إشعارات. أخيرًا، في أسفل النموذج، أطلِق على السياسة اسم "وقت تشغيل تطبيق الويب" وانقر على "حفظ".
للاطّلاع على شكل التنبيه، افتح Cloud Shell مرة أخرى في Cloud Console. سيؤدي الأمر التالي إلى إيقاف خدمة nginx التي تعمل في حاوية خادم الويب:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"
بعد بضع دقائق، من المفترض أن تتلقّى رسالة إلكترونية تنبّهك بانقطاع الخدمة:

لنتراجع عن ذلك. في Cloud Shell، لنعِد تشغيل nginx:
kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"
بعد بضع دقائق، ستتلقّى رسالة إلكترونية أخرى من Stackdriver، ولكن هذه المرة ستتضمّن أخبارًا أفضل من ذي قبل:

8. تنظيف
بعد أن نقلنا البيانات من GCE إلى GKE باستخدام Migrate for Anthos، لننظّف مشروعنا من جميع الموارد التي أنشأناها.
حذف المشروع
يمكنك حذف المشروع بأكمله إذا كنت تفضّل ذلك. في "وحدة تحكّم Google Cloud Platform"، انتقِل إلى صفحة Cloud Resource Manager:
في قائمة المشاريع، اختَر المشروع الذي كنا نعمل عليه وانقر على حذف. سيُطلب منك كتابة رقم تعريف المشروع. أدخِلها وانقر على إيقاف.
إذا كنت تفضّل حذف المكوّنات المختلفة واحدًا تلو الآخر، انتقِل إلى القسم التالي.
Stackdriver
لوحة البيانات
من صفحة لوحة البيانات، انقر على رمز الإعدادات
في أعلى الصفحة واختَر حذف لوحة البيانات.
سياسة التنبيهات
من صفحة "السياسات"، انقر على حذف من قائمة "الإجراءات"
على يسار كل سياسة أنشأتها.
التحقّق من وقت التشغيل
من صفحة "عمليات الفحص في وقت التشغيل"، انقر على حذف من قائمة "الإجراءات" على يسار كل عملية فحص أنشأتها.
GCE وKubernetes
آلة Google Compute Engine الافتراضية
gcloud compute instances delete webserver --zone=us-central1-a
مجموعة Kubernetes (تشمل Migrate for Anthos ومجموعة لها حالة وخدمة موازن التحميل)
gcloud container clusters delete my-gke-cluster --zone=us-central1-a
الأقراص
استخدمت مجموعة StatefulSet قرصًا أنشأناه. استخدِم ما يلي لاسترداد الاسم:
gcloud compute disks list --filter=webserver
باستخدام اسم القرص بدلاً من اسمي، احذفه باستخدام:
gcloud compute disks delete vls-690d-webserver --zone=us-central1-a
تمت إزالة كل الملفات غير الضرورية.
9. تهانينا!
أحسنت! لقد نقلت خادم الويب من مثيل GCE إلى مجموعة Kubernetes باستخدام Migrate for Anthos.
المواضيع التي تناولناها
- نقلنا خادم ويب من GCE إلى مجموعة Kubernetes باستخدام Migrate for Anthos
- أتحنا خادم الويب ذو الحالة الخاص بنا للعالم من خلال عرضه عبر خدمة موازنة التحميل في Kubernetes.
- فعّلنا Stackdriver وأنشأنا لوحة بيانات مخصّصة
- لقد أعددنا عملية فحص في وقت التشغيل مع سياسة تنبيه لإعلامنا عند توقّف خادم الويب عن العمل.
