זהו המדריך החמישי והאחרון בתוכנית הלימודים שמסבירה איך ליצור מודולריזציה לאפליקציה מונוליטית ולהעביר אותה לקונטיינר.
תוכנית הלימודים כוללת את המדריכים הבאים:
- סקירה כללית
- הסבר על המונולית
- הפיכת המונוליט למודולרי
- הכנת האפליקציה המודולרית להעברה לקונטיינר
- העברת האפליקציה המודולרית לקונטיינר
- פריסת האפליקציה באשכול GKE (המדריך הזה)
במדריך הקודם, Containerize the modular app, הכנתם את אפליקציית Cymbal Books המודולרית לפריסה. העברתם את המודולים של האפליקציה לקונטיינרים, בדקתם את הקונטיינרים שנוצרו והעברתם את קובצי האימג' של הקונטיינרים אל Artifact Registry.
במדריך הזה תלמדו איך לפרוס את האפליקציה בקונטיינר באשכול Google Kubernetes Engine. בשלב הזה הושלם השינוי של אפליקציית Cymbal Books למערכת מודולרית וניתנת להרחבה שפועלת באשכול Kubernetes.
עלויות
ביצוע השלבים במדריך הזה כרוך בחיובים בחשבון Google Cloud שלכם. העלויות מתחילות כשמפעילים את GKE ומפריסים את אפליקציית הדוגמה Cymbal Books. העלויות האלה כוללות חיובים לכל אשכול ב-GKE, כפי שמפורט בדף התמחור, וחיובים על הפעלת מכונות וירטואליות ב-Compute Engine.
כדי להימנע מחיובים מיותרים, הקפידו להשבית את GKE או למחוק את הפרויקט אחרי שתסיימו את המדריך הזה.
לפני שמתחילים
לפני שמתחילים את המדריך הזה, חשוב לוודא שסיימתם את המדריכים הקודמים בסדרה. סקירה כללית של כל הסדרה וקישורים למדריכים ספציפיים זמינים במאמר תוכנית לימודים: שינוי של אפליקציה מונוליטית לאפליקציית GKE – סקירה כללית.
בפרט, צריך לבצע את השלבים במדריך הקודם, יצירת קונטיינר לאפליקציה מודולרית.
הגדרת אשכול GKE
כדי לפרוס את אפליקציית Cymbal Books המודולרית, צריך קודם ליצור אשכול GKE. האשכול הזה מספק את התשתית שבה יפעלו הקונטיינרים של האפליקציה.
במדריך הזה משתמשים ב-CLI של gcloud כדי ליצור את האשכול. לחלופין, אפשר להשתמש בGoogle Cloud מסוף, שמספק ממשק משתמש גרפי (GUI) ליצירה ולניהול של משאבים כמו אשכולות GKE. Google Cloud
יצירה ואימות של אשכול GKE
אשכול GKE מספק את משאבי המחשוב שנדרשים להפעלת הקונטיינרים ב-Kubernetes. כדי ליצור אשכול באמצעות ה-CLI של gcloud, פועלים לפי השלבים הבאים.
עוברים אל Google Cloud המסוף.
במסוף, לוחצים על הלחצן Activate Cloud Shell:

בחלק התחתון של המסוף ייפתח סשן של Cloud Shell בתוך מסגרת.
מגדירים את פרויקט ברירת המחדל ב-Google Cloud CLI:
gcloud config set project PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט שיצרתם או בחרתם בקטע בחירה או יצירה של פרויקט Google Cloud במדריך הקודם. מזהה פרויקט הוא מחרוזת ייחודית שמבדילה את הפרויקט שלכם מכל הפרויקטים האחרים ב- Google Cloud. כדי לאתר את מזהה הפרויקט, עוברים אל בורר הפרויקטים. בדף הזה אפשר לראות את מזהי הפרויקטים של כל אחד מהפרויקטים שלכם ב- Google Cloud.יוצרים אשכול GKE:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --num-nodes=2מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAME: שם לאשכול, למשלcymbal-cluster.
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או תחום לאשכולות אזוריים, כמוus-central1אוeurope-west1-b.
מאחזרים את פרטי הכניסה של האשכול כדי ש-CLI של
kubectlיוכל להתחבר לאשכול:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONהפקודה הזו מעדכנת את קובץ התצורה של Kubernetes, שמאוחסן כברירת מחדל ב-
~/.kube/config. קובץ התצורה הזה מכיל את פרטי הכניסה שנדרשים ל-kubectlכדי ליצור אינטראקציה עם אשכול GKE.כדי לוודא ש-
kubectlמחובר לאשכול, מציגים את רשימת הצמתים של האשכול:kubectl get nodesאם ההגדרה מצליחה, הפקודה הזו מציגה את הצמתים באשכול GKE. מכיוון שיצרתם את האשכול באמצעות
--num-nodes=2, אמור להופיע מידע על שני צמתים, בדומה למידע הבא:NAME STATUS ROLES AGE VERSION gke-nov18-default-pool-6a8f9caf-bryg Ready <none> 30s v1.30.8-gke.1128000 gke-nov18-default-pool-6a8f9caf-ut0i Ready <none> 30s v1.30.8-gke.1128000בדוגמה הזו, שני הצמתים במצב
Ready. המשמעות של הסטטוס הזה היא שאשכול GKE מוכן לאירוח של עומסי העבודה שלכם בקונטיינרים.
פריסת האפליקציה
אחרי שיצרתם אשכול GKE, אתם יכולים לפרוס בו את אפליקציית CymbalBooks. כדי לפרוס אפליקציה באשכול, צריך להחיל את מניפסט Kubernetes על האשכול.
החלת מניפסט Kubernetes
ב-Cloud Shell, פורסים את האפליקציה לאשכול GKE על ידי הרצת הפקודות הבאות:
מנווטים לספריית הבסיס של האפליקציה בקונטיינרים:
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/הפעלת מניפסט Kubernetes:
kubectl apply -f kubernetes_manifest.yaml
הפקודה הקודמת מורה ל-Kubernetes ליצור את המשאבים שצוינו בקובץ kubernetes-manifest.yaml. המקורות האלה כוללים שירותים, פריסה ו-Pods.
המונח Services הוצג לראשונה בקטע שינוי הקוד המודולרי במדריך הכנת האפליקציה המודולרית להעברה לקונטיינר.
במדריך הזה, עדכנתם את הקוד של האפליקציה כדי להשתמש בשמות שירותים במקום ב-localhost. העדכון הזה מאפשר ל-Kubernetes לנתב בקשות בין מודולים, ומוודא שהמודולים יכולים לתקשר ביניהם בתוך אשכול.
עכשיו, כשמחילים את המניפסט, Kubernetes יוצר את השירותים בתוך האשכול.
פריסה היא אובייקט Kubernetes API שמאפשר להריץ כמה עותקים של Pods שמפוזרים בין הצמתים באשכול. בקטע הבא מוסבר מהם פודים.
מה זה Pod ב-Kubernetes?
במדריך הקודם יצרתם קובץ אימג' של קונטיינר לכל מודול באפליקציית Cymbal Books. לדוגמה, יצרתם קובצי אימג' של קונטיינר שמבוססים על המודולים home_app ו-book_details_app.
כשמשתמשים בפקודה kubectl apply כדי לפרוס את מניפסט Kubernetes, מערכת Kubernetes מושכת את קובצי האימג' של הקונטיינרים מ-Artifact Registry אל האשכול. באשכול, קובצי האימג' של הקונטיינרים הופכים לקונטיינרים, והקונטיינרים פועלים בתוך Pods.
Pod היא סביבה מבודדת שבה פועלים קונטיינרים, והיא מבצעת את המשימות הבאות:
- הקצאת מעבד (CPU) וזיכרון: פוד מספק את המשאבים שקונטיינרים צריכים כדי לפעול.
- מספק רשת: לכל Pod יש כתובת IP משלו. כך ה-Pod יכול לתקשר עם Pods אחרים.
הפודים רצים בצמתים, שהם המכונות שמספקות את כוח המחשוב לאשכול. Kubernetes מקצה באופן אוטומטי Pods לצמתים ומפיץ את ה-Pods בין הצמתים של האשכול כדי לצמצם את הסיכון לעומס יתר על צומת יחיד. החלוקה הזו עוזרת לאשכול להשתמש במשאבי המחשוב והזיכרון שלו בצורה יעילה.
אימות הפריסה
אחרי שמחילים את מניפסט Kubernetes באמצעות הפקודה kubectl apply, מוודאים שהאפליקציה נפרסה באשכול בהצלחה. כדי לוודא שהפריסה תקינה, בודקים שה-Pods והשירותים פועלים בצורה תקינה.
בדיקת ה-Pods
כדי לראות את ה-Pods באשכול, מריצים את הפקודה הבאה:
kubectl get pods
הפקודה הזו מציגה רשימה של ה-Pods והסטטוס הנוכחי שלהם. בעמודה STATUS (סטטוס) צריך לוודא שכל ה-Pods מסומנים בסימן Running, שמציין שהם פועלים בהצלחה ומוכנים לטפל בבקשות. הפלט הצפוי אמור להיראות כך:
NAME READY STATUS RESTARTS AGE
home-app-67d59c6b6d-abcde 1/1 Running 0 30s
book-details-app-6d8bcbc58f-xyz 1/1 Running 0 30s
book-reviews-app-75db4c4d7f-def 1/1 Running 0 30s
images-app-7f8c75c79c-ghi 1/1 Running 0 30s
הסטטוס של Pod מופיע בהתחלה כ-Pending בזמן היצירה שלו, והקונטיינרים שלו נמצאים בתהליך של הפעלה. אם מצב ה-Pod נשאר Pending למשך זמן ממושך, יכול להיות שאין מספיק משאבים באשכול כדי שה-Pod יעבור למצב תקין Running. אם הסטטוס של ה-Pod הוא CrashLoopBackOff, יכול להיות שיש בעיה עם הקונטיינר. בהמשך המדריך מפורטים שלבים לפתרון בעיות.
בדיקת השירותים
שירותים מאפשרים תקשורת בין Pods ומאפשרים ללקוחות חיצוניים (לדוגמה, משתמשים, סקריפטים אוטומטיים או כלי מעקב) לגשת לאפליקציה. כדי לראות את השירותים באשכול, מריצים את הפקודה הבאה:
kubectl get services
הפלט של הפקודה הזו אמור להיראות כך:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
home-app-service LoadBalancer 10.12.3.4 35.185.1.2 80:30837/TCP 30s
details-service ClusterIP 10.12.3.5 <none> 80/TCP 30s
reviews-service ClusterIP 10.12.3.6 <none> 80/TCP 30s
images-service LoadBalancer 10.12.3.7 34.125.6.3 80:32014/TCP 30s
השדות העיקריים שצריך לשים לב אליהם בפלט הם:
-
TYPE: בשדה הזה מצוין איך השירות נחשף. שירותים מסוגLoadBalancerמספקים גישה חיצונית לאפליקציה. -
EXTERNAL-IP: בשירות מסוגLoadBalancer, השדהEXTERNAL-IPמציג את כתובת ה-IP הציבורית שהמשתמשים יכולים להזין בדפדפן האינטרנט כדי לגשת לאפליקציה. בשירות מסוגClusterIP, השדה הזה ריק כי אפשר לגשת לשירותים מסוגClusterIPרק בתוך האשכול.
בדיקת הפריסה
אחרי שפורסים את אפליקציית Cymbal Books באשכול GKE, צריך לוודא שהאפליקציה נגישה ושהקונטיינרים יכולים לתקשר ביניהם.
גישה לאפליקציה
כדי לוודא שיש גישה לאפליקציה, פועלים לפי השלבים הבאים:
מאחזרים את כתובת ה-IP החיצונית של
home-app-service:kubectl get servicesחפשו את העמודה
**EXTERNAL-IP**בפלט ורשמו את כתובת ה-IP שמשויכת ל-home-app-service.פותחים דפדפן אינטרנט ומזינים את כתובת ה-URL הבאה:
http://EXTERNAL-IPמחליפים את
EXTERNAL-IPבכתובת ה-IP שמצאתם בשלב הקודם.מוודאים שדף הבית של אפליקציית Cymbal Books נטען בצורה תקינה.
אימות של תקשורת בין שירותים
המאגרי התגים באפליקציית Cymbal Books מסתמכים על Services להחלפת מידע. כדי לוודא שהקונטיינרים יכולים לתקשר ביעילות, פועלים לפי השלבים הבאים:
מאחזרים את כתובת ה-IP החיצונית של
home-app-serviceכמו שמתואר למעלה.משתמשים בממשק של האפליקציה כדי לבדוק אינטראקציות בין מאגרי תגים. כדי לעשות את זה, צריך ללחוץ על כל הקישורים שזמינים בממשק של האפליקציה ולוודא שהתכונות הבאות פועלות:
- בודקים את תמונות עטיפות הספרים: מוודאים שתמונות עטיפות הספרים נטענות בצורה תקינה גם בדף הבית וגם בדף הפרטים של הספר. אם הם תואמים, מאגרי התגים
home_appו-book_details_appמתקשרים בהצלחה עם מאגר התגיםimages_app. - הצגת פרטי הספר: מעבר לדף פרטי הספר מדף הבית. אם אתם רואים את פרטי הספר, סימן שהקשר בין מאגר התגים
home_appלביןbook_details_appתקין. - צפייה בביקורות על ספרים: לוחצים על קישור לביקורת על ספר כדי לוודא שהמאגר
home_appיכול לתקשר עם המאגרbook_reviews_app.
- בודקים את תמונות עטיפות הספרים: מוודאים שתמונות עטיפות הספרים נטענות בצורה תקינה גם בדף הבית וגם בדף הפרטים של הספר. אם הם תואמים, מאגרי התגים
האפליקציה שלכם פועלת עכשיו באשכול GKE!
כל הכבוד! במאמר הזה ראינו איך להפוך אפליקציה מונוליטית למערכת מודולרית שמבוססת על קונטיינרים ופועלת באשכול GKE פעיל. במהלך התהליך למדתם איך לחלק קוד עם תלות הדדית למודולים עצמאיים, ליצור קובצי אימג' בקונטיינרים ולהעביר אותם למאגר, להגדיר מניפסטים של Kubernetes ולפרוס את האפליקציה מהמאגר ל-GKE. זהו הישג משמעותי, והוא משקף את הצעדים שצוותים נוקטים בעולם האמיתי כדי לבצע מודרניזציה של אפליקציות לענן.
פתרון בעיות
אם האפליקציה לא מגיבה או שהקונטיינרים לא מצליחים לתקשר, אפשר להשתמש בשלבים הבאים לפתרון בעיות כדי לאבחן ולפתור בעיות נפוצות.
בדיקת הסטטוס של ה-Pods
מתחילים בהכנת רשימה של כל ה-Pods באשכול כדי לבדוק אם הם פועלים כמצופה:
kubectl get pods
בודקים את הפלט כדי לוודא שכל Pod נמצא במצב Running. אם יש פוד שלא פועל, צריך לרשום את השם שלו כדי לבדוק אותו בהמשך.
בדיקת יומנים של Pod
אם פוד לא מטפל בבקשות כמו שצריך, כדאי לבדוק את היומנים שלו כדי לחפש הודעות שגיאה:
kubectl logs POD_NAME
מחליפים את POD_NAME בשם של ה-Pod שרוצים לבדוק. הפקודה הזו שימושית לזיהוי בעיות בהפעלה או שגיאות בזמן ריצה.
תיאור של Pod לקבלת מידע מפורט
אם חבילת ה-Pod נשארת במצב שאינו Running למשך יותר מחמש דקות – למשל, במצב Pending, ContainerCreating או CrashLoopBackOff – אפשר להשתמש בפקודה הבאה כדי לראות מידע מפורט על הסטטוס והאירועים של ה-Pod:
kubectl describe pod POD_NAME
מחליפים את POD_NAME בשם של ה-Pod שרוצים לקבל עליו מידע מפורט.
הקטע Events בפלט עשוי להצביע על כך שמגבלות משאבים או בעיות בשליפת תמונות מונעות את ההפעלה התקינה של ה-Pod.
אימות הגדרות השירות
חשוב לוודא שהשירותים מוגדרים בצורה נכונה, במיוחד השירות שחושף את מודול הבית עם כתובת IP חיצונית. מריצים את הפקודה הבאה כדי להציג את השירותים:
kubectl get services
אם שמתם לב שבמודול Service for the home (שירות לבית) יש כתובת EXTERNAL-IP שמופיעה כ-Pending, מריצים את הפקודה הבאה:
kubectl describe service SERVICE_NAME
מחליפים את SERVICE_NAME בשם של מודול הבית Service.
הפקודה הזו מספקת פרטים נוספים על הגדרת השירות ועוזרת לזהות עיכובים בהקצאת כתובת ה-IP החיצונית או בעיות אחרות בהגדרות.
בדיקת אירועים באשכול
אתם יכולים לבדוק את האירועים של האשכול כדי לראות אם בעיה משפיעה על כמה רכיבים של האשכול:
kubectl get events
הפקודה הזו יכולה לקבוע אם בעיות רחבות יותר במשאבים או ברשת משפיעות על הפריסה.
פינוי משאבים
הפעלת אשכול GKE כרוכה בעלויות. אחרי שמסיימים את המדריך הזה, מומלץ למחוק את המשאבים כדי להימנע מחיובים נוספים. כדי להסיר את האשכול, ואם רוצים גם את כל הפרויקט, פועלים לפי השלבים הבאים.
מחיקת אשכול GKE
כדי למחוק את אשכול GKE, משתמשים בפקודה הבאה:
gcloud container clusters delete CLUSTER_NAME
--location=CONTROL_PLANE_LOCATION
מחליפים את מה שכתוב בשדות הבאים:
CLUSTER_NAME: השם של האשכול שיצרתם, למשלcymbal-cluster.
CONTROL_PLANE_LOCATION: המיקום של מישור הבקרה של האשכול ב-Compute Engine. מציינים אזור לאשכולות אזוריים או אזור זמין לאשכולות אזוריים.
כשמופיעה בקשת אישור, מאשרים את המחיקה.
בדיקה שהאשכול נמחק
כדי לוודא שהאשכול נמחק, מריצים את הפקודה הבאה:
gcloud container clusters list
האשכול לא אמור להופיע יותר בפלט. אם כן, מחכים כמה רגעים ומנסים שוב.
(אופציונלי) מחיקת הפרויקט Google Cloud
אם יצרתם Google Cloud פרויקט במיוחד בשביל המדריך הזה ואתם לא צריכים אותו יותר, אתם יכולים למחוק את Google Cloud הפרויקט כולו. כשמוחקים את הפרויקט, כל המשאבים מוסרים והחיוב על הפרויקט נפסק:
- במסוף Google Cloud , פותחים את הדף Manage Resources.
- בוחרים את הפרויקט שרוצים למחוק.
- לוחצים על Delete Project ופועלים לפי ההנחיות כדי לאשר.
סיכום הסדרה
כל הכבוד! בסיום תוכנית הלימודים הזו, למדתם את היסודות של המרת אפליקציה מונוליטית לאפליקציה מודולרית בקונטיינר שפועלת באשכול Kubernetes. השלבים הבאים מסכמים את התהליך:
-
- הסבר על המבנה של אפליקציית Cymbal Books המונוליטית.
- הגדרת סביבת Python מקומית להרצת המונוליט ובדיקת נקודות הקצה שלו.
- הבנתם את ה-codebase של האפליקציה כדי להכין אותה למודולריזציה.
-
- למדתי איך לפצל קוד מונוליטי למודולים נפרדים. כל מודול מטפל בתכונה נפרדת, כמו הצגת פרטי הספר או הביקורות עליו.
- ראיתי איך המודולים האלה מיושמים כאפליקציות Flask עצמאיות שפועלות ביציאות שונות.
- נבדקה האפליקציה המודולרית.
הכנת הקוד המודולרי להעברה לקונטיינר
- הבנתי שצריך לעדכן את כתובות ה-URL ב-
home.pyכדי להשתמש בשמות שירותים במקום ב-localhost. - הסבר על האופן שבו מניפסט Kubernetes מגדיר שירותים שמאפשרים למודולים של האפליקציה, שכבר מתקשרים ביניהם, למצוא אחד את השני בהקשר של אשכול Kubernetes.
- הבנתי שצריך לעדכן את כתובות ה-URL ב-
העברת האפליקציה המודולרית לקונטיינר
- הגדרתם Google Cloud פרויקט ושיבטתם את האפליקציה מ-GitHub ל-Cloud Shell.
- יצרו קובצי אימג' של קונטיינרים לכל מודול באמצעות Docker ובדקו את הקונטיינרים באופן מקומי.
- העברתם בדחיפה את קובצי האימג' של הקונטיינרים אל Artifact Registry כדי להכין את האפליקציה לפריסה באשכול.
- עדכנו את מניפסט Kubernetes כך שיפנה לנתיבי קובצי האימג' של הקונטיינרים ב-Artifact Registry.
פריסת האפליקציה באשכול GKE (המדריך שאתם קוראים עכשיו):
- יצירת אשכול GKE.
- פריסת קובצי האימג' של הקונטיינרים מ-Artifact Registry לאשכול GKE.
- בדקנו את הגרסה הסופית של האפליקציה, שניתן להרחיב אותה והיא פועלת בסביבת Kubernetes.
המאמרים הבאים
למידע נוסף על יצירת אשכולות, אפשר לעיין בסדרה תוכנית לימודים: אפליקציות ניתנות להרחבה.