1. Helm là gì?
Helm là trình quản lý gói (package manager) và công cụ triển khai ứng dụng cho Kubernetes. Tương tự như apt/yum trên Linux, Helm cho phép bạn đóng gói một tập hợp các tài nguyên Kubernetes (Pod, Service, Ingress, ConfigMap, Secret, …) thành một đơn vị logic duy nhất gọi là Chart. Khi cài đặt một Chart, Helm sẽ:
- Render các file template (YAML) bằng cách thay thế các biến bằng giá trị trong
values.yaml. - Gửi các manifest đã render tới API server của Kubernetes.
- Theo dõi trạng thái và cung cấp các lệnh quản lý (upgrade, rollback, uninstall …).
2. Cấu trúc cơ bản của một Helm chart
Khi bạn chạy helm create, Helm sẽ tạo ra một thư mục có cấu trúc chuẩn như sau:
/ ├── Chart.yaml # Thông tin mô tả chart (name, version, appVersion, …) ├── values.yaml # Các giá trị mặc định (variables) cho template ├── charts/ # Thư mục chứa các chart phụ (dependencies) ├── templates/ # Các file template YAML │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ ├── serviceaccount.yaml │ ├── hpa.yaml │ ├── _helpers.tpl # Các hàm helper dùng trong template │ └── tests/ # Kiểm thử (test hooks) └── .helmignore # Các file/folder sẽ bị bỏ qua khi đóng gói
2.1 Chart.yaml
apiVersion: v2 # Phiên bản API của Helm (v2, v3 …) name: my-app # Tên chart description: A Helm chart for Kubernetes type: application # Hoặc library version: 0.1.0 # Phiên bản chart appVersion: "1.0.0" # Phiên bản ứng dụng (được dùng trong template)
2.2 values.yaml
Chứa các biến mặc định mà người dùng có thể ghi đè khi cài đặt. Ví dụ:
replicaCount: 2
image:
repository: my-registry/my-app
pullPolicy: IfNotPresent
tag: "latest"
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: nginx
hosts:
- host: my-app.example.com
paths:
- path: /
pathType: ImplementationSpecific
2.3 templates/
Mỗi file trong thư mục này là một template YAML. Khi Helm render, các biểu thức Go template ({{ }}) sẽ được thay thế bằng giá trị tương ứng trong values.yaml hoặc các hàm helper. Ví dụ templates/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
2.4 _helpers.tpl
Chứa các hàm helper dùng lại trong nhiều template, ví dụ:
{{- define "my-app.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
3. Quy trình tạo và sử dụng Helm chart
3.1 Tạo chart mới
helm create my-app
Sau lệnh này, thư mục my-app/ sẽ chứa cấu trúc chuẩn như trên. Bạn chỉ cần tùy chỉnh:
Chart.yaml(tên, version, mô tả)values.yaml(điền các giá trị thực tế của môi trường)templates/(thêm, sửa, hoặc xóa các tài nguyên cần thiết)
3.2 Tùy chỉnh values.yaml
Thay vì sửa từng file manifest, bạn chỉ điều chỉnh một file (values.yaml hoặc một file giá trị tùy chỉnh) và Helm sẽ tự động render các template. Ví dụ, để thay đổi số replica và image:
replicaCount: 3 image: repository: harbor.mycompany.com/demo/my-app tag: "v2.1"
3.3 Cài đặt chart
# Tạo namespace (nếu chưa có) kubectl create ns prod # Cài đặt chart với file values tùy chỉnh helm install my-app-release -n prod -f my-values.yaml ./my-app
Kết quả (sau khi cài đặt) có thể kiểm tra bằng:
kubectl -n prod get all
Ví dụ output:
NAME READY STATUS RESTARTS AGE pod/my-app-release-6c9d5b9c5f-abcde 1/1 Running 0 2m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-app-release ClusterIP 10.96.120.45 80/TCP 2m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-app-release 3/3 3 3 2m
3.4 Nâng cấp (upgrade) và rollback
Upgrade khi có thay đổi trong chart hoặc values:
helm upgrade my-app-release -n prod -f my-values.yaml ./my-app
Rollback nếu nâng cấp gặp lỗi:
helm rollback my-app-release 1 -n prod
4. Các thành phần chi tiết và cách chúng hoạt động
| Thành phần | Mô tả | Vai trò trong quá trình render |
|---|---|---|
| Chart.yaml | Metadata của chart (name, version, description, …) | Cung cấp thông tin cho Helm khi lưu trữ và phân phối chart. |
| values.yaml | Các biến mặc định | Khi render, Helm thay thế {{ .Values.xxx }} bằng giá trị tương ứng. |
| templates/ | Các file YAML có chứa Go template | Được Helm render thành manifest thực tế dựa trên values.yaml. |
| _helpers.tpl | Hàm helper (định nghĩa lại tên, label, selector…) | Giúp tránh lặp lại code, đồng nhất tên tài nguyên. |
| charts/ | Dependencies (chart phụ) | Helm sẽ tự động tải và cài đặt các chart phụ khi cài chart chính. |
| tests/ | Test hooks (Pod test) | Kiểm tra nhanh sau khi cài đặt để xác nhận chart hoạt động. |
| .helmignore | Danh sách file/folder không đóng gói | Giảm kích thước chart khi publish. |
4.1 Render quá trình
- Helm đọc
Chart.yaml→ xác định phiên bản, dependencies. - Helm tải
values.yamlvà các file giá trị do người dùng cung cấp (-f custom-values.yaml). - Helm thực thi các template trong
templates/bằng Go templating engine. Các hàm như{{ .Release.Name }},{{ .Chart.Name }},{{ include "my-app.fullname" . }}được thay thế. - Kết quả là một tập hợp các file YAML chuẩn (Deployment, Service, …) được gửi tới API server của Kubernetes.
5. Lợi ích khi dùng Helm chart
| Lợi ích | Mô tả |
|---|---|
| Tái sử dụng | Một chart có thể dùng cho nhiều môi trường (dev, staging, prod) chỉ bằng cách thay đổi values.yaml. |
| Quản lý version | Mỗi lần thay đổi chart hoặc values đều có version, dễ rollback. |
| Tự động hoá CI/CD | Helm tích hợp tốt với Jenkins, GitLab CI, Argo CD… → triển khai tự động. |
| Dependency management | Chart có thể khai báo phụ thuộc (Redis, PostgreSQL…) và Helm sẽ tự động cài đặt chúng. |
| Kiểm thử | Thư mục tests/ cho phép chạy pod test ngay sau khi cài đặt để xác nhận. |
| Cộng đồng | Có hàng ngàn chart công khai trên Artifact Hub, giúp bạn không phải “tự viết lại từ đầu”. |
6. Ví dụ thực tế (từ bài viết viblo.asia)
6.1 Tạo chart và cấu trúc thư mục
helm create app-demo cd app-demo tree .
Kết quả (rút gọn):
app-demo/ ├── Chart.yaml ├── values.yaml ├── charts/ ├── templates/ │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ ├── serviceaccount.yaml │ ├── hpa.yaml │ └── _helpers.tpl └── .helmignore
6.2 Custom values.yaml (được copy ra để tùy biến)
replicaCount: 2
image:
repository: harbor.prod.viettq.com/demo/my-app
pullPolicy: Always
tag: "v1"
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: "local"
hosts:
- host: demo-helm.prod.viettq.com
paths:
- path: /
pathType: ImplementationSpecific
6.3 Thêm biến môi trường vào templates/deployment.yaml
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
6.4 Cài đặt
kubectl create ns helm-demo helm -n helm-demo install my-app -f app-demo-value.yaml ./app-demo
6.5 Kiểm tra kết quả
kubectl -n helm-demo get all
Output mẫu:
NAME READY STATUS RESTARTS AGE pod/my-app-app-demo-9cd4f7659-vfdsq 1/1 Running 0 19h pod/my-app-app-demo-9cd4f7659-zbf4l 1/1 Running 0 19h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/my-app-app-demo ClusterIP 10.233.57.19 80/TCP 23h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-app-app-demo 2/2 2 2 23h

