إنشاء خدمة Cloud Run باستخدام تطبيق جانبي

1. نظرة عامة

مقدمة

في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية نشر خدمة التشغيل في السحابة الإلكترونية التي تستخدم حاويات متعدّدة. عليك إنشاء تطبيقNode.js لاستخدامه كحاوية دخول في Cloud Run وتطبيق إضافي في العقدة.js سيتم استخدامه كجهاز جانبي.

نظرة عامة فنية

عند استخدام حاويات متعددة في مثيل Cloud Run، يتم استخدام حاوية واحدة باعتبارها الحاوية الرئيسية للزيارات الواردة من الويب. يشار إلى الحاوية الإضافية أو أكثر باسم العناصر الجانبية.

هناك طريقتان لحاويات متعددة للتواصل فيما بينها:

  1. تشترك الحاويات في واجهة شبكة المضيف المحلي، بحيث يمكن لجميع الحاويات الاستماع إلى منفذ، على سبيل المثال. localhost:port.
  2. يمكنك أيضًا استخدام وحدات التخزين في الذاكرة وتحميلها في الحاويات لمشاركة الملفات.

حالات الاستخدام

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

بما أنّ حاويات متعدّدة يمكن أن تتواصل من خلال مشاركة الملفات عبر وحدات التخزين المشتركة، يمكنك إضافة تطبيقات جانبية متعددة إلى خدمتك. على سبيل المثال، يمكنك ضبط أداة Cloud Run على استخدام البرامج المخصَّصة، مثل OpenTelemetry، لتصدير السجلّات والمقاييس وعمليات التتبُّع (مثال OpenTelemetry). ومن الأمثلة الأخرى استخدام اتصال جانبي بقاعدة بيانات Cloud Spanner PostgreSQL (مثال على Cloud Spanner Postgress).

أمثلة في هذا الدرس التطبيقي حول الترميز

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

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

  • كيفية إنشاء حاوية تستخدم بطاقة جانبية
  • كيف يمكن لحاوية الدخول أن تتواصل مع برنامج جانبي باستخدام المضيف المحلي
  • كيف يمكن لحاوية البيانات الواردة والعنصر الجانبي مشاركة ملف عبر وحدة تخزين مثبَّتة

2. الإعداد والمتطلبات

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

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

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

d95252b003979716.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.

7833d5e1c5d18f54.png

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

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

  1. شغِّل الأمر التالي في Cloud Shell لتأكيد مصادقتك:
gcloud auth list

مخرجات الأمر

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. شغّل الأمر التالي في Cloud Shell للتأكد من معرفة الأمر gcloud بمشروعك:
gcloud config list project

مخرجات الأمر

[core]
project = <PROJECT_ID>

إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:

gcloud config set project <PROJECT_ID>

مخرجات الأمر

Updated property [core/project].

3- إنشاء تطبيق الدخول

ضبط متغيّرات البيئة

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

REGION=<YOUR-REGION>
PROJECT_ID=<YOUR-PROJECT-ID>

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

إنشاء مستودع ArtifactRegistry للاحتفاظ بصور الحاوية

يمكنك إنشاء مستودع في Artifact Registry لتخزين صور حاويتك لهذا الدرس التطبيقي حول الترميز.

gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=$REGION --description="sidecar codelab"

بعد ذلك، أنشِئ ملف package.json يتضمّن المحتوى التالي:

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node ingress.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

أنشئ الآن ملفًا باسم "ingress.js" يتضمّن المحتوى التالي:

const express = require('express');
const app = express();
const axios = require("axios");

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

إنشاء ملف Docker لحاوية الدخول

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

# Copy local code to the container image.
COPY . .

# Run the web service on container startup.
ENV PORT=8080
CMD [ "npm", "start" ]

وإنشاء ملف ``.dockerignore` لحاوية الدخول.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

يمكنك الآن إنشاء صورة لحاوية الدخول عن طريق تشغيل الأمر التالي:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

4. إنشاء تطبيق الشريط الجانبي

في هذا القسم، ستُنشئ تطبيق العقدة الثاني الذي سيتم استخدامه كجهاز جانبي في خدمة التشغيل السحابي.

انتقِل إلى دليل السيارة الجانبية.

cd ../sidecar

أنشئ ملف package.json يتضمّن المحتوى التالي:

{
  "name": "sidecar-codelab",
  "version": "1.0.0",
  "private": true,
  "description": "demonstrates how to use sidecars in cloud run",
  "main": "index.js",
  "author": "Google LLC",
  "license": "Apache-2.0",
  "scripts": {
    "start": "node sidecar.js"
  },
  "dependencies": {
    "axios": "^1.6.2",
    "express": "^4.18.2"
  }
}

أنشئ الآن ملفًا باسم "sidecar.js" يتضمّن المحتوى التالي:

const express = require('express');
const app = express();

app.get('/', async (req, res) => {
    res.send("Hello ingress container! I'm the sidecar.");
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

إنشاء ملف شامل لحاوية الملف الجانبي

FROM node:20.10.0-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --production

# Copy local code to the container image.
COPY . .

# Run the web service on container startup.
ENV PORT=5000
CMD [ "npm", "start" ]

وإنشاء ملف ``.dockerignore` لحاوية السيارة الجانبية.

# Exclude locally installed dependencies
node_modules/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

يمكنك الآن إنشاء صورة لحاوية الدخول عن طريق تشغيل الأمر التالي:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

نشر خدمة Cloud Run

يمكنك نشر خدمة تشغيل السحابة الإلكترونية باستخدام ملف yaml.

انتقِل إلى الدليل الرئيسي.

cd ..

أنشئ ملفًا باسم sidecar-codelab.yaml يتضمّن المحتوى التالي:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"

بعد ذلك، يمكنك نشر الخدمة باستخدام الأمر التالي. تحتاج إلى استخدام الإصدار التجريبي من gcloud لأن عمليات تثبيت مستوى الصوت تتوفّر في النسخة التجريبية المتاحة للجميع.

gcloud beta run services replace sidecar-codelab.yaml

بعد النشر، احفظ عنوان URL للخدمة في متغيّر بيئة.

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --platform managed --region $REGION --format 'value(status.url)') 

5- الاتصال بخدمة Cloud Run

يمكنك الآن الاتصال بخدمتك من خلال تقديم رمز الهوية.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

يجب أن تبدو نتائجك مشابهة لمثال الإخراج أدناه:

The sidecar says: Hello ingress container! I'm the sidecar.

6- مشاركة ملف عبر تثبيت مستوى الصوت

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

عليك أولاً تعديل رمز حاوية الدخول. انتقِل إلى دليل الدخول.

cd ../ingress

ثم استبدِل محتوى ملف ingress.js بما يلي:

const express = require('express');
const app = express();
const fs = require('fs');
const axios = require("axios");

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

try {
    fs.writeFileSync(`${path}/${filename}`, "The ingress container created this file.");
} catch (err) {
    console.error(err);
}

app.get('/', async (req, res) => {

    let response = await axios.get("http://localhost:5000");

    res.send("The sidecar says: " + response.data);
});

const port = parseInt(process.env.PORT) || 8080;
app.listen(port, () => {
    console.log(`Ingress container listening on port ${port}`);
});

وأنشئ الصورة الجديدة لحاوية الدخول عن طريق تشغيل الأمر التالي:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/ingress:latest

انتقل الآن إلى دليل السيارة الجانبية:

cd ../sidecar

وعدِّل "sidecar.js" بالمحتوى التالي:

const express = require('express');
const app = express();
const fs = require('fs');

const filename = "test.txt"

let path = "/my-volume-mount";
app.use(path, express.static(path));

async function readFile() {
    try {
        return await fs.readFileSync(`${path}/${filename}`, { encoding: 'utf8' });
    } catch (err) {
        console.log(err);
    }
}

app.get('/', async (req, res) => {
    let contents = await readFile();
    res.send(contents);
});

const port = parseInt(process.env.PORT || 5000);
app.listen(port, () => {
    console.log(`Sidecar container listening on port ${port}`);
});

أنشئ الصورة الجديدة لحاوية السيارة الجانبية باستخدام الأمر التالي:

gcloud builds submit --tag $REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/sidecar:latest

يُرجى تعديل "sidecar-codelab.yaml" بما يلي لمشاركة مستوى صوت:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations:
  name: sidecar-codelab
  labels:
    cloud.googleapis.com/location: "<YOUR_REGION>"
spec:
  template:
    spec:
      containers:
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/ingress:latest"
          ports:
            - containerPort: 8080
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
        - image: "<YOUR_REGION>-docker.pkg.dev/<YOUR_PROJECT_ID>/sidecar-codelab/sidecar:latest"
          env:
            - name: PORT
              value: "5000"
          volumeMounts:
            - mountPath: /my-volume-mount
              name: in-memory-1
      volumes:
        - emptyDir:
            medium: Memory
          name: in-memory-1

نشر ملف sidecar-codelab.yaml المعدَّل

gcloud beta run services replace sidecar-codelab.yaml

يمكنك الآن الاتصال بخدمتك من خلال تقديم رمز الهوية.

curl -X GET -H "Authorization: Bearer $(gcloud auth print-identity-token)" ${SERVICE_URL}

يجب أن تبدو نتائجك مشابهة لمثال الإخراج أدناه:

The sidecar says: the ingress container created this file.

7. تهانينا!

تهانينا على إكمال الدرس التطبيقي حول الترميز.

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

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

  • كيفية إنشاء حاوية تستخدم بطاقة جانبية
  • كيف يمكن لحاوية الدخول أن تتواصل مع برنامج جانبي باستخدام المضيف المحلي
  • كيف يمكن لحاوية البيانات الداخلية والجانب الجانبي مشاركة وحدة تخزين مثبَّتة

8. تَنظيم

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

لحذف "دالة السحابة الإلكترونية"، انتقِل إلى Cloud Function في Cloud Console على الرابط https://console.cloud.google.com/run/ واحذف خدمة sidecar-codelab (أو $SERVICE_NAME في حال استخدمت اسمًا مختلفًا).

إذا اخترت حذف المشروع بالكامل، يمكنك الانتقال إلى https://console.cloud.google.com/cloud-resource-manager، واختيار المشروع الذي أنشأته في الخطوة الثانية، ثم اختيار "حذف". إذا حذفت المشروع، ستحتاج إلى تغيير المشاريع في حزمة تطوير البرامج (SDK) للسحابة الإلكترونية. يمكنك عرض قائمة بجميع المشاريع المتاحة من خلال تشغيل gcloud projects list.