Lab 3 — Helm Values & Templating
🎯 Mục tiêu
Sau Lab này, bạn sẽ:
- Hiểu Values và Template phối hợp với nhau như thế nào.
- Biết cách customize một Helm Chart mà không cần sửa
templates/. - Nhận biết được các syntax Helm Template phổ biến khi review Chart.
- Hiểu thứ tự ưu tiên của các nguồn values.
- Biết cách render Chart trước khi deploy để kiểm tra kết quả.
Không cần học thuộc Go Template syntax.
Mục tiêu của Lab là nhìn thấy:
{{ .Values.image.tag }}và hiểu ngay:
"Template này đang lấy
image.tagtừ configuration."
1. 🤔 Vấn đề thực tế
Hãy quay lại Todo Application.
Bạn muốn deploy cùng một application vào:
Dev
Staging
Production
Nhưng mỗi environment có configuration khác nhau:
Dev Staging Production
─── ─────── ──────────
Replicas 1 2 5
Image dev staging 1.5.0
CPU 100m 200m 500m
Memory 128Mi 256Mi 512Mi
Nếu viết Kubernetes YAML trực tiếp, bạn có thể phải tạo:
deployment-dev.yaml
deployment-staging.yaml
deployment-prod.yaml
Và khi application thay đổi, phải sửa nhiều file.
Helm giải quyết bằng cách tách:
Application
│
┌─────────┴─────────┐
│ │
Template Values
│ │
│ ┌──────┼──────┐
│ ▼ ▼ ▼
│ Dev Staging Prod
│
└───────────┬─────────────┘
▼
Rendered YAML
│
▼
Kubernetes
Template quyết định cấu trúc.
Values quyết định configuration.
Đây là mental model quan trọng nhất của Lab này.
2. 🧠 Hiểu nhanh
2.1 Values là gì?
Values là dữ liệu configuration mà Chart sử dụng.
Ví dụ:
replicaCount: 3
image:
repository: nginx
tag: "1.27"
service:
port: 80
Bạn có thể coi nó như:
Input của Helm Chart.
2.2 Template là gì?
Template là Kubernetes YAML có những phần động.
Ví dụ Kubernetes YAML thông thường:
spec:
replicas: 3
Helm Template:
spec:
replicas: {{ .Values.replicaCount }}
Helm lấy:
replicaCount: 3
và render thành:
spec:
replicas: 3
3. 🏗️ Architecture
Toàn bộ quá trình:
values.yaml
│
│
▼
┌───────────┐
│ Values │
└─────┬─────┘
│
│
▼
templates/deployment.yaml
│
│ {{ .Values.xxx }}
▼
Helm Engine
│
▼
Rendered Manifest
│
▼
Kubernetes API
│
▼
Deployment
Có thể nhớ đơn giản:
Values = Data
Template = Structure
Helm = Renderer
4. 🧪 Thực hành — Tạo Chart
Chúng ta tạo một Chart nhỏ để tập trung vào Values.
mkdir helm-values-lab
cd helm-values-lab
helm create my-app
cd my-app
Kiểm tra:
helm lint .
Nếu không có lỗi nghiêm trọng:
1 chart(s) linted, 0 chart(s) failed
5. 🧪 Bước 1 — Tạo Value đơn giản
Mở:
vi values.yaml
Tìm:
replicaCount: 1
Đổi thành:
replicaCount: 3
Bây giờ tìm trong:
templates/deployment.yaml
Bạn sẽ thấy:
replicas: {{ .Values.replicaCount }}
See Result
Render Chart:
helm template my-app .
Tìm:
replicas: 3
Understand
Flow là:
values.yaml
replicaCount: 3
│
▼
.Values.replicaCount
│
▼
replicas: 3
Đây là pattern bạn sẽ gặp liên tục trong Helm.
6. 🧩 Nested Values
Configuration thực tế thường không nằm ở một biến đơn.
Ví dụ:
image:
repository: nginx
tag: "1.27"
Trong Template:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Helm sẽ render thành:
image: "nginx:1.27"
Mental Model
.Values
│
└── image
├── repository
└── tag
Vì vậy:
.Values.image.repository
có nghĩa đơn giản là:
Lấy
repositorybên trongimage.
Không cần nhớ syntax sâu hơn.
7. 🧪 Bước 2 — Customize Image
Trong values.yaml:
image:
repository: nginx
tag: "1.27"
Thử thay:
image:
repository: nginx
tag: "1.28"
Render:
helm template my-app .
Tìm:
image:
Bạn sẽ thấy image thay đổi.
See Result
Before:
nginx:1.27
After:
nginx:1.28
Understand
Bạn vừa thay đổi application configuration mà không sửa Deployment template.
Đây chính là mục tiêu của Helm.
8. 🔀 Values có thể truyền từ bên ngoài
Bạn không nhất thiết phải sửa values.yaml.
Ví dụ:
helm template my-app . \
--set replicaCount=5
Kết quả:
replicas: 5
Trong trường hợp này:
values.yaml
replicaCount: 3
nhưng:
--set replicaCount=5
đã override nó.
Mental model:
Default Values
│
▼
values.yaml
│
▼
Override
│
├── values-prod.yaml
│
└── --set
│
▼
Final Values
│
▼
Template
9. 📁 Environment-specific Values
Đây là cách thường gặp trong thực tế.
Tạo:
values-dev.yaml
values-prod.yaml
Ví dụ:
values-dev.yaml
replicaCount: 1
image:
repository: nginx
tag: "1.27"
values-prod.yaml
replicaCount: 5
image:
repository: nginx
tag: "1.28"
Deploy Dev:
helm install todo-dev . \
-f values-dev.yaml
Deploy Production:
helm install todo-prod . \
-f values-prod.yaml
Cùng một Chart:
my-app Chart
│
┌─────────┴─────────┐
│ │
values-dev values-prod
│ │
▼ ▼
todo-dev todo-prod
Đây là một trong những pattern quan trọng nhất khi sử dụng Helm.
10. 🧠 Value Precedence
Khi nhiều nguồn cùng cung cấp một value:
values.yaml
values-prod.yaml
--set
Helm cần biết:
"Cuối cùng dùng giá trị nào?"
Bạn không cần học thuộc quá nhiều quy tắc.
Hãy nhớ mental model:
Default
↓
values.yaml
↓
custom values file
↓
--set
↓
Final Value
Nguồn override mạnh hơn sẽ thắng.
Ví dụ:
values.yaml:
replicaCount: 1
values-prod.yaml:
replicaCount: 5
Command:
helm template my-app . \
-f values-prod.yaml \
--set replicaCount=10
Kết quả:
replicas: 10
Vì --set override value từ file.
11. 🧪 Bước 3 — Kiểm tra Value thực tế
Một kỹ năng rất hữu ích khi debug:
helm get values <release>
Ví dụ:
helm get values todo-prod
Bạn có thể biết Release đang sử dụng những values nào.
Nếu muốn xem cả các giá trị mặc định và giá trị đã được áp dụng:
helm get values todo-prod --all
Production Tip
Khi một developer nói:
"Production đang chạy replica = 5."
Đừng chỉ tin vào file Git.
Hãy kiểm tra Release thực tế:
helm get values todo-prod --all
Vì configuration trong repository và configuration đang chạy đôi khi không giống nhau.
12. 🧠 Template Conditions
Helm không chỉ thay biến.
Bạn có thể bật/tắt resource.
Ví dụ trong values.yaml:
ingress:
enabled: true
Template:
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
...
{{- end }}
Nếu:
ingress:
enabled: true
Ingress được render.
Nếu:
ingress:
enabled: false
Ingress không được render.
Flow:
ingress.enabled
│
┌──────┴──────┐
│ │
true false
│ │
▼ ▼
Render Ingress Skip
Bạn không cần nhớ syntax if.
Chỉ cần nhận biết:
if
↓
Conditional rendering
13. 🧪 Bước 4 — Bật / Tắt Ingress
Trong:
values.yaml
đặt:
ingress:
enabled: true
Render:
helm template my-app .
Tìm:
kind: Ingress
Sau đó đổi:
ingress:
enabled: false
Render lại:
helm template my-app .
Ingress sẽ không còn xuất hiện.
Understand
Helm cho phép bạn dùng một Chart cho nhiều nhu cầu:
Dev
→ ingress: false
Production
→ ingress: true
Không cần tạo hai Chart.
14. 🔁 Template Loops
Một concept khác bạn cần nhận biết, không cần học sâu syntax là loop.
Ví dụ Values:
env:
- name: NODE_ENV
value: production
- name: LOG_LEVEL
value: info
Template có thể loop qua danh sách này:
env:
├── NODE_ENV
└── LOG_LEVEL
và render thành:
env:
- name: NODE_ENV
value: production
- name: LOG_LEVEL
value: info
Mental model:
Values List
│
▼
range
│
▼
Generate multiple items
Bạn chỉ cần nhận biết:
range
↓
Loop
Không cần học thuộc syntax ngay.
15. 🧠 Template Functions
Helm có rất nhiều template function.
Bạn không nên cố học thuộc tất cả.
Một số function bạn sẽ thường xuyên nhìn thấy:
default
required
quote
toYaml
nindent
include
Ví dụ:
{{ default "ClusterIP" .Values.service.type }}
Ý nghĩa:
Nếu người dùng không cung cấp
service.type, dùngClusterIP.
Bạn không cần nhớ chính xác syntax.
Chỉ cần hiểu:
default
↓
Fallback value
16. 🧪 Render trước khi Deploy
Đây là một habit rất tốt.
Thay vì:
helm upgrade ...
ngay lập tức, hãy:
helm template my-app .
để xem Helm generate gì.
Hoặc:
helm install my-app . \
--dry-run \
--debug
dry-run có thể hiểu đơn giản là:
"Thử chạy nhưng chưa thực sự deploy."
17. 🔍 Tại sao helm template quan trọng?
Giả sử AI tạo cho bạn một Chart:
templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
└── hpa.yaml
Bạn không cần đọc từng dòng template.
Chạy:
helm template my-app .
sau đó xem:
Deployment
Service
Ingress
HPA
Bạn có thể review output trực tiếp:
Helm Template
↓
Rendered YAML
↓
Review
↓
Kubernetes
Đây là workflow rất phù hợp khi làm việc với AI.
18. 🤖 Review Helm Chart do AI tạo
Giả sử AI đưa cho bạn:
replicaCount: 3
resources:
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: true
Bạn cần tự hỏi:
replicaCount = 3
↓
Deployment có dùng value này không?
resources
↓
Có được map vào container không?
autoscaling.enabled
↓
Có tạo HPA không?
HPA + replicaCount
↓
Có conflict về behavior không?
Đây mới là kỹ năng bạn cần.
Không phải:
"Tôi có thể tự viết toàn bộ Helm Template mà không cần AI."
19. ⚠️ Production Tips
1. Không hard-code configuration trong Template
Không nên:
replicas: 5
nếu đây là một giá trị cần customize.
Nên:
replicas: {{ .Values.replicaCount }}
và:
replicaCount: 5
trong values.
2. Không đưa Secret thật vào values.yaml
Ví dụ không nên:
database:
password: "my-production-password"
và commit vào Git.
Production nên sử dụng cơ chế quản lý Secret phù hợp.
Chúng ta sẽ quay lại chủ đề này khi học ConfigMap / Secret.
3. Values nên dễ hiểu
Không nên:
x: 3
y: true
z: abc
Nên:
replicaCount: 3
autoscaling:
enabled: true
image:
repository: todo-api
tag: "1.2.0"
Một người khác mở Chart phải hiểu ngay configuration này làm gì.
20. 🧪 Bài tập thực hành
Exercise 1 — Customize Replica
Thay:
replicaCount: 1
bằng:
replicaCount: 3
Render:
helm template my-app .
Xác nhận:
replicas: 3
Exercise 2 — Override bằng --set
Không sửa values.yaml.
Chạy:
helm template my-app . \
--set replicaCount=5
Kiểm tra:
replicas: 5
Exercise 3 — Environment
Tạo:
values-dev.yaml
values-prod.yaml
Dev:
replicaCount: 1
Production:
replicaCount: 5
Render:
helm template my-app . \
-f values-prod.yaml
Kiểm tra:
replicas: 5
Exercise 4 — Conditional Resource
Tìm:
ingress:
enabled: true
Thử:
true
false
Sau đó render:
helm template my-app .
và quan sát sự khác biệt.
21. 🧠 Tổng kết
Bạn không cần nhớ hàng chục syntax Helm Template.
Chỉ cần có mental model này:
Values
│
│ configuration
▼
Templates
│
│ render
▼
Kubernetes YAML
│
▼
Kubernetes
Và khi nhìn thấy:
{{ .Values.xxx }}
→ Lấy value
if
→ Điều kiện
range
→ Loop
include
→ Template dùng chung
default
→ Giá trị mặc định
Thế là đủ cho giai đoạn hiện tại.
🎯 Mental Model cuối Lab
Hãy tưởng tượng Helm Chart giống như một mẫu áo:
Template
│
│ "Thiết kế áo"
▼
┌─────────────────┐
│ SHIRT │
│ │
│ {{ size }} │
│ {{ color }} │
└─────────────────┘
▲
│
Values
│
┌────┴────┐
│ │
Dev Prod
│ │
size=S size=XL
color=blue color=black
Template không thay đổi.
Values thay đổi.
Kết quả được render theo từng environment.
Đây chính là lý do Helm có thể biến một Kubernetes manifest thành một deployment template có thể tái sử dụng.
Ở Lab tiếp theo, chúng ta sẽ áp dụng Values & Templating vào Deployment, Service, ConfigMap, Secret và Ingress, thay vì chỉ nhìn vào syntax riêng lẻ.
All rights reserved