0

Lab 9 — Helm Testing & Validation

🎯 Mục tiêu

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

  • Hiểu tại sao Helm Chart cần được validate trước khi deploy.
  • Biết sử dụng helm lint để phát hiện lỗi cơ bản.
  • Biết dùng helm template để kiểm tra YAML mà Helm thực sự render.
  • Biết sử dụng helm install --dry-run để mô phỏng deployment.
  • Biết kiểm tra Kubernetes Manifest sau khi render.
  • Biết xây dựng một quy trình validation đơn giản trong CI/CD.

Mục tiêu của Lab này không phải học nhiều công cụ testing của Helm.

Chỉ cần hình thành một thói quen:

Write Chart
    ↓
Validate
    ↓
Render
    ↓
Test
    ↓
Deploy

Đây là kỹ năng rất thực tế khi bạn phải review Helm Chart do AI tạo.


1. 🤔 Vấn đề thực tế

Giả sử bạn vừa sửa:

templates/deployment.yaml

và chạy ngay:

helm upgrade todo-api .

Kubernetes trả về:

YAML parse error

Hoặc tệ hơn:

Helm install thành công
        ↓
Pod không chạy
        ↓
CrashLoopBackOff

Hoặc:

Deployment chạy
        ↓
Service không connect được

Vấn đề là:

Helm Chart có thể đúng syntax Helm nhưng sai Kubernetes configuration.

Vì vậy chúng ta cần kiểm tra Chart theo nhiều tầng:

Helm Syntax
     ↓
Rendered YAML
     ↓
Kubernetes Manifest
     ↓
Application Behavior

2. 🧠 Hiểu nhanh

Có thể chia validation Helm thành 3 mức:

┌──────────────────────────────┐
│ 1. helm lint                 │
│    Chart có vấn đề cơ bản?   │
└──────────────┬───────────────┘
               ↓
┌──────────────────────────────┐
│ 2. helm template             │
│    Render ra YAML thế nào?   │
└──────────────┬───────────────┘
               ↓
┌──────────────────────────────┐
│ 3. dry-run / Kubernetes      │
│    Deploy có hợp lệ không?   │
└──────────────────────────────┘

Mỗi bước trả lời một câu hỏi khác nhau.


3. 🏗️ Validation Flow

Architecture của Lab:

Developer
    │
    │ Helm Chart
    ▼
┌───────────────┐
│ helm lint     │
└───────┬───────┘
        │
        ▼
┌───────────────┐
│ helm template │
└───────┬───────┘
        │
        ▼
┌──────────────────┐
│ Rendered YAML    │
└────────┬─────────┘
         │
         ▼
┌──────────────────┐
│ Dry Run / Test   │
└────────┬─────────┘
         │
         ▼
    Kubernetes

4. 🚀 Chuẩn bị Lab

Sử dụng Chart đã tạo ở các Lab trước.

Ví dụ:

todo-app/
├── Chart.yaml
├── values.yaml
├── templates/
└── charts/

Kiểm tra:

helm version

và:

helm lint .

5. 🧪 Bước 1 — helm lint

Tại sao cần?

helm lint giống như một vòng code review tự động cơ bản.

Nó kiểm tra Chart có những vấn đề phổ biến hay không.

Chạy:

helm lint .

Nếu hợp lệ:

1 chart(s) linted, 0 chart(s) failed

Mental model:

Chart
  │
  ▼
helm lint
  │
  ├── Syntax
  ├── Chart structure
  └── Common problems

6. 🧠 helm lint không kiểm tra tất cả

Đây là điều rất quan trọng.

Nếu:

helm lint .

pass:

✅ Chart có vẻ hợp lệ

không có nghĩa:

❌ Application chắc chắn chạy được

Ví dụ:

image:
  repository: my-api
  tag: "999"

Chart có thể vẫn lint được.

Nhưng image:

my-api:999

có thể không tồn tại.

Vì vậy:

helm lint

chỉ là bước đầu tiên.


7. 🧪 Exercise 1 — Cố tình tạo lỗi

Mở:

templates/deployment.yaml

Thử tạo một lỗi indentation hoặc template syntax.

Ví dụ cố tình viết sai một template expression:

name: {{ .Values.name

Chạy:

helm lint .

Quan sát lỗi.

Sau đó sửa lại.

Chạy:

helm lint .

Kết quả:

0 chart(s) failed

Điều cần hiểu

Bạn vừa thấy:

Code
 ↓
helm lint
 ↓
Feedback nhanh

Không cần deploy lên Kubernetes để phát hiện lỗi cơ bản.


8. 🧪 Bước 2 — helm template

helm lint chỉ cho biết:

Chart có vấn đề hay không?

Nhưng chúng ta còn một câu hỏi quan trọng hơn:

Helm thực sự tạo ra YAML gì?

Đó là lúc dùng:

helm template todo-api .

9. 🧠 Tại sao helm template quan trọng?

Helm Chart chứa:

Template
+
Values

Kubernetes lại cần:

Plain YAML

Quá trình:

values.yaml
      │
      ▼
templates/
      │
      ▼
 Helm Engine
      │
      ▼
Rendered YAML
      │
      ▼
 Kubernetes

helm template cho phép bạn nhìn thấy kết quả ở giữa.


10. 🧪 Render Chart

Chạy:

helm template todo-api .

Bạn sẽ thấy:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo-api
spec:
  replicas: 2

và:

apiVersion: v1
kind: Service
...

Điều quan trọng:

Đây chính là YAML mà Helm chuẩn bị đưa cho Kubernetes.


11. 🧠 Đây là command cực kỳ quan trọng khi review AI

Giả sử AI tạo cho bạn:

200 lines Helm Template

Đừng cố đọc từng dòng template trước.

Hãy:

helm template .

Sau đó review:

Rendered YAML

Bạn sẽ dễ phát hiện:

replicas sai
image sai
port sai
env sai
namespace sai
probe sai
resources sai

Mental model:

AI-generated Chart
       │
       ▼
helm template
       │
       ▼
Actual Kubernetes YAML
       │
       ▼
Human Review

Đây là một trong những kỹ năng Helm thực tế nhất.


12. 🧪 Exercise 2 — Kiểm tra Rendered YAML

Chạy:

helm template todo-api .

Sau đó tìm:

kind: Deployment

Kiểm tra:

□ replicas đúng?
□ image đúng?
□ containerPort đúng?
□ environment đúng?
□ resources đúng?
□ probes đúng?

Sau đó tìm:

kind: Service

Kiểm tra:

□ port đúng?
□ targetPort đúng?
□ selector có match Pod không?

13. ⚠️ Một lỗi rất hay gặp

Ví dụ Deployment:

metadata:
  labels:
    app: todo-api

Nhưng Service:

selector:
  app: todo

Helm vẫn có thể render thành YAML hợp lệ.

Helm
 ↓
✅ Render được

Nhưng Kubernetes:

Service
    │
    │ selector: app=todo
    ▼
Không tìm thấy Pod

Kết quả:

Service
   ↓
No endpoints

Đây là ví dụ rất rõ:

YAML hợp lệ ≠ Configuration đúng.


14. 🧪 Bước 3 — helm install --dry-run

Bây giờ chúng ta tiến thêm một bước.

Thay vì:

helm install

chúng ta có thể mô phỏng:

helm install todo-api . \
  --dry-run

Có thể thêm:

--debug

để xem thông tin chi tiết hơn:

helm install todo-api . \
  --dry-run \
  --debug

15. 🧠 dry-run là gì?

dry-run nghĩa là:

Thử thực hiện nhưng không thực sự deploy.

Mental model:

helm install
      │
      ▼
Kubernetes
      │
      ▼
Resources created

Còn:

helm install --dry-run
      │
      ▼
Simulation
      │
      ▼
Không tạo resources thật

Điều này rất hữu ích khi:

Production

và bạn muốn kiểm tra trước khi thực sự thay đổi cluster.


16. 🧪 Exercise 3 — Dry Run

Chạy:

helm install todo-api . \
  --dry-run \
  --debug

Quan sát:

Deployment
Service
ConfigMap
...

Sau đó:

kubectl get pods

Bạn sẽ thấy:

Không có Todo API Pod mới

Đây là điểm khác biệt quan trọng:

dry-run
   ↓
validate/simulate

install
   ↓
actually change cluster

17. 🧠 helm template vs dry-run

Hai command có vẻ giống nhau nhưng mục đích hơi khác.

helm template

Tập trung vào:

Helm render ra YAML gì?

Chart
 ↓
Rendered YAML

helm install --dry-run

Tập trung vào:

Nếu install thì Helm release sẽ trông như thế nào?

Chart
 ↓
Helm install simulation

Trong thực tế bạn sẽ thường dùng:

helm lint
    ↓
helm template
    ↓
helm install --dry-run

18. 🧪 Bước 4 — Validate Kubernetes Manifest

Đến đây chúng ta đã kiểm tra:

Helm

Nhưng vẫn cần kiểm tra:

Kubernetes

Một manifest có thể:

Helm render thành công

nhưng không hợp lệ với Kubernetes API.

Một cách thực tế là render ra file:

helm template todo-api . > rendered.yaml

Sau đó inspect:

cat rendered.yaml

Bạn cũng có thể sử dụng các công cụ Kubernetes/schema validation trong CI để kiểm tra manifest trước khi apply.

Điều quan trọng cần nhớ:

Helm Validation
        +
Kubernetes Validation

là hai lớp khác nhau.


19. 🧠 Validation nhiều tầng

Bây giờ mental model hoàn chỉnh:

                Helm Chart
                    │
                    ▼
              ┌───────────┐
              │ helm lint │
              └─────┬─────┘
                    │
                    ▼
             ┌──────────────┐
             │ helm template│
             └──────┬───────┘
                    │
                    ▼
              Rendered YAML
                    │
                    ▼
          Kubernetes Validation
                    │
                    ▼
             Dry Run / Test
                    │
                    ▼
              Real Deploy

Mỗi tầng bắt một loại lỗi khác nhau.


20. 🧪 Exercise 4 — Values Validation

Một Chart tốt thường có nhiều environment:

values-dev.yaml
values-staging.yaml
values-prod.yaml

Đừng chỉ test:

helm lint .

Hãy test từng configuration.

Ví dụ:

helm lint . -f values-dev.yaml
helm lint . -f values-staging.yaml
helm lint . -f values-prod.yaml

Và:

helm template todo-api . \
  -f values-prod.yaml

21. 🧠 Tại sao phải test từng Values file?

Vì:

Chart
  +
values-dev

có thể chạy.

Nhưng:

Chart
  +
values-prod

có thể lỗi.

Ví dụ:

# values-dev.yaml

image:
  tag: "dev"

và:

# values-prod.yaml

image:
  tag: ""

Chart vẫn tồn tại.

Nhưng Production có thể tạo:

image: todo-api:

và Pod không chạy.

Vì vậy:

Chart + Values = một configuration cần test.


22. 🧪 Exercise 5 — Cố tình tạo lỗi Values

Sửa:

values-prod.yaml

thành:

replicaCount: "three"

Thay vì:

replicaCount: 3

Render:

helm template todo-api . \
  -f values-prod.yaml

Quan sát kết quả.

Đây là lúc bạn nhận ra:

values.yaml

không chỉ là dữ liệu.

Nó là input của hệ thống template.


23. 🧠 Schema Validation

Khi Chart lớn hơn, bạn có thể thêm:

values.schema.json

Mục đích:

Giới hạn Values được phép truyền vào Chart.

Ví dụ bạn muốn:

replicaCount

phải là:

integer

thay vì:

"three"

Mental model:

values.yaml
     │
     ▼
values.schema.json
     │
     ▼
Validate Input
     │
     ▼
Helm Template

24. 🧪 Exercise 6 — Schema

Tạo:

values.schema.json

Ví dụ đơn giản:

{
  "$schema": "http://json-schema.org/schema#",
  "type": "object",
  "properties": {
    "replicaCount": {
      "type": "integer",
      "minimum": 1
    }
  }
}

Bây giờ:

replicaCount: "three"

sẽ bị validation bắt lỗi.

Trong khi:

replicaCount: 3

hợp lệ.


25. 🧠 Tại sao Schema hữu ích?

Hãy tưởng tượng:

20 developers
      │
      ▼
Reusable Chart
      │
      ▼
20 values files

Nếu không có validation:

replicaCount: 3
replicaCount: "3"
replicaCount: three
replicaCount: null

Có thể xuất hiện nhiều configuration không nhất quán.

Schema giúp biến:

values.yaml

thành một interface có contract rõ ràng.


26. 🧪 Exercise 7 — Test Dependency

Nếu Chart có dependency:

charts/
└── postgresql

hãy kiểm tra:

helm dependency list

Sau đó:

helm template todo-app .

Xác nhận:

PostgreSQL

được render đúng.

Cuối cùng:

helm install todo-app . \
  --dry-run \
  --debug

27. 🧠 Helm Test

Helm còn có một khái niệm gọi là:

Helm Test

Nó khác với:

helm lint

và:

helm template

helm test dùng để kiểm tra release sau khi đã deploy.

Ví dụ:

Application
    │
    ▼
Kubernetes
    │
    ▼
Running Pod
    │
    ▼
Test Pod
    │
    ▼
Check Application

Một test có thể kiểm tra:

Application có response không?
Service có connect được không?
Database connection có hoạt động không?

28. 🧠 Khi nào cần Helm Test?

Không phải Chart nào cũng cần test phức tạp.

Với application đơn giản:

helm lint
helm template
dry-run

có thể đã đủ cho bước validation cơ bản.

Nhưng application quan trọng có thể thêm:

Helm Test

để kiểm tra behavior sau deployment.

Ví dụ:

Deployment
    ↓
Pod Running
    ↓
helm test
    ↓
HTTP request
    ↓
Expected response

29. 🧪 Exercise 8 — Helm Test

Tạo:

templates/tests/test-connection.yaml

Một Helm test thường tạo một Pod có:

annotations:
  "helm.sh/hook": test

Test Pod có thể thực hiện:

curl http://todo-api

Sau khi install:

helm test todo-api

Nếu application phản hồi đúng:

TEST SUITE: ...
PASSED

Không cần nhớ cấu trúc test hook. Chỉ cần hiểu:

helm test
    ↓
kiểm tra behavior của release

30. 🏢 Production Workflow

Trong CI/CD, bạn có thể xây dựng flow:

                Pull Request
                     │
                     ▼
               helm lint
                     │
                     ▼
             helm dependency
                     │
                     ▼
              helm template
                     │
                     ▼
           Manifest Validation
                     │
                     ▼
                Helm Test
                     │
                     ▼
                  Review
                     │
                     ▼
                  Deploy

Ví dụ CI:

helm lint .

helm dependency build .

helm template todo-api . \
  -f values-prod.yaml

helm install todo-api . \
  -f values-prod.yaml \
  --dry-run

Sau khi mọi thứ pass:

Deploy

31. 🚨 Đừng chỉ test "Chart"

Đây là một điểm rất quan trọng.

Bạn không thực sự deploy:

Chart

Bạn deploy:

Chart
+
Values
+
Dependencies

Vì vậy test phải phản ánh configuration thực tế.

Ví dụ:

Chart
  +
values-dev.yaml

là một configuration.

Chart
  +
values-prod.yaml

là một configuration khác.


32. 🧠 Một cách review Helm Chart rất thực tế

Khi AI đưa cho bạn một Chart, thay vì đọc toàn bộ:

templates/
    deployment.yaml
    service.yaml
    ingress.yaml
    ...

hãy làm:

Step 1

helm lint .

Step 2

helm template .

Step 3

Review rendered YAML.

Step 4

helm install --dry-run

Step 5

Nếu có cluster test:

Deploy
 ↓
Check Pod
 ↓
Check Service
 ↓
Check Application

Đây là cách review nhanh hơn rất nhiều.


33. 🔥 Một ví dụ Debug thực tế

Giả sử:

Pod Running

nhưng:

API không truy cập được

Đừng lập tức sửa Helm Template.

Kiểm tra theo tầng:

1. Helm render đúng?
        ↓
2. Deployment đúng?
        ↓
3. Pod labels đúng?
        ↓
4. Service selector đúng?
        ↓
5. Service port đúng?
        ↓
6. Ingress đúng?

Ví dụ:

Pod
labels:
  app: todo-api

Service:

selector:
  app: todo

Kết quả:

Pod Running
      ↓
Service
      ↓
No Endpoint

Helm có thể hoàn toàn không báo lỗi.

Đây là lý do:

Validation phải kiểm tra cả logic, không chỉ syntax.


34. 🧠 Validation Pyramid

Bạn có thể ghi nhớ bằng mô hình:

                Production
                   ▲
                   │
            Application Test
                   │
          Kubernetes Validation
                   │
             Helm Dry Run
                   │
             helm template
                   │
               helm lint
                   │
             Chart Syntax

Càng lên cao:

Test càng thực tế

nhưng:

Test càng tốn thời gian

Vì vậy không phải lúc nào cũng cần test mọi thứ ở mọi bước.


35. 🧪 Final Exercise — Validation Pipeline

Hãy tạo một script:

validate.sh

Concept:

#!/bin/sh

helm lint .

helm dependency build .

helm template todo-api . \
  -f values-prod.yaml

helm install todo-api . \
  -f values-prod.yaml \
  --dry-run

Chạy:

./validate.sh

Mục tiêu:

Một command
    ↓
Validate toàn bộ Chart

36. 🏆 Production Checklist

Trước khi merge một Helm Chart:

□ helm lint pass

□ Dependencies được resolve

□ Chart.lock được kiểm soát

□ helm template pass

□ Rendered YAML được review

□ Production values đã được test

□ Schema validation nếu cần

□ Dry-run pass

□ Kubernetes manifest hợp lệ

□ Helm test nếu application cần

□ Không có secret hard-code

□ Image tag được xác định rõ

□ Resources được cấu hình

□ Probes được cấu hình

Không phải Chart nào cũng cần toàn bộ checklist.

Hãy chọn mức validation phù hợp với độ quan trọng của application.


37. 🎯 Tổng kết

Sau Lab này, bạn chỉ cần nhớ:

1. helm lint

Chart có vấn đề cơ bản không?

2. helm template

Helm thực sự render YAML gì?

3. --dry-run

Nếu deploy thì chuyện gì xảy ra?

4. Schema

Values có đúng format không?

5. Helm Test

Application sau khi deploy có hoạt động không?

6. Quan trọng nhất

Chart
 +
Values
 +
Dependencies
      ↓
Rendered Manifest
      ↓
Validation
      ↓
Deploy

Đừng chỉ hỏi:

"Helm Chart có syntax đúng không?"

Hãy hỏi:

"Sau khi render, Kubernetes sẽ nhận được gì và application có thực sự chạy đúng không?"


🧠 Mental Model cuối Lab

Khi review một Helm Chart do AI tạo, workflow của bạn nên gần như trở thành phản xạ:

AI tạo Chart
     │
     ▼
helm lint
     │
     ▼
helm template
     │
     ▼
Review Rendered YAML
     │
     ▼
Validate Kubernetes
     │
     ▼
Dry Run
     │
     ▼
Deploy Test Environment
     │
     ▼
helm test / Application Test
     │
     ▼
Production

Bạn không cần thuộc hàng trăm syntax Helm.

Điều quan trọng hơn là biết:

Helm làm gì?
     ↓
Render ra gì?
     ↓
Kubernetes nhận gì?
     ↓
Application chạy thế nào?

Đó chính là mức hiểu Helm phù hợp với mục tiêu review, customize và maintain Chart trong môi trường DevOps thực tế.


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í