מאמר זה הינו מדריך STEP BY STEP שמטרתו להציג כיצד ניתן להפיץ את הקוד שלכם לאפליקציה מרופלקת שרצה על קוברניטיס.
במדריך זה ניצור אפליקציית Node.js וניצר מהאפליקציה Docker קונטיינר,
נפיץ אותו אל קוברניטיס (Kubernetis engine) ונגרום לו לגדול (Scale Up).
להלן תרשים של החלקים השונים שישתתפו בפרויקט כדי להבין איך כל המרכיבים מתחברים יחד.
קוברניטיס הוא פרויקט קוד פתוח kubernetes.io, אפשר להריץ אותו בסביבות רבות ומגוונות, החל ממחשבים ניידים ועד למערכות H/A עם קלסטרים בעלי Nodeים רבים.
תחילה, תתחברו לחשבון שלכם ב- GCP ותפעילו את Google Cloud Shell:
כדי להפעיל את Google Cloud Shell יש ללחוץ על הכפתור הבא בתפריט העליון הימני
לא מכירים את Google Cloud Shell? לחצו כאן
יפתח CONSOLE ולאחר כמה שניות תקבלו הודעה Welcome To Cloud Shell
על מנת לבדוק באיזה פרויקט אתם נמצאים תלחצו
gcloud auth list
ב- Command Line u ותקבלו פירוט של החשבון.
Gcloud הוא כלי שורת פקודה חזק ואינטגרלי ל- Google Cloud Platform, הוא מגיע כבר מותקן מראש ב- Cloud Shell ואף תומך בהשלמות Tab.
עכשיו נתחיל בכיף האמיתי- תחילה ניצור את אפליקציית ה- Node.js שלנו ולצורך זה נשתמש ב Cloud Shell.
vi server.js
תתחילו לערוך בעזרת לחיצה על האות i
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello IsraelClouds Readers!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
שמרו את הקובץ (תלחצו על הכפתור Esc ואז על :wq)
היות ו- node executable כבר מותקן ב- Cloud Shell אפשר להריץ את הפקודה הבאה:
node server.js
עכשיו אנו נשתמש בפיצ'ר נחמד של Cloud Shell בשם Web Preview Feature כדי לפתוח דפדפן חדש ויזום קריאת Proxy ל- Instance שיצרנו (הכפתור נמצא בתפריט בצד ימין של Cloud Shell).
לפני שנמשיך נעצור את ה- node server על ידי לחיצה על Ctrl-c בתוך .Cloud Shell
תבצעו REFRESH על הדף ותקבלו הודעה שגיאה (מכיוון שעצרנו את האפליקציה)
Error: Could not connect to Cloud Shell on port 8080.
Ensure your server is listening on port 8080 and try again.
בשלב הבא ויותר חשוב אנו נעטוף את האפליקציה ב- Docker Container ולשם כך ניצור Docker container image.
Docker יכול לייצר Images בצורה אוטומטית ע"י קריאה וביצוע של ההוראות מקובץ DockerFile לכן אנו נתחיל ביצירה של Dockerfile על ידי כך שב- command line של cloud shell נרשום:
vi Dockerfile
תלחצו על האות i כדי לערוך ותוסיפו לקובץ את התוכן הבא:
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
שמרו את הקובץ על ידי לחיצה על הכפתור esc ולאחר מכן על :wq (שמירה רגילה ב-vi)
ועכשיו הסבר לקובץ dockerfile:
• התחל מה- Node Image שנמצא ב- Docker hub
• חשיפת פורט 8080
• העתק את הקובץ server.js לתוך ה Image
• הרץ/התחל את node server (כמו שעשינו מקודם ידנית)
עכשיו ניצור Image עם הפרטים הבאים:
docker build -t gcr.io/PROJECT_ID/hello-israelclouds:ver1 .
לדוגמא:
docker build -t gcr.io/qwiklabs-gcp-63ead51c6418b7c0_ID/hello-israelclouds:ver1 .
חשוב לשים לב שכל האותיות צריכות להיות lower case לכן על ה- ID בשורה למעלה תקבלו הודעה שגיאה.
docker build -t gcr.io/qwiklabs-gcp-63ead51c6418b7c0_id/hello-israelclouds:ver1 .
** חשוב לשנות את PROJECT_ID במספר האמיתי של הפרויקט שלכם. ניתן לברר את מספר הפרויקט על ידי הרצה של
gcloud config list project
ייקח מעט זמן להוריד ולייצא (extract) הכל. תוכלו לעקוב אחר ההתקדמות ב- progress bar, בסיום נבדוק את ה- Image לוקלית עם הפקודה הבאה אשר תריץ את ה- Docker Container כ- Deamon בפורט 8080 מה- container image החדש שיצרנו.
docker run -d -p 8080:8080 gcr.io/PROJECT_ID/hello-israelclouds:ver1
0950e858c9b5c820e384e5e2a752c25391218d55a02edf254c2e6c1fe0306523
נשתמש שוב ביכולת של Cloud Shell בשם Web preview על הפורט שרשמנו 8080
אפשרות נוספת לבדיקה היא השימוש בפקודת curl מתוך Cloud Shell
curl http://localhost:8080
ואתם אמורים לקבל את התשובה Hello IsraelClouds Readers!
עכשיו, נעצור את ה- Docker ותחילה נחפש אותו על ידי הרצת
docker ps
חפשו את ה- Container Id (השדה הראשון) ותריצו
docker stop [CONTAINER ID]
לאחר שווידאתם שה- Image רץ בצורה טובה וכפי שרצינו, נרשום/נדחוף אותו ל- Google Container Registry שזהו מאגר פרטי עבור ה- Docker Images והוא נגיש מהפרויקטים שלכם ב- GCP.
gcloud docker -- push gcr.io/PROJECT_ID/hello-israelclouds:ver1
תהליך הדחיפה בפעם הראשונה עשוי לקחת כמה דקות, בסיום התהליך ה- container יהיה רשום ב- console שלכם תחת Tools > Container Registry
כל הכבוד לכם! עכשיו יש לכם פרויקט זמין של docker image- אותו קוברניטיס יכול לגשת אליו ו"לנהל" אותו (orchestrate).
עכשיו ניצור את ה- CLUSTER שלנו- Container Engine cluster.
הקלאסטר בנוי משרת Kubernetes master API ש"יושב" על גוגל (hosted on google) ומקבוצה של Workers Nodes.
ה- Workers Nodes יהיו מכונות וירטואליות. (compute engine)
תחילה נוודא שאנחנו במקום (בפרויקט) הנכון:
gcloud config set project PROJECT_ID
לאחר מכן ניצור קלאסטר ובו 2 מכונות מסוג n1-standard-1
gcloud container clusters create hello-israelcloudsreaders \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-a
כמובן שישנה אפשרות ליצירת הקלסטר היא ע"י הconsole דרך המסלול הבא:
Kubernetes Engine > Kubernetes clusters > Create cluster.
מומלץ ליצור את הקלסטר באותו אזור כמו דלי האחסון (bucket) המשמש את container registry.
שוב ברכות! עכשיו יש לכם Kubernetes cluster הפועל באופן מלא, ומופעל על ידי Kubernetes Engine
עכשיו זה הזמן לפרוס את האפליקציה הקונטיינרית (containerized application) שלכם אל ה- Kubernetes cluster.
Pod או Kubernetes Pod הוא קבוצה של קונטיינרים שמחוברים ביחד בשל היבטים של אדמיניסטרציה ותקשורת.
Pod יכול להכיל קונטיינר אחד או קונטיינרים רבים.
בדוגמא זו נשתמש בקונטיינר אחד שבנינו בשלב קודם עם Node.js Image Stored אשר אוחסן ב- container registry הפרטי שלנו, השירות יינתן דרך פורט 8080.
מעכשיו נשתמש בפקודה kubectl שכמובן היא מקונפגת מראש בסביבת ה- Cloud Shell שלכם.
kubectl run hello-israelcloudsnode --image=gcr.io/PORJECT_ID/hello-israelclouds:ver1 --port=8080
וזו התשובה שאתם אמורים לקבל
deployment "hello-israelcloudsnode" created
כפי שבוודאי הבחנתם נוצר אובייקט מסוג deployment.
Deployment היא הדרך המומלצת כדי ליצור ולבצע scale של Podים.
כאן Deployment חדש ינהל Pod אחד (single pod replica) שמריץ את ה- IMAGE בשם
hello-israelclouds:ver1
על מנת לראות את ה- deployment שכבר יצרנו
kubectl get deployments
אנו אמורים לראות את Hello-node.
כדי לראות את ה- Pod שנוצר על ידי ה- deployment נריץ
kubectl get pods
ונקבל את Pod שיצרנו.
כברירת מחדל ל- Pod אין אפשרות גישה מבחוץ ועל מנת לאפשר ל- node בקונטיינר שיצרנו גישה מחוץ לרשת הווירטואלית של הקוברניטיס יש צורך לחשוף את ה- Pod כ- Kubernetes Service.
את החשיפה הזו נעשה מתוך Cloud Shell על ידי שילוב של הפקודה kubectl expose
בשילוב עם הדגל --type="LoadBalancer" .
kubectl expose deployment hello-israelcloudsnode --type="LoadBalancer"
התשובה שאנו אמורים לקבל:
service "hello-israelcloudsnode" exposed
הדגל שהשתמשנו בו מציין שאנו נשתמש ב- load-balancer של התשתית הבסיסית במקרה שלנו:
Compute Engine load balancer
חשוב לשים לב שחשפנו את ה- deployment ולא את ה- Pod ישירות, דבר שיאפשר לשירות להעביר עומסים בין כל ה- Podים המנוהלים על ידי ה- deployment (במקרה שלנו מדובר רק באחד אבל אנו נוסיף עוד בהמשך).
ה- Kubernetes master יוצר את ה- load balancer ואת כללי התעבורה(forwarding rules) של המכונות (compute engines), את ה- Target pools, את ה- Firewall rules כדי לאפשר לשירות להיות נגיש באופן מלא גם מחוץ ל- GCP.
כדי לראות את כתובות ה- IP החיצוניות שאפשר לגשת אליהם מבחוץ יש להריץ את הפקודה הבאה:
kubectl get services
אנו מקבלים 2 כתובות IP שרשומים עבור השירות שלנו ושניהם נגישות דרך פורט 8080 אחד מהכתובות הוא הכתובות ה- IP הפנימית שאפשר לגשת אליה רק מתוך רשת התקשורת העננית הווירטואלית, והשניה היא החיצונית.
כעת תהיו מסוגלים לגשת לכתובת ה- IP החיצונית גם מהדפדפן שלכם
כבר בשלב זה הרווחנו כמה דברים מכך שהעברנו את האפליקציה לקונטיינרים וקוברניטיס:
אנחנו לא חייבים לבחור באיזה Host להריץ את האפליקציה או את ה- workload שלנו ואנחנו גם נהנים משירות שהוא מנוטר ושיכול להתחיל את עצמו מחדש.
אחד היתרונות הגדולים של קוברניטיס היא היכולת הקלה שהוא מאפשר לנו לבצע scale לאפליקציה שלנו, נדמיין שאנו צריכים מיידית עוד משאבים רבים לאפליקציה, אנו יכולים בפקודה אחת לומר ל- replication controller לנהל מספר גדול יותר של רפליקות מה-Pod שלנו- כל מה שנדרש הוא הרצה של פקודה אחת
kubectl scale deployment hello-israelcloudsnode --replicas=4
ואנו צריכים לקבל בחזרה
deployment "hello-israelcloudsnode" scaled
כדי לקבל פירוט של ה- deployment המעודכן תריצו:
kubectl get deployment
אתם אמורים לקבל את הפלט הבא
ואפשר גם לקבל מידע על ה- Podים עצמם
kubectl get pods
אנו משתמשים כאן בגישה אחת בשם declarative approach.
במקום להתחיל או לעצור Instances חדשים, אנו קובעים כמה מכונות צריכות לרוץ כל הזמן.
מי שבעצם דואג לכך שהמספר יישאר קבוע הוא Kubernetes reconciliation loops על ידי כך שהוא נוקט צעדים במידה ומשהו קורה (INSTANCE נופל, לא עונה וכו')
להלן דיאגרמה:
בשלב כלשהו המוצר, האפליקציה או השירות שפיתחתם ידרוש תיקון באג, או הוספת פיצ'ר. קוברניטיס עוזר לכם להפיץ גרסה חדשה ל- PRODUCTION מבלי לפגוע בשירות או להשפיע על הלקוחות (משתמשים) שלכם.
כדי לעשות זאת נשנה את האפליצקיה
vi server.js
לחצו על האות i כדי לשנות את התוכן
"Hello IsraelClouds From Kubernetes World!");
לחצו על המקש esc ולאחר מכן על :wq
עכשיו אנחנו יכולים לבנות ולהפיץ container image חדש אל ה- Container Registry עם תג חדש למשל ver2
docker build -t gcr.io/PROJECT_ID/hello-israelclouds:ver2 .
gcloud docker -- push gcr.io/PROJECT_ID/hello-israelclouds:ver2
בניה והפצה מחדש של ה- image צריכה להיות מהירה יותר מהבניה הראשונה מכיוון שאנו נהנים מיכולות ה- caching.
קוברניטיס יעדכן את ה- replication controller שלנו בצורה חלקה לגרסה החדשה של האפליקציה, על מנת לשנות התגית של ה- Image עבור הקונטיינר שרץ ב- Production נצטרך לערוך את ה- deployment hello-israelcloudsnode ולהחליף את ה- image מ:
gcr.io/PROJECT_ID/hello-israelclouds:ver1
ל-
gcr.io/PROJECT_ID/ hello-israelclouds:ver2
על מנת לבצע זאת נשתמש בפקודה kubectl edit אשר פותחת לנו עורך טקסט לאחר ההרצה שמכיל את כל deployment deployment yaml configurationuration.
אין צורך להבין את כל ה- yaml config בשלב אלא זה רק להבין שעל ידי כך שנעדכן את השדה- spec.template.spec.containers.image בקובץ זה, אנו מורים ל- deployment לעדכן את ה- Podים עם ה- Image החדש.
ב- Cloud Shell אנו נלחץ על
kubectl edit deployment hello-israelcloudsnode
ונבצע עדכון לשורה
spec:
containers:
- image: gcr.io/PROJECT_ID/ hello-israelclouds:ver1 ## Update this line ##
ל hello-israelclouds:ver2 כפי שהסברנו מקודם.
לאחר ביצוע השינוי יש ללחוץ על הכפתור esc, וכדי לשמור :wq (כרגיל)
לאחר שתקבלו את השורה הבאה deployment "hello-israelcloudsnode" edited
תדעו שהצלחתם לעדכן.
לבסוף נריץ את הפקודה הבאה
kubectl get deployments
כדי לעדכן את ה- deployment עם ה- Image החדש.
Podים חדשים יווצרו עם ה- image החדש וה- Podים הישנים ימחקו, מה שיפה וטוב בצורת העבודה הזו היא שמשתמשים בשירותים הללו לא ירגישו בעיה ואף שירות לא יפגע.
לאחר זמן קצר המשתמשים יחלו לגשת לגרסה החדשה של האפליקציה.
פרטים נוספים לביצוע rolling updates ניתן למצוא במסמך הבא: http://bit.ly/replication-controller
לאחר שהתנסיתם עם הפצות, scaling, עדכון פיצ'רים ולאחר שהגדרתם את ה- Kubernetes Engine cluster אני בטוח שתסכימו עם הקביעה ש- kubernetes מאפשר לכם להתמקד באפליקציה הרבה יותר מאשר בתשתיות שלכם.
מאת: מערכת IsraelClouds
מאמר זה הינו מדריך STEP BY STEP שמטרתו להציג כיצד ניתן להפיץ את הקוד שלכם לאפליקציה מרופלקת שרצה על קוברניטיס.
במדריך זה ניצור אפליקציית Node.js וניצר מהאפליקציה Docker קונטיינר,
נפיץ אותו אל קוברניטיס (Kubernetis engine) ונגרום לו לגדול (Scale Up).
להלן תרשים של החלקים השונים שישתתפו בפרויקט כדי להבין איך כל המרכיבים מתחברים יחד.
קוברניטיס הוא פרויקט קוד פתוח kubernetes.io, אפשר להריץ אותו בסביבות רבות ומגוונות, החל ממחשבים ניידים ועד למערכות H/A עם קלסטרים בעלי Nodeים רבים.
תחילה, תתחברו לחשבון שלכם ב- GCP ותפעילו את Google Cloud Shell:
כדי להפעיל את Google Cloud Shell יש ללחוץ על הכפתור הבא בתפריט העליון הימני
לא מכירים את Google Cloud Shell? לחצו כאן
יפתח CONSOLE ולאחר כמה שניות תקבלו הודעה Welcome To Cloud Shell
על מנת לבדוק באיזה פרויקט אתם נמצאים תלחצו
gcloud auth list
ב- Command Line u ותקבלו פירוט של החשבון.
Gcloud הוא כלי שורת פקודה חזק ואינטגרלי ל- Google Cloud Platform, הוא מגיע כבר מותקן מראש ב- Cloud Shell ואף תומך בהשלמות Tab.
עכשיו נתחיל בכיף האמיתי- תחילה ניצור את אפליקציית ה- Node.js שלנו ולצורך זה נשתמש ב Cloud Shell.
vi server.js
תתחילו לערוך בעזרת לחיצה על האות i
var http = require('http');
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Hello IsraelClouds Readers!");
}
var www = http.createServer(handleRequest);
www.listen(8080);
שמרו את הקובץ (תלחצו על הכפתור Esc ואז על :wq)
היות ו- node executable כבר מותקן ב- Cloud Shell אפשר להריץ את הפקודה הבאה:
node server.js
עכשיו אנו נשתמש בפיצ'ר נחמד של Cloud Shell בשם Web Preview Feature כדי לפתוח דפדפן חדש ויזום קריאת Proxy ל- Instance שיצרנו (הכפתור נמצא בתפריט בצד ימין של Cloud Shell).
לפני שנמשיך נעצור את ה- node server על ידי לחיצה על Ctrl-c בתוך .Cloud Shell
תבצעו REFRESH על הדף ותקבלו הודעה שגיאה (מכיוון שעצרנו את האפליקציה)
Error: Could not connect to Cloud Shell on port 8080.
Ensure your server is listening on port 8080 and try again.
בשלב הבא ויותר חשוב אנו נעטוף את האפליקציה ב- Docker Container ולשם כך ניצור Docker container image.
Docker יכול לייצר Images בצורה אוטומטית ע"י קריאה וביצוע של ההוראות מקובץ DockerFile לכן אנו נתחיל ביצירה של Dockerfile על ידי כך שב- command line של cloud shell נרשום:
vi Dockerfile
תלחצו על האות i כדי לערוך ותוסיפו לקובץ את התוכן הבא:
FROM node:6.9.2
EXPOSE 8080
COPY server.js .
CMD node server.js
שמרו את הקובץ על ידי לחיצה על הכפתור esc ולאחר מכן על :wq (שמירה רגילה ב-vi)
ועכשיו הסבר לקובץ dockerfile:
• התחל מה- Node Image שנמצא ב- Docker hub
• חשיפת פורט 8080
• העתק את הקובץ server.js לתוך ה Image
• הרץ/התחל את node server (כמו שעשינו מקודם ידנית)
עכשיו ניצור Image עם הפרטים הבאים:
docker build -t gcr.io/PROJECT_ID/hello-israelclouds:ver1 .
לדוגמא:
docker build -t gcr.io/qwiklabs-gcp-63ead51c6418b7c0_ID/hello-israelclouds:ver1 .
חשוב לשים לב שכל האותיות צריכות להיות lower case לכן על ה- ID בשורה למעלה תקבלו הודעה שגיאה.
docker build -t gcr.io/qwiklabs-gcp-63ead51c6418b7c0_id/hello-israelclouds:ver1 .
** חשוב לשנות את PROJECT_ID במספר האמיתי של הפרויקט שלכם. ניתן לברר את מספר הפרויקט על ידי הרצה של
gcloud config list project
ייקח מעט זמן להוריד ולייצא (extract) הכל. תוכלו לעקוב אחר ההתקדמות ב- progress bar, בסיום נבדוק את ה- Image לוקלית עם הפקודה הבאה אשר תריץ את ה- Docker Container כ- Deamon בפורט 8080 מה- container image החדש שיצרנו.
docker run -d -p 8080:8080 gcr.io/PROJECT_ID/hello-israelclouds:ver1
0950e858c9b5c820e384e5e2a752c25391218d55a02edf254c2e6c1fe0306523
נשתמש שוב ביכולת של Cloud Shell בשם Web preview על הפורט שרשמנו 8080
אפשרות נוספת לבדיקה היא השימוש בפקודת curl מתוך Cloud Shell
curl http://localhost:8080
ואתם אמורים לקבל את התשובה Hello IsraelClouds Readers!
עכשיו, נעצור את ה- Docker ותחילה נחפש אותו על ידי הרצת
docker ps
חפשו את ה- Container Id (השדה הראשון) ותריצו
docker stop [CONTAINER ID]
לאחר שווידאתם שה- Image רץ בצורה טובה וכפי שרצינו, נרשום/נדחוף אותו ל- Google Container Registry שזהו מאגר פרטי עבור ה- Docker Images והוא נגיש מהפרויקטים שלכם ב- GCP.
gcloud docker -- push gcr.io/PROJECT_ID/hello-israelclouds:ver1
תהליך הדחיפה בפעם הראשונה עשוי לקחת כמה דקות, בסיום התהליך ה- container יהיה רשום ב- console שלכם תחת Tools > Container Registry
כל הכבוד לכם! עכשיו יש לכם פרויקט זמין של docker image- אותו קוברניטיס יכול לגשת אליו ו"לנהל" אותו (orchestrate).
עכשיו ניצור את ה- CLUSTER שלנו- Container Engine cluster.
הקלאסטר בנוי משרת Kubernetes master API ש"יושב" על גוגל (hosted on google) ומקבוצה של Workers Nodes.
ה- Workers Nodes יהיו מכונות וירטואליות. (compute engine)
תחילה נוודא שאנחנו במקום (בפרויקט) הנכון:
gcloud config set project PROJECT_ID
לאחר מכן ניצור קלאסטר ובו 2 מכונות מסוג n1-standard-1
gcloud container clusters create hello-israelcloudsreaders \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-a
כמובן שישנה אפשרות ליצירת הקלסטר היא ע"י הconsole דרך המסלול הבא:
Kubernetes Engine > Kubernetes clusters > Create cluster.
מומלץ ליצור את הקלסטר באותו אזור כמו דלי האחסון (bucket) המשמש את container registry.
שוב ברכות! עכשיו יש לכם Kubernetes cluster הפועל באופן מלא, ומופעל על ידי Kubernetes Engine
עכשיו זה הזמן לפרוס את האפליקציה הקונטיינרית (containerized application) שלכם אל ה- Kubernetes cluster.
Pod או Kubernetes Pod הוא קבוצה של קונטיינרים שמחוברים ביחד בשל היבטים של אדמיניסטרציה ותקשורת.
Pod יכול להכיל קונטיינר אחד או קונטיינרים רבים.
בדוגמא זו נשתמש בקונטיינר אחד שבנינו בשלב קודם עם Node.js Image Stored אשר אוחסן ב- container registry הפרטי שלנו, השירות יינתן דרך פורט 8080.
מעכשיו נשתמש בפקודה kubectl שכמובן היא מקונפגת מראש בסביבת ה- Cloud Shell שלכם.
kubectl run hello-israelcloudsnode --image=gcr.io/PORJECT_ID/hello-israelclouds:ver1 --port=8080
וזו התשובה שאתם אמורים לקבל
deployment "hello-israelcloudsnode" created
כפי שבוודאי הבחנתם נוצר אובייקט מסוג deployment.
Deployment היא הדרך המומלצת כדי ליצור ולבצע scale של Podים.
כאן Deployment חדש ינהל Pod אחד (single pod replica) שמריץ את ה- IMAGE בשם
hello-israelclouds:ver1
על מנת לראות את ה- deployment שכבר יצרנו
kubectl get deployments
אנו אמורים לראות את Hello-node.
כדי לראות את ה- Pod שנוצר על ידי ה- deployment נריץ
kubectl get pods
ונקבל את Pod שיצרנו.
כברירת מחדל ל- Pod אין אפשרות גישה מבחוץ ועל מנת לאפשר ל- node בקונטיינר שיצרנו גישה מחוץ לרשת הווירטואלית של הקוברניטיס יש צורך לחשוף את ה- Pod כ- Kubernetes Service.
את החשיפה הזו נעשה מתוך Cloud Shell על ידי שילוב של הפקודה kubectl expose
בשילוב עם הדגל --type="LoadBalancer" .
kubectl expose deployment hello-israelcloudsnode --type="LoadBalancer"
התשובה שאנו אמורים לקבל:
service "hello-israelcloudsnode" exposed
הדגל שהשתמשנו בו מציין שאנו נשתמש ב- load-balancer של התשתית הבסיסית במקרה שלנו:
Compute Engine load balancer
חשוב לשים לב שחשפנו את ה- deployment ולא את ה- Pod ישירות, דבר שיאפשר לשירות להעביר עומסים בין כל ה- Podים המנוהלים על ידי ה- deployment (במקרה שלנו מדובר רק באחד אבל אנו נוסיף עוד בהמשך).
ה- Kubernetes master יוצר את ה- load balancer ואת כללי התעבורה(forwarding rules) של המכונות (compute engines), את ה- Target pools, את ה- Firewall rules כדי לאפשר לשירות להיות נגיש באופן מלא גם מחוץ ל- GCP.
כדי לראות את כתובות ה- IP החיצוניות שאפשר לגשת אליהם מבחוץ יש להריץ את הפקודה הבאה:
kubectl get services
אנו מקבלים 2 כתובות IP שרשומים עבור השירות שלנו ושניהם נגישות דרך פורט 8080 אחד מהכתובות הוא הכתובות ה- IP הפנימית שאפשר לגשת אליה רק מתוך רשת התקשורת העננית הווירטואלית, והשניה היא החיצונית.
כעת תהיו מסוגלים לגשת לכתובת ה- IP החיצונית גם מהדפדפן שלכם
כבר בשלב זה הרווחנו כמה דברים מכך שהעברנו את האפליקציה לקונטיינרים וקוברניטיס:
אנחנו לא חייבים לבחור באיזה Host להריץ את האפליקציה או את ה- workload שלנו ואנחנו גם נהנים משירות שהוא מנוטר ושיכול להתחיל את עצמו מחדש.
אחד היתרונות הגדולים של קוברניטיס היא היכולת הקלה שהוא מאפשר לנו לבצע scale לאפליקציה שלנו, נדמיין שאנו צריכים מיידית עוד משאבים רבים לאפליקציה, אנו יכולים בפקודה אחת לומר ל- replication controller לנהל מספר גדול יותר של רפליקות מה-Pod שלנו- כל מה שנדרש הוא הרצה של פקודה אחת
kubectl scale deployment hello-israelcloudsnode --replicas=4
ואנו צריכים לקבל בחזרה
deployment "hello-israelcloudsnode" scaled
כדי לקבל פירוט של ה- deployment המעודכן תריצו:
kubectl get deployment
אתם אמורים לקבל את הפלט הבא
ואפשר גם לקבל מידע על ה- Podים עצמם
kubectl get pods
אנו משתמשים כאן בגישה אחת בשם declarative approach.
במקום להתחיל או לעצור Instances חדשים, אנו קובעים כמה מכונות צריכות לרוץ כל הזמן.
מי שבעצם דואג לכך שהמספר יישאר קבוע הוא Kubernetes reconciliation loops על ידי כך שהוא נוקט צעדים במידה ומשהו קורה (INSTANCE נופל, לא עונה וכו')
להלן דיאגרמה:
בשלב כלשהו המוצר, האפליקציה או השירות שפיתחתם ידרוש תיקון באג, או הוספת פיצ'ר. קוברניטיס עוזר לכם להפיץ גרסה חדשה ל- PRODUCTION מבלי לפגוע בשירות או להשפיע על הלקוחות (משתמשים) שלכם.
כדי לעשות זאת נשנה את האפליצקיה
vi server.js
לחצו על האות i כדי לשנות את התוכן
"Hello IsraelClouds From Kubernetes World!");
לחצו על המקש esc ולאחר מכן על :wq
עכשיו אנחנו יכולים לבנות ולהפיץ container image חדש אל ה- Container Registry עם תג חדש למשל ver2
docker build -t gcr.io/PROJECT_ID/hello-israelclouds:ver2 .
gcloud docker -- push gcr.io/PROJECT_ID/hello-israelclouds:ver2
בניה והפצה מחדש של ה- image צריכה להיות מהירה יותר מהבניה הראשונה מכיוון שאנו נהנים מיכולות ה- caching.
קוברניטיס יעדכן את ה- replication controller שלנו בצורה חלקה לגרסה החדשה של האפליקציה, על מנת לשנות התגית של ה- Image עבור הקונטיינר שרץ ב- Production נצטרך לערוך את ה- deployment hello-israelcloudsnode ולהחליף את ה- image מ:
gcr.io/PROJECT_ID/hello-israelclouds:ver1
ל-
gcr.io/PROJECT_ID/ hello-israelclouds:ver2
על מנת לבצע זאת נשתמש בפקודה kubectl edit אשר פותחת לנו עורך טקסט לאחר ההרצה שמכיל את כל deployment deployment yaml configurationuration.
אין צורך להבין את כל ה- yaml config בשלב אלא זה רק להבין שעל ידי כך שנעדכן את השדה- spec.template.spec.containers.image בקובץ זה, אנו מורים ל- deployment לעדכן את ה- Podים עם ה- Image החדש.
ב- Cloud Shell אנו נלחץ על
kubectl edit deployment hello-israelcloudsnode
ונבצע עדכון לשורה
spec:
containers:
- image: gcr.io/PROJECT_ID/ hello-israelclouds:ver1 ## Update this line ##
ל hello-israelclouds:ver2 כפי שהסברנו מקודם.
לאחר ביצוע השינוי יש ללחוץ על הכפתור esc, וכדי לשמור :wq (כרגיל)
לאחר שתקבלו את השורה הבאה deployment "hello-israelcloudsnode" edited
תדעו שהצלחתם לעדכן.
לבסוף נריץ את הפקודה הבאה
kubectl get deployments
כדי לעדכן את ה- deployment עם ה- Image החדש.
Podים חדשים יווצרו עם ה- image החדש וה- Podים הישנים ימחקו, מה שיפה וטוב בצורת העבודה הזו היא שמשתמשים בשירותים הללו לא ירגישו בעיה ואף שירות לא יפגע.
לאחר זמן קצר המשתמשים יחלו לגשת לגרסה החדשה של האפליקציה.
פרטים נוספים לביצוע rolling updates ניתן למצוא במסמך הבא: http://bit.ly/replication-controller
לאחר שהתנסיתם עם הפצות, scaling, עדכון פיצ'רים ולאחר שהגדרתם את ה- Kubernetes Engine cluster אני בטוח שתסכימו עם הקביעה ש- kubernetes מאפשר לכם להתמקד באפליקציה הרבה יותר מאשר בתשתיות שלכם.
מאת: מערכת IsraelClouds
הודעתך לא התקבלה - נסה שוב מאוחר יותר
Oops! Something went wrong while submitting the form