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

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

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

לא רלוונטי

הגדרת סביבה בקצב אישי

אם עדיין אין לכם חשבון Google (Gmail או Google Apps), אתם צריכים ליצור חשבון. נכנסים ל-Google Cloud Platform Console‏ (console.cloud.google.com) ויוצרים פרויקט חדש:

Screenshot from 2016-02-10 12:45:26.png

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

בשלב הבא, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

העלות של התרגיל הזה לא אמורה להיות גבוהה, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו את הקטע 'ניקוי' בסוף המסמך הזה).

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.

Cloud Shell

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

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

כדי להפעיל את Google Cloud Shell, פשוט לוחצים על הלחצן בפינה השמאלית העליונה במסוף למפתחים (הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים):

activateCloudShell.png

לוחצים על הלחצן 'הפעלת Cloud Shell':

Screen Shot 2017-06-14 at 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>

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

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

מחפשים את PROJECT_ID? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של המסוף:

Project_ID.png

חשוב: בסיום, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט:

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.

תבנו אפליקציית 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.

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

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

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

כדי לפרוס את האפליקציה שמוכלת בקונטיינר ב-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 \ 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 של השירות בדפדפן אינטרנט:

‫Cloud Run מגדיל באופן אוטומטי את קובץ האימג' בקונטיינר כדי לטפל בבקשות שהתקבלו, ואז מקטין אותו כשהביקוש יורד. משלמים רק על ה-CPU, הזיכרון והרשת שנעשה בהם שימוש במהלך הטיפול בבקשות.

ב-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

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

מידע נוסף

שלב טוב הבא יהיה לעיין במאמר מדריך למתחילים: פריסה ב-Cloud Run for Anthos ב-Google Cloud.

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

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