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

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


חשוב לזכור שמזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם שלמעלה כבר תפוס ולא יתאים לכם, מצטערים!). בהמשך נתייחס אליו כאל PROJECT_ID.
לאחר מכן, כדי להשתמש במשאבים של Google Cloud, צריך להפעיל את החיוב ב-Cloud Console. משתמשים חדשים ב-Google Cloud זכאים לתקופת ניסיון בחינם בשווי 300$. אם אתם לא משתמשים חדשים, אל דאגה, כי עלות ה-codelab לא אמורה להיות גבוהה מכמה דולרים. עם זאת, אם תשתמשו ביותר משאבים או תפעילו אותם למשך זמן ארוך יותר (ראו את הקטע 'ניקוי' בסוף), יכול להיות שהעלות של ה-codelab תהיה גבוהה יותר. מידע נוסף על תמחור
Cloud Shell
אפשר להפעיל את Google Cloud ואת GKE מרחוק באמצעות המחשב הנייד, אבל ב-Codelab הזה נשתמש ב-Cloud Shell – סביבת שורת פקודה שפועלת בענן.
המכונה הווירטואלית הזו מבוססת על Debian, וטעונים בה כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות של הרשת. כלומר, כל מה שצריך כדי לבצע את ההדרכה הזו הוא דפדפן (כן, היא פועלת ב-Chromebook).
- כדי להפעיל את Cloud Shell ממסוף Cloud, פשוט לוחצים על הפעלת Cloud Shell
(הקצאת המשאבים והחיבור לסביבה אמורים להימשך רק כמה רגעים).
אחרי שמתחברים ל-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:
ב-Cloud Shell מוגדרים גם כמה משתני סביבה כברירת מחדל, שיכולים להיות שימושיים כשמריצים פקודות בעתיד.
echo $GOOGLE_CLOUD_PROJECT
פלט הפקודה
<PROJECT_ID>
- לבסוף, מגדירים את אזור ברירת המחדל ואת הגדרת הפרויקט.
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.


מעולה! יצרתם את האשכול הראשון!
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 ובוחרים באפשרות 'תצוגה מקדימה ביציאה 8080'.

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

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

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 ולא למשאב Deployment. כדי לראות את כתובת ה-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).

אתם אמורים לראות את אותו אתר שבדקתם קודם. מעולה! האתר שלכם פועל באופן מלא ב-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 & 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
רואים שנוצרים שלושה פודים חדשים והפודים הישנים מושבתים. אפשר לדעת לפי הגילאים אילו מהם חדשים ואילו ישנים. בסופו של דבר, שוב יוצגו רק שלושה תרמילים, שהם שלושת התרמילים המעודכנים.
כדי לוודא שהשינויים בוצעו, עוברים שוב לכתובת ה-IP החיצונית של איזון העומסים ורואים שהאפליקציה עודכנה.
אם שכחתם את כתובת ה-IP, מריצים את הפקודה הבאה כדי לראות את רשימת השירותים ואת כתובת ה-IP:
kubectl get svc
הטקסט שהוספתם לרכיב של דף הבית אמור להופיע באתר.

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!