פריסת האפליקציה Spring Boot Java ב-Kubernetes ב-Google Kubernetes Engine

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.

מה צריך?

הגדרת סביבה בקצב עצמי

  1. נכנסים ל-Cloud Console ויוצרים פרויקט חדש או משתמשים שוב בפרויקט קיים. (אם עדיין אין לכם חשבון Gmail או G Suite, עליכם ליצור חשבון).

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

  1. לאחר מכן, עליך להפעיל חיוב ב-Cloud Console כדי להשתמש במשאבים של Google Cloud.

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

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

הפעלת Cloud Shell

  1. ב-Cloud Console, לוחצים על Activate Cloud Shell .

אם אף פעם לא התחלת להשתמש ב-Cloud Shell, יוצג לך מסך ביניים (בחלק הנגלל) שמתאר את הבעיה. אם זה קורה, יש ללחוץ על המשך (ולא יוצג לך שוב). כך נראה המסך החד-פעמי הזה:

הוא ייקח רק כמה רגעים עד שההקצאה והחיבור ל-Cloud Shell.

המכונה הווירטואלית הזו נטענת באמצעות כל כלי הפיתוח הדרושים לך. יש בה ספריית בית בנפח עקבי של 5GB והיא פועלת ב-Google Cloud, וכך משפרת באופן משמעותי את הביצועים ואת האימות של הרשת. את רוב העבודה במעבדה זו אפשר לבצע, אם לא את כולם, באמצעות דפדפן או ה-Chromebook בלבד.

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

  1. מריצים את הפקודה הבאה ב-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].

לאחר ההשקה של Cloud Shell, תוכלו להשתמש בשורת הפקודה כדי לשכפל את קוד המקור לדוגמה בספריית הבית.

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete
  1. אפשר להתחיל את אפליקציית Spring Boot בדרך כלל באמצעות הפלאגין Spring אתחול.
$ ./mvnw -DskipTests spring-boot:run
  1. לאחר הפעלת האפליקציה, לוחצים על תצוגה מקדימה באינטרנט בסרגל הכלים של Cloud Shell ובוחרים באפשרות תצוגה מקדימה ביציאה 8080.

כרטיסייה בדפדפן תיפתח ותתחבר לשרת שהתחלת עכשיו.

השלב הבא הוא להכין את האפליקציה להפעלה ב-Kubernetes. השלב הראשון הוא להגדיר את המאגר ואת התוכן שלו.

  1. יצירת JAR לפריסה של האפליקציה.
$ ./mvnw -DskipTests package
  1. יש להפעיל רישום של מאגר תגים כדי לאחסן את תמונת המאגר שברצונך ליצור.
$ gcloud services enable containerregistry.googleapis.com
  1. ניתן להשתמש ב-Jib כדי ליצור את תמונת הקונטיינר ולדחף אותה אל מרשם המאגר.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. אם הכול בסדר, תוכלו לראות את תמונת המאגר שמופיעה במסוף על ידי ניווט אל מרשם מאגרי תמונות &תמונות. עכשיו יש לכם תמונת Docker ברמת הפרויקט, ש-Kubernetes יכולה לגשת אליה ולתזמן אותה תוך כמה דקות.
  1. בסיום התהליך (יידרשו זמן מה כדי להוריד ולחלץ הכול), תוכלו לבדוק את התמונה באופן מקומי באמצעות הפקודה הבאה. פעולה זו תפעיל מאגר מאגר Docker כיציאה ב-8080 מתמונת המאגר החדשה שיצרתם:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. שוב, יש להשתמש בתכונת התצוגה המקדימה באינטרנט של Cloud Shell.

  1. דף ברירת המחדל אמור להופיע בכרטיסייה חדשה. אחרי שמוודאים שהאפליקציה פועלת באופן מקומי במאגר תגים של עגינה, אפשר ללחוץ על Control+C כדי להפסיק את השימוש במאגר התגים.

אתה מוכן ליצור אשכול של GKE. אשכול כולל שרת Kubernetes API המנוהל על ידי Google וקבוצת צמתים של עובדים. צמתים של עובדים הם VM Engine VMs.

  1. תחילה, יש לוודא שתכונות ה-API הקשורות אליו מופעלות.
$ gcloud services enable compute.googleapis.com container.googleapis.com
Operation "operations/..." finished successfully
  1. יוצרים אשכול עם שני צמתים 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.

  1. הפריסה של Kubernetes יכולה ליצור, לנהל ולשנות כמה מופעים של האפליקציה באמצעות תמונת המאגר שיצרתם. פריסת מופע אחד של האפליקציה עם Kubernetes באמצעות הפקודה kubectl run.
$ kubectl create deployment hello-java \
  --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. כדי להציג את הפריסה שיצרתם, פשוט מריצים את הפקודה הבאה:
$ kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. כדי להציג את מופעי האפליקציה שנוצרו על ידי הפריסה, מריצים את הפקודה הבאה:
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-java-714049816-ztzrb   1/1       Running   0          57s

בשלב זה, הקונטיינר שלכם צריך להיות בשליטתה של Kubernetes, אבל עדיין תצטרכו להפוך אותו לנגיש לכל העולם.

כברירת מחדל, ה-Pod נגיש רק באמצעות כתובת ה-IP הפנימית שלו באשכול. כדי להפוך את המאגר של hello-java לנגיש מחוץ לרשת הווירטואלית של Kubernetes, צריך לחשוף את ה-Pod כשירות של Kubernetes.

  1. ב-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.

  1. כדי למצוא את כתובת ה-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
  1. שים לב שיש שתי כתובות IP עבור השירות שלך, שתיהן מציגות את היציאה 8080. אחת היא כתובת ה-IP הפנימית שגלויה רק בענן הפרטי הווירטואלי שלך. הנקודה השנייה היא כתובת ה-IP החיצונית עם איזון העומס. בדוגמה, כתובת ה-IP החיצונית היא aaa.bbb.ccc.ddd. אמורה להיות לך אפשרות להגיע לשירות על ידי הפניית הדפדפן לכתובת http://<EXTERNAL_IP>:8080.

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

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

  1. פותחים את עורך הקודים בלחיצה על הפעלת העורך בתפריט Cloud Shell.
  2. עוברים אל 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!";
    }
}
  1. ניתן להשתמש ב-Jib כדי ליצור ולגרור גרסה חדשה של תמונת מאגר.
$ ./mvnw -DskipTests package \
  com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

אתם מוכנים ל-Kubernetes לעדכן באופן חלק את בקר השכפול שלכם לגרסה החדשה של האפליקציה!

  1. כדי לשנות את תווית התמונה של המאגר הפעיל, צריך לערוך את הפריסה הקיימת של hello-java ולשנות את התמונה מ-gcr.io/PROJECT_ID/hello-java:v1 ל-gcr.io/PROJECT_ID/hello-java:v2.
  1. באמצעות הפקודה 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
  1. בדוק שוב את http://EXTERNAL_IP:8080 כדי לראות שהוא מחזיר את התגובה החדשה.

אופס! האם עשית טעות בגרסה החדשה של האפליקציה? אולי הגרסה החדשה הכילה שגיאה ואתם צריכים להחזיר אותה במהירות. עם Kubernetes, אפשר להחזיר אותך למצב הקודם בקלות. כדי להפעיל מחדש את האפליקציה, מפעילים את הפקודה הבאה:

$ kubectl rollout undo deployment/hello-java

למדת איך לבנות ולפרוס אפליקציית אינטרנט חדשה המבוססת על ג'אווה ב-Kubernetes ב-GKE.

למידע נוסף