הפעלת אתרים יכולה להיות מסובכת בגלל כל התקורה שקשורה ליצירה ולניהול של מכונות וירטואליות (VM), אשכולות, יחידות Pod, שירותים ועוד. זה בסדר לאפליקציות גדולות יותר עם כמה רמות, אבל אם אתם רק מנסים לפרוס את האתר שלכם ולהציג אותו, זה הרבה עומס.
עם Cloud Run, ההטמעה של Google Cloud של Knative, אתם יכולים לנהל ולפרוס את האתר שלכם בלי התקורה שנדרשת לפריסות מבוססות-VM או Kubernetes. הגישה הזו לא רק פשוטה יותר מבחינת ניהול, אלא היא גם מאפשרת לכם להקטין את מספר המודעות לאפס כשלא מתקבלות בקשות באתר שלכם.
Cloud Run לא רק מאפשר פיתוח ללא שרתים לקונטיינרים, אלא גם מאפשר להריץ את הקונטיינרים באשכולות Google Kubernetes Engine (GKE) משלכם או בפלטפורמה מנוהלת לחלוטין כפתרון של פלטפורמה כשירות (PaaS) שמסופק על ידי Cloud Run. ב-codelab הזה תבדקו את התרחיש השני.
התרשים הבא מדגים את תהליך הפריסה והאירוח ב-Cloud Run. מתחילים עם קובץ אימג' של Docker שנוצר באמצעות Cloud Build, ומפעילים אותו ב-Cloud Shell. לאחר מכן, פורסים את האימג' הזה ב-Cloud Run באמצעות פקודה ב-Cloud Shell.

דרישות מוקדמות
- היכרות כללית עם Docker (אפשר לעיין בקטע תחילת העבודה באתר של Docker).
מה תלמדו
- איך יוצרים קובץ אימג' של Docker באמצעות Cloud Build ומעלים אותו אל gcr.io
- איך פורסים קובצי אימג' של Docker ב-Cloud Run
- איך מנהלים פריסות של Cloud Run
- איך מגדירים נקודת קצה לאפליקציה ב-Cloud Run
מה תפַתחו
- אתר סטטי שפועל בתוך קונטיינר ב-Docker
- גרסה של הקונטיינר הזה שמאוחסנת ב-Container Registry
- פריסה של Cloud Run לאתר סטטי
מה נדרש
- חשבון Google עם הרשאת אדמין ליצירת פרויקטים או פרויקט עם תפקיד של בעלים
הגדרת סביבה בקצב עצמי
אם עדיין אין לכם חשבון Google, אתם צריכים ליצור חשבון. לאחר מכן, נכנסים אל מסוף Google Cloud ולוחצים על פרויקט > יצירת פרויקט.


חשוב לזכור את מזהה הפרויקט, שמאוכלס באופן אוטומטי מתחת לשם הפרויקט. מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud, ולכן השם בצילום המסך כבר תפוס ולא יתאים לכם. בהמשך נתייחס אליו כאל PROJECT_ID.
בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Google Cloud ולהפעיל את Cloud Run API.
הפעלת Cloud Run API
לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Dashboard (מרכז בקרה) > Enable APIs And Services (הפעלת ממשקי API ושירותים). .

מחפשים את Cloud Run API ולוחצים על Cloud Run API > Enable (הפעלה).

העלות של התרגול ב-codelab הזה לא אמורה להיות גבוהה, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו ניקוי בסוף). מידע נוסף זמין במאמר בנושא תמחור.
משתמשים חדשים ב-Google Cloud זכאים לתקופת ניסיון בחינם בשווי 300$.
Cloud Shell
אפשר להפעיל את Google Cloud ואת Cloud Run מרחוק מהמחשב הנייד, אבל אתם תשתמשו ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud. הסביבה מוגדרת מראש עם כל ספריות הלקוח והמסגרות שאתם צריכים.
המכונה הווירטואלית הזו מבוססת על Debian, וטעונים בה כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. כלומר, כל מה שצריך בשביל ה-codelab הזה הוא דפדפן (כן, הוא עובד ב-Chromebook).
כדי להפעיל את Google Cloud Shell, פשוט לוחצים על הלחצן בפינה השמאלית העליונה במסוף למפתחים (הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים):
לוחצים על הלחצן 'הפעלת Cloud Shell':
אחרי שמתחברים ל-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? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של המסוף:
חשוב: בסיום, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט:
gcloud config set compute/zone us-central1-f
אפשר לבחור מתוך מגוון אזורים שונים. מידע נוסף זמין במסמכי התיעוד בנושא אזורים ותחומים.
מכיוון שאתם פורסים אתר קיים, אתם צריכים רק לשכפל את המקור מהמאגר, כדי שתוכלו להתמקד ביצירת קובצי אימג' של Docker ובפריסה ב-Cloud Run.
מריצים את הפקודות הבאות כדי לשכפל את המאגר למכונת Cloud Shell ולעבור לספרייה המתאימה. בנוסף, תתקינו את יחסי התלות של Node.js כדי שתוכלו לבדוק את האפליקציה לפני הפריסה.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
הפעולה הזו משכפלת את המאגר, עוברת לספרייה ומתקינה את התלות שנדרשת להפעלת האפליקציה באופן מקומי. יכול להיות שיחלפו כמה דקות עד שהסקריפט יפעל.
חשוב לבצע בדיקה יסודית של האפליקציה. כדי להפעיל את שרת האינטרנט, מריצים את הפקודה הבאה:
cd ~/monolith-to-microservices/monolith npm start
פלט:
Monolith listening on port 8080!
כדי לראות תצוגה מקדימה של האפליקציה, לוחצים על תצוגה מקדימה באינטרנט
ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

ייפתח חלון חדש שבו תוכלו לראות את חנות הצעצועים בפעולה.

אפשר לסגור את החלון הזה אחרי הצפייה באתר. כדי להפסיק את התהליך של שרת האינטרנט, לוחצים על CONTROL+C (Command+C ב-Macintosh) בחלון הטרמינל.
עכשיו, אחרי שהכנתם את קובצי המקור, הגיע הזמן להשתמש ב-Docker כדי ליצור קונטיינר לאפליקציה.
בדרך כלל, צריך לבצע תהליך דו-שלבי שכולל יצירת קונטיינר Docker והעברה שלו בדחיפה למרשם כדי לאחסן את קובץ האימג' שממנו GKE ימשוך את הנתונים. אבל אפשר להשתמש ב-Cloud Build כדי ליצור את קונטיינר Docker ולהכניס את קובץ האימג' ל-Container Registry באמצעות פקודה אחת בלבד. כדי לראות את התהליך הידני של יצירת קובץ Docker והעברתו בדחיפה, אפשר לעיין במאמר מדריך למתחילים בנושא Container Registry.
Cloud Build דוחס את הקבצים מהספרייה ומעביר אותם לקטגוריה ב-Cloud Storage. תהליך הבנייה לוקח את כל הקבצים מהקטגוריה ומשתמש ב-Dockerfile, שנמצא באותה ספרייה, כדי להריץ את תהליך הבנייה של Docker. בהנחה שציינתם את הדגל --tag עם המארח gcr.io עבור תמונת ה-Docker, תמונת ה-Docker שנוצרת תועבר בדחיפה אל Container Registry.
קודם כול, צריך לוודא ש-Cloud Build API מופעל. מריצים את הפקודה הבאה כדי להפעיל אותה:
gcloud services enable cloudbuild.googleapis.com
אחרי שמפעילים את ה-API, מריצים את הפקודה הבאה ב-Cloud Shell כדי להתחיל את תהליך ה-build:
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .התהליך הזה נמשך כמה דקות, אבל אחרי שהוא מסתיים, יוצגו בטרמינל נתונים שדומים לאלה שמופיעים בדוגמה הבאה:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/monolith:1.0.0 SUCCESS
כדי לראות את היסטוריית הבנייה או לצפות בתהליך בזמן אמת, אפשר לעבור אל Cloud Console, ואז ללחוץ על תפריט הניווט ☰ > Cloud Build > היסטוריה. תוכלו לראות שם רשימה של כל הגרסאות הקודמות, אבל אמורה להיות שם רק הגרסה שיצרתם.

אם לוחצים על Build id, אפשר לראות את כל הפרטים של ה-build הזה, כולל פלט היומן. כדי לראות את תמונת מאגר התגים שנוצרה, לוחצים על הקישור שליד תמונה.

אחרי שיצרתם קונטיינר לאתר והעליתם אותו ל-Container Registry, הגיע הזמן לפרוס אותו ב-Cloud Run.
יש שתי גישות לפריסה ב-Cloud Run:
- Cloud Run (מנוהל באופן מלא) הוא מודל PaaS שבו מנוהל מחזור החיים המלא של הקונטיינר. ב-codelab הזה נשתמש בגישה הזו.
- Cloud Run for Anthos הוא Cloud Run עם שכבת שליטה נוספת, שמאפשרת לכם להביא את האשכולות וה-Pods שלכם מ-GKE. מידע נוסף זמין במאמר הגדרת Cloud Run for Anthos ב-Google Cloud.
הדוגמאות לשורת הפקודה יהיו ב-Cloud Shell, באמצעות משתני הסביבה שהגדרתם קודם.
שורת הפקודה
מריצים את הפקודה הבאה כדי לפרוס את האפליקציה:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed תתבקשו לציין באיזה אזור תרצו להציג מודעות. בוחרים את האזור שהכי קרוב אליכם ואז מאשרים את שם השירות המוצע שמוגדר כברירת מחדל (monolith).

למטרות בדיקה, מאפשרים בקשות לא מאומתות לאפליקציה. מזינים y בהנחיה.

אימות הפריסה
כדי לוודא שהפריסה נוצרה בהצלחה, מריצים את הפקודה הבאה. יכול להיות שיחלפו כמה רגעים עד שהסמל של Pod status יהפוך לRunning:
gcloud run services list
בוחרים באפשרות [1] Cloud Run (fully managed) (Cloud Run (בניהול מלא)).
פלט:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
בפלט מוצגים כמה דברים. תוכלו לראות את הפריסה, את המשתמש שפרס את האפליקציה (כתובת האימייל שלכם) ואת כתובת ה-URL שבה תוכלו לגשת לאפליקציה. נראה שהכול נוצר בהצלחה.
פותחים את כתובת ה-URL שמופיעה ברשימת השירותים בדפדפן האינטרנט, וצריך לראות את אותו אתר שהוצג בתצוגה המקדימה המקומית.
עכשיו פורסים שוב את האפליקציה, אבל הפעם משנים אחד מהפרמטרים.
כברירת מחדל, לאפליקציה ב-Cloud Run יש ערך של 80 לגבי מספר הבקשות המקסימלי שניתן לטפל בהן בו-זמנית, כלומר כל מופע של קונטיינר ישרת עד 80 בקשות בכל פעם. זה שונה מאוד מהמודל של פונקציות כשירות (FaaS), שבו מופע אחד מטפל בבקשה אחת בכל פעם.
פורסים מחדש את אותו קובץ תמונה של מאגר עם ערך מקבילות של 1 (למטרות בדיקה בלבד) ובודקים מה קורה.
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1עונים על השאלות הבאות כמו שעניתם בפעם הראשונה. אחרי שהפקודה תצליח, תוכלו לבדוק את התוצאה ב-Cloud Console.
בלוח הבקרה של Cloud Run, לוחצים על שירות monolith כדי לראות את הפרטים.

לוחצים על הכרטיסייה עדכונים. אמורות להופיע שתי גרסאות. לוחצים על monolith-00002 ובודקים את הפרטים. ערך המקבילות אמור להצטמצם ל-1.
]

ההגדרה הזו מספיקה לבדיקות, אבל ברוב תרחישי הייצור יהיו לכם קונטיינרים שתומכים בכמה בקשות בו-זמניות.
עכשיו משחזרים את מספר ההפעלות המקבילות המקורי בלי לפרוס מחדש. אפשר להגדיר את ערך המקבילות לערך ברירת המחדל 80 או ל-0, וכך להסיר את כל ההגבלות על מקבילות ולהגדיר אותו לערך המקסימלי שמוגדר כברירת מחדל (שבזמן כתיבת המאמר הזה הוא 80).
מריצים את הפקודה הבאה ב-Cloud Shell כדי לעדכן את הגרסה הנוכחית:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80שימו לב שנוצרה גרסה חדשה, שהתנועה הופנתה מחדש ושהמקביליות חזרה ל-80.
צוות השיווק ביקש ממך לשנות את דף הבית של אתר החברה. הם חושבים שהמידע צריך להיות מפורט יותר ולכלול הסבר על החברה ועל המוצרים שהיא מוכרת. בקטע הזה, תוסיפו טקסט לדף הבית כדי לשמח את צוות השיווק.
נראה שאחד מהמפתחים שלך כבר יצר את השינויים עם שם הקובץ index.js.new. פשוט מעתיקים את הקובץ אל index.js והשינויים אמורים להשתקף. פועלים לפי ההוראות כדי לבצע את השינויים הנדרשים.
מריצים את הפקודות הבאות, מעתיקים את הקובץ המעודכן לשם הקובץ הנכון ומדפיסים את התוכן שלו כדי לוודא שהשינויים בוצעו:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
הקוד שיתקבל צריך להיראות כך:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}עדכנתם את רכיבי React, אבל אתם צריכים ליצור את אפליקציית React כדי ליצור את הקבצים הסטטיים. מריצים את הפקודה הבאה כדי ליצור את אפליקציית React ולהעתיק אותה לספרייה הציבורית של המונוליט:
cd ~/monolith-to-microservices/react-app npm run build:monolith
אחרי שמעדכנים את הקוד, צריך לבנות מחדש את מאגר Docker ולפרסם אותו ב-Container Registry. אפשר להשתמש באותה פקודה כמו קודם, רק שהפעם צריך לעדכן את תווית הגרסה.
מריצים את הפקודה הבאה כדי להפעיל Cloud Build חדש עם גרסה מעודכנת של קובץ אימג' 2.0.0:
cd ~/monolith-to-microservices/monolith
#Feel free to test your application
npm start
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .בקטע הבא נסביר איך להשתמש בתמונה הזו כדי לעדכן את האפליקציה בלי השבתה.
השינויים הושלמו וצוות השיווק מרוצה מהעדכונים שלך! הגיע הזמן לעדכן את האתר בלי להפריע למשתמשים.
ב-Cloud Run, כל פריסה נחשבת לגרסה חדשה, שתועבר למצב אונליין והתנועה תופנה אליה.
פועלים לפי ההוראות הבאות כדי לעדכן את האתר.
שורת הפקודה
משורת הפקודה, אפשר לפרוס מחדש את השירות כדי לעדכן את התמונה לגרסה חדשה באמצעות הפקודה הבאה:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managedאימות הפריסה
מריצים את הפקודה הבאה כדי לאמת את עדכון הפריסה:
gcloud run services describe monolith --platform managed
הפלט אמור להיראות כך:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
annotations:
client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...
תראו שהשירות שלכם משתמש עכשיו בגרסה העדכנית ביותר של התמונה שנפרסה בגרסה חדשה.
כדי לוודא שהשינויים בוצעו, עוברים שוב לכתובת ה-URL החיצונית של שירות Cloud Run ורואים שכותרת האפליקציה עודכנה.
אם שכחתם את כתובת ה-IP, תוכלו להריץ את הפקודה הבאה כדי לראות את רשימת השירותים ואת כתובת ה-IP:
gcloud run services list
עכשיו הטקסט שהוספתם לרכיב של דף הבית אמור להופיע באתר.

מחיקת תמונות ב-Container Registry
# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet
# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quietמחיקת ארטיפקטים של Cloud Build מ-Cloud Storage
# The following command will take all source archives from all builds and delete them from cloud storage
# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'
gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; doneמחיקת שירות Cloud Run
gcloud run services delete monolith --platform managed
פרסתם את האתר, שיניתם את קנה המידה שלו ועדכנתם אותו באמצעות Cloud Run.