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.
לאחר מכן, תצטרכו להפעיל את החיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud. משתמשים חדשים ב-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 ובוחרים באפשרות Preview on port 8080 (תצוגה מקדימה ביציאה 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, ולכן קובץ האימג' שנוצר מועבר בדחיפה ל-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 ולא לפריסה. כדי למצוא את כתובת ה-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
אימות פריסה בהיקף נרחב
כדי לוודא שה-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 & 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
הטקסט שהוספתם לרכיב של דף הבית אמור להופיע באתר.

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!