פריסת האפליקציה Spring Boot Java ב-Kubernetes ב-Google Kubernetes Engine
מידע על Codelab זה
1. לפני שמתחילים
Kubernetes הוא פרויקט קוד פתוח, שיכול לפעול בסביבות שונות, ממחשבים ניידים ועד אשכולות צמתים זמינים ביותר, מעננים ציבוריים ועד לפריסות מקומיות, ממכונות וירטואליות (VM) ועד מתכת חשופה.
במעבדה הזו, תוכלו לפרוס את אפליקציית האינטרנט Spring Boot Java ב-Kubernetes בקלות ב-GKE, כאשר המטרה היא להריץ את אפליקציית האינטרנט שלכם כאפליקציה כפולה ב-Kubernetes. לקחת את הקוד שתפתחו במחשב, להפוך אותו לתמונת מאגר התגים של Docker ולהפעיל את התמונה ב-GKE.
אתם תשתמשו ב-GKE, שירות מנוהל ב-Google Cloud ב-Google Cloud, כדי שתוכלו להתמקד יותר בחוויית Kubernetes, במקום בהגדרת התשתית הבסיסית.
אם אתם מעדיפים להריץ את Kubernetes במחשב המקומי שלכם, כמו מחשב נייד לפיתוח, כדאי לחפש את Minikube, שכולל הגדרה פשוטה של אשכול Kubernetes לצומת אחד למטרות פיתוח ובדיקה. אם רוצים, אפשר להשתמש ב-minikube כדי לעבור את קוד הקוד.
Codelab ישתמש בקוד לדוגמה מהמדריך שעוסק בבניית אפליקציה עם Spring Spring.
דרישות מוקדמות
- היכרות עם השפה והתכנות של Java
- ידע בעורכי טקסט רגילים של Linux, כמו Vim , Emacs ו-nano
מה צריך לעשות
- אורזים אפליקציית Java פשוטה כמאגר של תחנת עגינה.
- יצירת אשכול של Kubernetes ב-GKE.
- פריסת אפליקציית Java ב-Kubernetes ב-GKE.
- כדאי להרחיב את השירות ולהרחיב את השדרוג
- גישה למרכז השליטה, ממשק משתמש משולב באינטרנט של Kubernetes.
מה צריך?
- פרויקט ב-Google Cloud
- דפדפן כמו Google Chrome
2. הגדרה ודרישות
הגדרת סביבה בקצב עצמי
- נכנסים ל-Cloud Console ויוצרים פרויקט חדש או משתמשים שוב בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, עליכם ליצור חשבון).
חשוב לזכור את מזהה הפרויקט הוא שם ייחודי בכל הפרויקטים ב-Google Cloud (השם הקודם כבר תפוס, והוא לא יעבוד בשבילך.) נתייחס אליו מאוחר יותר ב-codelab הזה בתור PROJECT_ID
.
- לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.
התהליך של קוד Lab זה לא אמור לעלות יותר מדולר אחד, אבל אם החלטתם להשתמש במשאבים נוספים או להשאיר אותם, ייתכן שהסכום יהיה גבוה יותר.
משתמשים חדשים ב-Google Cloud זכאים לתקופת ניסיון בחינם ב-1200 ש"ח.
הפעלת Cloud Shell
- ב-Cloud Console, לוחצים על Activate Cloud Shell
.
אם אף פעם לא התחלת להשתמש ב-Cloud Shell, יוצג לך מסך ביניים (בחלק הנגלל) שמתאר את הבעיה. אם זה קורה, יש ללחוץ על המשך (ולא יוצג לך שוב). כך נראה המסך החד-פעמי הזה:
הוא ייקח רק כמה רגעים עד שההקצאה והחיבור ל-Cloud Shell.
המכונה הווירטואלית הזו נטענת באמצעות כל כלי הפיתוח הדרושים לך. יש בה ספריית בית בנפח עקבי של 5GB והיא פועלת ב-Google Cloud, וכך משפרת באופן משמעותי את הביצועים ואת האימות של הרשת. את רוב העבודה במעבדה זו אפשר לבצע, אם לא את כולם, באמצעות דפדפן או ה-Chromebook בלבד.
לאחר החיבור ל-Cloud Shell, אתם אמורים לראות שכבר בוצע אימות, ושהפרויקט כבר מוגדר כמזהה הפרויקט.
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שאתם מאומתים:
gcloud auth list
פלט הפקודה
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
פלט הפקודה
[core] project = <PROJECT_ID>
אם לא, אפשר להגדיר אותה באמצעות הפקודה הבאה:
gcloud config set project <PROJECT_ID>
פלט הפקודה
Updated property [core/project].
3. לקבלת קוד המקור
לאחר ההשקה של Cloud Shell, תוכלו להשתמש בשורת הפקודה כדי לשכפל את קוד המקור לדוגמה בספריית הבית.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
4. הפעלת האפליקציה באופן מקומי
- אפשר להתחיל את אפליקציית Spring Boot בדרך כלל באמצעות הפלאגין Spring אתחול.
$ ./mvnw -DskipTests spring-boot:run
- לאחר הפעלת האפליקציה, לוחצים על תצוגה מקדימה באינטרנט
בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.
כרטיסייה בדפדפן תיפתח ותתחבר לשרת שהתחלת עכשיו.
5. אורזים את אפליקציית Java כמאגר של תחנת עגינה
השלב הבא הוא להכין את האפליקציה להפעלה ב-Kubernetes. השלב הראשון הוא להגדיר את המאגר ואת התוכן שלו.
- יצירת JAR לפריסה של האפליקציה.
$ ./mvnw -DskipTests package
- יש להפעיל רישום של מאגר תגים כדי לאחסן את תמונת המאגר שברצונך ליצור.
$ gcloud services enable containerregistry.googleapis.com
- ניתן להשתמש ב-Jib כדי ליצור את תמונת הקונטיינר ולדחף אותה אל מרשם המאגר.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- אם הכול בסדר, תוכלו לראות את תמונת המאגר שמופיעה במסוף על ידי ניווט אל מרשם מאגרי תמונות &תמונות. עכשיו יש לכם תמונת Docker ברמת הפרויקט, ש-Kubernetes יכולה לגשת אליה ולתזמן אותה תוך כמה דקות.
- בסיום התהליך (יידרשו זמן מה כדי להוריד ולחלץ הכול), תוכלו לבדוק את התמונה באופן מקומי באמצעות הפקודה הבאה. פעולה זו תפעיל מאגר מאגר Docker כיציאה ב-8080 מתמונת המאגר החדשה שיצרתם:
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- שוב, יש להשתמש בתכונת התצוגה המקדימה באינטרנט של Cloud Shell.
- דף ברירת המחדל אמור להופיע בכרטיסייה חדשה. אחרי שמוודאים שהאפליקציה פועלת באופן מקומי במאגר תגים של עגינה, אפשר ללחוץ על
Control+C
כדי להפסיק את השימוש במאגר התגים.
6. יצירת אשכול שלך
אתה מוכן ליצור אשכול של GKE. אשכול כולל שרת Kubernetes API המנוהל על ידי Google וקבוצת צמתים של עובדים. צמתים של עובדים הם VM Engine VMs.
- תחילה, יש לוודא שתכונות ה-API הקשורות אליו מופעלות.
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- יוצרים אשכול עם שני צמתים
n1-standard-1
(תהליך זה יימשך מספר דקות).
$ gcloud container clusters create hello-java-cluster \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-c
בסופו של דבר אתם אמורים לראות את האשכול שנוצר.
Creating cluster hello-java-cluster...done. Created [https://container.googleapis.com/v1/projects/...]. kubeconfig entry generated for hello-dotnet-cluster. NAME ZONE MASTER_VERSION hello-java-cluster us-central1-c ...
עכשיו אמורה להיות לכם אשכול מלא ב-Kubernetes המופעל על ידי GKE.
הגיע הזמן לפרוס את האפליקציה המאגרת באשכול של Kubernetes! מעתה ואילך, עליך להשתמש בשורת הפקודה של kubectl
(שכבר מוגדרת בסביבת Cloud Shell). שאר קוד Lab דורש מ-Kubernetes להשתמש בגרסת 1.2 ומעלה של לקוח השרת. תוצג לך הגרסה הנוכחית של הפקודה kubectl version
.
7. פריסת האפליקציה ב-Kubernetes
- הפריסה של Kubernetes יכולה ליצור, לנהל ולשנות כמה מופעים של האפליקציה באמצעות תמונת המאגר שיצרתם. פריסת מופע אחד של האפליקציה עם Kubernetes באמצעות הפקודה
kubectl run
.
$ kubectl create deployment hello-java \ --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- כדי להציג את הפריסה שיצרתם, פשוט מריצים את הפקודה הבאה:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 1 1 1 1 37s
- כדי להציג את מופעי האפליקציה שנוצרו על ידי הפריסה, מריצים את הפקודה הבאה:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-java-714049816-ztzrb 1/1 Running 0 57s
בשלב זה, הקונטיינר שלכם צריך להיות בשליטתה של Kubernetes, אבל עדיין תצטרכו להפוך אותו לנגיש לכל העולם.
8. אישור תנועה חיצונית
כברירת מחדל, ה-Pod נגיש רק באמצעות כתובת ה-IP הפנימית שלו באשכול. כדי להפוך את המאגר של hello-java
לנגיש מחוץ לרשת הווירטואלית של Kubernetes, צריך לחשוף את ה-Pod כשירות של Kubernetes.
- ב-Cloud Shell, ניתן לחשוף את ה-Pod לאינטרנט הציבורי בעזרת הפקודה
kubectl expose
בשילוב עם הסימון--type=LoadBalancer
. הדגל נדרש ליצירת כתובת IP שניתן לגשת אליה באופן חיצוני.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
הדגל המשמש בפקודה מציין כי ייעשה שימוש במאזן העומסים המסופק על ידי התשתית הבסיסית. הערה: אתם חושפים את הפריסה ישירות, ולא ב-Pod. בעקבות זאת, השירות שיתקבל יטען את התנועה ליתרה בכל ה-Podss שמנוהלים על ידי הפריסה (במקרה הזה, רק תא אחד, אבל בהמשך יתווספו עוד עותקים כפולים).
ה-Kubernetes Master יוצר את מאזן העומס ואת כללי ההעברה הקשורים ל-Compute Engine, מאגרי יעדים וכללי חומת אש כדי להפוך את השירות לנגיש במלואו מחוץ ל-Google Cloud.
- כדי למצוא את כתובת ה-IP הציבורית של השירות, יש לבקש מ-
kubectl
להציג את כל שירותי האשכול.
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE Hello-java 10.3.253.62 aaa.bbb.ccc.ddd 8080/TCP 1m kubernetes 10.3.240.1 <none> 443/TCP 5m
- שים לב שיש שתי כתובות IP עבור השירות שלך, שתיהן מציגות את היציאה 8080. אחת היא כתובת ה-IP הפנימית שגלויה רק בענן הפרטי הווירטואלי שלך. הנקודה השנייה היא כתובת ה-IP החיצונית עם איזון העומס. בדוגמה, כתובת ה-IP החיצונית היא
aaa.bbb.ccc.ddd
. אמורה להיות לך אפשרות להגיע לשירות על ידי הפניית הדפדפן לכתובת http://<EXTERNAL_IP>:8080.
9. להרחיב את השירות
אחת מהתכונות המתקדמות של Kubernetes היא עד כמה קל להרחיב את האפליקציה שלך. נניח שלפעמים צריך יותר קיבולת לאפליקציה שלך. אפשר פשוט לומר לבקר השכפול כדי לנהל מספר חדש של עותקים כפולים למופעי האפליקציה שלך.
$ kubectl scale deployment hello-java --replicas=3 deployment "hello-java" scaled $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 3 3 3 3 22m
שימו לב לגישה המוצהרת. במקום להפעיל או לעצור מופעים חדשים, אתם מצהירים כמה מופעים צריכים לפעול כל הזמן. תהליך ההתאמה ב-Kubernetes מאפשר לכם רק לוודא שהמציאות תואמת למה שביקשתם ותפעל בהתאם, במקרה הצורך.
10. השקת שדרוג לשירות
בשלב מסוים, האפליקציה שנפרסה לצורך הייצור תדרוש תיקוני באגים או תכונות נוספות. Kubernetes יכול לעזור לפרוס גרסה חדשה לייצור מבלי להשפיע על המשתמשים.
- פותחים את עורך הקודים בלחיצה על הפעלת העורך
בתפריט Cloud Shell.
- עוברים אל
src/main/java/hello/HelloController.java
ומעדכנים את ערך התגובה.
package hello;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Google Kubernetes Engine!";
}
}
- ניתן להשתמש ב-Jib כדי ליצור ולגרור גרסה חדשה של תמונת מאגר.
$ ./mvnw -DskipTests package \ com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2
אתם מוכנים ל-Kubernetes לעדכן באופן חלק את בקר השכפול שלכם לגרסה החדשה של האפליקציה!
- כדי לשנות את תווית התמונה של המאגר הפעיל, צריך לערוך את הפריסה הקיימת של
hello-java
ולשנות את התמונה מ-gcr.io/PROJECT_ID/hello-java:v1
ל-gcr.io/PROJECT_ID/hello-java:v2
.
- באמצעות הפקודה
kubectl set image
, אפשר לבקש מ-Kubernetes לפרוס את הגרסה החדשה של האפליקציה בבת אחת בכל האשכול.
$ kubectl set image deployment/hello-java \ hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2 deployment "hello-java" image updated
- בדוק שוב את http://EXTERNAL_IP:8080 כדי לראות שהוא מחזיר את התגובה החדשה.
11. החזרה למצב הקודם
אופס! האם עשית טעות בגרסה החדשה של האפליקציה? אולי הגרסה החדשה הכילה שגיאה ואתם צריכים להחזיר אותה במהירות. עם Kubernetes, אפשר להחזיר אותך למצב הקודם בקלות. כדי להפעיל מחדש את האפליקציה, מפעילים את הפקודה הבאה:
$ kubectl rollout undo deployment/hello-java
12. מזל טוב
למדת איך לבנות ולפרוס אפליקציית אינטרנט חדשה המבוססת על ג'אווה ב-Kubernetes ב-GKE.