1. نظرة عامة
مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية نشر خدمة التشغيل في السحابة الإلكترونية التي تستخدم حاويات متعدّدة. عليك إنشاء تطبيقNode.js لاستخدامه كحاوية دخول في Cloud Run وتطبيق إضافي في العقدة.js سيتم استخدامه كجهاز جانبي.
نظرة عامة فنية
عند استخدام حاويات متعددة في مثيل Cloud Run، يتم استخدام حاوية واحدة باعتبارها الحاوية الرئيسية للزيارات الواردة من الويب. يشار إلى الحاوية الإضافية أو أكثر باسم العناصر الجانبية.
هناك طريقتان لحاويات متعددة للتواصل فيما بينها:
- تشترك الحاويات في واجهة شبكة المضيف المحلي، بحيث يمكن لجميع الحاويات الاستماع إلى منفذ، على سبيل المثال. localhost:port.
- يمكنك أيضًا استخدام وحدات التخزين في الذاكرة وتحميلها في الحاويات لمشاركة الملفات.
حالات الاستخدام
نظرًا لأن جميع الحاويات المضمنة في مثيل Cloud Run تشترك في واجهة شبكة المضيف المحلي، يمكنك استخدام أداة جانبية أمام الحاوية الرئيسية لطلبات الخادم الوكيل. يمكن أن توفر خوادم الوكيل هذه طبقة تجريد إضافية لتدفق أكثر فعالية لحركة المرور إلى التطبيق بين العميل والخوادم من خلال اعتراض الطلبات وإعادة توجيهها إلى نقطة النهاية المناسبة. على سبيل المثال، يمكنك استخدام صورة Nginx الرسمية من DockerHub (كما هو موضّح هنا).
بما أنّ حاويات متعدّدة يمكن أن تتواصل من خلال مشاركة الملفات عبر وحدات التخزين المشتركة، يمكنك إضافة تطبيقات جانبية متعددة إلى خدمتك. على سبيل المثال، يمكنك ضبط أداة Cloud Run على استخدام البرامج المخصَّصة، مثل OpenTelemetry، لتصدير السجلّات والمقاييس وعمليات التتبُّع (مثال OpenTelemetry). ومن الأمثلة الأخرى استخدام اتصال جانبي بقاعدة بيانات Cloud Spanner PostgreSQL (مثال على Cloud Spanner Postgress).
أمثلة في هذا الدرس التطبيقي حول الترميز
في هذا الدرس التطبيقي، عليك أولاً نشر خدمة Cloud Run حيث تتصل حاوية الدخول التابعة لها بجهاز جانبي عبر منفذ مضيف محلي. بعد ذلك، عليك تعديل حاوية الوصول والعنصر الجانبي لمشاركة ملف عبر تثبيت مستوى الصوت.
المعلومات التي ستطّلع عليها
- كيفية إنشاء حاوية تستخدم بطاقة جانبية
- كيف يمكن لحاوية الدخول أن تتواصل مع برنامج جانبي باستخدام المضيف المحلي
- كيف يمكن لحاوية البيانات الواردة والعنصر الجانبي مشاركة ملف عبر وحدة تخزين مثبَّتة
2. الإعداد والمتطلبات
المتطلبات الأساسية
- تسجيل الدخول إلى Cloud Console
- سبق لك نشر خدمة Cloud Run. على سبيل المثال، يمكنك متابعة نشر خدمة ويب من خلال التشغيل السريع لرمز المصدر للبدء.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell .
إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة تصف ماهيتها. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بخدمة Cloud Shell بضع دقائق فقط.
يتم تحميل هذا الجهاز الافتراضي مع جميع أدوات التطوير اللازمة. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ معظم عملك، إن لم يكن كلّه، في هذا الدرس التطبيقي حول الترميز باستخدام متصفّح.
بعد الربط بخدمة Cloud Shell، من المفترض أن تتأكّد من أنّه تمّت مصادقتك وأنّ المشروع مضبوط على رقم تعريف مشروعك.
- شغِّل الأمر التالي في 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`
- شغّل الأمر التالي في 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
.