Trong phần 1, mình đã giới thiệu với các bạn một số thông tin về Helm chart và cách generate một Helm project là như thế nào. Trong phần này, chúng ta sẽ tiến hành chỉnh sửa các tập tin cấu hình cho các đối tượng của Kubernetes, sau đó thì sử dụng Helm để deploy ứng dụng ví dụ. Các bạn sẽ hình dung cách mà chúng ta sử dụng Helm để quản lý việc deployment cho các ứng dụng được deploy sử dụng Kubernetes các bạn nhé!
Bây giờ, chúng ta sẽ review lại nội dung của tập tin deployment.yaml và service.yaml để xem những thông tin nào chúng ta có thể configurable được, những thông tin nào có thể re-use được. Những thông tin nào có thể configurable được, chúng ta sẽ định nghĩa chúng vào tập tin values.yaml, còn những thông tin nào có thể re-use được, chúng ta sẽ định nghĩa chúng trong tập tin _helpers.tpl.
Trong tập tin deployment.yaml của mình, các thông tin như replicas, Docker Image repository, Docker Image tag là những thông tin chúng ta có thể extract để chúng configurable được. Còn trong tập tin service.yaml, chúng ta có thể extract thông tin type và port để chúng configurable.
Mình có thể định nghĩa nội dung tập tin values.yaml như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
replicaCount: 1 image: spring_boot_docker_compose: repository: spring-boot-docker-compose tag: 1.0.0 postgres: repository: postgres tag: 13.3 service: type: LoadBalancer port: 8080 |
Để sử dụng các cặp key, value này trong các tập tin deployment.yaml và service.yaml, chúng ta sẽ khai báo sử dụng với cú pháp như sau:
1 |
{{ .Values.<key> }} |
trong đó:
- <key> là tên property chúng ta sử dụng để khai báo giá trị.
- Values là built-in object của Helm, nắm giữ thông tin của tất cả property mà chúng ta khai báo trong tập tin values.yaml.
Nội dung của tập tin deployment.yaml và service.yaml sau khi sử dụng các cặp key, value trong tập tin values.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: {{ .Values.replicaCount }} selector: matchLabels: app: spring-boot-docker-compose template: metadata: labels: app: spring-boot-docker-compose spec: containers: - name: spring-boot-docker-compose image: "{{ .Values.image.spring_boot_docker_compose.repository }}:{{ .Values.image.spring_boot_docker_compose.tag }}" 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: "{{ .Values.image.postgres.repository }}:{{ .Values.image.postgres.tag }}" 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: {{ .Values.service.port }} targetPort: 8080 type: {{ .Values.service.type }} |
Trong 2 tập tin deployment.yaml và service.yaml thì thông tin về label là có thể re-use được. Chúng ta có thể định nghĩa một template chứa thông tin label này trong tập tin _helpers.tpl sử dụng action “define” của Helm như sau:
1 2 3 |
{{- define "spring-boot-docker-compose.labels" }} app: spring-boot-docker-compose {{- end }} |
Để sử dụng template “spring-boot-docker-compose.labels” này trong các tập tin deployment.yaml và service.yaml, chúng ta có thể khai báo sử dụng include function 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: {{ .Values.replicaCount }} selector: matchLabels: {{- include "spring-boot-docker-compose.labels" . | indent 6 }} template: metadata: labels: {{- include "spring-boot-docker-compose.labels" . | indent 8 }} spec: containers: - name: spring-boot-docker-compose image: "{{ .Values.image.spring_boot_docker_compose.repository }}:{{ .Values.image.spring_boot_docker_compose.tag }}" 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: "{{ .Values.image.postgres.repository }}:{{ .Values.image.postgres.tag }}" 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: {{- include "spring-boot-docker-compose.labels" . | indent 4 }} ports: - protocol: "TCP" port: {{ .Values.service.port }} targetPort: 8080 type: {{ .Values.service.type }} |
Như các bạn thấy, tất cả mọi khai báo sử dụng template của Helm, chúng ta đều sử dụng cặp mở “{{” và đóng “}}”. Và tuỳ theo nhu cầu, việc khai báo bên trong cặp “{{” và “}}” sẽ khác nhau.
Ở đây, mình còn khai báo từ khoá indent. Trước khi mình nói về từ khoá này, thì mình cũng muốn nhấn mạnh với các bạn là chúng ta đang làm việc với Helm chart template. Nó không phải là tập tin cuối cùng được sử dụng cho deployment. Helm sẽ giúp chúng ta, dựa vào template mà chúng ta định nghĩa để generate output cuối cùng dành cho việc deployment. Từ khoá indent giúp chúng ta định dạng text sẽ được generate. “indent 4” khi generate output thì dòng này sẽ được lùi vào 4 ký tự space các bạn nhé! Tương tự “indent 8” là sẽ 8 ký tự space. Việc sử dụng indent giúp output của chúng ta dễ đọc và bảo trì hơn.
Đến đây thì mình đã hoàn thành việc apply Helm template vào các tập tin cấu hình cho các đối tượng của Kubernetes.
Các bạn có thể verify xem liệu phần cấu hình cho Helm chart của chúng ta có vấn đề gì hay không, sử dụng câu lệnh:
1 |
helm lint <path-to-helm-project-root-folder> |
trong đó:
- path-to-helm-project-root-folder là đường dẫn tới thư mục root của Helm project.
Ví dụ mình có thể chạy command “helm lint” cho ứng dụng ví dụ của mình như sau:
1 |
helm lint . |
Kết quả:
Như vậy là Helm chart mà mình cấu hình không có lỗi gì cả.
Để xem kết quả Helm sẽ generate output như thế nào dựa vào template, các bạn có thể chạy câu lệnh:
1 |
helm template <template-name> <path-to-helm-project-root-folder> |
trong đó:
- template-name là tên của template mà chúng ta đặt cho Helm chart
- path-to-helm-project-root-folder thì tương tự như mình đã nói ở trên.
Kết quả khi mình chạy command helm template cho ví dụ của mình:
1 |
helm template spring-boot-docker-compose . |
như sau:
Như các bạn thấy, các thông tin trong tập tin deployment.yaml và service.yaml đã được thay thế bằng các giá trị mình định nghĩa trong tập tin values.yaml và _helpers.tpl.
Lúc này, các bạn có thể deploy ứng dụng lên Kubernetes sử dụng câu lệnh install của Helm như sau:
1 |
helm install <release-name> <path-to-helm-project-root-folder> |
trong đó:
- release-name là tên release của ứng dụng
Kết quả khi mình chạy command install:
1 |
helm install spring-boot-docker-compose . |
như sau:
Kiểm tra tất cả deployment có trong Kubernetes cluster, các bạn sẽ thấy kết quả như sau:
Kiểm tra tất cả các services, các bạn sẽ thấy kết quả như sau:
Giờ thì truy cập truy cập tới địa chỉ http://localhost:8080/hello, các bạn sẽ thấy kết quả như mình đã nói trong bài viết trước.
Các bạn có thể kiểm tra tất cả chart release sử dụng command list như sau:
1 |
helm list |
Kết quả khi mình chạy câu lệnh list này như sau: