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

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

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

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

הגדרת סביבה בקצב עצמי

אם עדיין אין לכם חשבון 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 > Enable (הפעלה).

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

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

Cloud Shell

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

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

כדי להפעיל את Google Cloud Shell, פשוט לוחצים על הלחצן בפינה השמאלית העליונה במסוף למפתחים (הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים):

activateCloudShell.png

לוחצים על הלחצן 'הפעלת Cloud Shell':

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>

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

echo $GOOGLE_CLOUD_PROJECT

פלט הפקודה

<PROJECT_ID>

אם מסיבה כלשהי הפרויקט לא מוגדר, פשוט מריצים את הפקודה הבאה :

gcloud config set project <PROJECT_ID>

מחפשים את PROJECT_ID? כדאי לבדוק באיזה מזהה השתמשתם בשלבי ההגדרה, או לחפש אותו בלוח הבקרה של המסוף:

Project_ID.png

חשוב: בסיום, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט:

gcloud config set compute/zone us-central1-f

אפשר לבחור מתוך מגוון אזורים שונים. מידע נוסף זמין במסמכי התיעוד בנושא אזורים ותחומים.

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

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

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

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

אחרי שיצרתם קונטיינר לאתר והעליתם אותו ל-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 (fully managed) (‏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 שמופיעה ברשימת השירותים בדפדפן האינטרנט, וצריך לראות את אותו אתר שהוצג בתצוגה המקדימה המקומית.

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

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

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

]

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

עכשיו משחזרים את מספר ההפעלות המקבילות המקורי בלי לפרוס מחדש. אפשר להגדיר את ערך המקבילות לערך ברירת המחדל 80 או ל-0, וכך להסיר את כל ההגבלות על מקבילות ולהגדיר אותו לערך המקסימלי שמוגדר כברירת מחדל (שבזמן כתיבת המאמר הזה הוא 80).

מריצים את הפקודה הבאה ב-Cloud Shell כדי לעדכן את הגרסה הנוכחית:

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

שימו לב שנוצרה גרסה חדשה, שהתנועה הופנתה מחדש ושהמקביליות חזרה ל-80.

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

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

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

השינויים הושלמו וצוות השיווק מרוצה מהעדכונים שלך! הגיע הזמן לעדכן את האתר בלי להפריע למשתמשים.

ב-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

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

מחיקת תמונות ב-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

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

מידע נוסף