זהו המדריך החמישי והאחרון בתוכנית לימודים שמסבירה איך להפוך אפליקציה מונוליתית למודולרית ולהכיל אותה בקונטיינרים.
תוכנית הלימודים כוללת את המדריכים הבאים:
- סקירה כללית
- הסבר על המונוליט
- מודולריזציה של המונוליט
- הכנת האפליקציה המודולרית להכללה בקונטיינר
- העברת האפליקציה המודולרית לקונטיינר
- פריסת האפליקציה באשכול GKE (המדריך הזה)
במדריך הקודם, יצירת קונטיינר לאפליקציה מודולרית, הכנתם את האפליקציה המודולרית 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) ליצירה ולניהול Google Cloud של משאבים כמו אשכולות GKE.
יצירה ואימות של אשכול 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, אתם יכולים לפרוס בו את האפליקציה Cymbal Books. כדי לפרוס אפליקציה באשכול, צריך להחיל את מניפסט 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.
הפעם הראשונה שבה נתקלתם בשירותים הייתה בקטע שינוי הקוד המודולרי במדריך הכנת האפליקציה המודולרית להכללה בקונטיינרים.
במדריך הזה, עדכנתם את הקוד של האפליקציה כדי להשתמש בשמות שירותים במקום ב-localhost. העדכון הזה מאפשר ל-Kubernetes לנתב בקשות בין מודולים, ומוודא שהמודולים יכולים לתקשר אחד עם השני בתוך אשכול.
עכשיו, כשמחילים את המניפסט, Kubernetes יוצר את השירותים בתוך האשכול.
פריסה היא אובייקט Kubernetes API שמאפשר להפעיל כמה עותקים של Pods שמפוזרים בין הצמתים באשכול. בקטע הבא מוסבר מהם פודים.
מה זה Kubernetes Pod?
במדריך הקודם יצרתם קובץ אימג' של קונטיינר לכל מודול באפליקציית Cymbal Books. לדוגמה, יצרתם קובצי אימג' של קונטיינר שמבוססים על המודולים home_app ו-book_details_app.
כשמשתמשים בפקודה kubectl apply כדי לפרוס את מניפסט Kubernetes, Kubernetes מושך את קובצי האימג' של הקונטיינר מ-Artifact Registry אל האשכול. באשכול, קובצי האימג' של הקונטיינרים הופכים לקונטיינרים, והקונטיינרים פועלים בתוך Pods.
Pod הוא סביבה מבודדת שבה פועלים קונטיינרים, והוא מבצע את המשימות הבאות:
- הקצאת מעבד (CPU) וזיכרון: פוד מספק את המשאבים שקונטיינרים צריכים כדי לפעול.
- מספקת רשת: לכל Pod יש כתובת IP משלו. כך אפשר לנהל תקשורת בין ה-Pod לבין Pods אחרים.
הפודים רצים בצמתים, שהם המכונות שמספקות את כוח המחשוב לאשכול. מערכת Kubernetes מקצה באופן אוטומטי פודים לצמתים ומפיצה את הפודים בין הצמתים באשכול כדי לצמצם את הסיכון לעומס יתר על צומת יחיד. ההתפלגות הזו עוזרת לאשכול להשתמש במשאבי המחשוב והזיכרון שלו ביעילות.
אימות הפריסה
אחרי שמחילים את מניפסט Kubernetes באמצעות הפקודה kubectl apply, מוודאים שהאפליקציה נפרסה בהצלחה באשכול. כדי לוודא שהפריסה תקינה, בודקים שהפודים והשירותים פועלים בצורה תקינה.
בדיקת ה-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
כדי לבדוק אם הפודים פועלים כמו שצריך, מתחילים ברשימה של כל הפודים באשכול:
kubectl get pods
בודקים את הפלט כדי לוודא שכל Pod נמצא במצב Running. אם יש Pod שלא פועל, צריך לרשום את השם שלו כדי לבדוק אותו בהמשך.
עיון ביומנים של Pod
אם 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 מקומית כדי להריץ את המונוליט ובדיקת נקודות הקצה שלו.
- הבנת את בסיס הקוד של האפליקציה כדי להכין אותה למודולריזציה.
-
- למדתי איך לפצל קוד מונוליטי למודולים נפרדים. כל מודול מטפל בתכונה נפרדת, כמו הצגת פרטי הספר או ביקורות.
- ראיתם איך המודולים האלה מוטמעים כאפליקציות 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.
המאמרים הבאים
למידע נוסף על יצירת אשכולות, ראו את הסדרה תוכנית לימודים: אפליקציות שניתנות להתאמה לעומס (scalable).