یک سرویس Cloud Run با یک sidecar ایجاد کنید

1. بررسی اجمالی

مقدمه

در این لبه کد، نحوه استقرار یک سرویس Cloud Run را که از چندین کانتینر استفاده می کند، یاد خواهید گرفت. شما یک برنامه node.js ایجاد خواهید کرد که به عنوان محفظه ورودی Cloud Run و یک برنامه node.js اضافی که به عنوان سایدکار استفاده می شود، استفاده می شود.

نمای کلی فنی

هنگام استفاده از چندین کانتینر در یک نمونه Cloud Run، یک کانتینر به عنوان محفظه اصلی برای ورود به وب استفاده می شود. به یک یا چند کانتینر اضافی به عنوان سایدکار گفته می شود.

دو راه برای ارتباط چند کانتینر با یکدیگر وجود دارد:

  1. کانتینرها رابط شبکه لوکال هاست را به اشتراک می گذارند، بنابراین همه کانتینرها می توانند به یک پورت گوش دهند، به عنوان مثال localhost:port.
  2. همچنین می توانید از حجم های درون حافظه استفاده کنید و آنها را روی کانتینرها برای اشتراک گذاری فایل ها نصب کنید.

موارد استفاده کنید

از آنجایی که همه کانتینرهای موجود در نمونه Cloud Run رابط شبکه محلی میزبان را به اشتراک می گذارند، می توانید از یک sidecar در جلوی کانتینر اصلی خود برای درخواست های پراکسی استفاده کنید. چنین پراکسی‌هایی می‌توانند با رهگیری درخواست‌ها و ارسال آن‌ها به نقطه پایانی مناسب، یک لایه انتزاعی اضافی برای جریان کارآمدتر ترافیک به برنامه بین کلاینت و سرور فراهم کنند. به عنوان مثال، می توانید از تصویر رسمی Nginx از DockerHub (همانطور که در اینجا نشان داده شده است) استفاده کنید.

از آنجایی که چندین کانتینر می‌توانند با اشتراک‌گذاری فایل‌ها از طریق حجم‌های مشترک با هم ارتباط برقرار کنند، برنامه‌های کاربردی مختلفی را به سرویس خود اضافه می‌کنید. برای مثال، می‌توانید سرویس Cloud Run خود را برای استفاده از عوامل سفارشی مانند OpenTelemetry برای صادر کردن گزارش‌ها، معیارها و ردیابی‌ها ( مثال OpenTelemetry ) ابزار کنید. مثال دیگر استفاده از یک اتصال کناری به پایگاه داده Cloud Spanner PostgreSQL است ( مثال Cloud Spanner Postgress ).

نمونه هایی در این کد لبه

در این کد لبه، ابتدا یک سرویس Cloud Run را مستقر خواهید کرد که در آن کانتینر ورودی آن از طریق یک پورت لوکال هاست با یک سایدکار ارتباط برقرار می کند. سپس محفظه ورودی و صندلی کناری را به‌روزرسانی می‌کنید تا فایلی را از طریق پایه تنظیم صدا به اشتراک بگذارید.

چیزی که یاد خواهید گرفت

  • چگونه ظرفی بسازیم که از یک سایدکار استفاده می کند
  • چگونه یک کانتینر ورودی می تواند با استفاده از لوکال هاست با یک سایدکار ارتباط برقرار کند
  • چگونه یک کانتینر ورودی و یک سایدکار هر دو می توانند یک فایل را از طریق یک حجم نصب شده به اشتراک بگذارند

2. راه اندازی و الزامات

پیش نیازها

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

d95252b003979716.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

7833d5e1c5d18f54.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  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. اپلیکیشن 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 می توانید لیست تمام پروژه های موجود را مشاهده کنید.