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

۱. مرور کلی

مقدمه

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

نمای کلی فنی

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

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

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

موارد استفاده

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

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

مثال‌هایی در این آزمایشگاه کد

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

آنچه یاد خواهید گرفت

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

۲. تنظیمات و الزامات

پیش‌نیازها

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید d1264ca30785e435.png .

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

پس از اتصال به 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].

۳. برنامه‌ی ورود (ingress) را ایجاد کنید

تنظیم متغیرهای محیطی

در این آزمایشگاه کد، شما چند متغیر محیطی ایجاد خواهید کرد تا خوانایی دستورات gcloud مورد استفاده در این آزمایشگاه کد را بهبود بخشید.

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

SERVICE_NAME=sidecar-codelab
REPO_NAME=sidecar-codelab

یک مخزن ArtifactRegistry برای نگهداری تصاویر کانتینر خود ایجاد کنید

شما می‌توانید یک مخزن (repo) در رجیستری مصنوعات (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

۴. اپلیکیشن سایدکار را ایجاد کنید

در این بخش، یک برنامه 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`` برای کانتینر sidecar ایجاد کنید.

# 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 استفاده کنید زیرا volume mounts در پیش‌نمایش عمومی است.

gcloud beta run services replace sidecar-codelab.yaml

پس از استقرار، آدرس اینترنتی سرویس را در یک متغیر محیطی ذخیره کنید.

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

۵. با سرویس 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.

۶. اشتراک‌گذاری فایل از طریق نصب کننده‌ی صدا

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

ابتدا کد محفظه ورودی را به‌روزرسانی کنید. به پوشه ورودی بروید.

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}`);
});

و با اجرای دستور زیر، ایمیج جدید را برای کانتینر sidecar خود بسازید:

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.

۷. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات Cloud Run را بررسی کنید، به طور خاص در مورد استقرار چندکانتینری‌ها و استفاده از نصب‌های حجمی درون حافظه‌ای.

آنچه ما پوشش داده‌ایم

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

۸. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، (برای مثال، اگر این تابع ابری سهواً بیشتر از تخصیص فراخوانی ماهانه Cloud Run شما در سطح رایگان فراخوانی شود)، می‌توانید سرویس Cloud Run یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید، حذف کنید.

برای حذف تابع ابری، به کنسول ابری تابع ابری در آدرس https://console.cloud.google.com/run/ بروید و سرویس sidecar-codelab (یا $SERVICE_NAME را در صورتی که از نام دیگری استفاده کرده‌اید) حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه Delete را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.