ทําให้แอป Spring Boot Java ใช้งานได้ใน Kubernetes บน Google Kubernetes Engine
เกี่ยวกับ Codelab นี้
1 ข้อควรทราบก่อนที่จะเริ่มต้น
Kubernetes เป็นโปรเจ็กต์โอเพนซอร์สที่ทํางานได้ในสภาพแวดล้อมต่างๆ มากมาย ตั้งแต่แล็ปท็อป ไปจนถึงคลัสเตอร์โหนดแบบหลายความพร้อมใช้งานสูง ตั้งแต่ระบบคลาวด์สาธารณะไปจนถึงการติดตั้งใช้งานในองค์กร และจากอินสแตนซ์เครื่องเสมือน (VM) ไปจนถึงเปลือย
ใน Codelab นี้ คุณจะทําให้เว็บแอป Spring Boot สําหรับ Java ใช้งานได้ใน Kubernetes บน GKE ได้โดยง่าย โดยมีเป้าหมายให้คุณเรียกใช้เว็บแอปเป็นแอปจําลองใน Kubernetes คุณจะใช้โค้ดที่คุณพัฒนาในเครื่อง เปลี่ยนให้เป็นอิมเมจคอนเทนเนอร์ของ Docker และเรียกใช้รูปภาพใน GKE ได้
คุณจะใช้ GKE ซึ่งเป็นบริการ Kubernetes ที่มีการจัดการครบวงจรใน Google Cloud ซึ่งจะช่วยให้คุณโฟกัสกับการใช้งาน Kubernetes ได้มากขึ้น แทนที่จะตั้งค่าโครงสร้างพื้นฐานที่สําคัญ
หากคุณสนใจที่จะเรียกใช้ Kubernetes ในเครื่องของคุณ เช่น แล็ปท็อปเพื่อการพัฒนา ให้ดู Minikube ซึ่งเสนอการตั้งค่าคลัสเตอร์ Kubernetes แบบโหนดเดียวง่ายๆ เพื่อการพัฒนาและทดสอบ คุณสามารถใช้ Minikube เพื่อเลื่อนดู Codelab ได้ตามต้องการ
Codelab จะใช้โค้ดตัวอย่างจากคําแนะนําเกี่ยวกับการสร้างแอปที่มี Spring Boot
ข้อกำหนดเบื้องต้น
- คุ้นเคยกับภาษาและเครื่องมือเขียนโปรแกรม Java
- ความรู้เกี่ยวกับเครื่องมือแก้ไขข้อความ Linux มาตรฐาน เช่น Vim, Emacs และ nano
สิ่งที่คุณจะทํา
- สร้างแพ็กเกจแอป Java แบบง่ายเป็นคอนเทนเนอร์ Docker
- สร้างคลัสเตอร์ 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
การเรียกใช้ Codelab นี้ไม่ควรมีค่าใช้จ่ายเกิน 2-3 ดอลลาร์ แต่อาจมากกว่านั้นหากคุณตัดสินใจใช้ทรัพยากรเพิ่มเติมหรือปล่อยให้ทรัพยากรทํางาน
ผู้ใช้ใหม่ของ Google Cloud มีสิทธิ์รับช่วงทดลองใช้ฟรี$300
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากคุณไม่เคยเริ่มใช้งาน Cloud Shell มาก่อน ระบบจะแสดงหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ที่อธิบายปัญหาหากเกิดกรณีดังกล่าวขึ้น ให้คลิกต่อไป (แล้วคุณจะไม่เห็นอีกเลย) หน้าจอแบบครั้งเดียวนี้มีลักษณะดังนี้
การดําเนินการนี้จะใช้เวลาสักครู่เพื่อจัดสรรและเชื่อมต่อกับ Cloud Shell
เครื่องเสมือนนี้โหลดด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหน้าแรกขนาด 5 GB ถาวรและทํางานอยู่ใน Google Cloud ซึ่งช่วยปรับปรุงประสิทธิภาพและการตรวจสอบสิทธิ์ของเครือข่ายได้อย่างมาก งานที่ทําใน Codelab นี้เพียงบางรายการสามารถทําได้โดยใช้เบราว์เซอร์หรือ 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 Boot
$ ./mvnw -DskipTests spring-boot:run
- หลังจากแอปเริ่มทํางาน ให้คลิกแสดงตัวอย่างเว็บ
ในแถบเครื่องมือ Cloud Shell แล้วเลือกแสดงตัวอย่างบนพอร์ต 8080
แท็บในเบราว์เซอร์จะเปิดขึ้นและเชื่อมต่อกับเซิร์ฟเวอร์ที่คุณเพิ่งเริ่มต้น
5 สร้างแพ็กเกจแอป Java เป็นคอนเทนเนอร์ Docker
ต่อไปคุณต้องเตรียมแอปของคุณให้ทํางานใน Kubernetes ขั้นตอนแรกคือการกําหนดคอนเทนเนอร์และเนื้อหาของคอนเทนเนอร์
- สร้าง JAR ที่ทําให้ใช้งานได้กับแอป
$ ./mvnw -DskipTests package
- เปิดใช้ Container Registry เพื่อจัดเก็บอิมเมจคอนเทนเนอร์ที่คุณจะสร้าง
$ gcloud services enable containerregistry.googleapis.com
- ใช้ Jib เพื่อสร้างรูปภาพคอนเทนเนอร์และพุชไปยัง Container Registry
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- หากไม่มีปัญหาใดๆ คุณควรดูรูปภาพคอนเทนเนอร์ที่แสดงในคอนโซลได้โดยไปที่ Container Registry > รูปภาพ ตอนนี้คุณมีรูปภาพ Docker ทั่วทั้งโปรเจ็กต์แล้ว ซึ่ง Kubernetes จะเข้าถึงและเรียบเรียงเป็นกลุ่มได้ภายในไม่กี่นาที
- เมื่อทําเสร็จแล้ว (ต้องใช้เวลาในการดาวน์โหลดและแตกข้อมูลทุกอย่างออก) คุณสามารถทดสอบรูปภาพในเครื่องโดยใช้คําสั่งต่อไปนี้ ซึ่งจะเรียกใช้คอนเทนเนอร์ Docker เป็นไดมอนด์ในพอร์ต 8080 จากอิมเมจคอนเทนเนอร์ที่คุณสร้างใหม่
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- และใช้ประโยชน์จากฟีเจอร์ตัวอย่างเว็บของ Cloud Shell อีกครั้ง
- คุณควรเห็นหน้าเริ่มต้นในแท็บใหม่ หลังจากยืนยันแล้วว่าแอปทํางานภายในคอนเทนเนอร์ Docker คุณสามารถหยุดคอนเทนเนอร์ที่ทํางานอยู่ได้โดยกด
Control+C
6 สร้างคลัสเตอร์
คุณพร้อมสร้างคลัสเตอร์ GKE แล้ว คลัสเตอร์ประกอบด้วยเซิร์ฟเวอร์ Kubernetes API ที่จัดการโดย Google และชุดโหนดผู้ปฏิบัติงาน โหนดผู้ปฏิบัติงานคือ VM ของ Compute Engine
- ขั้นแรก ให้เปิดใช้ฟีเจอร์ API ที่เกี่ยวข้อง
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- สร้างคลัสเตอร์ที่มี 2 โหนด
n1-standard-1
(ใช้เวลา 2-3 นาทีจึงจะเสร็จสมบูรณ์)
$ 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 แล้ว) ส่วนที่เหลือของ Codelab ต้องใช้ไคลเอ็นต์ Kubernetes และเวอร์ชันเซิร์ฟเวอร์เป็น 1.2 ขึ้นไป kubectl version
จะแสดงคําสั่งเวอร์ชันปัจจุบัน
7 ทําให้แอปของคุณใช้งานได้ใน Kubernetes
- การใช้งาน Kubernetes จะสร้าง จัดการ และปรับขนาดอินสแตนซ์หลายรายการของแอปได้โดยใช้รูปภาพคอนเทนเนอร์ที่คุณสร้างขึ้น ทําให้อินสแตนซ์ของแอปใช้งานได้ 1 รายการด้วย 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 อนุญาตการรับส่งข้อมูลภายนอก
โดยค่าเริ่มต้น IP ภายในจะเข้าถึงพ็อดได้เท่านั้นภายในคลัสเตอร์ หากต้องการให้คอนเทนเนอร์ hello-java
เข้าถึงได้จากภายนอกเครือข่ายเสมือนของ Kubernetes คุณต้องแสดงพ็อดเป็นบริการ Kubernetes
- ใน Cloud Shell คุณจะเปิดใช้พ็อดไปยังอินเทอร์เน็ตสาธารณะด้วยคําสั่ง
kubectl expose
ร่วมกับแฟล็ก--type=LoadBalancer
ได้ ต้องใช้แฟล็กสําหรับการสร้าง IP ที่เข้าถึงภายนอกได้
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
แฟล็กที่ใช้ในคําสั่งจะระบุว่าคุณกําลังใช้ตัวจัดสรรภาระงานจากโครงสร้างพื้นฐานที่เกี่ยวข้อง โปรดทราบว่าคุณเปิดเผยการทําให้ใช้งานได้โดยตรง ไม่ใช่พ็อด การดําเนินการนี้จะทําให้บริการที่เป็นผลลัพธ์โหลดการรับส่งข้อมูลยอดคงเหลือในพ็อดทั้งหมดที่ได้รับการจัดการโดยการทําให้ใช้งานได้ (ในกรณีนี้จะมีเพียง 1 พ็อดเท่านั้น แต่คุณจะเพิ่มการจําลองเพิ่มเติมในภายหลัง)
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 สําหรับบริการของคุณ 2 รายการ ซึ่งทั้ง 2 รายการจะแสดงพอร์ต 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
สังเกตแนวทางการประกาศ แทนที่จะประกาศหรือหยุดอินสแตนซ์ใหม่ คุณต้องประกาศจํานวนอินสแตนซ์ที่ควรทํางานตลอดเวลา การวนซ้ําการปรับยอดของโปรโตคอลเพียงแค่ตรวจสอบว่าความเป็นจริงตรงกับสิ่งที่คุณขอและดําเนินการหากจําเป็น
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 ยินดีด้วย
คุณได้เรียนรู้วิธีสร้างและทําให้เว็บแอปที่ใช้ Java ใหม่ใช้งานได้ใน Kubernetes บน GKE