1. לפני שמתחילים
ההפעלה של אתרים יכולה להיות מסובכת בגלל התקורה ביצירה ובניהול של מכונות וירטואליות (VM), אשכולות, קבוצות Pod, שירותים ועוד. זה בסדר כשמדובר באפליקציות גדולות יותר מרובות-שכבות, אבל אם אתם מנסים רק להשיק את האתר שלכם ולהופיע בו, התקורה תהיה גדולה.
באמצעות Cloud Run, ההטמעה של Knative מאפשרת לכם לנהל ולפרוס את האתר ללא התקורה הדרושה לפריסות המבוססות על VM או Kubernetes. לא רק זו גישה פשוטה יותר מנקודת מבט של ניהול, אלא גם יכולת להתאים את עצמה לאפס כאשר אין בקשות שמגיעות לאתר שלכם.
לא רק ש-Cloud Run מאפשר פיתוח ללא שרת (serverless) לקונטיינרים, הוא יכול גם להריץ אותו באשכולות Google Kubernetes Engine (GKE) משלכם או בפלטפורמה מנוהלת כשירות (PaaS) שמסופק על ידי Cloud Run. נבדוק את התרחיש השני ב-Codelab הזה.
התרשים הבא ממחיש את זרימת הפריסה והאירוח ב-Cloud Run. מתחילים עם תמונת Docker שנוצרה דרך Cloud Build, שאותה מפעילים ב-Cloud Shell. לאחר מכן, פורסים את קובץ האימג' הזה ל-Cloud Run באמצעות פקודה ב-Cloud Shell.
דרישות מוקדמות
מה תלמדו
- איך יוצרים קובץ אימג' של Docker באמצעות Cloud Build ומעלים אותו אל gcr.io
- איך לפרוס קובצי אימג' של Docker ל-Cloud Run
- איך לנהל פריסות של Cloud Run
- איך להגדיר נקודת קצה לאפליקציה ב-Cloud Run
מה תפַתחו
- אתר סטטי שרץ בקונטיינר ב-Docker
- גרסה של מאגר התגים הזה שנמצאת ב-Container Registry
- פריסת Cloud Run לאתר הסטטי
מה נדרש
- חשבון Google עם הרשאת אדמין ליצירת פרויקטים או לפרויקט עם תפקיד 'בעלי הפרויקט'
2. הגדרת סביבה
הגדרת סביבה בקצב אישי
אם עדיין אין לכם חשבון Google, עליכם ליצור חשבון. לאחר מכן, נכנסים אל מסוף Google Cloud ולוחצים על Project > יוצרים פרויקט.
חשוב לזכור את מזהה הפרויקט, שמאוכלס באופן אוטומטי מתחת לשם הפרויקט. מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud, כך שהשם בצילום המסך כבר תועד ולא יעבוד בשבילכם. בהמשך נתייחס אליה בתור PROJECT_ID
.
לאחר מכן, צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud ולהפעיל את Cloud Run API.
הפעלת Cloud Run API
לוחצים על תפריט הניווט TODO > ממשקי API שירותים > מרכז הבקרה > הפעלת ממשקי API ושירותים. .
מחפשים את Cloud Run API, לאחר מכן לחצו על Cloud Run API > הפעלה.
ההרצה ב-Codelab הזו לא אמורה לעלות לך יותר מכמה דולרים, אבל היא יכולה להיות גבוהה יותר אם תחליטו להשתמש ביותר משאבים או אם תשאירו אותם פועלים (ראו ניקוי בסוף). מידע נוסף זמין במאמר תמחור.
משתמשים חדשים ב-Google Cloud זכאים לתקופת ניסיון בחינם בשווי 300$.
Cloud Shell
את Google Cloud ואת Cloud Run אפשר להפעיל מרחוק מהמחשב הנייד, אבל משתמשים ב-Cloud Shell, סביבת שורת הפקודה שפועלת ב-Google Cloud. הסביבה מוגדרת מראש לכל ספריות הלקוח וה-frameworks שדרושות לכם.
המכונה הווירטואלית הזו שמבוססת על Debian נטענת עם כל הכלים למפתחים שדרושים לכם. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כלומר, כל מה שדרוש ל-Codelab הזה הוא דפדפן (כן, הוא פועל ב-Chromebook).
- כדי להפעיל את Cloud Shell ממסוף Cloud, לוחצים על Activate 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:
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
כדי לצפות בהיסטוריית ה-build או לצפות בתהליך בזמן אמת, אפשר להיכנס למסוף Cloud וללחוץ על תפריט הניווט TODO > Cloud Build > היסטוריה. תוצג רשימה של כל גרסאות ה-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
תתבקשו לציין באיזה אזור תרצו לפעול. בוחרים את האזור הקרוב ביותר אליכם ואז מאשרים את שם השירות המוצע כברירת מחדל (מונולית).
למטרות בדיקה, צריך להתיר בקשות לא מאומתות לאפליקציה. בהנחיה, מזינים 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), שבו מכונה אחת מטפלת בבקשה אחת בכל פעם.
לפרוס מחדש את אותה קובץ אימג' בקונטיינר עם ערך בו-זמניות של 1 (למטרות בדיקה בלבד) ולראות מה קורה.
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1
עונים על השאלות הבאות כמו שעשיתם בפעם הראשונה. אחרי שהפקודה תתבצע בהצלחה, צריך לבדוק את Cloud Console כדי לראות את התוצאה.
ממרכז הבקרה של Cloud Run, לוחצים על שירות המונולית כדי לראות את הפרטים.
לוחצים על הכרטיסייה גרסאות. אמורים להופיע שתי גרסאות קודמות. לוחצים על monolith-00002 ובודקים את הפרטים. אתם אמורים לראות שערך בו-זמניות מופחת ל-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 אם שכחתם אותה:
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.