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

Cloud Run היא פלטפורמת מחשוב מנוהלת שמאפשרת להריץ קונטיינרים בלי שמירת מצב שאפשר להפעיל באמצעות בקשות HTTP. Cloud Run הוא שירות בלי שרת (serverless), כך שלא צריך לנהל תשתית. אתם יכולים להתמקד במה שחשוב באמת – פיתוח אפליקציות מעולות. הוא מבוסס על Knative, ומאפשר לכם לבחור אם להריץ את הקונטיינרים באמצעות Cloud Run (מנוהל באופן מלא) או Cloud Run for Anthos. המטרה של ה-Codelab הזה היא שתבנו קובץ אימג' של קונטיינר ותפרסו אותו ב-Cloud Run.
דרישות מוקדמות
לא רלוונטי
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים אל Cloud Console ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, אתם צריכים ליצור חשבון).
חשוב לזכור את מזהה הפרויקט, שהוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך ה-codelab הזה נתייחס אליו כאל PROJECT_ID.
- לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. חשוב לפעול לפי ההוראות בקטע 'ניקוי' כדי להשבית את המשאבים, וכך לא תחויבו אחרי שתסיימו את המדריך הזה. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
Cloud Shell
אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud.
המכונה הווירטואלית הזו מבוססת על Debian, וטעונים בה כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. כלומר, כל מה שצריך כדי לבצע את ההוראות במאמר הזה הוא דפדפן (כן, זה עובד ב-Chromebook).
- כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על הפעלת Cloud Shell
(הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים).
אחרי שמתחברים ל-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:
ב-Cloud Shell מוגדרים גם כמה משתני סביבה כברירת מחדל, שיכולים להיות שימושיים כשמריצים פקודות בעתיד.
echo $GOOGLE_CLOUD_PROJECT
פלט הפקודה
<PROJECT_ID>
- לבסוף, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט.
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 פשוטה שמבוססת על 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.
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 על ידי הפעלת הפקודה הבאה מהספרייה שמכילה את קובץ 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). האימג' מאוחסן ב-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.
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 \ 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, הזיכרון והרשת שנעשה בהם שימוש במהלך הטיפול בבקשות.
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.
מידע נוסף
שלב טוב הבא יהיה לעיין במאמר מדריך למתחילים: פריסה ב-Cloud Run for Anthos ב-Google Cloud.
מידע נוסף על יצירת קונטיינר HTTP בלי שמירת מצב שמתאים ל-Cloud Run מקוד מקור והעברתו בדחיפה ל-Container Registry זמין במקורות המידע הבאים:
מידע נוסף על Knative, פרויקט הקוד הפתוח הבסיסי, זמין במאמר בנושא Knative.