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

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.

db5f05c090d5ebcb.png

דרישות מוקדמות

  • היכרות כללית עם Docker (עיינו בקטע תחילת העבודה באתר Docker).

מה תלמדו

  • איך יוצרים קובץ אימג' של Docker באמצעות Cloud Build ומעלים אותו אל gcr.io
  • איך לפרוס קובצי אימג' של Docker ל-Cloud Run
  • איך לנהל פריסות של Cloud Run
  • איך להגדיר נקודת קצה לאפליקציה ב-Cloud Run

מה תפַתחו

מה נדרש

  • חשבון Google עם הרשאת אדמין ליצירת פרויקטים או לפרויקט עם תפקיד 'בעלי הפרויקט'

2. הגדרת סביבה

הגדרת סביבה בקצב אישי

אם עדיין אין לכם חשבון Google, עליכם ליצור חשבון. לאחר מכן, נכנסים אל מסוף Google Cloud ולוחצים על Project > יוצרים פרויקט.

53dad2cefdae71da.png

faab21976aabeb4c.png

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

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

הפעלת Cloud Run API

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

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

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

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

צילום מסך מתאריך 2017-06-14 בשעה 22:13.43.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

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

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

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

כדי לצפות בהיסטוריית ה-build או לצפות בתהליך בזמן אמת, אפשר להיכנס למסוף Cloud וללחוץ על תפריט הניווט TODO > Cloud Build > היסטוריה. תוצג רשימה של כל גרסאות ה-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 

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

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 Console כדי לראות את התוצאה.

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

7d1eed2e4728a4f2.png

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

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.

מידע נוסף