פריסת אתר באמצעות Cloud Run

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

הפעלת אתרים יכולה להיות קשה בגלל כל העלויות הנלוות ליצירה ולניהול של מכונות וירטואליות (VM), אשכולות, אשכולות של קונטיינרים, שירותים ועוד. זה בסדר לאפליקציות גדולות יותר עם כמה שכבות, אבל אם אתם רק מנסים לפרוס את האתר ולהפוך אותו לזמין, זה הרבה זמן וכסף.

בעזרת Cloud Run, ההטמעה של Knative ב-Google Cloud, אפשר לנהל ולפרוס את האתר בלי העלויות הנוספות שנדרשות לפריסות מבוססות-VM או מבוססות-Kubernetes. זוהי גישה פשוטה יותר מנקודת מבט ניהולית, והיא גם מאפשרת לכם לשנות את ההיקף לאפס כשאין בקשות שמגיעות לאתר.

בקודלאב הזה נתחיל עם קובץ אימג' של 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 (פרויקט) > Create project (יצירת פרויקט).

53dad2cefdae71da.png

faab21976aabeb4c.png

חשוב לזכור את מזהה הפרויקט, שמאוכלס באופן אוטומטי מתחת לשם הפרויקט. מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud, ולכן השם שמוצג בצילום המסך כבר נלקח ולא יתאים לכם. בהמשך נקרא לו PROJECT_ID.

בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים של Google Cloud ולהפעיל את Cloud Run API.

הפעלת Cloud Run API

לוחצים על תפריט הניווט ☰ > APIs & Services > Dashboard > Enable APIs And Services. .

5dbb2e6e27a55fcf.png

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

f1fd486174a744cf.png

השלמת הקודלאב הזה לא אמורה לעלות יותר מכמה דולרים, אבל העלות עשויה להיות גבוהה יותר אם תחליטו להשתמש במשאבים נוספים או אם תמשיכו להפעיל אותם (ראו ניקוי בסוף). מידע נוסף זמין במאמר תמחור.

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

Cloud Shell

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

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

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על Activate Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (ההקצאה והחיבור לסביבה אמורים להימשך רק כמה רגעים).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

אחרי שתתחברו ל-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:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>
  1. לסיום, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט.
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

הפקודה הזו יוצרת עותק (clone) של המאגר, עוברת לספרייה ומתקינה את יחסי התלות הנדרשים להרצת האפליקציה באופן מקומי. ייתכן שיחלפו כמה דקות עד שהסקריפט ירוץ.

בודקים את האפליקציה ומריצים את הפקודה הבאה כדי להפעיל את שרת האינטרנט:

cd ~/monolith-to-microservices/monolith
npm start

פלט:

Monolith listening on port 8080!

כדי להציג תצוגה מקדימה של האפליקציה, לוחצים על תצוגה מקדימה באתר acc630712255c604.png ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

אפשר לסגור את החלון הזה אחרי הצפייה באתר. כדי להפסיק את תהליך שרת האינטרנט, לוחצים על CONTROL+C (Command+C ב-Macintosh) בחלון מסוף.

4. יצירת קונטיינר Docker באמצעות Cloud Build

עכשיו, כשקובצי המקור מוכנים, הגיע הזמן להעביר את האפליקציה ל-Docker.

בדרך כלל, צריך לבצע שני שלבים: פיתוח קונטיינר של Docker והעברה שלו למרשם כדי לאחסן את קובץ האימג', שממנו GKE ימשוך אותו. עם זאת, אפשר להקל על החיים באמצעות Cloud Build כדי ליצור את קונטיינר Docker ולהעביר את קובץ האימג' ל-Container Registry באמצעות פקודה אחת. במאמר מדריך למתחילים ב-Container Registry מוסבר איך יוצרים קובץ Dockerfile ומעבירים אותו בדחיפה באופן ידני.

Cloud Build דוחס את הקבצים מהספרייה ומעביר אותם לקטגוריה ב-Cloud Storage. לאחר מכן, תהליך ה-build לוקח את כל הקבצים מהקטגוריה ומשתמש ב-Dockerfile שנמצא באותה ספרייה כדי להריץ את תהליך ה-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 ולוחצים על Navigation menu ☰‏ > Cloud Build‏ > History. שם תוצג רשימה של כל הגרסאות הקודמות של ה-build, אבל אמורה להופיע רק הגרסה שיצרתם.

4c753ede203255f6.png

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

6e88ed1643dfe629.png

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).

d52d9419c5166674.png

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

3a57b32f133dad61.png

אימות הפריסה

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

במרכז הבקרה של Cloud Run, לוחצים על השירות monolith כדי לראות את הפרטים.

7d1eed2e4728a4f2.png

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

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

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

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

עכשיו הטקסט שהוספתם לרכיב דף הבית אמור להופיע באתר.

451ca252acae6928.png

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.

מידע נוסף