1. לפני שמתחילים
הפעלת אתרים יכולה להיות מסובכת בגלל כל התקורה שקשורה ליצירה ולניהול של מכונות וירטואליות (VM), אשכולות, יחידות Pod, שירותים ועוד. זה בסדר לאפליקציות גדולות יותר עם כמה רמות, אבל אם אתם רק מנסים לפרוס את האתר שלכם ולהציג אותו, זה הרבה עומס.
בעזרת Cloud Run, ההטמעה של Google Cloud של Knative, אתם יכולים לנהל ולפרוס את האתר שלכם בלי התקורה שנדרשת לפריסות מבוססות-VM או מבוססות-Kubernetes. הגישה הזו לא רק פשוטה יותר מבחינת ניהול, אלא היא גם מאפשרת לכם להקטין את מספר המודעות לאפס כשלא מתקבלות בקשות באתר שלכם.
ב-Codelab הזה תתחילו עם קובץ אימג' של 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 עם הרשאת אדמין ליצירת פרויקטים או פרויקט עם תפקיד של בעלים
2. הגדרת הסביבה
הגדרת סביבה בקצב עצמי
אם עדיין אין לכם חשבון 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 ואז על הפעלה.

העלות של התרגול ב-codelab הזה לא אמורה להיות גבוהה מכמה דולרים, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו את הקטע ניקוי בסוף). מידע נוסף מפורט בקטע תמחור.
משתמשים חדשים ב-Google Cloud זכאים לתקופת ניסיון בחינם בשווי 300$.
Cloud Shell
אפשר להפעיל את Google Cloud ואת Cloud Run מרחוק מהמחשב הנייד, אבל אתם תשתמשו ב-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
אפשר לבחור מתוך מגוון אזורים שונים. מידע נוסף זמין במאמר בנושא אזורים ותחומים.
3. שכפול מאגר המקור
מכיוון שאתם פורסים אתר קיים, אתם צריכים רק לשכפל את המקור מהמאגר, כדי שתוכלו להתמקד ביצירת קובצי אימג' של 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) בחלון הטרמינל.
4. יצירת קונטיינר Docker באמצעות Cloud Build
עכשיו, אחרי שהכנתם את קובצי המקור, הגיע הזמן להשתמש ב-Docker כדי ליצור קונטיינר לאפליקציה.
בדרך כלל, צריך לבצע תהליך דו-שלבי שכולל יצירת קונטיינר Docker והעברה שלו בדחיפה למרשם כדי לאחסן את קובץ האימג' שממנו GKE ימשוך את הנתונים. אבל אפשר להשתמש ב-Cloud Build כדי ליצור את קונטיינר Docker ולהכניס את קובץ האימג' ל-Container Registry באמצעות פקודה אחת בלבד. כדי לראות את התהליך הידני של יצירת קובץ Docker והעברתו בדחיפה, אפשר לעיין במאמר מדריך למתחילים בנושא Container Registry.
Cloud Build דוחס את הקבצים מהספרייה ומעביר אותם לקטגוריה של Cloud Storage. תהליך build לוקח את כל הקבצים מהקטגוריה ומשתמש בקובץ Docker, שנמצא באותה ספרייה, כדי להריץ את תהליך build של 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, אפשר לראות את כל הפרטים של ה-Build הזה, כולל פלט היומן. כדי לראות את קובץ אימג' של קונטיינר שנוצר, לוחצים על הקישור שליד תמונה.

5. פריסת קונטיינר ב-Cloud Run
אחרי שיצרתם קונטיינר לאתר והעליתם אותו ל-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 (בניהול מלא).
פלט:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
בפלט מוצגים כמה דברים. תוכלו לראות את הפריסה, את המשתמש שפרס את האפליקציה (כתובת האימייל שלכם) ואת כתובת ה-URL שבה תוכלו לגשת לאפליקציה. נראה שהכול נוצר בהצלחה.
פותחים את כתובת ה-URL שמופיעה ברשימת השירותים בדפדפן האינטרנט, וצריך לראות את אותו אתר שראיתם בתצוגה המקדימה המקומית.
6. יצירת גרסה חדשה עם רמת מקבילות נמוכה יותר
עכשיו פורסים שוב את האפליקציה, אבל הפעם משנים אחד מהפרמטרים.
כברירת מחדל, לאפליקציה ב-Cloud Run יש ערך של 80 לגבי מספר הבקשות המקסימלי שניתן לטפל בהן בו-זמנית, כלומר כל מופע של קונטיינר יטפל בעד 80 בקשות בכל פעם. זהו שינוי משמעותי מהמודל של פונקציות כשירות (FaaS), שבו מופע אחד מטפל בבקשה אחת בכל פעם.
פורסים מחדש את אותו קובץ אימג' של קונטיינר עם ערך בו-זמניות (concurrency) של 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 ובודקים את הפרטים. ערך הבו-זמניות (concurrency) אמור להיות 1.
]

ההגדרה הזו מספיקה לבדיקות, אבל ברוב תרחישי הייצור יהיו לכם קונטיינרים שתומכים בכמה בקשות בו-זמנית.
עכשיו משחזרים את הבו-זמניות המקורית בלי לפרוס מחדש. אפשר להגדיר את ערך הבו-זמניות (concurrency) לערך ברירת המחדל 80 או ל-0, וכך להסיר את כל ההגבלות על בו-זמניות ולהגדיר את הערך המקסימלי שמוגדר כברירת מחדל (שבזמן כתיבת המאמר הזה הוא 80).
מריצים את הפקודה הבאה ב-Cloud Shell כדי לעדכן את הגרסה הנוכחית:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80
שימו לב שנוצרה גרסה חדשה, שהתנועה הופנתה מחדש ושהמקביליות חזרה ל-80.
7. ביצוע שינויים באתר
צוות השיווק ביקש ממך לשנות את דף הבית של אתר החברה. הם חושבים שהמידע צריך להיות מפורט יותר ולכלול את סוג החברה והמוצרים שהיא מוכרת. בקטע הזה תוסיפו טקסט לדף הבית כדי לשמח את צוות השיווק.
נראה שאחד מהמפתחים שלך כבר יצר את השינויים עם שם הקובץ 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 .
בקטע הבא נשתמש בתמונה הזו כדי לעדכן את האפליקציה ללא השבתה.
8. עדכון האתר ללא השבתה
השינויים הושלמו וצוות השיווק מרוצה מהעדכונים שלך! הגיע הזמן לעדכן את האתר בלי להפריע למשתמשים.
ב-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
עכשיו הטקסט שהוספתם לרכיב של דף הבית אמור להופיע באתר.

9. הסרת המשאבים
מחיקת תמונות ב-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
10. מזל טוב
פרסתם, שיניתם את קנה המידה ועדכנתם את האתר שלכם באמצעות Cloud Run.