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

1. מבוא

קשה להריץ אתרים ואפליקציות.

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

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

התרגילים מאורגנים בהתאם לחוויה של מפתחי ענן נפוצים:

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

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

ddba666bd2b02d0d.png

מה תלמדו

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

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

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

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

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

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

53dad2cefdae71da.png

צילום מסך מ-10-02-2016 12:45:26.png

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

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

Cloud Shell

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

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

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

5869738f0e9ec386.png

זה אמור להיפתח חלון חדש שבו תוכלו לראות את חנות המהודרת בפעולה!

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

4c753ede203255f6.png

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

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

6e88ed1643dfe629.png

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

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

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

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

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

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

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

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 חיצוניות. עליכם לחשוף את האפליקציה באופן מפורש לתנועת גולשים מהאינטרנט דרך משאב שירות. שירות מספק תמיכה ברשתות וב-IP לקבוצות ה-Pod של האפליקציה. מערכת GKE יוצרת כתובת IP חיצונית ומאזן עומסים (בכפוף לחיוב) לאפליקציה.

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

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

פלט:

service/monolith exposed

גישה לשירות

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

אימות פריסה מותאמת

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

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. כמו כן, חשוב לזכור של-Deployment ו-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. עדכון האתר ללא זמן השבתה

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

העדכונים המצטברים של 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

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

כדי לאמת את השינויים, צריך לעבור שוב לכתובת ה-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 לפריטי מידע שנוצרו בתהליך הפיתוח (Artifact) שאינם Codelab, יש צורך למחוק באופן ידני את המקור מהקטגוריה gs://<PROJECT_ID>_cloudbuild/source של 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

מחיקת שירות GKE

kubectl delete service monolith
kubectl delete deployment monolith

מחיקת אשכול GKE

gcloud container clusters delete fancy-cluster

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

12. מעולה!

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

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