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

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

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

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

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

53dad2cefdae71da.png

faab21976aabeb4c.png

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

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

הפעלת Cloud Run API

לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Dashboard (מרכז בקרה) > Enable APIs And Services (הפעלת ממשקי API ושירותים). .

5dbb2e6e27a55fcf.png

מחפשים את Cloud Run API, לוחצים על Cloud Run API ואז על הפעלה.

f1fd486174a744cf.png

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

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

Cloud Shell

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

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

  1. כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על הפעלת 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 Console:

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

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

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

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

4c753ede203255f6.png

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

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), שבו מופע אחד מטפל בבקשה אחת בכל פעם.

פורסים מחדש את אותו קובץ אימג' של קונטיינר עם ערך בו-זמניות (concurrency) של 1 (למטרות בדיקה בלבד) ובודקים מה קורה.

gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1

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

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

7d1eed2e4728a4f2.png

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

217185c0eccc87dd.png]

4ad481b8bcd0343d.png

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

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

מידע נוסף