نشر موقعك الإلكتروني وتوسيع نطاقه وتعديله باستخدام Google Kubernetes Engine (GKE)

1. مقدمة

من الصعب تشغيل مواقع الويب والتطبيقات.

تسوء الأمور عندما لا ينبغي ذلك، وتتعطل الخوادم، وتتسبب زيادة الطلب، في استخدام المزيد من الموارد، كما أن إجراء التغييرات دون توقف العمل أمر معقد ومجهد.

تخيل أداة يمكن أن تساعدك في القيام بكل ذلك وتسمح لك حتى بأتمتته! مع GKE، لا يمكن تنفيذ كل ذلك فحسب، بل أصبح سهلاً. في هذا الدرس التطبيقي حول الترميز، ستلعب دور مطوّر برامج يدير موقع تجارة إلكترونية لشركة تخيلية اسمها "متجر رائع". بسبب المشاكل المتعلّقة بالتوسعة وحالات انقطاع الخدمة، تم تكليفك بنشر تطبيقك على GKE.

يتم ترتيب التمارين لتعكس التجربة الشائعة لمطور السحابة الإلكترونية:

  1. أنشئ مجموعة GKE.
  2. أنشئ حاوية Docker.
  3. انشر الحاوية في GKE.
  4. اعرِض الحاوية عبر إحدى الخدمات.
  5. تكبير حجم الحاوية إلى نسخ مكررة متعددة.
  6. تعديل الموقع الإلكتروني.
  7. طرح إصدار جديد بدون أي فترات توقف عن العمل

الرسم التخطيطي للهندسة

ddba666bd2b02d0d.png

ما ستتعرَّف عليه

  • كيفية إنشاء مجموعة GKE
  • كيفية إنشاء صورة Docker
  • طريقة نشر صور Docker في Kubernetes
  • كيفية توسيع نطاق تطبيق على Kubernetes
  • كيفية إجراء تحديث متداول على Kubernetes

المتطلبات الأساسية

  • حساب Google لديه إذن وصول إداري لإنشاء مشاريع أو مشروع بدور مالك المشروع
  • فهم أساسيّ لـ Docker وKubernetes (إذا لم تتوفّر لديك المعلومات الأساسية، يُرجى مراجعة Docker وKubernetes الآن).

2. إعداد البيئة

إعداد بيئة ذاتية

إذا لم يكن لديك حساب على Google، عليك إنشاء حساب. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا.

53dad2cefdae71da.png

لقطة شاشة من 2016-02-10 12:45:26.png

يُرجى العِلم أنّ رقم تعريف المشروع هو اسم فريد في جميع مشاريع Google Cloud (سبق أن تم استخدام الاسم أعلاه ولن يكون مناسبًا لك). وسيُشار إليها لاحقًا باسم PROJECT_ID.

بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud. يُتاح لمستخدمي Google Cloud الجدد الحصول على فترة تجريبية مجانية بقيمة 300 دولار أمريكي. إذا لم تكن مستخدمًا جديدًا، لا داعي للقلق لأنّ الدرس التطبيقي حول الترميز لن يكلفك أكثر من بضعة دولارات. مع ذلك، قد يكلفك الدرس التطبيقي حول الترميز المزيد من المال في حال استخدام المزيد من المراجع أو إبقاءها قيد التشغيل (يُرجى الاطّلاع على القسم "تنظيف" في النهاية). لمزيد من المعلومات، يُرجى الاطّلاع على الأسعار.

Cloud Shell

على الرغم من أنّه يمكنك تشغيل Google Cloud وGKE عن بُعد باستخدام الكمبيوتر المحمول، ستستخدم Cloud Shell، وهو بيئة سطر أوامر تعمل على السحابة الإلكترونية، وذلك في الدرس التطبيقي حول الترميز.

هذا الجهاز الافتراضي المستند إلى نظام دبيان محمل بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. وهذا يعني أنّ كل ما ستحتاجه في هذا الدرس التطبيقي حول الترميز هو متصفّح (نعم، يعمل على جهاز Chromebook).

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (من المفترَض أن تستغرق عملية الإعداد والاتصال بالبيئة بضع دقائق فقط).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

لقطة شاشة يوم 14-06-2017 في الساعة 10.13.43 مساءً.png

بعد الربط بتطبيق Cloud Shell، من المفترض أن يظهر لك أنّه قد تمت مصادقتك وأنّ المشروع سبق أن تم ضبطه على PROJECT_ID.

gcloud auth list

مخرجات الأمر

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يتم ضبط المشروع لسبب ما، ما عليك سوى إصدار الأمر التالي:

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ تحقَّق من المعرّف الذي استخدمته في خطوات الإعداد أو ابحث عنه في لوحة بيانات Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

تضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، وهو ما قد يكون مفيدًا عند تشغيل الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

مخرجات الأمر

<PROJECT_ID>
  1. أخيرًا، قم بتعيين تهيئة المنطقة الافتراضية والمشروع.
gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، راجع المناطق المناطق:

3- إنشاء مجموعة GKE

بعد أن أصبحت لديك بيئة عمل لتطوير البرامج، ستحتاج إلى مجموعة GKE لنشر موقعك الإلكتروني عليها. قبل إنشاء مجموعة، يجب التأكد من تفعيل واجهات برمجة التطبيقات المناسبة. شغِّل الأمر التالي لتفعيل واجهة برمجة تطبيقات الحاويات:

gcloud services enable container.googleapis.com

الآن، يمكنك إنشاء مجموعتك! اتّبِع الخطوات أدناه لإنشاء مجموعة باسم fancy-cluster مع عُقد 3:

gcloud container clusters create fancy-cluster --num-nodes 3

قد يستغرق إنشاء المجموعة عدّة دقائق. بعد ذلك، شغِّل الأمر التالي واطّلِع على مثيلات الأجهزة الافتراضية (VM) الثلاث في المجموعة:

gcloud compute instances list

إخراج:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

يمكنك أيضًا عرض مجموعتك والمعلومات ذات الصلة في Cloud Console. انقر على زر القائمة في أعلى الجانب الأيسر، ومرر لأسفل إلى Kubernetes Engine وانقر على Clusters. من المفترض أن تظهر لك المجموعة باسم fancy-cluster.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

تهانينا! لقد أنشأت أول مجموعة لك.

4. نسخ مستودع المصدر

بما أنّ هذا الموقع الإلكتروني حالي، ما عليك سوى استنساخ المصدر من المستودع لتتمكّن من التركيز على إنشاء صور Docker ونشرها على GKE.

شغِّل الأوامر التالية لانسخ المستودع المصدر إلى مثيل Cloud Shell وتغييره إلى الدليل المناسب. ويمكنك أيضًا تثبيت تبعيات Node.js لكي تتمكن من اختبار التطبيق قبل نشره.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

يجب إجراء العناية الواجبة واختبار طلبك. نفِّذ الأمر التالي لبدء خادم الويب:

cd ~/monolith-to-microservices/monolith
npm start

إخراج:

Monolith listening on port 8080!

يمكنك معاينة تطبيقك من خلال النقر على رمز معاينة الويب في قائمة Cloud Shell واختيار معاينة في المنفذ 8080.

5869738f0e9ec386.png

من المفترض أن يؤدي ذلك إلى فتح نافذة جديدة يمكنك من خلالها الاطّلاع على "متجرك الرائع" أثناء تشغيله.

9ed25c3f0cbe62fa.png

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. اضغط على Control+C (Windows أو Mac) في النافذة الطرفية لإيقاف عملية خادم الويب.

5- إنشاء حاوية Docker باستخدام Cloud Build

الآن وقد أصبحت ملفات المصدر جاهزة للاستخدام، حان الوقت لإنشاء تطبيق Dockerize!

في العادة، سيكون عليك اتّباع نهج من خطوتَين يستلزم إنشاء حاوية Docker وإرسالها إلى سجلّ لتخزين الصورة التي يسحبها GKE من محرّك بحث GKE. مع ذلك، يمكنك تسهيل المهام اليومية باستخدام Cloud Build لإنشاء حاوية Docker ووضع الصورة في Container Registry باستخدام أمر واحد. (لعرض العملية اليدوية لإنشاء ملف Docker وإرساله، يُرجى الاطّلاع على Quickstart for Container Registry.)

يضغط Cloud Build الملفات من الدليل وينقلها إلى حزمة Cloud Storage. بعد ذلك تأخذ عملية الإنشاء الملفات من الحزمة وتستخدم ملف Dockerfile لتشغيل عملية إنشاء Docker. لأنّك حدّدت علامة --tag مع المضيف على أنّه gcr.io لصورة Docker، سيتم إرسال صورة Docker الناتجة إلى Container Registry.

أولاً، يجب تفعيل Cloud Build API من خلال تنفيذ الأمر التالي:

gcloud services enable cloudbuild.googleapis.com

بعد تفعيل واجهة برمجة التطبيقات، شغِّل الأمر التالي في Cloud Shell لبدء عملية التصميم:

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

تستغرق هذه العملية بضع دقائق، ولكن بعد اكتمالها، يمكنك الاطّلاع على النتيجة التالية في الوحدة الطرفية:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

لعرض سجلّ الإصدارات أو مشاهدة العملية في الوقت الفعلي، يمكنك الانتقال إلى Cloud Console. انقر على زر القائمة في أعلى الجانب الأيمن، وانتقِل للأسفل إلى Ci/CD، ثم انقر على Cloud Build (إنشاء السحابة الإلكترونية)، وأخيرًا انقر على History (السجلّ). وهناك، يمكنك الاطّلاع على قائمة بالإصدارات السابقة، ولكن يُفترض أن يكون هناك الإصدار الذي أنشأته.

4c753ede203255f6.png

وعند النقر على "معرّف الإصدار"، يمكنك الاطّلاع على جميع التفاصيل لهذا الإصدار، بما في ذلك ناتج السجلّ.

في صفحة تفاصيل الإصدار، يمكنك الاطّلاع على صورة الحاوية التي تمّ إنشاؤها عن طريق النقر على اسم الصورة في قسم معلومات الإصدار.

6e88ed1643dfe629.png

6- نشر الحاوية إلى GKE

الآن بعد أن نقلت الحاوية إلى Container Registry، يمكنك نشرها على Kubernetes.

لنشر التطبيقات وإدارتها على مجموعة GKE، يجب الاتصال بنظام إدارة المجموعات في Kubernetes. يمكنك إجراء ذلك عادةً باستخدام أداة سطر الأوامر kubectl.

يُمثِّل Kubernetes التطبيقات على أنّها Pods، وهي وحدات تمثّل حاوية (أو مجموعة من الحاويات المزدوجة بإحكام). وهي أصغر وحدة قابلة للنشر في Kubernetes. في هذا المثال، تحتوي كل مجموعة على حاويتك الأحادية فقط.

لنشر تطبيقك، عليك إنشاء عملية نشر. تدير عملية النشر نسخًا متعددة من تطبيقك - تسمى النسخ المتماثلة - وتجدولها للتشغيل على العُقد الفردية في المجموعة. في هذه الحالة، سيتم تشغيل مجموعة واحدة فقط من تطبيقك في عملية النشر. تضمن عمليات النشر ذلك عن طريق إنشاء ReplicaSet. المجموعة ReplicaSet مسؤولة عن التأكد من أن عدد النسخ المتماثلة المحددة قيد التشغيل دائمًا.

يؤدّي الأمر kubectl create deployment إلى إنشاء Kubernetes لعملية نشر باسم نص واحد على مجموعتك مع نسخة مطابقة 1.

شغّل الأمر التالي لنشر التطبيق:

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

التأكّد من النشر

للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي (قد يستغرق الأمر بضع لحظات لتصبح حالة المجموعة "قيد التشغيل"):

kubectl get all

إخراج:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

يعرض لك هذا الناتج عدة أشياء. يمكنك الاطّلاع على "عملية النشر" الحالية، ReplicaSet، مع عدد الكبائن المطلوب واحدة؛ واللوحة التي تعمل يبدو أنك أنشأت كل شيء بنجاح!

لعرض الموارد بشكل فردي، يمكنك تشغيل الأوامر التالية:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

للاستفادة من كل مزايا Kubernetes، يمكنك محاكاة أي تعطُّل في الخادم وحذف Pod ومعرفة ما يحدث.

انسخ اسم المجموعة من الأمر السابق وشغِّل الأمر التالي لحذفها:

kubectl delete pod/<POD_NAME>

إذا كنت سريعًا بالقدر الكافي، يمكنك تشغيل الأمر السابق ليظهر لك كل ذلك مرة أخرى، ومن المفترض أن ترى لوحتين، أحدهما ينتهي بالنهاية والآخر ينشئ أو قيد التشغيل:

kubectl get all

إخراج:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

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

7. عرض نشر GKE

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

شغِّل الأمر التالي لعرض موقعك الإلكتروني على الإنترنت:

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

إخراج:

service/monolith exposed

الوصول إلى الخدمة

يعيّن GKE عنوان IP الخارجي لمورد الخدمة، وليس للنشر. في حال أردت العثور على عنوان IP الخارجي الذي وفّره لك GKE في تطبيقك، يمكنك فحص الخدمة باستخدام الأمر kubectl get service:

kubectl get service

إخراج:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

وبعد تحديد عنوان IP الخارجي لتطبيقك، انسخه. وجِّه المتصفح إلى عنوان URL هذا (مثل http://203.0.113.0) لمعرفة ما إذا كان يمكن الوصول إلى تطبيقك أم لا.

9ed25c3f0cbe62fa.png

من المفترض أن يظهر لك الموقع الإلكتروني نفسه الذي اختبرته سابقًا. تهانينا! يتم تشغيل موقعك الإلكتروني بالكامل على Kubernetes.

8. نشر GKE على نطاق واسع

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

شغّل الأمر التالي لتوسيع نطاق عملية النشر لما يصل إلى ثلاث نسخ مكررة:

kubectl scale deployment monolith --replicas=3

إخراج:

deployment.apps/monolith scaled

التحقّق من النشر الموسّع

للتأكّد من أنّه تم ضبط نطاق "النشر" بنجاح، شغِّل الأمر التالي:

kubectl get all

إخراج:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

من المفترض أن تظهر ثلاث حالات من Pod قيد التشغيل. لاحظ أيضًا أن النشر وReplicaSet الآن بعدد مطلوب من ثلاثة.

9. إجراء تغييرات على الموقع الإلكتروني

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

شغّل الأوامر التالية، وانسخ الملف المعدَّل إلى اسم الملف الصحيح، واطبع محتواه للتحقق من التغييرات:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

من المفترض أن تظهر التعليمة البرمجية الناتجة على النحو التالي:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

لقد عدّلت مكونات React، ولكنك بحاجة إلى إنشاء تطبيق React لإنشاء الملفات الثابتة. شغِّل الأمر التالي لإنشاء تطبيق React ونسخه إلى الدليل العام المتوافق:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

الآن بعد أن تم تحديث الرمز الخاص بك، يجب عليك إعادة إنشاء حاوية Docker ونشرها على Container Registry. يمكنك استخدام الأمر نفسه كما في السابق، إلا أنك ستحدّث تصنيف الإصدار في هذه المرة.

شغِّل الأمر التالي لتشغيل إصدار Cloud Build جديد بإصدار صورة 2.0.0 معدَّل:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

اضغط على Control+C (Windows أو Mac) في النافذة الطرفية لإيقاف عملية خادم الويب.

في القسم التالي، ستستخدم هذه الصورة لتحديث تطبيقك بدون أي فترات توقف عن العمل.

10. تحديث الموقع الإلكتروني بدون أي فترات توقف عن العمل

اكتملت التغييرات وفريق التسويق سعيد بتحديثاتك! حان الوقت لتحديث الموقع الإلكتروني دون مقاطعة للمستخدمين. اتّبِع التعليمات التالية لتعديل موقعك الإلكتروني.

تضمن تحديثات GKE المتداولة بقاء تطبيقك متاحًا ومتاحًا حتى عندما يستبدل النظام مثيلات صورة الحاوية القديمة بأخرى جديدة على جميع النسخ المكررة قيد التشغيل.

من سطر الأوامر، يمكنك إعلام Kubernetes بأنّك تريد تعديل صورة "النشر" إلى إصدار جديد باستخدام الأمر التالي:

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

إخراج:

deployment.apps/monolith image updated

التحقّق من النشر

يمكنك التحقّق من صحة تحديث "النشر" من خلال تشغيل الأمر التالي:

kubectl get pods

إخراج:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

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

للتحقّق من التغييرات التي أجريتها، انتقِل إلى عنوان IP الخارجي لجهاز موازنة الحمل مرة أخرى ولاحظ أنّه تم تحديث تطبيقك.

شغِّل الأمر التالي لعرض قائمة بالخدمات وعرض عنوان IP في حال نسيانه:

kubectl get svc

يجب أن يعرض موقع الويب الخاص بك النص الذي أضفته إلى مكون الصفحة الرئيسية!

8006c9938dbd5aa5.png

11. تَنظيم

حذف مستودع Git

cd ~
rm -rf monolith-to-microservices

حذف صور Container Registry

ملاحظة: إذا قمت بإنشاء نسخ أخرى، يمكنك حينئذٍ استخدام نفس البنية لحذف هذه الصور أيضًا. يفترض هذا الدرس التطبيقي حول الترميز أن لديك علامتان فقط.

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

حذف عناصر Cloud Build من Cloud Storage

ملاحظة: إذا استخدمت Cloud Build لعناصر أخرى غير هذا الدرس التطبيقي حول الترميز، عليك حذف المصدر يدويًا من حزمة Cloud Storage gs://<PROJECT_ID>_cloudbuild/source.

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

حذف خدمة GKE

kubectl delete service monolith
kubectl delete deployment monolith

حذف مجموعة GKE

gcloud container clusters delete fancy-cluster

ملاحظة: قد يستغرق هذا الأمر بعض الوقت.

12. تهانينا!

لقد نشرت موقعك الإلكتروني ووسّعت نطاقه وعدّلته على GKE. أصبحت الآن متمرّسًا في Docker وKubernetes.

مراجع إضافية