Helm chart là gì và các thành phần của Helm chart


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ẽ:

  1. Render các file template (YAML) bằng cách thay thế các biến bằng giá trị trong values.yaml.
  2. Gửi các manifest đã render tới API server của Kubernetes.
  3. 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ầnMô tảVai trò trong quá trình render
Chart.yamlMetadata 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.yamlCác biến mặc địnhKhi 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.tplHà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.
.helmignoreDanh sách file/folder không đóng góiGiảm kích thước chart khi publish.

4.1 Render quá trình

  1. Helm đọc Chart.yaml → xác định phiên bản, dependencies.
  2. Helm tải values.yaml và các file giá trị do người dùng cung cấp (-f custom-values.yaml).
  3. 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ế.
  4. 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 íchMô tả
Tái sử dụngMộ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ý versionMỗi lần thay đổi chart hoặc values đều có version, dễ rollback.
Tự động hoá CI/CDHelm tích hợp tốt với Jenkins, GitLab CI, Argo CD… → triển khai tự động.
Dependency managementChart 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 đồngCó 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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

87 − = 81
Powered by MathCaptcha