یک کانتینر را با Cloud Run در Node.js مستقر کرده و اجرا کنید

۱. قبل از شروع

6a5cf23c8e20491f.png

Cloud Run یک پلتفرم محاسباتی مدیریت‌شده است که به شما امکان می‌دهد کانتینرهای بدون وضعیت (stateless) را که از طریق درخواست‌های HTTP قابل فراخوانی هستند، اجرا کنید. Cloud Run بدون سرور است؛ این پلتفرم نیاز به مدیریت زیرساخت را از بین می‌برد، بنابراین می‌توانید روی آنچه که بیشترین اهمیت را دارد - ساخت برنامه‌های عالی - تمرکز کنید. این پلتفرم توسط Knative ساخته شده است و به شما امکان می‌دهد کانتینرهای خود را با Cloud Run (کاملاً مدیریت‌شده) یا Cloud Run برای Anthos اجرا کنید. هدف این codelab این است که شما یک تصویر کانتینر بسازید و آن را در Cloud Run مستقر کنید.

پیش‌نیازها

ناموجود

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

تنظیم محیط خودتنظیم

  1. وارد Cloud Console شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. (اگر از قبل حساب Gmail یا G Suite ندارید، باید یکی ایجاد کنید .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aTQz5GpG0T

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه‌های Google Cloud (نام بالا قبلاً گرفته شده و برای شما کار نخواهد کرد، متاسفیم!). بعداً در این آزمایشگاه کد به آن PROJECT_ID گفته خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در Cloud Console فعال کنید .

اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، نباید هزینه زیادی داشته باشد. حتماً دستورالعمل‌های بخش «پاکسازی» را که به شما نحوه خاموش کردن منابع را آموزش می‌دهد، دنبال کنید تا پس از این آموزش، متحمل هزینه نشوید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

پوسته ابری

اگرچه می‌توان از راه دور و از طریق لپ‌تاپ، گوگل کلود را مدیریت کرد، اما برای این کار از Cloud Shell ، یک محیط خط فرمان که در گوگل کلود اجرا می‌شود، استفاده خواهید کرد.

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

  1. برای فعال کردن Cloud Shell از کنسول Cloud، کافیست روی Activate Cloud Shell کلیک کنید. fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (فقط چند لحظه طول می‌کشد تا آماده شود و به محیط متصل شود).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

اسکرین شات 2017-06-14 ساعت 10.13.43 PM.png

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

gcloud auth list

خروجی دستور

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

خروجی دستور

[core]
project = <PROJECT_ID>

اگر به هر دلیلی پروژه تنظیم نشده باشد، کافیست دستور زیر را اجرا کنید:

gcloud config set project <PROJECT_ID>

به دنبال PROJECT_ID خود هستید؟ بررسی کنید که در مراحل راه‌اندازی از چه شناسه‌ای استفاده کرده‌اید یا آن را در داشبورد Cloud Console جستجو کنید:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqA BYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell همچنین برخی از متغیرهای محیطی را به طور پیش‌فرض تنظیم می‌کند که ممکن است هنگام اجرای دستورات بعدی مفید باشند.

echo $GOOGLE_CLOUD_PROJECT

خروجی دستور

<PROJECT_ID>
  1. در نهایت، منطقه پیش‌فرض و پیکربندی پروژه را تنظیم کنید.
gcloud config set compute/zone us-central1-f

شما می‌توانید مناطق مختلفی را انتخاب کنید. برای اطلاعات بیشتر، به بخش مناطق و نواحی مراجعه کنید.

فعال کردن API اجرای ابری

از Cloud Shell، رابط برنامه‌نویسی کاربردی Cloud Run را فعال کنید.

gcloud services enable run.googleapis.com

این باید یک پیام موفقیت‌آمیز مشابه این تولید کند:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

۳. برنامه نمونه را بنویسید

شما یک برنامه Node.js ساده و مبتنی بر Express خواهید ساخت که به درخواست‌های HTTP پاسخ می‌دهد.

برای ساخت برنامه خود، با استفاده از Cloud Shell یک دایرکتوری جدید به نام helloworld-nodejs ایجاد کنید و دایرکتوری را به آن تغییر دهید.

mkdir helloworld-nodejs
cd helloworld-nodejs

یک فایل package.json با محتوای زیر ایجاد کنید:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

از همه مهم‌تر، فایل بالا شامل یک دستور اسکریپت شروع و یک وابستگی به چارچوب برنامه وب Express است.

سپس، در همان دایرکتوری، یک فایل index.js ایجاد کنید و محتوای زیر را در آن کپی کنید:

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

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

این کد یک وب سرور پایه ایجاد می‌کند که به پورت تعریف شده توسط متغیر محیطی PORT گوش می‌دهد. اکنون برنامه شما آماده کانتینرایز شدن، آزمایش و آپلود در Container Registry است.

۴. برنامه خود را کانتینرایز کنید و آن را در Container Registry آپلود کنید

برای کانتینرایز کردن برنامه نمونه، یک فایل جدید با نام Dockerfile در همان دایرکتوری فایل‌های منبع ایجاد کنید و محتوای زیر را در آن کپی کنید:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

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

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

اکنون، با اجرای دستور زیر از دایرکتوری حاوی Dockerfile، تصویر کانتینر خود را با استفاده از Cloud Build بسازید:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT یک متغیر محیطی است که شامل شناسه پروژه Google Cloud شما هنگام اجرا در Cloud Shell است. همچنین می‌توانید آن را با اجرای gcloud config get-value project دریافت کنید.

پس از ارسال به رجیستری، یک پیام SUCCESS حاوی نام تصویر ( gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld ) مشاهده خواهید کرد. تصویر در رجیستری کانتینر ذخیره می‌شود و در صورت تمایل می‌توان از آن دوباره استفاده کرد.

شما می‌توانید با استفاده از این دستور، تمام تصاویر کانتینر مرتبط با پروژه فعلی خود را فهرست کنید:

gcloud container images list

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

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

در Cloud Shell، روی پیش‌نمایش وب کلیک کنید ۱۷۰b7a95be8c6296.png و پیش‌نمایش را روی پورت ۸۰۸۰ انتخاب کنید.

3618ca3a4a135570.png

این یک پنجره مرورگر باز می‌کند که می‌گوید «سلام دنیا!»

a0307f34cacf9e6a.png

همچنین می‌توانید به سادگی از curl localhost:8080 استفاده کنید.

۵. استقرار در Cloud Run

استقرار برنامه کانتینر شده شما در Cloud Run با استفاده از دستور زیر انجام می‌شود (مطمئن شوید که آن را با نام تصویر صحیح برای برنامه‌ای که ساخته‌اید تنظیم می‌کنید یا از تصویر پیش‌ساخته gcr.io/cloudrun/hello استفاده می‌کنید):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

گزینه --allow-unauthenticated deploy به شما این امکان را می‌دهد که بدون احراز هویت به برنامه دسترسی پیدا کنید. گزینه --platform managed \ deploy به این معنی است که شما درخواست یک محیط کاملاً مدیریت‌شده را دارید (نه زیرساخت Kubernetes از طریق Anthos).

چند لحظه صبر کنید تا استقرار کامل شود. پس از اتمام، خط فرمان URL سرویس را نمایش می‌دهد.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

اکنون می‌توانید با باز کردن URL سرویس در یک مرورگر وب، کانتینر مستقر شده خود را مشاهده کنید:

63260b4d3aee42b8.png

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

۶. تمیز کردن

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

شما می‌توانید پروژه گوگل کلود خود را حذف کنید تا از پرداخت هزینه‌ها جلوگیری شود، که این امر باعث توقف پرداخت هزینه برای تمام منابع مورد استفاده برای آن پروژه می‌شود، یا به سادگی تصویر helloworld خود را با استفاده از این دستور حذف کنید:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

برای حذف سرویس Cloud Run، از این دستور استفاده کنید:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

۷. تبریک

تبریک! شما یک برنامه‌ی بسته‌بندی‌شده در یک تصویر کانتینر را در Cloud Run مستقر کردید.

بیشتر بدانید

قدم بعدی خوب این است که Quickstart: Deploy to Cloud Run را برای Anthos در Google Cloud بررسی کنید.

برای اطلاعات بیشتر در مورد ساخت یک کانتینر HTTP بدون وضعیت مناسب برای Cloud Run از منبع کد و ارسال آن به Container Registry، به منابع زیر مراجعه کنید:

برای کسب اطلاعات بیشتر در مورد Knative، پروژه متن‌باز زیربنایی، به Knative مراجعه کنید.