0

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/_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.yaml là file config bắt buộc phải có."

Hãy nghĩ:

values.yaml là 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

configuration,

thì:

templates/

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.yaml hoặ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.yaml nói Chart là gì.

values.yaml nói muốn customize Chart như thế nào.

templates/ nói Kubernetes resources được tạo ra như thế nào.

_helpers.tpl chứ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

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í