פריסה והפעלה של קונטיינר באמצעות Cloud Run ב-Node.js

1. לפני שמתחילים

6a5cf23c8e20491f.png

Cloud Run היא פלטפורמת מחשוב מנוהלת שמאפשרת להריץ קונטיינרים ללא שמירת מצב, שניתן להפעיל באמצעות בקשות HTTP. Cloud Run הוא ללא שרת (serverless), בלי צורך בניהול תשתית, כך שתוכלו להתמקד במה שהכי חשוב – פיתוח אפליקציות מעולות. היא מבוססת על Knative, ומאפשרת לכם להריץ את הקונטיינרים באמצעות Cloud Run (מנוהל במלואו) או עם Cloud Run for Anthos. המטרה של ה-Codelab היא לפתח קובץ אימג' של קונטיינר ולפרוס אותו ב-Cloud Run.

דרישות מוקדמות

לא רלוונטי

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמאי

  1. נכנסים למסוף Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, תצטרכו ליצור חשבון).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

חשוב לזכור את מזהה הפרויקט, שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא מתאים לכם, סליחה). בהמשך ב-Codelab הזה, היא תיקרא PROJECT_ID.

  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud.

מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. חשוב לבצע את כל ההוראות בקטע 'ניקוי' שמסביר איך להשבית משאבים כדי שלא תצברו חיובים מעבר למדריך הזה. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

Cloud Shell

את Google Cloud אפשר להפעיל מרחוק מהמחשב הנייד, אבל משתמשים ב-Cloud Shell, סביבת שורת הפקודה שפועלת ב-Google Cloud.

המכונה הווירטואלית הזו שמבוססת על Debian נטענת עם כל הכלים למפתחים שדרושים לכם. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כלומר, כל מה שדרוש ל-Codelab הזה הוא דפדפן (כן, הוא פועל ב-Chromebook).

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, לוחצים על Activate Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (ההקצאה וההתחברות לסביבה אמורות להימשך כמה דקות).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

צילום מסך מתאריך 2017-06-14 בשעה 22:13.43.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:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell גם מגדירה משתני סביבה כברירת מחדל, והוא יכול להיות שימושי כשמריצים פקודות עתידיות.

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>
  1. בשלב האחרון, מגדירים את ברירת המחדל של האזור והפרויקט.
gcloud config set compute/zone us-central1-f

אפשר לבחור מגוון אזורים שונים. מידע נוסף זמין במאמר אזורים ו אזורים.

הפעלת Cloud Run API

ב-Cloud Shell, מפעילים את Cloud Run API.

gcloud services enable run.googleapis.com

המטרה היא ליצור מסר מוצלח שדומה להודעה הזו:

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

3. כתיבת האפליקציה לדוגמה

נפתח אפליקציית Node.js פשוטה שמבוססת על אקספרס ומגיבה לבקשות 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"
  }
}

הדבר החשוב ביותר הוא שהקובץ שלמעלה מכיל פקודת סקריפט להתחלה ותלות ב-framework של אפליקציית האינטרנט 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.

4. יצירת קונטיינרים של האפליקציה והעלאתה ל-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" ]

עכשיו יוצרים קובץ אימג' בקונטיינר באמצעות Cloud Build על ידי הרצת הפקודה הבאה מהספרייה שמכילה את קובץ ה-Docker:

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). התמונה מאוחסנת ב-Container Registry ואפשר להשתמש בה שוב אם צריך.

כדי להציג את רשימת כל קובצי האימג' של הקונטיינרים שמשויכים לפרויקט הנוכחי, אפשר להשתמש בפקודה הבאה:

gcloud container images list

כדי להריץ ולבדוק את האפליקציה באופן מקומי מ-Cloud Shell, אפשר להפעיל אותה באמצעות הפקודה הרגילה הבאה של docker:

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

ב-Cloud Shell, לוחצים על Web Preview 170b7a95be8c6296.png ובוחרים באפשרות Preview on Port 8080.

3618ca3a4a135570.png

נפתח חלון דפדפן עם הכיתוב Hello World!

a0307f34cacf9e6a.png

אפשר גם להשתמש ב-curl localhost:8080.

5. פריסה ב-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 מאפשרת לגשת לאפליקציה ללא אימות. המשמעות של אפשרות הפריסה של --platform managed \ היא שמבקשים את הסביבה המנוהלת במלואה (ולא את תשתית 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), הזיכרון והרשת שנצרכו במהלך הטיפול בבקשה.

6. הסרת המשאבים

אמנם Cloud Run לא נטען כשהשירות לא בשימוש, אבל ייתכן שעדיין תחויבו על אחסון קובץ האימג' של הקונטיינר שנוצר.

אפשר למחוק את הפרויקט ב-Google Cloud כדי להימנע מחיובים, שיפסיקו את החיוב על כל המשאבים שבהם נעשה שימוש בפרויקט, או פשוט למחוק את קובץ האימג' של helloworld באמצעות הפקודה הבאה:

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

כדי למחוק את השירות Cloud Run, משתמשים בפקודה הבאה:

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

7. מזל טוב

מעולה! פרסתם אפליקציה ארוזה בקובץ אימג' של קונטיינר ל-Cloud Run.

מידע נוסף

כדאי לקרוא את המאמר מדריך למתחילים: Deploy to Cloud Run for Anthos ב-Google Cloud.

למידע נוסף על פיתוח קונטיינר HTTP ללא שמירת מצב שמתאים ל-Cloud Run ממקור הקוד ולדחוף אותו ל-Container Registry, עיינו במקורות המידע הבאים:

למידע נוסף על Knative, הפרויקט המקורי בקוד פתוח, ראו Knative