Helm là một công cụ giúp chúng ta quản lý các ứng dụng được deploy sử dụng Kubernetes. Các bạn cứ hình dung là để deploy một ứng dụng sử dụng Kubernetes chúng ta sẽ cần nhiều tập tin cấu hình khác nhau ví dụ như Deployment, Service, Ingress, … Mỗi lần deploy thì thông tin của những tập tin cấu hình này sẽ khác nhau. Làm thế nào để quản lý chúng? Helm sẽ giúp chúng ta giải quyết vấn đề này. Mỗi lần deploy, Helm sẽ giúp chúng ta đóng gói tất cả các tập tin cấu hình cần thiết vào một tập tin gọi là chart (mình cũng không rõ tại sao họ lại gọi như vậy), lưu lại chart này trong Charts repository giống như Maven repository và deploy application sử dụng các tập tin cấu hình trong chart đó. Cụ thể như thế nào? Trong bài viết này, mình sẽ giới thiệu với các bạn những kiến thức cơ bản về Helm để các bạn có thể sử dụng nó cho các ứng dụng deploy sử dụng Kubernetes các bạn nhé!
Ứng dụng ví dụ
Mình sẽ sử dụng ứng dụng ví dụ trong bài viết giới thiệu về Docker Compose để làm ví dụ cho bài viết này. Nếu các bạn không có thời gian đọc bài viết đó thì mình xin tóm gọn như này: ứng dụng ví dụ trong bài viết đó chỉ đơn giản là expose một endpoint “/hello”, trả về số idle connection kết nối đến một database là PostgreSQL mà thôi!
Dockerfile cho ứng dụng này, mình cũng đã tạo. Chi tiết các bạn có thể đọc lướt qua bài viết đó, tìm nội dung của tập tin Dockerfile nếu muốn nhé! (Mình không include ở đây vì có thể sau này mình update thì bài viết này không được update theo!)
Để deploy ứng dụng ví dụ này với Kubernetes, mình sẽ định nghĩa các tập tin deployment.yaml và service.yaml như sau:
deployment.yaml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-docker-compose spec: replicas: 1 selector: matchLabels: app: spring-boot-docker-compose template: metadata: labels: app: spring-boot-docker-compose spec: containers: - name: spring-boot-docker-compose image: spring-boot-docker-compose:1.0.0 ports: - containerPort: 8080 env: - name: "DATABASE_USERNAME" value: "khanh" - name: "DATABASE_PASSWORD" value: "123456" - name: "DATABASE_HOST" value: "localhost" - name: "DATABASE_NAME" value: "test" - name: "DATABASE_PORT" value: "5432" - name: postgres image: postgres:13.3 ports: - containerPort: 5432 env: - name: "POSTGRES_PASSWORD" value: "123456" - name: "POSTGRES_USER" value: "khanh" - name: "POSTGRES_DB" value: "test" |
service.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Service metadata: name: spring-boot-docker-compose-app-service spec: selector: app: spring-boot-docker-compose ports: - protocol: "TCP" port: 8080 targetPort: 8080 type: LoadBalancer |
Sau khi chạy command “apply” với 2 tập tin cấu hình trên:
1 |
kubectl apply -f deployment.yaml |
và:
1 |
kubectl apply -f service.yaml |
rồi request tới địa chỉ http://localhost:8080/hello, các bạn sẽ thấy kết quả như sau:
Bây giờ, chúng ta sẽ sử dụng Helm chart để quản lý việc deployment sử dụng Kubernetes cho ứng dụng ví dụ này các bạn nhé!
Helm project
Nếu các bạn chưa cài Helm thì có thể tham khảo ở đây.
Để sử dụng Helm quản lý việc deployment sử dụng Kubernetes, các bạn hãy tạo mới Helm project sử dụng câu lệnh “create” như sau:
1 |
helm create <project-name> |
trong đó:
- project-name là tên project mà các bạn muốn tạo.
Ví dụ, mình có thể tạo mới Helm project cho ứng dụng ví dụ của mình như sau:
1 |
helm create spring-boot-docker-compose |
Kết quả:
Kiểm tra thư mục mà các bạn vừa mới chạy câu lệnh “create” trên, các bạn sẽ thấy thư mục này đã tạo mới một số tập tin, thư mục như sau:
Các bạn hãy mở tập tin Chart.yaml, các bạn sẽ thấy nó được sử dụng để định nghĩa thông tin của chart bao gồm tên (thuộc tính name), mô tả (thuộc tính description), loại chart (thuộc tính type), version của chart (thuộc tính version) và version của ứng dụng (thuộc tính appVersion). Đây chỉ là những thông tin cơ bản, tập tin Chart.yaml này còn có thể định nghĩa rất nhiều thông tin khác nữa, các bạn có thể xem thêm tại đây.
Thuộc tính type định nghĩa loại chart mà chúng ta đang khai báo. Có 2 loại chart là application và library, điểm khác biệt giữa chúng là chart application có thể deploy được, còn chart library thì không các bạn nhé!
Mình sẽ định nghĩa thông tin chart cho ứng dụng ví dụ của mình như sau:
1 2 3 4 5 6 7 8 9 |
apiVersion: v2 name: spring-boot-docker-compose description: A Helm chart for Kubernetes to deploy spring-boot-docker-compose application type: application version: 0.1.0 appVersion: "1.0.0" |
Thư mục charts sẽ chứa các chart khác mà chart của bạn cần sử dụng.
Để đơn giản, mình sẽ không sử dụng các chart khác cho chart của ứng dụng ví dụ trong bài viết này nha các bạn!
Thư mục templates là thư mục quan trọng, chúng ta sẽ định nghĩa các tập tin cấu hình cho các đối tượng của Kubernetes trong thư mục này.
Mặc định, khi Helm project được generate, các bạn sẽ thấy rất nhiều tập tin cấu hình cho các đối tượng Kubernetes như deployment.yaml, service.yaml, … được generate trong thư mục này:
Các tập tin deployment.yaml, hpa.yaml, ingress.yaml, service.yaml, serviceaccount.yaml là những thông tin định nghĩa thông tin cho các đối tượng lần lượt là Deployment, Horizontal Pod Autoscaling, Ingress, Service và Service Account của Kubernetes. Tập tin _helpers.tpl sẽ chứa các định nghĩa template và có thể sử dụng lại nhiều nơi trong chart của chúng ta. Tập tin NOTES.txt để định nghĩa các dòng text sẽ được hiển thị khi chúng ta chạy các command của Helm như helm install, … Thư mục tests chứa các cấu hình liên quan đến testing cho chart của chúng ta.
Để deploy ứng dụng ví dụ của mình, như mình đã làm ở trên, mình chỉ cần cấu hình đối tượng Deployment và Service. Do đó để đơn giản, ngoại trừ tập tin _helpers.tpl, deployment.yaml và service.yaml, mình sẽ xoá hết các tập tin, thư mục còn lại, trong thư mục templates này như sau:
Nội dung của các tập tin deployment.yaml và service.yaml mình sẽ thay thế bằng nội dung ở trên và mình cũng sẽ xoá nội dung của tập tin _helpers.tpl đi!
Tập tin values.yaml ở thư mục home của Helm project dùng để định nghĩa các cặp key, value và chúng ta có thể declare để sử dụng các cặp key.value này trong các tập tin cấu hình của chart.
Mình cũng sẽ xoá nội dung của tập tin này, để viết lại từ đầu, cho các bạn dễ hình dung hơn. Vì tập tin generate đang chứa rất nhiều thông tin.
Đến đây thì mình xin kết thúc phần 1 của bài viết này. Chúng ta sẽ bắt đầu chỉnh sửa, apply Helm template cho các tập tin cấu hình cho các đối tượng của Kubernetes trong phần sau các bạn nhé!