פריסה, התאמה לעומס ועדכון של האתר באמצעות Google Kubernetes Engine (GKE)

1. מבוא

הפעלת אתרים ואפליקציות היא משימה לא פשוטה.

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

תארו לעצמכם כלי שיכול לעזור לכם לעשות את כל זה ואפילו לאפשר לכם להפוך את התהליך לאוטומטי! עם GKE, לא רק שאפשר לעשות את כל זה, אלא שזה גם קל! ב-codelab הזה, אתם מגלמים תפקיד של מפתח שמפעיל אתר מסחר אלקטרוני עבור חברה פיקטיבית – Fancy Store. בגלל בעיות בהרחבת הקיבולת והפסקות שירות, אתם נדרשים לפרוס את האפליקציה שלכם ב-GKE.

התרגילים מסודרים לפי סדר שמשקף את החוויה של מפתחים בענן:

  1. יוצרים אשכול GKE.
  2. יוצרים קונטיינר Docker.
  3. פורסים את הקונטיינר ב-GKE.
  4. חשיפת מאגר התגים דרך שירות.
  5. הגדלת הקיבולת של מאגר התגים למספר רפליקות.
  6. משנים את האתר.
  7. השקת גרסה חדשה ללא השבתה.

תרשים הארכיטקטורה

ddba666bd2b02d0d.png

מה תלמדו

  • איך יוצרים אשכול GKE
  • איך יוצרים קובץ אימג' של Docker
  • איך פורסים תמונות Docker ב-Kubernetes
  • איך משנים את קנה המידה של אפליקציה ב-Kubernetes
  • איך מבצעים עדכון בהדרגה (rolling) ב-Kubernetes

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

  • חשבון Google עם הרשאת אדמין ליצירת פרויקטים או פרויקט עם תפקיד של בעלים
  • הבנה בסיסית של Docker ו-Kubernetes (אם אין לכם הבנה בסיסית, כדאי לעיין עכשיו במאמרים בנושא Docker ו-Kubernetes).

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

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

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

53dad2cefdae71da.png

Screenshot from 2016-02-10 12:45:26.png

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

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

Cloud Shell

אפשר להפעיל את Google Cloud ואת GKE מרחוק באמצעות המחשב הנייד, אבל ב-Codelab הזה תשתמשו ב-Cloud Shell – סביבת שורת פקודה שפועלת בענן.

המכונה הווירטואלית הזו מבוססת על 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. יצירת אשכול GKE

עכשיו, אחרי שיש לכם סביבת פיתוח פעילה, אתם צריכים אשכול GKE כדי לפרוס את האתר שלכם. לפני שיוצרים אשכול, צריך לוודא שממשקי ה-API המתאימים מופעלים. מריצים את הפקודה הבאה כדי להפעיל את Containers API:

gcloud services enable container.googleapis.com

עכשיו אפשר ליצור את האשכול. כדי ליצור אשכול בשם fancy-cluster עם 3 צמתים:

gcloud container clusters create fancy-cluster --num-nodes 3

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

gcloud compute instances list

פלט:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

אפשר גם לראות את האשכול ואת המידע שקשור אליו ב-Cloud Console. לוחצים על לחצן התפריט בפינה הימנית העליונה, גוללים למטה אל Kubernetes Engine ולוחצים על Clusters (אשכולות). אמור להופיע האשכול שנקרא fancy-cluster.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

מעולה! יצרתם את האשכול הראשון!

4. שכפול מאגר המקור

מכיוון שמדובר באתר קיים, צריך רק לשכפל את המקור מהמאגר כדי להתמקד ביצירת תמונות Docker ובפריסה ב-GKE.

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

כדי לראות תצוגה מקדימה של האפליקציה, לוחצים על סמל התצוגה המקדימה באינטרנט בתפריט Cloud Shell ובוחרים באפשרות Preview on port 8080 (תצוגה מקדימה ביציאה 8080).

5869738f0e9ec386.png

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

9ed25c3f0cbe62fa.png

אחרי שצופים באתר, אפשר לסגור את החלון. מקישים על Control+C (Windows או Mac) בחלון הטרמינל כדי לעצור את תהליך שרת האינטרנט.

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

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

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

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

קודם כל, מפעילים את Cloud Build API באמצעות הפקודה הבאה:

gcloud services enable cloudbuild.googleapis.com

אחרי שמפעילים את ה-API, מריצים את הפקודה הבאה ב-Cloud Shell כדי להתחיל את תהליך ה-build:

cd ~/monolith-to-microservices/monolith
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 Console. לוחצים על לחצן התפריט בפינה הימנית העליונה, גוללים למטה אל Ci/CD, לוחצים על Cloud Build ואז על History (היסטוריה). תוכלו לראות שם רשימה של הגדרות קודמות, אבל אמורה להיות רק אחת שיצרתם.

4c753ede203255f6.png

אם לוחצים על מזהה ה-Build, אפשר לראות את כל הפרטים של ה-Build הזה, כולל פלט היומן.

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

6e88ed1643dfe629.png

6. פריסת קונטיינר ב-GKE

אחרי שיצרתם קונטיינר לאתר והעליתם אותו ל-Container Registry, אתם יכולים לפרוס אותו ב-Kubernetes.

כדי לפרוס אפליקציות באשכול GKE ולנהל אותן, צריך לתקשר עם מערכת ניהול האשכולות של Kubernetes. בדרך כלל עושים את זה באמצעות כלי שורת הפקודה kubectl.

ב-Kubernetes, אפליקציות מיוצגות כPods, שהן יחידות שמייצגות קונטיינר (או קבוצה של קונטיינרים שמשולבים זה בזה). ‫Pod היא יחידת הפריסה הקטנה ביותר ב-Kubernetes. במקרה הזה, כל Pod מכיל רק את קונטיינר המונוליט.

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

הפקודה kubectl create deployment גורמת ל-Kubernetes ליצור פריסה בשם monolith באשכול עם 1 רפליקה.

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

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

אימות הפריסה

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

kubectl get all

פלט:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

בפלט הזה אפשר לראות כמה דברים. תוכלו לראות את הפריסה הנוכחית, את ReplicaSet עם מספר ה-Pod הרצוי שהוא אחד, ואת ה-Pod שפועל. נראה שיצרת הכול בהצלחה!

כדי לראות את המשאבים בנפרד, אפשר להריץ את הפקודות הבאות:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

כדי לראות את היתרון המלא של Kubernetes, אתם יכולים לדמות קריסה של שרת, למחוק את ה-Pod ולראות מה קורה.

מעתיקים את שם ה-Pod מהפקודה הקודמת ומריצים את הפקודה הבאה כדי למחוק אותו:

kubectl delete pod/<POD_NAME>

אם תהיו מספיק מהירים, תוכלו להריץ את הפקודה הקודמת כדי לראות שוב את כל הפודים, ותוכלו לראות שני פודים, אחד בתהליך סיום והשני בתהליך יצירה או הרצה:

kubectl get all

פלט:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

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

7. חשיפת פריסה של GKE

פרסתם את האפליקציה ב-GKE, אבל אין לכם דרך לגשת אליה מחוץ לאשכול. כברירת מחדל, אי אפשר לגשת לאינטרנט מהקונטיינרים שמופעלים ב-GKE כי אין להם כתובות IP חיצוניות. אתם צריכים לחשוף את האפליקציה שלכם לתנועה מהאינטרנט באופן מפורש באמצעות משאב Service. שירות מספק תמיכה ברשת וב-IP עבור ה-Pods של האפליקציה. ‫GKE יוצר כתובת IP חיצונית ומאזן עומסים (שחלים עליהם חיובים) לאפליקציה.

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

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

פלט:

service/monolith exposed

גישה לשירות

‫GKE מקצה את כתובת ה-IP החיצונית למשאב Service ולא לפריסה. כדי למצוא את כתובת ה-IP החיצונית ש-GKE הקצה לאפליקציה, אפשר לבדוק את השירות באמצעות הפקודה kubectl get service:

kubectl get service

פלט:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

אחרי שקובעים את כתובת ה-IP החיצונית של האפליקציה, מעתיקים אותה. כדי לבדוק אם אפשר לגשת לאפליקציה, מעבירים את הדפדפן לכתובת ה-URL הזו (למשל http://203.0.113.0).

9ed25c3f0cbe62fa.png

אתם אמורים לראות את אותו אתר שבדקתם קודם. מעולה! האתר שלכם פועל באופן מלא ב-Kubernetes.

8. שינוי קנה מידה של פריסת GKE

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

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

kubectl scale deployment monolith --replicas=3

פלט:

deployment.apps/monolith scaled

אימות פריסה בהיקף נרחב

כדי לוודא שה-Deployment שונתה בהצלחה, מריצים את הפקודה הבאה:

kubectl get all

פלט:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

אמורות להופיע שלוש מכונות של ה-Pod שלכם שפועלות. בנוסף, שימו לב שהפריסה וה-ReplicaSet שלכם כוללים עכשיו ספירה רצויה של שלוש.

9. ביצוע שינויים באתר

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

מקישים על Control+C (Windows או Mac) בחלון הטרמינל כדי לעצור את תהליך שרת האינטרנט.

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

10. עדכון האתר ללא השבתה

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

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

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

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

פלט:

deployment.apps/monolith image updated

אימות הפריסה

כדי לאמת את עדכון הפריסה, מריצים את הפקודה הבאה:

kubectl get pods

פלט:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

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

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

אם שכחתם את כתובת ה-IP, תוכלו להריץ את הפקודה הבאה כדי לראות את רשימת השירותים ואת כתובת ה-IP:

kubectl get svc

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

8006c9938dbd5aa5.png

11. הסרת המשאבים

מחיקת מאגר Git

cd ~
rm -rf monolith-to-microservices

מחיקת תמונות ב-Container Registry

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

# 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

הערה: אם השתמשתם ב-Cloud Build בשביל ארטיפקטים אחרים ולא בשביל ה-Codelab הזה, תצטרכו למחוק את המקור באופן ידני מקטגוריית Cloud Storage‏ gs://<PROJECT_ID>_cloudbuild/source.

# 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

מחיקת שירות GKE

kubectl delete service monolith
kubectl delete deployment monolith

מחיקת אשכול GKE

gcloud container clusters delete fancy-cluster

הערה: יכול להיות שהפקודה הזו תימשך קצת זמן.

12. מעולה!

פרסתם, הרחבתם ועדכנתם את האתר שלכם ב-GKE. עכשיו יש לכם ניסיון עם Docker ו-Kubernetes!

מקורות מידע נוספים