פריסה והפעלה של מאגר עם Cloud Run ב-Node.js

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

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

לא רלוונטי

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

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

צילום מסך מ-2016-02-10 12:45:26.png

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

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

התהליך של קוד Lab זה לא אמור לעלות יותר מדולר אחד, אבל יכול להיות שתצטרכו לשלם על משאבים נוספים או להשאיר אותו פעיל (עיינו בקטע "cleanup" בסוף המסמך).

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

Cloud Shell

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

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

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

playCloudShell.png

לוחצים על הלחצן "Start Cloud Shell"

צילום מסך 2017-06-14 בשעה 22:13.43

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

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

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

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

אפשר גם להשתמש ב-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 \ פירושה שאתם מבקשים את הסביבה המנוהלת במלואה (ולא את תשתית Kubernetes באמצעות Anthos).

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

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 Cloud ארוזה בתמונת מאגר.

למידע נוסף

השלב הבא הוא לנסות את Quickstart: פריסה ל-Cloud Run for Anthos ב-Google Cloud.

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

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