نشر موقع إلكتروني باستخدام Cloud Run

1. قبل البدء

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

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

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

يوضح المخطّط البياني التالي سير عملية النشر واستضافة تشغيل السحابة الإلكترونية. تبدأ بصورة Docker تم إنشاؤها عبر Cloud Build، والتي تشغّلها في Cloud Shell. وبعد ذلك، يمكنك نشر هذه الصورة في Cloud Run باستخدام أمر في Cloud Shell.

db5f05c090d5ebcb.png

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

المُعطيات

  • كيفية إنشاء صورة Docker باستخدام Cloud Build وتحميلها على gcr.io
  • كيفية نشر صور Docker في Cloud Run
  • كيفية إدارة عمليات نشر Cloud Run
  • كيفية إعداد نقطة نهاية لتطبيق على Cloud Run

ما الذي ستقوم ببنائه

  • موقع ويب ثابت يعمل داخل حاوية Docker
  • نسخة من هذه الحاوية متوفّرة في Container Registry
  • نشر في Cloud Run لموقعك الإلكتروني الثابت

المتطلبات

  • حساب Google لديه إذن وصول إداري لإنشاء مشاريع أو مشروع بدور مالك المشروع

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

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

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

53dad2cefdae71da.png

faab21976aabeb4c.png

تذكر رقم تعريف المشروع، الذي تتم تعبئته تلقائيًا تحت اسم مشروعك. رقم تعريف المشروع هو اسم فريد في جميع مشاريع Google Cloud، لذا سبق أن تم استخدام الاسم الوارد في لقطة الشاشة ولن يكون مناسبًا لك. ويُشار إليها لاحقًا باسم PROJECT_ID.

بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud وتفعيل Cloud Run API.

تفعيل Cloud Run API

انقر على قائمة التنقل ⋮ > واجهات برمجة التطبيقات الخدمات > لوحة البيانات > تفعيل واجهات برمجة التطبيقات والخدمات: .

5dbb2e6e27a55fcf.png

ابحث عن "Cloud Run API". ثم انقر على Cloud Run API > تفعيل

f1fd486174a744cf.png

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

يُتاح لمستخدمي Google Cloud الجدد الحصول على فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

Cloud Shell

على الرغم من إمكانية إدارة Google Cloud وCloud Run عن بُعد من الكمبيوتر المحمول، ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud. ويتم ضبط البيئة مسبقًا بحيث تحتوي على جميع مكتبات وأُطر العملاء التي تحتاج إليها.

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

ونظرًا لأنك تنشر موقعًا إلكترونيًا حاليًا، ما عليك سوى استنساخ المصدر من المستودع، حتى يتسنّى لك التركيز على إنشاء صور Docker ونشرها على Cloud Run.

شغِّل الأوامر التالية لنسخ المستودع إلى مثيل 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!

يمكنك معاينة تطبيقك بالنقر على معاينة الويب acc630712255c604.png واختيار معاينة على المنفذ 8080.

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. لإيقاف عملية خادم الويب، اضغط على CONTROL+C (Command+C على نظام التشغيل Macintosh) في النافذة الطرفية.

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

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

في العادة، سيكون عليك اتّباع نهج من خطوتَين يتطلّب إنشاء حاوية Docker وإرسالها إلى سجلّ لتخزين الصورة كي يتمكّن GKE من سحبها. مع ذلك، يمكنك تسهيل المهام اليومية باستخدام Cloud Build لإنشاء حاوية Docker ووضع الصورة في Container Registry باستخدام أمر واحد. لعرض العملية اليدوية لإنشاء ملف Dockerfile وإرساله، يمكنك الاطّلاع على 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 لبدء عملية التصميم:

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 ثم النقر على قائمة التنقل 🥭 > إنشاء السحابة الإلكترونية > السجلّ: وهناك، يمكنك رؤية قائمة بجميع الإصدارات السابقة، ولكن يجب أن يكون هناك الإصدار الذي أنشأته.

4c753ede203255f6.png

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

6e88ed1643dfe629.png

5- نشر الحاوية إلى التشغيل في السحابة الإلكترونية

والآن بعد إضافة موقعك الإلكتروني إلى Container Registry، حان وقت النشر إلى Cloud Run.

هناك طريقتان للنشر على Cloud Run:

  • يشير تشغيل السحابة الإلكترونية (المُدار بالكامل) إلى نموذج PaaS الذي تتم فيه إدارة مراحل نشاط الحاوية بالكامل. ستستخدم هذا النهج في هذا الدرس التطبيقي حول الترميز.
  • Cloud Run for Anthos هو Cloud Run مع طبقة تحكُّم إضافية تسمح لك بجلب مجموعاتك ومجموعاتك الصغيرة من GKE. للمزيد من المعلومات، يُرجى الاطّلاع على إعداد Cloud Run for Anthos على Google Cloud.

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

سطر الأوامر

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

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed 

سيُطلب منك تحديد المنطقة التي تريد عرض إعلاناتك فيها. اختَر المنطقة الأقرب إليك، ثم اقبل اسم الخدمة التلقائي المقترَح (الكتلة الأحادية).

d52d9419c5166674.png

لأغراض الاختبار، يمكنك السماح بإرسال الطلبات التي لم تتم مصادقتها إلى التطبيق. أدخِل y في الطلب.

3a57b32f133dad61.png

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

للتأكّد من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق ضبط قيمة Pod status على Running بضع لحظات:

gcloud run services list

اختَر [1] Cloud Run (مُدارة بالكامل).

إخراج:

SERVICE   REGION    URL  LAST DEPLOYED BY          LAST DEPLOYED AT
✔  monolith  us-east1 <your url>  <your email>  2019-09-16T21:07:38.267Z

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

افتح عنوان URL المتوفر في قائمة الخدمات في متصفح الويب وسيظهر لك موقع الويب نفسه الذي شاهدته على الجهاز.

6- إنشاء نسخة سابقة جديدة بتزامن أقل

والآن، يمكنك نشر تطبيقك مرة أخرى، ولكن هذه المرة عليك تعديل إحدى المعلمات.

بشكلٍ تلقائي، تبلغ قيمة التزامن لتطبيق Cloud Run 80، ما يعني أنّ كل مثيل حاوية سيخدم ما يصل إلى 80 طلبًا في المرة الواحدة. وهذا انحراف كبير عن الدوال كنموذج خدمة (FaaS)، حيث تعالج إحدى الحالات طلبًا واحدًا في كل مرة.

أعِد نشر صورة الحاوية نفسها مع قيمة تزامن 1 (لأغراض الاختبار فقط) وشاهِد ما سيحدث.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

أجب عن الأسئلة اللاحقة كما فعلت في المرة الأولى. بعد نجاح الأمر، تحقَّق من Cloud Console للاطّلاع على النتيجة.

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

7d1eed2e4728a4f2.png

انقر على علامة التبويب النُسخ السابقة. من المفترض أن ترى نسختين تم إنشاؤهما. انقر على monolith-00002 وراجِع التفاصيل. ومن المفترض أن تلاحظ انخفاضًا في قيمة التزامن إلى 1.

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

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

والآن، يمكنك استعادة التزامن الأصلي بدون إعادة النشر. يمكنك ضبط قيمة التزامن على القيمة التلقائية 80 أو 0، ما سيؤدي إلى إزالة أي قيود على التزامن وضبطها على الحدّ الأقصى التلقائي (وهو 80 في وقت كتابة هذا التقرير).

شغّل الأمر التالي في Cloud Shell لتحديث النسخة الحالية:

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80

ولاحظ أنه قد تم إنشاء نسخة سابقة أخرى، وتمت إعادة توجيه الزيارات، وأن التزامن عاد إلى 80.

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

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

يبدو أن أحد مطوري البرامج قد أنشأ التغييرات من قبل باستخدام اسم الملف 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 .

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

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

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

ويتعامل Cloud Run مع كل عملية نشر على أنّها مراجعة جديدة، حيث سيتم إعادتها إلى الإنترنت وإعادة توجيه حركة البيانات إليها.

اتّبِع مجموعات التعليمات التالية لتعديل موقعك الإلكتروني.

سطر الأوامر

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

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed

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

تحقَّق من صحة تحديث النشر من خلال تنفيذ الأمر التالي:

gcloud run services describe monolith --platform managed 

تبدو الإخراج على النحو التالي:

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  annotations:
    client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...

وسيظهر لك أنّ الخدمة تستخدم الآن أحدث إصدار من الصورة تم نشره في نسخة جديدة.

للتحقق من التغييرات، انتقل إلى عنوان URL الخارجي لخدمة Cloud Run مرة أخرى ولاحظ أنه تم تعديل عنوان تطبيقك.

شغِّل الأمر التالي لإدراج الخدمات وعرض عنوان IP في حال نسيانه:

gcloud run services list

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

451ca252acae6928.png

9. تَنظيم

حذف صور 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

# 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

حذف خدمة Cloud Run

gcloud run services delete monolith --platform managed

10. تهانينا

لقد نشرت موقعك الإلكتروني ووسّعت نطاقه وحدثته باستخدام Cloud Run.

مزيد من المعلومات