Lab 2 — Helm Chart Structure
🎯 Mục tiêu
Sau Lab này, bạn sẽ:
- Hiểu cấu trúc cơ bản của một Helm Chart.
- Biết vai trò của
Chart.yaml,values.yaml,templates/và_helpers.tpl. - Biết Helm lấy dữ liệu từ đâu và render thành Kubernetes Manifest như thế nào.
- Tự tạo một Chart đơn giản thay vì chỉ sử dụng Chart được tạo sẵn.
- Có thể mở một Helm Chart bất kỳ và nhanh chóng hiểu "file nào làm gì".
Không cần học thuộc cấu trúc Helm Chart.
Mục tiêu của Lab là khi nhìn vào một Chart, bạn có thể hiểu:
Chart.yaml → Chart này là gì? values.yaml → Có thể customize những gì? templates/ → Kubernetes resources được tạo như thế nào? _helpers.tpl → Các template dùng chung nằm ở đâu?
1. 🤔 Vấn đề thực tế
Ở Lab 1, chúng ta đã chạy:
helm create my-app
Helm tự tạo ra rất nhiều file.
Nếu bạn mở thư mục:
my-app/
├── Chart.yaml
├── values.yaml
├── charts/
├── templates/
└── ...
người mới rất dễ có cảm giác:
"Tại sao Helm cần nhiều file như vậy?"
Trong Kubernetes thông thường, bạn có thể có:
kubernetes/
├── deployment.yaml
├── service.yaml
├── configmap.yaml
└── ingress.yaml
Mỗi file là một Kubernetes Manifest.
Helm cần thêm một lớp abstraction để biến những manifest này thành một application package có thể tái sử dụng.
Ví dụ:
Helm Chart
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
Metadata Config Templates
│ │ │
Chart.yaml values.yaml templates/
│
▼
Kubernetes Manifests
Đó chính là lý do Chart có nhiều thành phần.
2. 🧠 Hiểu nhanh cấu trúc Helm Chart
Một Chart tối thiểu có thể rất đơn giản:
my-app/
├── Chart.yaml
├── values.yaml
└── templates/
└── deployment.yaml
Một Chart thực tế hơn:
my-app/
├── Chart.yaml
├── values.yaml
├── values.schema.json
├── charts/
└── templates/
├── deployment.yaml
├── service.yaml
├── configmap.yaml
├── ingress.yaml
└── _helpers.tpl
Trong Lab này, chúng ta tập trung vào 4 thành phần quan trọng nhất:
Chart.yaml
values.yaml
templates/
_helpers.tpl
3. 🏗️ Architecture
Hãy hình dung Helm Chart như một nhà máy tạo Kubernetes Manifest:
Helm Chart
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
Chart.yaml values.yaml templates/
│ │ │
│ │ │
Metadata Configuration Templates
│ │ │
└────────────────┼────────────────┘
│
▼
Helm Engine
│
▼
Kubernetes Manifests
│
▼
Kubernetes
Còn _helpers.tpl giống như một hộp chứa các template dùng chung:
templates/
├── deployment.yaml ──────┐
├── service.yaml ──────────┤
├── ingress.yaml ──────────┤
└── _helpers.tpl ◄─────────┘
│
├── fullname
├── labels
└── selector
4. 📦 Chart.yaml — Chart này là gì?
Tại sao cần?
Khi bạn chia sẻ một Chart cho người khác, họ cần biết:
Chart này tên gì? Version bao nhiêu? Đây là loại package nào?
Chart.yaml chứa metadata của Chart.
Ví dụ:
apiVersion: v2
name: todo-app
description: Helm chart for Todo Application
type: application
version: 0.1.0
appVersion: "1.0.0"
Bạn không cần học thuộc từng field.
Chỉ cần nhớ:
Chart.yaml
│
├── name → Tên Chart
├── version → Version của Chart
└── appVersion → Version của Application
Một điểm dễ nhầm
Có hai version:
Chart version
│
└── Version của Helm Chart
App version
│
└── Version của application
Ví dụ:
Chart version: 1.2.0
App version: 3.5.0
Điều này hoàn toàn bình thường.
Bạn có thể thay đổi cách Chart hoạt động:
Chart 1.2.0
mà application vẫn là:
App 3.5.0
5. 🧪 Thực hành — Xem Chart.yaml
Nếu bạn chưa có Chart:
helm create my-app
Đi vào thư mục:
cd my-app
Xem:
cat Chart.yaml
Bạn sẽ thấy một file tương tự:
apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"
See Result
Kiểm tra thông tin Chart:
helm show chart .
Bạn sẽ thấy metadata của Chart.
Understand
Điều cần nhớ:
Chart.yaml = Metadata của Chart
Không phải Kubernetes Deployment.
Không phải configuration của application.
6. ⚙️ values.yaml — Configuration của Application
Đây là một trong những file quan trọng nhất trong Helm.
Tại sao cần?
Hãy tưởng tượng bạn có một Deployment:
replicas: 3
Ở development bạn muốn:
replicas = 1
Production:
replicas = 5
Nếu viết trực tiếp vào template:
replicas: 3
thì mỗi environment phải sửa template.
Không tốt.
Helm giải quyết bằng cách tách:
Template
+
Configuration
Configuration nằm trong:
values.yaml
Ví dụ:
replicaCount: 2
image:
repository: nginx
tag: "1.27"
service:
type: ClusterIP
port: 80
Template sẽ sử dụng các giá trị này.
7. 🧠 Mental Model của values.yaml
Đừng nghĩ:
"
values.yamllà file config bắt buộc phải có."
Hãy nghĩ:
values.yamllà giao diện configuration của Chart.
Ví dụ Chart cung cấp:
replicaCount: 3
image:
repository: my-app
tag: "1.0"
service:
port: 8080
Người sử dụng Chart chỉ cần thay đổi:
replicaCount: 5
mà không cần sửa:
templates/deployment.yaml
Đây chính là yếu tố làm Helm Chart reusable.
8. 🧪 Thực hành — Thay đổi values.yaml
Mở:
vi values.yaml
Tìm:
replicaCount: 1
đổi thành:
replicaCount: 3
Sau đó render:
helm template my-app .
Tìm:
replicas: 3
See Result
Bạn vừa thay đổi:
values.yaml
│
▼
template
│
▼
replicas: 3
Không cần sửa trực tiếp Deployment template.
Understand
Đây là pattern quan trọng của Helm:
values.yaml
↓
Input
↓
templates/
↓
Rendered Kubernetes YAML
9. 📝 templates/ — Nơi tạo Kubernetes Resources
Nếu:
values.yaml
là configuration,
thì:
templates/
là nơi định nghĩa Kubernetes resources.
Ví dụ:
templates/
├── deployment.yaml
├── service.yaml
├── ingress.yaml
└── configmap.yaml
Mỗi file thường tương ứng với một hoặc nhiều Kubernetes resources.
Ví dụ:
deployment.yaml
↓
Deployment
service.yaml
↓
Service
ingress.yaml
↓
Ingress
10. 🧠 Template khác Kubernetes YAML thông thường như thế nào?
Kubernetes YAML bình thường:
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
Helm Template có thể viết:
apiVersion: apps/v1
kind: Deployment
spec:
replicas: {{ .Values.replicaCount }}
Điểm khác biệt là:
3
được thay bằng:
.Values.replicaCount
Helm sẽ lấy giá trị từ:
values.yaml
và render thành:
replicas: 3
11. 🔄 Toàn bộ flow
Đây là flow quan trọng nhất của Lab:
values.yaml
│
│ replicaCount: 3
▼
templates/deployment.yaml
│
│ {{ .Values.replicaCount }}
▼
Helm Render
│
▼
replicas: 3
│
▼
Kubernetes
Vì vậy khi bạn nhìn thấy:
{{ .Values.xxx }}
hãy nghĩ ngay:
"Giá trị này đến từ
values.yamlhoặc configuration được truyền vào khi Helm chạy."
12. 🧪 Thực hành — Xem Template
Mở:
cat templates/deployment.yaml
Bạn sẽ thấy khá nhiều syntax.
Không cần cố hiểu tất cả.
Chỉ tìm:
.Values
Bạn sẽ thấy những đoạn tương tự:
{{ .Values.replicaCount }}
hoặc:
{{ .Values.image.repository }}
See Result
Bạn có thể đối chiếu:
values.yaml
────────────────────
replicaCount: 1
image:
repository: nginx
tag: "1.27"
với:
templates/deployment.yaml
─────────────────────────
.Values.replicaCount
.Values.image.repository
.Values.image.tag
Understand
Template không tự chứa tất cả configuration.
Nó lấy configuration từ values.yaml.
13. 🧩 _helpers.tpl — Template dùng chung
Đây là file người mới thường thấy khó hiểu nhất.
Ví dụ bạn có:
deployment.yaml
service.yaml
ingress.yaml
Cả ba đều có thể cần:
app name
labels
selector
fullname
Nếu copy logic vào từng file:
deployment.yaml
└── duplicate logic
service.yaml
└── duplicate logic
ingress.yaml
└── duplicate logic
sẽ khó maintain.
Helm cho phép tạo các named templates dùng chung trong:
_helpers.tpl
Ví dụ:
_helpers.tpl
│
├── app.name
├── app.fullname
└── app.labels
│
┌────┼────┐
▼ ▼ ▼
Deployment Service Ingress
14. 🧠 Không cần học syntax _helpers.tpl
Bạn có thể gặp:
{{ include "my-app.fullname" . }}
Ở giai đoạn này, chỉ cần hiểu:
include
↓
gọi một template dùng chung
Ví dụ:
_helpers.tpl
│
│ defines fullname
▼
deployment.yaml
│
│ include fullname
▼
service.yaml
Mục đích chính:
Tránh duplicate logic trong nhiều template.
Bạn sẽ tìm hiểu sâu hơn về named templates ở Lab Templating.
15. 🗂️ charts/ — Dependencies
Bạn có thể thấy:
charts/
Thư mục này dùng để chứa dependency của Chart.
Dependency nghĩa là:
Application của bạn cần một Chart khác.
Ví dụ:
my-app
│
├── frontend
├── backend
│
└── PostgreSQL
Chart của bạn có thể phụ thuộc vào:
PostgreSQL Chart
Redis Chart
Khi đó Helm có cơ chế quản lý các dependency này.
Ở Lab này bạn chưa cần đi sâu.
Chỉ cần nhớ:
charts/
↓
Nơi chứa / quản lý Chart dependencies
Chúng ta sẽ học ở Lab Dependencies.
16. 🧪 Thực hành — Tạo Chart tối giản
Bây giờ thay vì dùng Chart được tạo sẵn, hãy tự tạo một Chart nhỏ.
Tạo thư mục:
mkdir simple-chart
cd simple-chart
Tạo:
mkdir templates
touch Chart.yaml
touch values.yaml
touch templates/configmap.yaml
Cấu trúc:
simple-chart/
├── Chart.yaml
├── values.yaml
└── templates/
└── configmap.yaml
Bước 1 — Chart.yaml
apiVersion: v2
name: simple-chart
description: A simple Helm chart
type: application
version: 0.1.0
appVersion: "1.0.0"
Bước 2 — values.yaml
appName: todo-api
environment: dev
Bước 3 — templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.appName }}
data:
environment: {{ .Values.environment }}
17. 🔍 Render Chart
Chạy:
helm template simple-chart .
Kết quả sẽ tương tự:
apiVersion: v1
kind: ConfigMap
metadata:
name: todo-api
data:
environment: dev
Đây chính là điều Helm làm
Input:
appName: todo-api
environment: dev
Template:
name: {{ .Values.appName }}
environment: {{ .Values.environment }}
Output:
name: todo-api
environment: dev
18. 🧪 Thử thay đổi Environment
Thay:
environment: dev
thành:
environment: production
Render lại:
helm template simple-chart .
Bạn sẽ thấy:
data:
environment: production
Không cần sửa template.
Đây chính là sức mạnh của:
Templates + Values
19. 🧠 Chart Structure trong thực tế
Một application Chart production có thể trông như:
todo-app/
│
├── Chart.yaml
│
├── values.yaml
│
├── values-dev.yaml
├── values-staging.yaml
├── values-prod.yaml
│
├── charts/
│
└── templates/
│
├── deployment.yaml
├── service.yaml
├── configmap.yaml
├── secret.yaml
├── ingress.yaml
├── hpa.yaml
│
└── _helpers.tpl
Bạn không cần nhớ từng file.
Hãy phân chia trong đầu thành 3 nhóm:
Helm Chart
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
Metadata Configuration Resources
│ │ │
Chart.yaml values.yaml templates/
Đây là mental model quan trọng nhất.
20. ⚠️ Production Tips
1. values.yaml nên là API của Chart
Nếu bạn xây dựng một Chart reusable:
image:
repository: ...
tag: ...
replicaCount: ...
resources:
requests: ...
limits: ...
hãy coi đây như public interface của Chart.
Developer sử dụng Chart không nên phải sửa:
templates/deployment.yaml
để customize application.
Họ nên thay đổi:
values
2. Đừng biến values.yaml thành "bãi rác"
Một Chart lớn có thể có hàng trăm values.
Không nên:
foo1: ...
foo2: ...
foo3: ...
foo4: ...
foo5: ...
Hãy tổ chức theo component:
image:
repository: ...
tag: ...
service:
type: ClusterIP
port: 80
resources:
requests:
cpu: 100m
memory: 128Mi
Nhìn vào là hiểu application có những configuration nào.
3. Template không nên chứa quá nhiều business logic
Một lỗi phổ biến:
values
↓
rất nhiều if/else
↓
rất nhiều template logic
↓
Chart khó đọc
Helm template càng phức tạp thì càng khó debug.
Một Chart tốt nên hướng tới:
Simple values
↓
Simple templates
↓
Predictable YAML
21. 🤖 Khi AI viết Helm Chart cho bạn
Đây chính là cách bạn nên sử dụng AI trong thực tế.
Ví dụ bạn yêu cầu AI:
"Tạo Helm Chart cho Spring Boot application, hỗ trợ Deployment, Service, ConfigMap, Ingress và HPA."
AI có thể tạo:
Chart.yaml
values.yaml
templates/
_helpers.tpl
Bạn không cần tự viết tất cả từ đầu.
Nhưng bạn phải review được:
Chart.yaml
↓
Chart metadata đúng chưa?
values.yaml
↓
Configuration hợp lý chưa?
templates/
↓
Generate đúng Kubernetes resources chưa?
_helpers.tpl
↓
Có duplicate logic không?
Sau đó:
helm lint .
và:
helm template my-app .
Cuối cùng kiểm tra Kubernetes Manifest.
Skill Helm quan trọng không phải là nhớ được 100% syntax.
Mà là nhìn vào Chart và hiểu:
"Chart này đang làm gì?" "Configuration nằm ở đâu?" "Nó sẽ generate ra resource gì?" "Nếu thay value này thì chuyện gì xảy ra?"
22. 🎯 Tổng kết
Sau Lab này, bạn chỉ cần nhớ:
Chart.yaml
↓
Thông tin về Chart
values.yaml
↓
Configuration của Chart
templates/
↓
Kubernetes resources được generate
_helpers.tpl
↓
Reusable template logic
charts/
↓
Dependencies
Và toàn bộ Helm Chart có thể nhớ bằng một diagram:
Helm Chart
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
Chart.yaml values.yaml templates/
│ │ │
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── ingress.yaml
│ │ └── _helpers.tpl
│ │
└─────────────┼─────────────┘
│
▼
Helm Rendering
│
▼
Kubernetes Manifests
│
▼
Kubernetes
🧠 Mental model cuối Lab
Chart.yamlnói Chart là gì.
values.yamlnói muốn customize Chart như thế nào.
templates/nói Kubernetes resources được tạo ra như thế nào.
_helpers.tplchứa logic template dùng chung.Helm kết hợp tất cả → render thành Kubernetes YAML.
Ở Lab tiếp theo, chúng ta sẽ tập trung vào Values & Templating — tức là hiểu cách dữ liệu từ values.yaml đi vào templates/. Đây là phần bạn cần đủ hiểu để review Helm Chart do AI sinh ra, nhưng không cần học thuộc syntax.
All rights reserved