בדוגמה המתקדמת הזו נדגים איך ליצור אפליקציית יומן שמשתמשת ב-Node.js לקצה הקדמי וב-MySQL לבק-אנד. התבנית גם יוצרת ומקשרת מאזן עומסים של HTTP שמבצע איזון עומסים בשני אזורים, ומנגנון לשינוי גודל אוטומטי שמשנה את גודל האפליקציה באופן אוטומטי.
בדוגמה הזו אנחנו מניחים שאתם מכירים את קונטיינרים של Docker, וגם את המשאבים של Compute Engine, במיוחד איזון עומסים של HTTP, התאמה אוטומטית לעומס, קבוצות מופעי מכונה מנוהלים ותבניות של הגדרות מכונה.
מדריכים נוספים למתחילים זמינים במדריך למתחילים או במדריך המפורט.
לפני שמתחילים
- אם רוצים להשתמש בדוגמאות לשורת הפקודה במדריך הזה, צריך להתקין את כלי שורת הפקודה`gcloud`.
- כדי להשתמש בדוגמאות ל-API במדריך הזה, צריך להגדיר גישה ל-API.
- יש לכם ידע באיזון עומסים ב-HTTP ב-Compute Engine.
- יש לכם ידע בקונטיינרים של Docker.
יצירת תבניות
בדוגמה הזו מופעל פריסה עם כמה סוגים של משאבים. כדי להתחיל, יוצרים תבניות לשימוש חוזר שמגדירות את המשאבים האלה בנפרד. בהמשך תשתמשו בתבניות האלה בהגדרה הסופית.
בסוף הדוגמה הזו, הפריסה תכיל את המשאבים הבאים:
- מכונה אחת של Compute Engine למכונה הווירטואלית של MySQL בקצה העורפי.
- תבנית של הגדרות מכונה שמשתמשת בקובץ אימג' של Docker.
- שתי קבוצות של מופעי מכונה מנוהלים עם התאמה אוטומטית לעומס (autoscaling) בשני אזורים שונים, שמריצות את שירות ה-frontend node.js.
- עוד שתי קבוצות מופעי מכונה מנוהלים עם שינוי גודל אוטומטי, שמציגות נתונים סטטיים.
- בדיקת תקינות ומאזן עומסים מסוג HTTP כדי להפיץ את התנועה בין קבוצות המופעים המנוהלות המתאימות.
יצירת תבניות ה-Backend
הקצה העורפי של האפליקציה הזו הוא מכונה וירטואלית אחת ב-Compute Engine שמריצה קונטיינר של MySQL Docker. יוצרים תבנית שמגדירה מכונה של Compute Engine שמשתמשת בתמונה שעברה אופטימיזציה לקונטיינרים. נותנים לקובץ את השם container_vm.[py|jinja]:
Jinja
Python
בתבנית מוגדרים מספר משתנים, כמו containerImage ו-manifest, שיוזנו כשמגדירים את ההגדרות. התבנית הזו יוצרת רק מופע אחד של מכונה וירטואלית (VM).
כשמשתמשים בקובצי אימג' של קונטיינרים במכונות של Compute Engine, צריך גם לספק קובץ מניפסט (שונה ממניפסט של Deployment Manager) כדי לתאר ל-Compute Engine באיזה קובץ אימג' של קונטיינר להשתמש. יוצרים שיטת עזר בשם container_helper.[py|jinja] כדי להגדיר באופן דינמי את מניפסט מאגר התגים:
Jinja
Python
יצירת תבניות frontend
הקצה הקדמי של האפליקציה הזו מריץ Node.js ומאפשר למשתמשים לשלוח הודעות בדף אינטרנט. יהיו שתי קבוצות של מופעי מכונה מנוהלים שמכילות שני מופעים כל אחת: קבוצה ראשית של מופעי מכונה מנוהלים וקבוצה משנית של מופעי מכונה מנוהלים לאיזון עומסים.
כדי ליצור את תבניות הקצה הקדמי האלה, פועלים לפי ההוראות הבאות.
יוצרים תבנית של הגדרות מכונה.
כדי ליצור קבוצה של מופעי מכונה מנוהלים (MIG), צריך משאב מסוג Instance Template (תבנית מכונה). קבוצה כזו היא קבוצה של מופעים זהים של מכונות וירטואליות שמנוהלים באופן מרכזי. בדוגמה הזו נוצרת קבוצת מופעי מכונה מנוהלים עבור מופעי Node.js של קצה קדמי, אבל קודם צריך ליצור את תבנית של הגדרות מכונה.
מגדירים קובץ בשם
container_instance_template.[py|jinja]:Jinja
Python
יצירת קבוצה של מופעי מכונה מנוהלים עם שינוי גודל אוטומטי.
עכשיו שיש לכם תבנית של הגדרות מכונה, אתם יכולים להגדיר תבנית שמשתמשת בתבנית של הגדרות מכונה כדי ליצור קבוצת מופעי מכונה מנוהלים עם שינוי גודל אוטומטי. יוצרים קובץ חדש בשם
autoscaled_group.[py|jinja]עם התוכן הבא:Jinja
Python
יוצרים את קובץ הסכימה המתאים:
Jinja
Python
יוצרים משאבים באמצעות התבניות האלה.
עד עכשיו הגדרתם תבניות בסיס שקובעות את המאפיינים של המשאבים. באמצעות התבניות האלה, מגדירים את ההגדרה של חזית האתר. יוצרים קובץ חדש בשם
service.[py|jinja]עם התוכן הבא:Jinja
Python
יוצרים את קובץ הסכימה המתאים:
Jinja
Python
הנה פירוט של מה שהתבנית הזו יוצרת:
שתי קבוצות של מופעי מכונה מנוהלים, אחת ראשית ואחת משנית.
התבנית משתמשת בתבנית
autoscaled_group.[py|jinja]כדי ליצור קבוצת מופעי מכונה מנוהלים עם קנה מידה אוטומטי, ראשונית ומשנית.לאחר מכן, התבנית יוצרת שירות קצה עורפי ובודק תקינות. שירות לקצה העורפי נדרש לאיזון עומסים של HTTP, והוא מגדיר את יכולת ההגשה של קבוצות המכונות בשירות הזה לקצה העורפי. במקרה כזה, קבוצות המופעים המנוהלות הראשיות והמשניות הן חלק מהקצה העורפי הזה, ומאפייני ברירת המחדל של שירות הקצה העורפי חלים.
כברירת מחדל, שירות קצה עורפי מבצע איזון עומסים על סמך ניצול המעבד של קבוצות המופעים המשויכות, אבל אפשר גם לבצע איזון עומסים על סמך בקשות לשנייה (RPS).
הערה: תמיד נדרשת בדיקת תקינות כשיוצרים שירות לקצה העורפי.
יצירת תבנית מאחדת
לבסוף, יוצרים תבנית מאחדת שמשלבת בין תבניות ה-backend וה-frontend. יוצרים קובץ חדש בשם application.[py|jinja]:
Jinja
Python
יוצרים קובץ סכימה תואם:
Jinja
Python
בנוסף לחלק הקדמי ולחלק האחורי, התבנית מגדירה גם כמה משאבים נוספים:
שירות סטטי עם קבוצות ראשיות ומשניות של מופעי מכונה מנוהלים. השירות הסטטי הזה מציג דף אינטרנט שנמצא בנתיב
/staticבאפליקציה.משאב של מפת כתובות URL. כדי להשתמש באיזון עומסים של HTTP, צריך למפות את כתובות ה-URL השונות לנתיבים הנכונים באמצעות מפת URL. במקרה הזה, נתיב ברירת המחדל, שמצוין על ידי המאפיין
defaultService, הוא שירות הקצה העורפי שיצרתם קודם. אם משתמש עובר אל/static, מפת ה-URL תמפה את הנתיב הזה לשירות הסטטי, כפי שמוגדר בקטעpathMatchers.כלל העברה גלובלי ושרת proxy של HTTP ביעד. מכיוון שהאפליקציה מאוזנת בעומס בין שני אזורים נפרדים, תצטרכו כלל העברה גלובלי שמשרת כתובת IP חיצונית אחת. בנוסף, נדרש HTTP proxy ליעד להגדרת איזון עומסים של HTTP.
כלל חומת אש שמאפשר תעבורה דרך יציאה 8080.
יצירת ההגדרה
אחרי שהתבניות והסכימות הקשורות מוכנות, אפשר ליצור הגדרה לפריסת המשאבים האלה. יוצרים קובץ הגדרות בשם application.yaml עם התוכן הבא, ומחליפים את הערכים ZONE_TO_RUN ו-SECONDARY_ZONE_TO_RUN בתחומי הזמינות הראשי והמשני שאתם בוחרים.
Jinja
Python
פריסת ההגדרה
עכשיו נבצע פריסה של המשאבים. מריצים את הפקודה הבאה באמצעות Google Cloud CLI, ואפשר גם להחליף את advanced-configuration-l7 בשם פריסה לבחירתכם. חשוב לזכור ששם הפריסה ישמש באופן אוטומטי לשמות המשאבים.
בדוגמה הזו, שם הפריסה הוא advanced-configuration-l7. אם בוחרים לשנות את שם הפריסה, צריך להשתמש בשם הפריסה הזה בכל הדוגמאות הבאות.
gcloud deployment-manager deployments create advanced-configuration-l7 --config application.yaml
התגובה אמורה להיראות כמו המשאבים הבאים:
Waiting for create operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0...done. Create operation operation-1469468950934-5387966d431f0-49b11bc4-1421b2f0 completed successfully. NAME TYPE STATE ERRORS advanced-configuration-l7-application-fw compute.v1.firewall COMPLETED [] advanced-configuration-l7-application-l7lb compute.v1.globalForwardingRule COMPLETED [] advanced-configuration-l7-application-targetproxy compute.v1.targetHttpProxy COMPLETED [] advanced-configuration-l7-application-urlmap compute.v1.urlMap COMPLETED [] advanced-configuration-l7-backend compute.v1.instance COMPLETED [] advanced-configuration-l7-frontend-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-frontend-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-frontend-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-frontend-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-frontend-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-frontend-sec-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-bes compute.v1.backendService COMPLETED [] advanced-configuration-l7-static-service-hc compute.v1.httpHealthCheck COMPLETED [] advanced-configuration-l7-static-service-it compute.v1.instanceTemplate COMPLETED [] advanced-configuration-l7-static-service-pri-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-pri-igm compute.v1.instanceGroupManager COMPLETED [] advanced-configuration-l7-static-service-sec-as compute.v1.autoscaler COMPLETED [] advanced-configuration-l7-static-service-sec-igm compute.v1.instanceGroupManager COMPLETED []
הוספת תוויות שירות
לאחר מכן, מציינים את תוויות השירות המתאימות לקבוצות המנוהלות של המופעים. תוויות שירות הן מטא-נתונים שמשמשים את שירות איזון העומסים לקיבוץ משאבים.
כדי להוסיף תוויות שירות, מריצים את הפקודות הבאות, בהתאמה לאזורים הראשיים והמשניים לאזורים שבחרתם בקובץ הגדרות הפריסה:
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-pri-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [PRIMARY_ZONE]
gcloud compute instance-groups unmanaged set-named-ports advanced-configuration-l7-frontend-sec-igm \
--named-ports http:8080,httpstatic:8080 \
--zone [SECONDARY_ZONE]
בדיקת ההגדרה
כדי לבדוק את ההגדרה, מקבלים את כתובת ה-IP החיצונית שמשרתת תנועה על ידי שליחת שאילתה לכלל ההעברה:
gcloud compute forwarding-rules list | grep advanced-configuration-l7-l7lb advanced-configuration-l7-l7lb 107.178.249.126 TCP advanced-configuration-l7-targetproxy
במקרה הזה, כתובת ה-IP החיצונית היא 107.178.249.126.
בדפדפן, נכנסים לכתובת ה-IP החיצונית ביציאה 8080. לדוגמה, אם כתובת ה-IP החיצונית שלכם היא 107.178.249.126, כתובת ה-URL תהיה:
http://107.178.249.126:8080
אמור להופיע דף ריק, וזה צפוי. לאחר מכן, מפרסמים הודעה בדף. עוברים לכתובת ה-URL הבאה:
http://107.178.249.126:8080?msg=hello_world!
יופיע אישור שההודעה נוספה. חוזרים לכתובת ה-URL הראשית. עכשיו אמורה להופיע בדף ההודעה:
hello_world!
אפשר גם להיכנס לדף הסטטי שיצרתם או לבדוק את תקינות האפליקציה באמצעות כתובות ה-URL הבאות:
# Static web page
http://107.178.249.126:8080/static
# Health check
http://107.178.249.126:8080/_ah/health
הגדרתם את התצורה בהצלחה.
(אופציונלי) יצירת תמונות Docker
Docker מאפשרת לכם להריץ תוכנה בתוך קונטיינרים באופן אוטומטי. קונטיינרים מאפשרים לבודד שירותים שונים בתוך קונטיינרים שיכולים לפעול כולם על מכונת Linux אחת.
בדוגמה הזו נעשה שימוש בכמה קובצי אימג' קיימים של Docker, אבל אפשר גם ליצור גרסאות משלכם של קובצי האימג' האלה של Docker. הוראות ליצירת תמונות של קצה העורפי (backend) של MySQL ותמונות של קצה חזיתי (frontend) של Node.js מופיעות בקטע יצירת תבניות משאבים.
כדי ליצור את קובץ אימג' של Docker שמציג את דף האינטרנט הסטטי:
יוצרים מכונה וירטואלית חדשה עם קובץ אימג' שמותאם לקונטיינרים:
gcloud compute instances create docker-playground \ --image-family container-vm \ --image-project google-containers \ --zone us-central1-a \ --machine-type f1-microמתחברים למכונה:
gcloud compute ssh --zone us-central1-a docker-playgroundיוצרים קובץ בשם
Dockerfileעם התוכן הבא:FROM node:latest RUN mkdir /var/www/ ADD service.js /var/www/service.js WORKDIR /var/www/ RUN npm install mysql CMD ["node", "service.js"]יוצרים קובץ בשם
service.jsעם התוכן הבא:var http = require('http'); var url = require('url'); console.log('Started static node server') http.createServer(function (req, res) { reqUrl = url.parse(req.url, true); res.useChunkedEncodingByDefault = false; res.writeHead(200, {'Content-Type': 'text/html'}); if (reqUrl.pathname == '/_ah/health') { res.end('ok'); } else if (reqUrl.pathname == '/exit') { process.exit(-1) } else { res.end('static server'); } }).listen(8080, '0.0.0.0'); console.log('Static server running at http://127.0.0.1:8080/');יוצרים את קובץ האימג' של Docker, ומחליפים את
usernameבשם המשתמש שלכם ב-Docker Hub. אם אין לכם שם משתמש ב-Docker Hub, צריך ליצור שם משתמש לפני שיוצרים את קובץ האימג' של Docker.sudo docker build --no-cache -t username/nodejsservicestatic .מעבירים את התמונות למאגר Docker:
sudo docker push username/nodejsservicestatic
עכשיו יש לכם את קובצי האימג' של Docker להפעלת Node.js ו-MySQL. אפשר לראות את התמונות האלה במאגר על ידי חיפוש השמות של התמונות. כדי לנסות את התמונות, אפשר להחליף את כל המופעים של gcr.io/deployment-manager-examples/mysql ושל gcr.io/deployment-manager-examples/nodejsservice בתמונות המתאימות.
השלבים הבאים
אחרי שתסיימו את הדוגמה הזו, תוכלו:
- אפשר להמשיך את הדוגמה הזו וליצור דף אינטרנט חזק יותר, או להוסיף עוד שירותים לשרת האינטרנט.
- מידע נוסף על הגדרות או על פריסות
- אפשר לנסות ליצור הגדרות משלכם.