18.3.1 Triển khai lên Kubernetes
Kubernetes là một nền tảng điều phối container tuyệt vời giúp chạy các image, xử lý việc scale container lên hoặc xuống khi cần thiết, và khôi phục các container bị lỗi để tăng độ ổn định, cùng với nhiều tính năng khác.
Kubernetes là một nền tảng mạnh mẽ để triển khai ứng dụng—mạnh đến mức mà chúng ta sẽ không thể trình bày chi tiết trong chương này. Thay vào đó, chúng ta sẽ chỉ tập trung vào các bước cần thiết để triển khai một ứng dụng Spring Boot (đã được đóng gói thành image container) lên một cụm Kubernetes. Để hiểu chi tiết hơn về Kubernetes, hãy tham khảo cuốn Kubernetes in Action, Ấn bản thứ 2 của Marko Lukša.
Kubernetes có tiếng là khó sử dụng (dù có thể điều này chưa hẳn công bằng), nhưng việc triển khai một ứng dụng Spring đã được đóng gói dưới dạng image container lên Kubernetes thực sự rất dễ và hoàn toàn xứng đáng với công sức bạn bỏ ra vì những lợi ích mà Kubernetes mang lại.
Bạn sẽ cần một môi trường Kubernetes để triển khai ứng dụng của mình. Có nhiều lựa chọn, bao gồm AWS EKS của Amazon và Google Kubernetes Engine (GKE). Nếu muốn thử nghiệm cục bộ, bạn cũng có thể chạy cụm Kubernetes bằng nhiều phiên bản triển khai như MiniKube https://minikube.sigs.k8s.io/docs/, MicroK8s https://microk8s.io/, và cá nhân tôi yêu thích Kind https://kind.sigs.k8s.io/.
Việc đầu tiên bạn cần làm là tạo một tệp khai báo triển khai (deployment manifest). Đây là một tệp YAML mô tả cách image sẽ được triển khai. Ví dụ đơn giản dưới đây là một deployment manifest để triển khai image Taco Cloud đã tạo trước đó lên cụm Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: taco-cloud-deploy
labels:
app: taco-cloud
spec:
replicas: 3
selector:
matchLabels:
app: taco-cloud
template:
metadata:
labels:
app: taco-cloud
spec:
containers:
- name: taco-cloud-container
image: tacocloud/tacocloud:latestTệp manifest này có thể đặt tên bất kỳ. Nhưng để tiện thảo luận, hãy giả sử bạn đặt tên nó là deploy.yaml và để trong thư mục k8s ở thư mục gốc của dự án.
Không đi sâu vào chi tiết cách hoạt động của deployment trong Kubernetes, những điểm chính cần lưu ý là deployment này có tên là taco-cloud-deploy và (gần cuối tệp) được thiết lập để triển khai và khởi chạy một container dựa trên image có tên tacocloud/tacocloud:latest. Việc sử dụng “latest” thay vì “0.0.19-SNAPSHOT” giúp đảm bảo rằng image mới nhất được đẩy lên registry sẽ được sử dụng.
Một điểm đáng chú ý khác là thuộc tính replicas được đặt là 3. Điều này thông báo cho Kubernetes rằng cần chạy ba bản sao (instance) của container. Nếu vì bất kỳ lý do nào một trong ba instance bị lỗi, Kubernetes sẽ tự động khắc phục bằng cách tạo một instance mới thay thế. Để áp dụng deployment này, bạn có thể sử dụng công cụ dòng lệnh kubectl như sau:
kubectl apply -f deploy.yamlSau một lúc, bạn có thể dùng kubectl get all để xem deployment đang hoạt động, bao gồm ba pod, mỗi pod chạy một instance của container. Dưới đây là ví dụ kết quả bạn có thể thấy:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/taco-cloud-deploy-555bd8fdb4-dln45 1/1 Running 0 20s
pod/taco-cloud-deploy-555bd8fdb4-n455b 1/1 Running 0 20s
pod/taco-cloud-deploy-555bd8fdb4-xp756 1/1 Running 0 20s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/taco-cloud-deploy 3/3 3 3 20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/taco-cloud-deploy-555bd8fdb4 3 3 3 20sPhần đầu tiên hiển thị ba pod, mỗi cái tương ứng với một instance bạn đã yêu cầu trong thuộc tính replicas. Phần giữa là tài nguyên Deployment. Phần cuối là tài nguyên ReplicaSet, một loại tài nguyên đặc biệt trong Kubernetes dùng để ghi nhớ số lượng bản sao của ứng dụng cần được duy trì.
Nếu bạn muốn thử chạy ứng dụng, bạn sẽ cần mở một cổng từ một trong các pod ra bên ngoài máy của bạn. Để làm điều đó, bạn có thể dùng lệnh kubectl port-forward như sau:
kubectl port-forward pod/taco-cloud-deploy-555bd8fdb4-dln45 8080:8080Trong ví dụ này, tôi đã chọn pod đầu tiên trong ba pod được liệt kê từ lệnh kubectl get all và yêu cầu chuyển tiếp các yêu cầu từ cổng 8080 của máy chủ host (máy đang chạy cụm Kubernetes) đến cổng 8080 của pod. Khi đã cấu hình xong, bạn có thể mở trình duyệt và truy cập vào http://localhost:8080 để xem ứng dụng Taco Cloud đang chạy trên pod được chỉ định.
