الانتقال من Compute Engine إلى Kubernetes Engine باستخدام أداة Migrate for Anthos

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 الخارجي، لأنّنا سنحتاج إليه لاحقًا للتأكّد من أنّ خادم الويب يعمل.

a08aa5bf924b107d.png

بعد تشغيل الجهاز الافتراضي، يمكننا استخدام بروتوكول SSH للوصول إلى الجهاز الافتراضي من Cloud Shell لتثبيت nginx وبدء تشغيل خادم الويب:

gcloud compute ssh --zone us-central1-a webserver

بعد تسجيل الدخول إلى الجهاز الظاهري، ثبِّت nginx:

sudo apt install nginx

تسجيل الخروج من جلسة SSH باستخدام الأمر logout

لنتأكّد من أنّ خادم الويب يعمل من خلال إدخال عنوان IP الخارجي الخاص بالجهاز الظاهري الذي تم إنشاؤه سابقًا في المتصفّح. من المفترض أن تظهر لك شاشة الترحيب التلقائية في nginx:

5c08e3b2bd17e03.png

سيعمل خادم الويب هذا كتطبيق ويب قديم سننقله إلى 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

يُرجى الانتظار بضع دقائق حتى يكتمل تنفيذ هذا الأمر. بعد إنشاء المجموعة، ستتلقّى بعض النتائج التي تتضمّن تفاصيلها:

c69778b8fb8ac72b.png

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

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

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

5bf601103a5335cf.png

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 التي ظهرت سابقًا:

5c08e3b2bd17e03.png

لقد نجحنا! تتم الآن استضافة خادم الويب GCE على Kubernetes. أحسنت.

6. ‫Stackdriver Monitoring

المقاييس

بما أنّ Kubernetes Engine هي خدمة Kubernetes مُدارة، يتم إعدادها تلقائيًا لتسجيل البيانات ومراقبتها باستخدام Stackdriver. لنلقِ نظرة على بعض المقاييس التي تسجّلها Stackdriver تلقائيًا.

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

بعد التحميل، مرِّر مؤشر الماوس فوق "الموارد" (Resources) في اللوحة اليمنى واختَر "Kubernetes Engine NEW" من القائمة.

4e62c8ad3f2b3fe9.png

يمثّل كل صف في لوحة البيانات المعروضة هنا أحد موارد Kubernetes. يمكنك التبديل بين عرض البنية الأساسية أو أحمال العمل أو الخدمات باستخدام الروابط أعلى لوحة البيانات.

62066a9251d19843.png

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

d054778de301429e.png

الرسوم البيانية المعروضة في لوحة البيانات هذه هي تلك التي سنتمكّن من استخدامها لإنشاء لوحة بيانات مخصّصة.

لوحات البيانات المخصّصة

تتيح لنا Stackdriver إنشاء لوحات بيانات مخصّصة يمكننا استخدامها لتنظيم المخططات والرسوم البيانية لأي بيانات مقاييس متاحة لنا. لننشئ لوحة بيانات مخصّصة لتقديم نظرة سريعة على بعض مقاييس خادم الويب.

في اللوحة الجانبية اليمنى، مرِّر مؤشر الماوس فوق "لوحات البيانات"، ثم انقر على "إنشاء لوحة بيانات".

56a0513efe60de3e.png

بعد أن أصبح لدينا لوحة بيانات فارغة، يمكننا إضافة المقاييس التي نريد تتبُّعها. لنمنح لوحة البيانات بلا عنوان اسمًا مفيدًا مثل "حاويات خادم الويب الخاص بي"، ثمّ ننقر على "إضافة رسم بياني" في أعلى يسار الصفحة:

bd66ba91f3125028.png

هل تتذكر المقاييس الجاهزة للاستخدام؟ لنضِف رسمًا بيانيًا لاستخدام وحدة المعالجة المركزية للحاوية. في حقل "عنوان الرسم البياني" (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 في حقل "القيمة". انقر على "حفظ".

لدينا الآن لوحة بيانات تتضمّن المخطط الأول.

3d3d45e4357454e0.png

7. سياسة التنبيه وفحص وقت التشغيل

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

من اللوحة اليمنى، اختَر "عمليات الفحص في وقت التشغيل" ثم "نظرة عامّة على عمليات الفحص في وقت التشغيل":

49368e5700274cf2.png

كما تقترح صفحة "عمليات الفحص في وقت التشغيل"، لنبدأ بإعداد عملية الفحص الأولى في وقت التشغيل. انقر على الزر إضافة عملية تحقّق من وقت التشغيل في أعلى يسار الصفحة.

d884560f91011009.png

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

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

انقر على إنشاء سياسة تنبيه.

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

74609849348bd03e.png

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

44c474e28a497659.png

انقر على إضافة قناة إشعارات. أخيرًا، في أسفل النموذج، أطلِق على السياسة اسم "وقت تشغيل تطبيق الويب" وانقر على "حفظ".

للاطّلاع على شكل التنبيه، افتح Cloud Shell مرة أخرى في Cloud Console. سيؤدي الأمر التالي إلى إيقاف خدمة nginx التي تعمل في وحدة webserver:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

بعد بضع دقائق، من المفترض أن تتلقّى رسالة إلكترونية تنبّهك بانقطاع الخدمة:

808ac1d75ce3681f.png

لنرجع إلى الحالة السابقة. في Cloud Shell، لنعِد تشغيل nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

بعد بضع دقائق، ستتلقّى رسالة إلكترونية أخرى من Stackdriver، ولكن هذه المرة ستتضمّن أخبارًا أفضل من ذي قبل:

5b8262fbbc4877c.png

8. تنظيف

بعد أن أكملنا عملية النقل من GCE إلى GKE باستخدام Migrate for Anthos، لننظّف مشروعنا من جميع الموارد التي أنشأناها.

حذف المشروع

يمكنك حذف المشروع بأكمله إذا كنت تفضّل ذلك. في "وحدة تحكّم Google Cloud Platform"، انتقِل إلى صفحة Cloud Resource Manager:

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

إذا كنت تفضّل حذف المكوّنات المختلفة واحدًا تلو الآخر، انتقِل إلى القسم التالي.

Stackdriver

لوحة البيانات

من صفحة لوحة البيانات، انقر على رمز الإعدادات dc259295eb33cb42.pngفي أعلى الصفحة واختَر حذف لوحة البيانات.

سياسة التنبيهات

من صفحة "السياسات"، انقر على حذف من قائمة "الإجراءات" 2ef75d82e76accaa.png على يسار كل سياسة أنشأتها.

التحقّق من وقت التشغيل

من صفحة "عمليات الفحص في وقت التشغيل"، انقر على حذف من قائمة "الإجراءات" على يسار كل عملية فحص أنشأتها.

‫GCE وKubernetes

آلة Google Compute Engine الافتراضية

gcloud compute instances delete webserver --zone=us-central1-a

مجموعة Kubernetes (تشمل Migrate for Anthos ومجموعة StatefulSet وخدمة موازنة التحميل)

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.

المواضيع التي تناولناها

  • نقلنا خادم ويب من "محرك حساب Google" إلى مجموعة Kubernetes باستخدام Migrate for Anthos
  • أتحنا خادم الويب ذو الحالة الخاص بنا للعالم من خلال عرضه عبر خدمة موازنة التحميل في Kubernetes.
  • فعّلنا Stackdriver وأنشأنا لوحة بيانات مخصّصة
  • لقد أعددنا عملية فحص في وقت التشغيل مع سياسة تنبيه لإعلامنا عند توقّف خادم الويب عن العمل.