0

Lab 3 — Helm Values & Templating

🎯 Mục tiêu

Sau Lab này, bạn sẽ:

  • Hiểu ValuesTemplate 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.tag từ 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 repository bên trong image.

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

--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ùng ClusterIP.

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí