1. بررسی اجمالی
مقدمه
در این لبه کد، نحوه استقرار یک سرویس Cloud Run را که از چندین کانتینر استفاده می کند، یاد خواهید گرفت. شما یک برنامه node.js ایجاد خواهید کرد که به عنوان محفظه ورودی Cloud Run و یک برنامه node.js اضافی که به عنوان سایدکار استفاده می شود، استفاده می شود.
نمای کلی فنی
هنگام استفاده از چندین کانتینر در یک نمونه Cloud Run، یک کانتینر به عنوان محفظه اصلی برای ورود به وب استفاده می شود. به یک یا چند کانتینر اضافی به عنوان سایدکار گفته می شود.
دو راه برای ارتباط چند کانتینر با یکدیگر وجود دارد:
- کانتینرها رابط شبکه لوکال هاست را به اشتراک می گذارند، بنابراین همه کانتینرها می توانند به یک پورت گوش دهند، به عنوان مثال localhost:port.
- همچنین می توانید از حجم های درون حافظه استفاده کنید و آنها را روی کانتینرها برای اشتراک گذاری فایل ها نصب کنید.
موارد استفاده کنید
از آنجایی که همه کانتینرهای موجود در نمونه Cloud Run رابط شبکه محلی میزبان را به اشتراک می گذارند، می توانید از یک sidecar در جلوی کانتینر اصلی خود برای درخواست های پراکسی استفاده کنید. چنین پراکسیهایی میتوانند با رهگیری درخواستها و ارسال آنها به نقطه پایانی مناسب، یک لایه انتزاعی اضافی برای جریان کارآمدتر ترافیک به برنامه بین کلاینت و سرور فراهم کنند. به عنوان مثال، می توانید از تصویر رسمی Nginx از DockerHub (همانطور که در اینجا نشان داده شده است) استفاده کنید.
از آنجایی که چندین کانتینر میتوانند با اشتراکگذاری فایلها از طریق حجمهای مشترک با هم ارتباط برقرار کنند، برنامههای کاربردی مختلفی را به سرویس خود اضافه میکنید. برای مثال، میتوانید سرویس Cloud Run خود را برای استفاده از عوامل سفارشی مانند OpenTelemetry برای صادر کردن گزارشها، معیارها و ردیابیها ( مثال OpenTelemetry ) ابزار کنید. مثال دیگر استفاده از یک اتصال کناری به پایگاه داده Cloud Spanner PostgreSQL است ( مثال Cloud Spanner Postgress ).
نمونه هایی در این کد لبه
در این کد لبه، ابتدا یک سرویس Cloud Run را مستقر خواهید کرد که در آن کانتینر ورودی آن از طریق یک پورت لوکال هاست با یک سایدکار ارتباط برقرار می کند. سپس محفظه ورودی و صندلی کناری را بهروزرسانی میکنید تا فایلی را از طریق پایه تنظیم صدا به اشتراک بگذارید.
چیزی که یاد خواهید گرفت
- چگونه ظرفی بسازیم که از یک سایدکار استفاده می کند
- چگونه یک کانتینر ورودی می تواند با استفاده از لوکال هاست با یک سایدکار ارتباط برقرار کند
- چگونه یک کانتینر ورودی و یک سایدکار هر دو می توانند یک فایل را از طریق یک حجم نصب شده به اشتراک بگذارند
2. راه اندازی و الزامات
پیش نیازها
- شما به کنسول Cloud وارد شده اید.
- شما قبلاً یک سرویس Cloud Run را مستقر کرده اید. برای مثال، میتوانید برای شروع ، استقرار یک سرویس وب را از کد منبع سریع دنبال کنید.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در 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. اپلیکیشن ingress را ایجاد کنید
تنظیم متغیرهای محیطی
در این کد لبه، شما چند متغیر محیطی برای بهبود خوانایی دستورات gcloud
مورد استفاده در این کدلب ایجاد خواهید کرد.
REGION=<YOUR-REGION> PROJECT_ID=<YOUR-PROJECT-ID> SERVICE_NAME=sidecar-codelab REPO_NAME=sidecar-codelab
یک مخزن ArtifactRegistry برای نگهداری تصاویر کانتینر خود ایجاد کنید
می توانید یک مخزن در Artifact Registry ایجاد کنید تا تصاویر کانتینر خود را برای این Codelab ذخیره کنید.
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}`); });
یک dockerfile برای کانتینر ورودی ایجاد کنید
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. برنامه sidecar را ایجاد کنید
در این بخش، برنامه دوم node.js را ایجاد میکنید که به عنوان سایدکار در سرویس Cloud Run استفاده میشود.
به دایرکتوری sidecar بروید.
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}`); });
یک Dockerfile برای کانتینر sidecar ایجاد کنید
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 را مستقر کنید
شما سرویس 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 beta استفاده کنید زیرا نصبهای حجم در پیشنمایش عمومی است.
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
اکنون به دایرکتوری sidecar بروید:
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. تبریک می گویم!
برای تکمیل کد لبه تبریک می گویم!
توصیه میکنیم مستندات مربوط به Cloud Run را مرور کنید، بهویژه استقرار چند کانتینر و استفاده از پایههای حجم در حافظه.
آنچه را پوشش داده ایم
- چگونه ظرفی بسازیم که از یک سایدکار استفاده می کند
- چگونه یک کانتینر ورودی می تواند با استفاده از لوکال هاست با یک سایدکار ارتباط برقرار کند
- چگونه یک کانتینر ورودی و یک صندلی کناری میتوانند هر دو حجم نصب شده را به اشتراک بگذارند
8. پاکسازی کنید
برای جلوگیری از هزینههای غیرعمدی، (به عنوان مثال، اگر این تابع Cloud به طور ناخواسته بیشتر از تخصیص فراخوانی ماهانه Cloud Run در ردیف رایگان فراخوانی شود)، میتوانید سرویس Cloud Run را حذف کنید یا پروژهای را که در مرحله 2 ایجاد کردهاید حذف کنید.
برای حذف عملکرد Cloud، به کنسول Cloud Function Cloud در https://console.cloud.google.com/run/ بروید و سرویس sidecar-codelab
(یا $SERVICE_NAME را در صورت استفاده از نام دیگری حذف کنید).
اگر تصمیم به حذف کل پروژه دارید، میتوانید به https://console.cloud.google.com/cloud-resource-manager بروید، پروژهای را که در مرحله ۲ ایجاد کردهاید انتخاب کنید و حذف را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه ها را در Cloud SDK خود تغییر دهید. با اجرای gcloud projects list
می توانید لیست تمام پروژه های موجود را مشاهده کنید.