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

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

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

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

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

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

أهداف الدورة التعليمية

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

ما ستنشئه

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

المتطلبات

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

إعداد البيئة بالوتيرة التي تناسبك

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

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

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

تفعيل Cloud Run API

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

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

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

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

Cloud Shell

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

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

لتفعيل Google Cloud Shell، ما عليك سوى النقر على الزرّ في أعلى يسار صفحة "وحدة تحكّم المطوّرين" (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط):

activateCloudShell.png

انقر على الزر "بدء Cloud Shell":

Screen Shot 2017-06-14 at 10.13.43 PM.png

بعد الاتصال بواجهة سطر الأوامر على السحابة الإلكترونية، من المفترض أن تظهر لك رسالة تفيد بأنّك قد أثبتّ هويتك وأنّ المشروع قد تم ضبطه على PROJECT_ID :

gcloud auth list

ناتج الأمر

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

ناتج الأمر

[core]
project = <PROJECT_ID>

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

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Project_ID.png

ملاحظة مهمة: أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع:

gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. يمكنك الاطّلاع على مزيد من المعلومات في مستند المناطق والأحياء.

بما أنّك ستنشر موقعًا إلكترونيًا حاليًا، ما عليك سوى استنساخ المصدر من المستودع، ما يتيح لك التركيز على إنشاء صور 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!

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

سيؤدي ذلك إلى فتح نافذة جديدة يمكنك فيها رؤية متجرك على Fancy وهو يعمل.

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

بعد أن أصبحت ملفات المصدر جاهزة، حان الوقت لإنشاء حاوية Docker لتطبيقك.

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

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

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

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

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

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

سطر الأوامر

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

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

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

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

التحقّق من عملية النشر

للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق 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 المقدَّم في قائمة الخدمات في متصفّح الويب، وسيظهر لك الموقع الإلكتروني نفسه الذي عاينته محليًا.

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

سيتضمّن تطبيق 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 للاطّلاع على النتيجة.

من لوحة بيانات Cloud Run، انقر على خدمة monolith للاطّلاع على التفاصيل.

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

]

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

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

نفِّذ الأمر التالي في Cloud Shell لتعديل المراجعة الحالية:

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

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

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

يبدو أنّ أحد المطوّرين قد أجرى التغييرات باستخدام اسم الملف 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 ونسخه إلى دليل monolith العام:

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 .

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

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

يتعامل 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

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

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

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

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