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

1. نظرة عامة

وليس من الممكن دائمًا إعادة كتابة التطبيقات الحالية أو إعادة تصميمها للعمل على Kubernetes أو إجراء ذلك يدويًا. يمكن أن تساعد ميزة "نقل البيانات لنظام Anthos" في تحديث تطبيقاتك الحالية وتشغيلها في Kubernetes. في هذا الدرس التطبيقي حول الترميز، سيتم نقل تطبيق ويب حالي مستضاف على Compute Engine إلى Kubernetes Engine باستخدام Migrate for Anthos.

المعلومات التي ستطّلع عليها

  • طريقة نشر عملية نقل بيانات Anthos على مجموعة Kubernetes
  • كيفية إنشاء حاوية في مجموعة ذات حالة من مثيل حالي في Compute Engine
  • كيفية نشر حاويتك على Kubernetes وإعدادها باستخدام جهاز موازنة الحمل

المتطلبات

  • مشروع على Google Cloud تم إعداد الفوترة فيه وإذا لم يكن لديك حساب، عليك إنشاء حساب.

2. بدء الإعداد

يمكن تشغيل هذا الدرس التطبيقي بالكامل على Google Cloud Platform بدون أي عمليات تثبيت أو ضبط على الجهاز.

تفعيل واجهات برمجة التطبيقات

قبل البدء، احرص على تفعيل واجهات برمجة التطبيقات المطلوبة في مشروعك على Google Cloud، وذلك باتّباع الخطوات التالية:

إنشاء خادم ويب لمثيل Compute

لنُنشئ مثيلاً حوسبة سنستخدمه لاستضافة خادم الويب 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

بعد ذلك، انتقِل إلى سوق Google Cloud Platform (GCP) لنشر عملية نقل البيانات في Anthos:

45f5753cae53ccb5.png

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

94dc6238b2affd16.png

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

5bf601103a5335cf.png

4. من المثيل الحوسبة إلى مجموعة الحالة

لدينا مجموعة Kubernetes التي تشغّل Migrate for Anthos، وبالتالي يمكننا الآن بدء عملية نقل البيانات. لنشر مثيل الحوسبة في مجموعة Kubenetes، سنوقف مثيل محرك الحوسبة لكي نتمكن من أخذ لقطات من الأقراص. قبل المتابعة، يُرجى ملاحظة رقم تعريف المثيل، والذي سنحتاج إليه لاحقًا:

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 في صفحة Workloads (أحمال العمل):

من الطبيعي أن تظهر حالة "اللوحات في انتظار المراجعة" لبضع دقائق بعد تشغيل kubectl apply. انتقل إلى الخطوة التالية بعد أن تظهر الحالة "حسنًا".

5- عرض المجموعة العنقودية على جهاز موازنة الحمل

في هذه المرحلة، من المفترض أن تشغّل مجموعة Kubenetes خادم الويب كمجموعة ذات حالة محددة، ولكننا سنحتاج أيضًا إلى تعريض حاويتها إلى جهاز موازنة الحمل للوصول إلى خادم الويب الخاص بنا عبر عنوان 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 الخارجي لخدمة حاوية خادم الويب:

kubectl get services

إذا أدخلنا عنوان IP الخارجي في متصفحنا، فمن المفترض أن نحصل على نفس شاشة الترحيب التلقائية في nginx من قبل:

5c08e3b2bd17e03.png

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

6- تتبُّع Stackdriver

المقاييس

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

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

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

4e62c8ad3f2b3fe9.png

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

62066a9251d19843.png

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

d054778de301429e.png

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

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

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

في الجزء الأيمن، مرر مؤشر الماوس فوق "Dashboards" (لوحات البيانات)، ثم انقر فوق "Create Dashboard" (إنشاء لوحة بيانات).

56a0513efe60de3e.png

الآن بعد أن أصبح لدينا لوحة بيانات فارغة، يمكننا إضافة المقاييس التي نريد مراقبتها. دعنا نعطي لوحة البيانات بلا عنوان اسمًا مفيدًا مثل "حاويات خادم الويب" وانقر فوق "Add Chart" (إضافة مخطط) في أعلى يسار الصفحة:

bd66ba91f3125028.png

هل تتذكر المقاييس التقليدية؟ دعونا نضيف مخططًا لاستخدام حاوية وحدة المعالجة المركزية (CPU). في حقل عنوان الرسم البياني، أدخِل "استخدام وحدة المعالجة المركزية (CPU). في مربّع "العثور على نوع المورد والمقياس"، اكتب request_utilization واختَر استخدام طلب وحدة المعالجة المركزية (CPU) من القائمة التي تمت فلترتها. سيؤدي هذا الاختيار إلى تعبئة حقلي "نوع المورد" و"المقياس" لنا.

بعد ذلك، سنرغب في التصفية حسب project_id (إذا كان لدينا مشروعات متعددة) وContain_name. في المربع "Filter" (الفلتر)، اكتب project_id، واختَره من القائمة التي تمت فلترتها، ثم اختَر مشروعك في حقل "القيمة". نحتاج أيضًا إلى التصفية حسب filter_name. في المربّع "الفلتر"، اكتب container_name، واختَرها من القائمة المفلتَرة، واختَر webserver-statefulset في الحقل "Value". النقر على "حفظ"

لدينا الآن لوحة معلومات مع مخططنا الأول.

3d3d45e4357454e0.png

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

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

من الجزء الأيمن، انقر على "عمليات الفحص في وقت التشغيل" ثم على "نظرة عامة على عمليات الفحص في وقت التشغيل":

49368e5700274cf2.png

وفقًا لما تقترحه صفحة "عمليات الفحص في وقت التشغيل"، لنبدأ بإعداد أول عملية فحص في وقت التشغيل. انقر على الزر Add Uptime Check (إضافة عمليات الفحص في وقت التشغيل) في أعلى يسار الصفحة.

d884560f91011009.png

في نموذج المتابعة، أدخِل Endpoint Uptime العنوان وعنوان IP الخارجي لجهاز موازنة الحمل كاسم المضيف.

568a8f1e27ae8417.png

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

f89d53a106a709f4.png

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

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

74609849348bd03e.png

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

44c474e28a497659.png

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

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

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 باستخدام "نقل البيانات في 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 (تشمل خدمة "نقل البيانات لخدمة Anthos" و"مجموعة الحالة" و"خدمة موازنة التحميل")

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

الأقراص

استخدمت مجموعتنا ذات الحالة قرصًا أنشأناه. استخدم ما يلي لاسترداد الاسم:

gcloud compute disks list --filter=webserver

باستخدام اسم القرص الخاص بك بدلاً من اسمي، يمكنك حذفه باستخدام ما يلي:

gcloud compute disks delete vls-690d-webserver --zone=us-central1-a

تم حلّ جميع المشاكل.

9. تهانينا!

أحسنت. نقلتَ خادم الويب من مثيل GCE إلى مجموعة Kubernetes باستخدام أداة "نقل البيانات في Anthos".

النقاط التي تناولناها

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