העברת אתר מונוליתי למיקרו-שירותים ב-Google Kubernetes Engine

1. מבוא

למה כדאי לעבור מאפליקציה מונוליתית לארכיטקטורת מיקרו-שירותים (microservices)? פירוק אפליקציה למיקרו-שירותים מציעה את היתרונות הבאים: רובם נובעים מהעובדה שמיקרו-שירותים (microservices) בצימוד חלש.

  • אפשר לבדוק ולפרוס את המיקרו-שירותים באופן עצמאי. ככל שיחידת הפריסה קטנה יותר, כך הפריסה קלה יותר.
  • אפשר להטמיע אותם בשפות שונות ובמסגרות שונות. לכל מיקרו-שירות (microservice), אתם יכולים לבחור את הטכנולוגיה המתאימה ביותר לתרחיש המסוים שלו.
  • אפשר לנהל אותם על ידי צוותים שונים. הגבול בין מיקרו-שירותים (microservices) מקל על הקצאת צוות למיקרו-שירותים (microservices) אחד או יותר.
  • מעבר לשימוש במיקרו-שירותים (microservices) משחרר את יחסי התלות בין הצוותים. כל צוות צריך לטפל רק בממשקי ה-API של המיקרו-שירותים (microservices) שבהם הוא תלוי. הצוות לא צריך לחשוב על האופן שבו המיקרו-שירותים האלה מוטמעים, על מחזורי הגרסאות שלהם וכו'.
  • קל יותר לתכנן כשלים. כשמגדירים גבולות ברורים בין השירותים, קל יותר לקבוע מה לעשות אם שירות מסוים מושבת.

אלה החסרונות בהשוואה למונוליתים:

  • אפליקציה שמבוססת על מיקרו-שירות (microservice) היא רשת של שירותים שונים שבדרך כלל יוצרים אינטראקציה בדרכים שלא ברורות מאליהן, ולכן המורכבות הכוללת של המערכת נוטה לגדול.
  • בניגוד לחלק הפנימי של מונולית, מיקרו-שירותים מתקשרים באמצעות רשת. בנסיבות מסוימות, הדבר יכול להיחשב כבעיית אבטחה. Istio פותר את הבעיה הזו על ידי הצפנת תעבורת הנתונים בין מיקרו-שירותים (microservices).
  • לפעמים קשה להשיג את אותה רמת ביצועים כמו בגישה מונוליתית בגלל זמני אחזור בין שירותים.
  • התנהגות המערכת לא נגרמת על ידי שירות אחד, אלא על ידי רבים מהם והאינטראקציות שלהם. לכן קשה יותר להבין איך המערכת מתנהגת בסביבת הייצור (ניראות (observability)). גם Istio הוא פתרון לבעיה הזו.

בשיעור ה-Lab הזה נריץ מיקרו-שירותים (microservices) ב-Google Kubernetes Engine (GKE). Kubernetes היא פלטפורמה לניהול, לאירוח ולפריסה של קונטיינרים. קונטיינרים הם דרך ניידת לאריזה ולהרצת קוד. הם מתאימים היטב לדפוס מיקרו-שירותים, שבו כל מיקרו-שירות יכול לפעול בקונטיינר משלו.

בשיעור ה-Lab הזה נפרוס אפליקציה מונוליתית קיימת באשכול של Google Kubernetes Engine, ולאחר מכן נפרק אותה למיקרו-שירותים!

תרשים הארכיטקטורה של המיקרו-שירותים שלנו

נתחיל בפיצול המונולית שלנו לשלושה מיקרו-שירותים, אחד בכל פעם. המיקרו-שירותים כוללים: Orders, מוצרים ו-Frontend. אנחנו יוצרים קובץ אימג' של Docker לכל מיקרו-שירות באמצעות Cloud Build, שאותו אנחנו מפעילים מתוך Cloud Shell. לאחר מכן נפרוס ונחשוף את המיקרו-שירותים (microservices) שלנו ב-Google Kubernetes Engine (GKE) באמצעות סוג שירות Load Balancer של Kubernetes. נעשה זאת עבור כל שירות, ובמקביל לארגן אותם מחדש מתוך המונולית שלנו. במהלך התהליך נפעל גם המונולית וגם המיקרו-שירותים שלנו עד לסופה, ואז נוכל למחוק את המונולית.

636a2d58588b2b87.png

מה תלמדו

  • איך לפרק מונולית למיקרו-שירותים
  • איך יוצרים אשכול של Google Kubernetes Engine
  • איך יוצרים קובץ אימג' של Docker
  • איך פורסים קובצי אימג' של Docker ל-Kubernetes

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

  • חשבון Google Cloud Platform עם הרשאת אדמין ליצירת פרויקטים או פרויקט עם תפקיד 'בעלי הפרויקט'
  • הבנה בסיסית של Docker ו-Kubernetes

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

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

אם אין לכם עדיין חשבון Google (Gmail או Google Apps), עליכם ליצור חשבון. נכנסים למסוף Google Cloud Platform ( console.cloud.google.com) ויוצרים פרויקט חדש:

53dad2cefdae71da.png

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

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

בשלב הבא עליך להפעיל את החיוב ב-Developer Console כדי להשתמש במשאבים של Google Cloud ולהפעיל את Container Engine API.

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

משתמשים חדשים ב-Google Cloud Platform זכאים לתקופת ניסיון בחינם בשווי 300$.

Google Cloud Shell

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

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

אנחנו משתמשים באפליקציה מונוליתית קיימת של אתר מסחר אלקטרוני מדומה, עם דף פתיחה פשוט, דף מוצרים ודף היסטוריית הזמנות. נצטרך רק לשכפל את המקור ממאגר ה-Git שלנו, כדי שנוכל להתמקד בפיצול שלו למיקרו-שירותים (microservices) ופריסה ל-Google Kubernetes Engine (GKE).

מריצים את הפקודות הבאות כדי לשכפל את מאגר ה-Git למכונה של Cloud Shell ולהחליף לספרייה המתאימה. בנוסף, נתקין את יחסי התלות של NodeJS כדי שנוכל לבדוק את המונולית שלנו לפני הפריסה. יכול להיות שהסקריפט ירוץ כמה דקות.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

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

4. יצירת אשכול GKE

עכשיו, אחרי שיש לכם סביבת פיתוח עבודה, אנחנו זקוקים לאשכול Kubernetes כדי לפרוס את המונולית שלנו, ובסופו של דבר, את המיקרו-שירותים שלנו. לפני שנוכל ליצור אשכול, אנחנו צריכים לוודא שממשקי ה-API המתאימים מופעלים. מריצים את הפקודה הבאה כדי להפעיל את ממשק ה-API של הקונטיינרים כדי שנוכל להשתמש ב-Google Kubernetes Engine:

gcloud services enable container.googleapis.com

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

אפשר גם להציג את אשכול Kubernetes ומידע קשור במסוף Google Cloud. לוחצים על לחצן התפריט בפינה הימנית העליונה, גוללים למטה אל Kubernetes Engine ולוחצים על Clusters. אתם אמורים לראות את האשכול בשם fancy-cluster.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

מעולה! יצרתם עכשיו את האשכול הראשון שלכם ב-Kubernetes!

5. פריסת מונולית קיים

בשיעור ה-Lab הזה תלמדו על פירוק מונולית למיקרו-שירותים, לכן אנחנו צריכים להפעיל יישום מונולית. מריצים את הסקריפט הבא כדי לפרוס אפליקציה מונולית באשכול GKE למטרות של שיעור ה-Lab הזה:

cd ~/monolith-to-microservices
./deploy-monolith.sh

גישה למונולית

כדי למצוא את כתובת ה-IP החיצונית של אפליקציית המונולית שלנו, מריצים את הפקודה הבאה.

kubectl get service monolith

הפלט אמור להיראות כך:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

הערה: צריך להקצות לשם כך מאזן עומסים חיצוני וכתובת IP, אז יכול לקחת קצת זמן עד שזה יקרה. אם בפלט מופיעה כתובת ה-IP החיצונית

<pending> צריך להמתין כמה דקות ולנסות שוב.

אחרי שקובעים את כתובת ה-IP החיצונית למונולית, מעתיקים את כתובת ה-IP. מפנים את הדפדפן לכתובת ה-URL הזו (למשל http://203.0.113.0) כדי לבדוק אם ניתן לגשת למונולית.

9ed25c3f0cbe62fa.png

אתם אמורים לראות את דף הפתיחה של האתר המונוליתי בדיוק כמו בתמונה שלמעלה. דף הפתיחה הוא דף סטטי שיוצג על ידי המיקרו-שירות (microservice) של Frontend בהמשך. המונולית שלך פועל באופן מלא ב-Kubernetes!

6. העברת הזמנות למיקרו-שירות (microservice)

עכשיו, אחרי שאתר המונולית הקיים שלנו פועל ב-GKE, אנחנו יכולים להתחיל לפצל כל שירות למיקרו-שירות (microservice). בדרך כלל צריך לתכנן את השירותים כדי לחלק את השירותים לחלקים קטנים יותר, בדרך כלל סביב חלקים ספציפיים באפליקציה, כמו הדומיין של העסק. למטרות הדגמה, יצרנו דוגמה טריוויאלית וחילקנו את השירותים לפי הדומיין של העסק, הזמנות, מוצרים וממשק קצה. הקוד כבר הועבר ואנחנו נתמקד ביצירה ובפריסה של השירותים ב-Google Kubernetes Engine (GKE).

יצירת מיקרו-שירות (microservice) חדשות להזמנות

השירות הראשון שנציע לו הוא שירות ההזמנות. אנחנו נשתמש ב-codebase הנפרד וניצור קונטיינר נפרד של Docker לשירות הזה.

יצירת קונטיינר Docker באמצעות Google Cloud Build

מכיוון שכבר העברנו את ה-codebase בשבילך, השלב הראשון יהיה יצירת קונטיינר Docker של שירות ההזמנות שלנו באמצעות Google Cloud Build.

בדרך כלל צריך לנקוט גישה דו-שלבית שכוללת פיתוח קונטיינר Docer ודחיפה שלו למרשם כדי לאחסן את התמונה ש-GKE תשלוף ממנה. אבל נוכל לעשות את החיים קלים יותר – אנחנו יכולים להשתמש ב-Google Cloud Build כדי לפתח את הקונטיינר של Docker ולהעביר את קובץ האימג' ל-Google Cloud Container Registry בפקודה אחת! כך אנחנו יכולים להנפיק פקודה אחת לבניית קובץ האימג' שלנו ולהעברה שלו למרשם הקונטיינרים. כאן אפשר לראות את התהליך הידני של יצירת קובץ Docker ודחיפה שלו.

מערכת Google Cloud Build תדחס את הקבצים מהספרייה ותעביר אותם לקטגוריה של Google Cloud Storage. לאחר מכן, תהליך ה-build תיקח את כל הקבצים מהקטגוריה וישתמש בקובץ ה-Docker כדי להריץ את תהליך ה-build של Docker. מכיוון שציינו את הדגל --tag עם המארח כ-gcr.io עבור תמונת ה-Docker, תמונת ה-Docker שתתקבל תועבר ל-Google Cloud Container Registry.

כדי לפתח את הקונטיינר ב-Docker מריצים את הפקודות הבאות ודוחפים אותו ל-Google Container Registry:

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/orders: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>/orders:1.0.0  SUCCESS

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

4c753ede203255f6.png

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

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

6e88ed1643dfe629.png

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

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

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

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

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

הפקודה kubectl create deployment שבהמשך גורמת ל-Kubernetes ליצור פריסה בשם orders באשכול עם רפליקה 1.

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

kubectl create deployment orders --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/orders:1.0.0

אימות הפריסה

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

kubectl get all

פלט:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-779c8d95f5-dxnzl   1/1     Running   0          15h
pod/orders-5bc6969d76-kdxkk     1/1     Running   0          21s
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.39.240.1     <none>         443/TCP        19d
service/monolith     LoadBalancer   10.39.241.130   34.74.209.57   80:30412/TCP   15h
NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1/1     1            1           15h
deployment.apps/orders     1/1     1            1           21s
NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-779c8d95f5   1         1         1       15h
replicaset.apps/orders-5bc6969d76     1         1         1       21s

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

חשיפת קונטיינר GKE

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

כשפרסנו את שירות ההזמנות שלנו, חשפנו אותו ביציאה 8081 באופן פנימי באמצעות פריסה של Kubernetes. כדי לחשוף את השירות הזה לגורם חיצוני, צריך ליצור שירות Kubernetes מסוג Load Balancer, שינתב תעבורת נתונים ביציאה 80 באופן חיצוני ליציאה הפנימית 8081 של שירות ההזמנות. מריצים את הפקודה הבאה כדי לחשוף את האתר לאינטרנט:

kubectl expose deployment orders --type=LoadBalancer --port 80 --target-port 8081

גישה לשירות

מערכת GKE מקצה את כתובת ה-IP החיצונית למשאב השירות ולא לפריסה. כדי לברר מהי כתובת ה-IP החיצונית ש-GKE הקצה לאפליקציה שלכם, אפשר לבדוק את השירות באמצעות הפקודה kubectl get service:

kubectl get service orders

פלט:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
orders       10.3.251.122    203.0.113.0     80:30877/TCP     3d

אחרי שקובעים את כתובת ה-IP החיצונית של האפליקציה, מעתיקים אותה. כדאי לשמור אותו לשלב הבא כשנחליף את המונולית שלנו לשירות ההזמנות החדש!

הגדרה מחדש של מונולית

מכיוון שהסרנו את שירות ההזמנות מהמונולית, ניאלץ לשנות את המונולית כך שיפנה למיקרו-שירות החיצוני החדש של Orders.

כשמפרקים מונולית, אנחנו מסירים קטעי קוד מבסיס קוד יחיד למספר רב של מונולית ופורסים אותם בנפרד. המיקרו-שירות (microservice) פועל בשרת אחר, ולכן כבר אי אפשר להפנות לכתובות ה-URL של השירותים שלנו כנתיבים מוחלטים, לכן אנחנו צריכים נתיב לכתובת השרת החדשה של המיקרו-שירות (microservice) של ההזמנות. הערה: יש צורך בזמן השבתה של השירות המונולית כדי לעדכן את כתובת ה-URL של כל שירות שלא היה פעיל. חשוב להביא זאת בחשבון כשמתכננים להעביר את המיקרו-שירותים (microservices) והמונולית לסביבת הייצור במהלך תהליך ההעברה של מיקרו-שירותים (microservices).

אנחנו צריכים לעדכן את קובץ התצורה במונולית שלנו כך שיפנה לכתובת ה-IP החדשה של מיקרו-שירותים (microservices) של Orders. אפשר להשתמש בעורך הננו כדי להחליף את כתובת ה-URL המקומית בכתובת ה-IP של מיקרו-שירות (microservice) החדש של Orders. מריצים את הפקודה הבאה כדי לערוך את

cd ~/monolith-to-microservices/react-app
nano .env.monolith

כשהעורך נפתח, הקובץ אמור להיראות כך:

REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

מחליפים את REACT_APP_ORDERS_URL בפורמט החדש בזמן ההחלפה בכתובת ה-IP של המיקרו-שירות (microservice) של ההזמנות, כדי שהכתובות יהיו תואמות לנתונים הבאים:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

כדי לשמור את הקובץ בעורך הננו, מקישים על CTRL+O, על ENTER ואז על CTRL+X.

כדי לבדוק את המיקרו-שירות (microservice) החדש, אפשר לעבור לכתובת ה-URL שהגדרת עכשיו בקובץ הזה. דף האינטרנט אמור להחזיר תגובת JSON מהמיקרו-שירות של ההזמנות.

בשלב הבא נצטרך לבנות מחדש את הקצה הקדמי המונולית שלנו ולחזור על תהליך ה-build כדי לפתח את הקונטיינר למונולית ולפרוס אותו מחדש באשכול GKE. מריצים את הפקודות הבאות כדי להשלים את השלבים:

בנייה מחדש של קובצי התצורה של Monolith

npm run build:monolith

יצירת קונטיינר Docker באמצעות Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

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

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

תוכל לוודא שהאפליקציה שלך מגיעה עכשיו למיקרו-שירות (microservice) החדש של Orders על ידי מעבר לאפליקציה המונולית בדפדפן וניווט לדף Orders. כל מזהי ההזמנות צריכים להסתיים בסיומת -MICROSERVICE, כפי שמוצג בהמשך:

1cdd60bb0d4d1148.png

7. העברת מוצרים למיקרו-שירות (microservice)

יצירת מיקרו-שירות (microservice) למוצרים חדשים

אנחנו יכולים להמשיך להשיק את השירותים שלנו על ידי העברת השירות 'מוצרים' הבא. נבצע את אותו תהליך כמו בשלב הקודם. מריצים את הפקודות הבאות כדי לפתח קונטיינר ב-Docker, לפרוס את הקונטיינר ולחשוף אותו אליו דרך שירות Kubernetes.

יצירת קונטיינר Docker באמצעות Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0 .

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

kubectl create deployment products --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/products:1.0.0

חשיפת קונטיינר GKE

kubectl expose deployment products --type=LoadBalancer --port 80 --target-port 8082

מוצאים את כתובת ה-IP הציבורית של שירותי המוצרים שלנו באותו אופן שבו עשינו את שירות ההזמנות שלנו באמצעות הפקודה הבאה:

kubectl get service products

פלט:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
products     10.3.251.122    203.0.113.0     80:30877/TCP     3d

שומרים את כתובת ה-IP לשלב הבא כשנגדיר מחדש את המונולית שלנו כך שיצביע אל מיקרו-שירות (microservice) החדש של 'מוצרים'.

הגדרה מחדש של מונולית

משתמשים בעורך הננו כדי להחליף את כתובת ה-URL המקומית בכתובת ה-IP של המיקרו-שירותים (microservices) החדשים שלנו למוצרים:

cd ~/monolith-to-microservices/react-app
nano .env.monolith

כשהעורך נפתח, הקובץ אמור להיראות כך:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

מחליפים את REACT_APP_PRODUCTS_URL בפורמט החדש בזמן ההחלפה בכתובת ה-IP של מיקרו-שירות (microservice) של המוצר, כדי שהכתובת תהיה תואמת לנתונים הבאים:

REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products

כדי לשמור את הקובץ בעורך הננו, מקישים על CTRL+O, על ENTER ואז על CTRL+X.

כדי לבדוק את המיקרו-שירות (microservice) החדש, אפשר לעבור לכתובת ה-URL שהגדרת עכשיו בקובץ הזה. דף האינטרנט אמור להחזיר תגובת JSON מהמיקרו-שירות של המוצרים שלנו.

בשלב הבא נצטרך לבנות מחדש את הקצה הקדמי המונולית שלנו ולחזור על תהליך ה-build כדי לפתח את הקונטיינר למונולית ולפרוס אותו מחדש באשכול GKE. מריצים את הפקודות הבאות כדי להשלים את השלבים:

בנייה מחדש של קובצי התצורה של Monolith

npm run build:monolith

יצירת קונטיינר Docker באמצעות Google Cloud Build

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0 .

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

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:3.0.0

כדי לוודא שהאפליקציה שלך מגיעה עכשיו למיקרו-שירות (microservice) החדש 'מוצרים', צריך לעבור לאפליקציית המונולית בדפדפן ולעבור לדף 'מוצרים'. כל שמות המוצרים צריכים להיות בקידומת MS- , כפי שמוצג בהמשך:

5389b29f4b8c7c69.png

8. העברת Frontend ל-Microservice

השלב האחרון בתהליך ההעברה הוא העברת הקוד של הקצה הקדמי למיקרו-שירות (microservice) וכיבוי המונולית! אחרי שהשלב הזה יושלם, נעביר בהצלחה את המונולית שלנו לארכיטקטורת מיקרו-שירותים (microservices).

יצירת מיקרו-שירות (microservice) של Frontend חדש

נבצע את אותו תהליך כמו בשני השלבים האחרונים כדי ליצור מיקרו-שירות (microservice) בממשק קצה חדש.

בעבר כשבנינו מחדש את המונולית, עדכנו את ההגדרה כך שהיא תכוון למונולית שלנו, אבל עכשיו אנחנו צריכים להשתמש באותה הגדרה במיקרו-שירות של הקצה הקדמי. מריצים את הפקודות הבאות כדי להעתיק את קובצי התצורה של כתובות ה-URL של המיקרו-שירותים ל-codebase של מיקרו-שירות (microservice) של Frontend:

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build

לאחר השלמתו, נבצע את אותו תהליך כמו השלבים הקודמים. מריצים את הפקודות הבאות כדי לפתח קונטיינר ב-Docker, לפרוס את הקונטיינר ולחשוף אותו אליו דרך שירות Kubernetes.

יצירת קונטיינר Docker באמצעות Google Cloud Build

cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0 .

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

kubectl create deployment frontend --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/frontend:1.0.0

חשיפת קונטיינר GKE

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

מחיקת המונולית

עכשיו, כשכל השירותים שלנו פועלים כמיקרו-שירותים, אנחנו יכולים למחוק את אפליקציית המונולית שלנו. חשוב לשים לב שהעברה בפועל תגרום גם לשינויים ב-DNS וכו', שיגרמו לשמות הדומיינים הקיימים שלנו להפנות למיקרו-שירותים (microservices) החדשים של הקצה הקדמי של האפליקציה שלנו. מריצים את הפקודות הבאות כדי למחוק את המונולית שלנו:

kubectl delete deployment monolith
kubectl delete service monolith

בודקים את העבודה

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

kubectl get services

הפלט שלכם אמור להיראות כך:

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)        AGE
frontend     LoadBalancer   10.39.246.135   35.227.21.154    80:32663/TCP   12m
kubernetes   ClusterIP      10.39.240.1     <none>           443/TCP        18d
orders       LoadBalancer   10.39.243.42    35.243.173.255   80:32714/TCP   31m
products     LoadBalancer   10.39.250.16    35.243.180.23    80:32335/TCP   21m

אחרי שקובעים את כתובת ה-IP החיצונית עבור מיקרו-שירות של Frontend, מעתיקים את כתובת ה-IP. מפנים את הדפדפן לכתובת ה-URL הזו (למשל http://203.0.113.0) כדי לבדוק אם יש גישה לקצה הקדמי. האתר שלכם צריך להיות זהה לזה שהיה לפני שפוצלנו את המונולית למיקרו-שירותים!

9. הסרת המשאבים

ברגע שתהיו מוכנים, הדרך הקלה ביותר לנקות את כל הפעילויות שבוצעו היא למחוק את הפרויקט. מחיקת הפרויקט תמחק את כל המשאבים שנוצרו ב-Codelab הזה כדי להבטיח שלא יתבצעו חיובים חוזרים בלתי צפויים. מבצעים את הפעולות הבאות ב-Cloud Shell, כאשר PROJECT_ID הוא מזהה הפרויקט המלא ולא רק שם הפרויקט.

gcloud projects delete [PROJECT_ID]

כדי לאשר את המחיקה, מזינים 'Y'. כשמוצגת הנחיה לעשות זאת.

10. מעולה!

פירטתם את האפליקציה המונוליתית שלכם למיקרו-שירותים (microservices) ופרסתם אותם ב-Google Kubernetes Engine!

השלבים הבאים

כדי לקבל מידע נוסף על Kubernetes, מומלץ לעיין ב-Codelabs הבאים:

משאבים נוספים