Triển khai ứng dụng Java Khởi động mùa xuân cho Kubernetes trên Google Kubernetes Engine

Kubernetes là một dự án nguồn mở, có thể chạy trong nhiều môi trường khác nhau, từ máy tính xách tay đến các cụm nhiều nút có tính sẵn sàng cao, từ đám mây công cộng đến các hoạt động triển khai tại cơ sở hạ tầng riêng, và từ các thực thể máy ảo (VM) đến máy chủ vật lý.

Trong lớp học lập trình này, bạn sẽ triển khai một ứng dụng web Java Spring Boot đơn giản lên Kubernetes trên GKE, với mục tiêu là chạy ứng dụng web của bạn dưới dạng một ứng dụng được sao chép trên Kubernetes. Bạn sẽ lấy mã mà bạn phát triển trên máy, chuyển mã đó thành một hình ảnh vùng chứa Docker và chạy hình ảnh đó trên GKE.

Bạn sẽ sử dụng GKE, một dịch vụ Kubernetes được quản lý hoàn toàn trên Google Cloud, để có thể tập trung hơn vào việc trải nghiệm Kubernetes thay vì thiết lập cơ sở hạ tầng cơ bản.

Nếu bạn muốn chạy Kubernetes trên máy cục bộ (chẳng hạn như máy tính xách tay phát triển), hãy xem xét Minikube. Minikube cung cấp một chế độ thiết lập đơn giản cho cụm Kubernetes một nút nhằm phục vụ mục đích phát triển và kiểm thử. Bạn có thể sử dụng Minikube để tham gia lớp học lập trình này nếu muốn.

Lớp học lập trình này sẽ sử dụng mã mẫu trong hướng dẫn về Tạo ứng dụng bằng Spring Boot.

Điều kiện tiên quyết

  • Làm quen với ngôn ngữ lập trình và các công cụ Java
  • Kiến thức về các trình chỉnh sửa văn bản tiêu chuẩn của Linux, chẳng hạn như Vim, Emacs và nano

Bạn sẽ thực hiện

  • Đóng gói một ứng dụng Java đơn giản dưới dạng một vùng chứa Docker.
  • Tạo cụm Kubernetes trên GKE.
  • Triển khai ứng dụng Java của bạn lên Kubernetes trên GKE.
  • Mở rộng quy mô dịch vụ và triển khai bản nâng cấp.
  • Truy cập vào Trang tổng quan, một giao diện người dùng Kubernetes dựa trên web.

Bạn cần có

  • Một dự án trên Google Cloud
  • Một trình duyệt, chẳng hạn như Google Chrome

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)

Hãy nhớ mã dự án, một tên duy nhất trong tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.

  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên trên Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy.

Người dùng mới của Google Cloud đủ điều kiện dùng gói dùng thử miễn phí trị giá 300 USD.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .

Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài giây.

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.

  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list

Đầu ra của lệnh

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Đầu ra của lệnh

[core]
project = <PROJECT_ID>

Nếu không, bạn có thể đặt nó bằng lệnh sau:

gcloud config set project <PROJECT_ID>

Đầu ra của lệnh

Updated property [core/project].

Sau khi Cloud Shell khởi động, bạn có thể dùng dòng lệnh để sao chép mã nguồn ví dụ trong thư mục chính.

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete
  1. Bạn có thể khởi động ứng dụng Spring Boot như bình thường bằng trình bổ trợ Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
  1. Sau khi ứng dụng khởi động, hãy nhấp vào Web Preview (Xem trước trên web) trong thanh công cụ Cloud Shell rồi chọn Preview on port 8080 (Xem trước trên cổng 8080).

Một thẻ trong trình duyệt sẽ mở ra và kết nối với máy chủ mà bạn vừa khởi động.

Tiếp theo, bạn cần chuẩn bị ứng dụng để chạy trên Kubernetes. Bước đầu tiên là xác định vùng chứa và nội dung của vùng chứa đó.

  1. Tạo JAR có thể triển khai cho ứng dụng.
$ ./mvnw -DskipTests package
  1. Cho phép Container Registry lưu trữ hình ảnh vùng chứa mà bạn sẽ tạo.
$ gcloud services enable containerregistry.googleapis.com
  1. Sử dụng Jib để tạo hình ảnh vùng chứa và đẩy hình ảnh đó vào Container Registry.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Nếu không có vấn đề gì, bạn sẽ thấy hình ảnh vùng chứa xuất hiện trong bảng điều khiển bằng cách chuyển đến Container Registry > Images (Sổ đăng ký vùng chứa > Hình ảnh). Giờ đây, bạn có một hình ảnh Docker trên toàn dự án mà Kubernetes có thể truy cập và điều phối như bạn sẽ thấy trong vài phút nữa.
  1. Sau khi hoàn tất (sẽ mất một chút thời gian để tải xuống và trích xuất mọi thứ), bạn có thể kiểm thử cục bộ hình ảnh bằng lệnh sau. Lệnh này sẽ chạy một vùng chứa Docker dưới dạng một chương trình nền trên cổng 8080 từ hình ảnh vùng chứa mà bạn vừa tạo:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Một lần nữa, hãy tận dụng tính năng xem trước trên web của Cloud Shell.

  1. Bạn sẽ thấy trang mặc định trong một thẻ mới. Sau khi xác minh rằng ứng dụng đang chạy cục bộ trong một vùng chứa Docker, bạn có thể dừng vùng chứa đang chạy bằng cách nhấn Control+C.

Bạn đã sẵn sàng tạo cụm GKE. Cụm bao gồm một máy chủ API Kubernetes do Google quản lý và một nhóm các nút worker. Các nút worker là VM Compute Engine.

  1. Trước tiên, hãy đảm bảo rằng bạn đã bật các tính năng API có liên quan.
$ gcloud services enable compute.googleapis.com container.googleapis.com
Operation "operations/..." finished successfully
  1. Tạo một cụm có 2 nút n1-standard-1 (quá trình này sẽ mất vài phút để hoàn tất).
$ gcloud container clusters create hello-java-cluster \
  --num-nodes 2 \
  --machine-type n1-standard-1 \
  --zone us-central1-c

Cuối cùng, bạn sẽ thấy cụm đã được tạo.

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

Giờ đây, bạn đã có một cụm Kubernetes hoạt động đầy đủ nhờ GKE.

Giờ là lúc triển khai ứng dụng được chứa trong vùng chứa vào cụm Kubernetes! Từ giờ trở đi, bạn sẽ sử dụng dòng lệnh kubectl (đã được thiết lập trong môi trường Cloud Shell). Phần còn lại của lớp học lập trình yêu cầu phiên bản máy chủ và ứng dụng Kubernetes là 1.2 trở lên. kubectl version sẽ cho bạn biết phiên bản hiện tại của lệnh.

  1. Một hoạt động triển khai Kubernetes có thể tạo, quản lý và mở rộng nhiều phiên bản của ứng dụng bằng hình ảnh vùng chứa mà bạn đã tạo. Triển khai một phiên bản ứng dụng của bạn lên Kubernetes bằng lệnh kubectl run.
$ kubectl create deployment hello-java \
  --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. Để xem chế độ triển khai mà bạn đã tạo, chỉ cần chạy lệnh sau:
$ kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. Để xem các thực thể ứng dụng do quá trình triển khai tạo ra, hãy chạy lệnh sau:
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-java-714049816-ztzrb   1/1       Running   0          57s

Đến đây, bạn sẽ có vùng chứa chạy dưới sự kiểm soát của Kubernetes, nhưng bạn vẫn phải cho phép truy cập từ bên ngoài.

Theo mặc định, Pod chỉ có thể truy cập bằng IP nội bộ trong cụm. Để có thể truy cập vào vùng chứa hello-java từ bên ngoài mạng ảo Kubernetes, bạn phải hiển thị Pod dưới dạng một dịch vụ Kubernetes.

  1. Trong Cloud Shell, bạn có thể hiển thị Pod cho Internet công cộng bằng lệnh kubectl expose kết hợp với cờ --type=LoadBalancer. Bạn cần có cờ này để tạo một IP có thể truy cập từ bên ngoài.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

Cờ được dùng trong lệnh này chỉ định rằng bạn sẽ sử dụng trình cân bằng tải do cơ sở hạ tầng cơ bản cung cấp. Xin lưu ý rằng bạn trực tiếp hiển thị việc triển khai chứ không phải Pod. Điều này sẽ khiến dịch vụ kết quả cân bằng tải lưu lượng truy cập trên tất cả các Pod do việc triển khai quản lý (trong trường hợp này, chỉ có một Pod, nhưng bạn sẽ thêm nhiều bản sao hơn sau này).

Kubernetes Master tạo bộ cân bằng tải và các quy tắc chuyển tiếp, nhóm mục tiêu và quy tắc tường lửa liên quan của Compute Engine để giúp dịch vụ có thể truy cập hoàn toàn từ bên ngoài Google Cloud.

  1. Để tìm địa chỉ IP có thể truy cập công khai của dịch vụ, bạn chỉ cần yêu cầu kubectl liệt kê tất cả các dịch vụ của cụm.
$ 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. Lưu ý rằng có 2 địa chỉ IP được liệt kê cho dịch vụ của bạn, cả hai đều phục vụ cổng 8080. Một là địa chỉ IP nội bộ chỉ hiển thị bên trong Đám mây riêng ảo của bạn. Địa chỉ còn lại là địa chỉ IP được cân bằng tải bên ngoài. Trong ví dụ này, địa chỉ IP bên ngoài là aaa.bbb.ccc.ddd. Giờ đây, bạn có thể truy cập vào dịch vụ bằng cách trỏ trình duyệt đến http://<EXTERNAL_IP>:8080.

Một trong những tính năng mạnh mẽ mà Kubernetes cung cấp là khả năng mở rộng ứng dụng một cách dễ dàng. Giả sử bạn đột ngột cần thêm dung lượng cho ứng dụng của mình. Bạn chỉ cần yêu cầu bộ điều khiển sao chép quản lý một số lượng bản sao mới cho các phiên bản ứng dụng của mình.

$ 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

Hãy chú ý đến phương pháp khai báo. Thay vì bắt đầu hoặc dừng các phiên bản mới, bạn khai báo số lượng phiên bản cần chạy mọi lúc. Vòng lặp điều phối Kubernetes chỉ cần đảm bảo rằng thực tế khớp với những gì bạn yêu cầu và thực hiện hành động nếu cần.

Đến một thời điểm nào đó, ứng dụng mà bạn triển khai cho phiên bản phát hành công khai sẽ cần được sửa lỗi hoặc bổ sung tính năng. Kubernetes có thể giúp bạn triển khai một phiên bản mới cho bản phát hành công khai mà không ảnh hưởng đến người dùng.

  1. Mở trình chỉnh sửa mã bằng cách nhấp vào Khởi chạy trình chỉnh sửa trong trình đơn Cloud Shell.
  2. Chuyển đến src/main/java/hello/HelloController.java rồi cập nhật giá trị của phản hồi.
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. Sử dụng Jib để tạo và đẩy một phiên bản mới của hình ảnh vùng chứa.
$ ./mvnw -DskipTests package \
  com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

Bạn đã sẵn sàng để Kubernetes cập nhật bộ điều khiển sao chép lên phiên bản mới của ứng dụng một cách suôn sẻ!

  1. Để thay đổi nhãn hình ảnh cho vùng chứa đang chạy, bạn cần chỉnh sửa chế độ triển khai hello-java hiện có và thay đổi hình ảnh từ gcr.io/PROJECT_ID/hello-java:v1 thành gcr.io/PROJECT_ID/hello-java:v2.
  1. Bạn có thể dùng lệnh kubectl set image để yêu cầu Kubernetes triển khai phiên bản mới của ứng dụng trên toàn bộ cụm, mỗi lần một phiên bản bằng cách cập nhật luân phiên.
$ kubectl set image deployment/hello-java \
  hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

deployment "hello-java" image updated
  1. Kiểm tra lại http://EXTERNAL_IP:8080 để xem liệu nó có trả về phản hồi mới hay không.

Rất tiếc! Bạn có gặp lỗi với phiên bản mới của ứng dụng không? Có thể phiên bản mới chứa lỗi và bạn cần nhanh chóng khôi phục phiên bản cũ. Với Kubernetes, bạn có thể dễ dàng khôi phục về trạng thái trước đó. Quay lại phiên bản trước của ứng dụng bằng cách chạy lệnh sau:

$ kubectl rollout undo deployment/hello-java

Bạn đã tìm hiểu cách tạo và triển khai một ứng dụng web mới dựa trên Java lên Kubernetes trên GKE.

Tìm hiểu thêm