✕ סגור 
צור קשר
תודה על ההתעניינות .

Thank you! Your submission has been received!

Oops! Something went wrong while submitting the form

Hello Node Kubernetes

|
קלה
|
Jun 6, 2018
להרשמה לניוזלטר

מאמר זה הינו מדריך 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

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 Up your Service

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

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 Up your Service

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

בואו נעבוד ביחד
צרו קשר