Lab 8 — Helm Dependencies
🎯 Mục tiêu
Sau Lab này, bạn sẽ:
- Hiểu Helm Dependency giải quyết vấn đề gì.
- Biết cách một Helm Chart sử dụng Chart khác.
- Hiểu
Chart.yamlvàChart.lockở mức cần thiết. - Biết cách sử dụng một dependency thực tế như PostgreSQL.
- Biết cách kiểm tra dependency trước khi deploy.
- Nhận biết những vấn đề production thường gặp khi sử dụng dependencies.
Không cần học thuộc syntax dependency.
Chỉ cần nhớ:
Application Chart │ ├── PostgreSQL Chart ├── Redis Chart └── ...Helm sẽ giúp quản lý các Chart phụ thuộc này.
1. 🤔 Vấn đề thực tế
Hãy quay lại application:
Todo Application
Application không chỉ có backend.
Nó có thể cần:
Todo API
PostgreSQL
Redis
Architecture:
Todo Application
│
┌──────────┼──────────┐
│ │ │
▼ ▼ ▼
Backend PostgreSQL Redis
Nếu bạn deploy thủ công:
helm install postgres ...
helm install redis ...
helm install todo-api ...
thì bạn phải:
1. Cài PostgreSQL
2. Cài Redis
3. Cấu hình chúng
4. Cài Todo API
5. Đảm bảo tất cả version/configuration tương thích
Với một application đơn giản thì không quá khó.
Nhưng với hệ thống lớn:
Application
├── PostgreSQL
├── Redis
├── RabbitMQ
├── Prometheus
└── ...
việc quản lý thủ công bắt đầu trở nên phức tạp.
2. 🧠 Helm Dependency là gì?
Dependency đơn giản là:
Chart của bạn cần một Chart khác để application hoạt động.
Ví dụ:
todo-app
│
├── todo-api
│
├── PostgreSQL ← dependency
│
└── Redis ← dependency
Thay vì:
helm install postgres
helm install redis
helm install todo-app
bạn có thể quản lý:
todo-app
│
├── PostgreSQL Chart
└── Redis Chart
thông qua dependency.
3. 🏗️ Architecture
Mental model:
Parent Chart
todo-app
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
Backend PostgreSQL Redis
Template Chart Chart
│ │ │
└────────────┼────────────┘
▼
Kubernetes
Trong đó:
todo-app
là parent chart.
Còn:
PostgreSQL
Redis
là child/dependency charts.
4. 🧠 Tại sao không copy Chart vào trong Chart?
Một cách rất dễ nghĩ tới:
todo-app/
├── templates/
└── postgres/
├── templates/
└── values.yaml
Nhưng đây không phải cách tốt để quản lý những component phổ biến.
Ví dụ PostgreSQL có thể được:
todo-app
user-app
payment-app
sử dụng.
Nếu mỗi application copy PostgreSQL Chart:
Todo → PostgreSQL copy
User → PostgreSQL copy
Payment → PostgreSQL copy
thì việc update trở nên khó.
Tốt hơn:
PostgreSQL Chart
▲
┌─────────────┼─────────────┐
│ │ │
Todo App User App Payment App
Mỗi application có thể sử dụng một version PostgreSQL Chart cụ thể.
5. 🧠 Dependency được khai báo ở đâu?
Trong:
Chart.yaml
Ví dụ:
apiVersion: v2
name: todo-app
version: 1.0.0
dependencies:
- name: postgresql
version: 16.x.x
repository: https://charts.bitnami.com/bitnami
Bạn không cần học thuộc từng field.
Chỉ cần đọc được:
dependencies:
│
└── postgresql
│
├── version
└── repository
Nó có nghĩa:
"Chart todo-app cần Chart PostgreSQL này."
6. 🧪 Chuẩn bị Lab
Tạo Chart:
helm create todo-app
cd todo-app
Bạn sẽ có:
todo-app/
├── Chart.yaml
├── values.yaml
└── templates/
7. 🧪 Thêm PostgreSQL Dependency
Mở:
Chart.yaml
Thêm:
dependencies:
- name: postgresql
version: "16.x.x"
repository: "https://charts.bitnami.com/bitnami"
Version trong ví dụ chỉ mang tính minh họa. Khi thực hành, hãy kiểm tra version Chart PostgreSQL hiện có trong repository thay vì copy một version cũ một cách mù quáng.
8. 🧪 Thêm Helm Repository
Helm cần biết repository chứa Chart.
helm repo add bitnami https://charts.bitnami.com/bitnami
Kiểm tra:
helm repo list
Bạn sẽ thấy:
NAME URL
bitnami https://charts.bitnami.com/bitnami
9. 🧪 Download Dependency
Chạy:
helm dependency update
Helm sẽ tìm dependency trong:
Chart.yaml
và download Chart cần thiết.
Kiểm tra:
ls charts/
Bạn có thể thấy:
charts/
└── postgresql-*.tgz
Structure lúc này:
todo-app/
├── Chart.yaml
├── Chart.lock
├── values.yaml
├── charts/
│ └── postgresql-*.tgz
└── templates/
10. 🧠 charts/ là gì?
Thư mục:
charts/
chứa các dependency mà parent Chart sử dụng.
Ví dụ:
todo-app/
│
├── templates/
│
└── charts/
├── postgresql-*.tgz
└── redis-*.tgz
Mental model:
Parent Chart
│
├── Own Templates
│
└── Dependencies
│
├── PostgreSQL
└── Redis
11. 🧠 Chart.lock là gì?
Bạn có thể thấy:
Chart.lock
Đừng quá lo lắng về file này.
Nó giúp Helm lock dependency versions.
Tư duy đơn giản:
Chart.yaml
│
│ "Tôi cần PostgreSQL"
▼
Dependency Resolution
│
▼
Chart.lock
│
▼
Version cụ thể được xác định
Điều này quan trọng vì:
Hai lần deploy ở hai thời điểm khác nhau không nên tự nhiên lấy hai version dependency khác nhau.
12. ⚠️ Chart.yaml và Chart.lock khác nhau thế nào?
Bạn chỉ cần nhớ:
Chart.yaml
Nói:
Tôi muốn dependency nào và version constraint là gì?
Chart.lock
Nói:
Dependency cụ thể nào đã được resolve.
Mental model:
Chart.yaml
↓
Requirement
Chart.lock
↓
Resolved version
Không cần nhớ chi tiết hơn ở giai đoạn này.
13. 🧪 Kiểm tra Dependency
Chạy:
helm dependency list
Bạn sẽ thấy đại loại:
NAME VERSION REPOSITORY
postgresql 16.x.x https://charts.bitnami.com/bitnami
Đây là command rất hữu ích khi debugging:
"Chart này đang phụ thuộc vào những gì?"
14. 🧠 Dependency không chỉ để cài database
Bạn có thể gặp:
Application Chart
│
├── PostgreSQL
├── Redis
├── RabbitMQ
└── ...
Ví dụ:
dependencies:
- name: postgresql
...
- name: redis
...
Architecture:
todo-app
│
┌────────────┼────────────┐
▼ ▼ ▼
PostgreSQL Redis RabbitMQ
15. 🧪 Dependency Values
Một vấn đề mới xuất hiện:
Nếu PostgreSQL là dependency, làm sao cấu hình PostgreSQL?
Ví dụ:
postgresql:
auth:
database: todo
username: todo
Mental model:
values.yaml
│
├── Application values
│
└── PostgreSQL values
│
▼
PostgreSQL Chart
Đây chính là cách parent Chart truyền configuration xuống dependency.
16. 🧠 Parent Values vs Dependency Values
Ví dụ:
replicaCount: 3
image:
repository: todo-api
postgresql:
auth:
database: todo
Có thể hiểu:
replicaCount
image
↓
Todo App
postgresql.*
↓
PostgreSQL dependency
Đây là concept quan trọng hơn việc nhớ syntax.
17. 🧪 Exercise — Cấu hình PostgreSQL
Thêm vào:
values.yaml
postgresql:
auth:
database: todo
username: todo
Sau đó:
helm template todo-app .
Tìm PostgreSQL resources trong output:
helm template todo-app . | grep -i postgres
Mục tiêu của exercise:
Nhìn thấy configuration từ parent Chart được truyền vào dependency.
18. 🧠 Dependency có phải lúc nào cũng nên dùng?
Không.
Đây là điểm rất quan trọng trong production.
Giả sử bạn có:
todo-app
└── PostgreSQL
Có vẻ tiện.
Nhưng production có thể có:
PostgreSQL
│
├── Backup
├── Replication
├── Monitoring
├── Storage
├── Disaster Recovery
└── Security
Bạn thực sự có muốn mỗi application tự deploy một PostgreSQL không?
Thường là:
Development
→ Có thể dùng dependency PostgreSQL
Production
→ PostgreSQL managed/shared infrastructure
Ví dụ:
Dev
Todo App
└── PostgreSQL dependency
nhưng:
Production
Todo App ───────────────► Managed PostgreSQL
Đây là một quyết định architecture, không phải quyết định syntax Helm.
19. ⚠️ Dependency và Production
Một lỗi phổ biến:
"Helm dependency rất tiện"
↓
Cho tất cả infrastructure vào Chart
Ví dụ:
application
├── PostgreSQL
├── Redis
├── Kafka
├── Prometheus
└── Grafana
Sau đó:
helm install application
và mọi thứ được tạo.
Nghe rất tiện.
Nhưng production sẽ nhanh chóng trở nên khó quản lý:
Application upgrade
↓
Infrastructure upgrade?
↓
Database upgrade?
↓
Redis upgrade?
↓
Risk
Dependency giúp đóng gói, nhưng không có nghĩa:
"Cái gì cũng nên đóng gói chung."
20. 🧠 Một nguyên tắc thực tế
Hãy tự hỏi:
Dependency này thuộc lifecycle của application hay thuộc infrastructure?
Ví dụ:
Có thể hợp lý
Application
└── small supporting component
Cần cân nhắc kỹ
Application
└── Production Database
Thường không nên gom tùy tiện
Application
├── Production Database
├── Production Kafka
└── Production Monitoring
Infrastructure quan trọng thường có lifecycle riêng.
21. 🏗️ Hai mô hình thực tế
Model A — Everything together
Application Chart
│
├── App
├── PostgreSQL
└── Redis
Ưu điểm:
helm install
là có gần như toàn bộ stack.
Phù hợp:
Local
Development
Demo
Testing
Model B — Infrastructure riêng
Infrastructure
├── PostgreSQL
├── Redis
└── Kafka
│
│
▼
Application
├── Todo API
└── User API
Phù hợp hơn với production lớn.
Application chỉ cần biết:
DATABASE_HOST
REDIS_HOST
KAFKA_BROKER
22. 🧪 Exercise — Tách Production Dependency
Hãy suy nghĩ scenario:
Dev:
Todo API + PostgreSQL dependency
nhưng:
Production:
Todo API + Managed PostgreSQL
Thiết kế:
values-dev.yaml
values-prod.yaml
Sao cho:
Dev
→ PostgreSQL enabled
Prod
→ PostgreSQL disabled
Ví dụ concept:
postgresql:
enabled: true
và Production:
postgresql:
enabled: false
Việc dependency có hỗ trợ
enabledhay không phụ thuộc Chart cụ thể. Đây là pattern phổ biến, không phải mọi dependency đều giống nhau.
23. 🧠 Đây là một Pattern rất hữu ích
Bạn có thể có:
Same Application Chart
│
┌───────────┴───────────┐
│ │
Dev Prod
│ │
PostgreSQL Chart Managed DB
│ │
▼ ▼
Kubernetes External DB
Application Chart vẫn giống nhau.
Chỉ khác:
Infrastructure strategy
24. 🔍 Debug Dependency
Khi Chart có dependency, debugging có thêm một lớp.
Nếu:
helm install todo-app .
bị lỗi, đừng chỉ nhìn:
templates/
Hãy kiểm tra:
helm dependency list
Sau đó:
helm template todo-app .
và tìm:
PostgreSQL
Redis
...
Mental model:
Helm Error
│
├── Parent Template?
│
├── Values?
│
└── Dependency?
25. 🧪 Exercise — Debug Dependency
Thử thay đổi version dependency thành một version không tồn tại:
dependencies:
- name: postgresql
version: "999.0.0"
repository: "https://charts.bitnami.com/bitnami"
Chạy:
helm dependency update
Quan sát lỗi.
Sau đó sửa lại version hợp lệ và chạy:
helm dependency update
Bạn vừa thấy dependency resolution hoạt động như thế nào.
26. 🧠 helm dependency update vs helm dependency build
Ở mức hiện tại chỉ cần nhớ:
helm dependency update
Dùng khi:
Dependency definition thay đổi hoặc muốn resolve/update dependencies.
helm dependency build
Dùng khi:
Muốn build dependency từ lock file hiện có.
Mental model:
Chart.yaml
│
▼
dependency update
│
▼
Chart.lock
Trong CI/CD, việc lock version giúp deployment predictable hơn.
27. 🏢 Dependency trong CI/CD
Một workflow thực tế:
Git
│
▼
CI
│
├── helm lint
│
├── helm dependency build
│
├── helm template
│
├── tests
│
▼
Package Chart
│
▼
Chart Registry
Sau đó:
Dev
↓
Staging
↓
Production
Điều quan trọng là dependency versions phải được kiểm soát.
28. 🚨 Một lỗi production cần tránh
Đừng để CI/CD tự nhiên lấy dependency version mới mà bạn chưa review.
Ví dụ:
Monday
PostgreSQL Chart v16.0
Một tuần sau:
PostgreSQL Chart v17.0
Nếu pipeline tự resolve version mới:
Deploy Production
↓
Dependency changed
↓
Unexpected behavior
Đó là lý do cần:
Version constraints
+
Chart.lock
+
Testing
29. 🧪 Exercise — Review Dependency
Hãy review Chart.yaml:
dependencies:
- name: postgresql
version: "..."
repository: "..."
Trả lời:
□ Dependency là gì?
□ Nó được lấy từ repository nào?
□ Version nào được sử dụng?
□ Có Chart.lock không?
□ Dependency này có thực sự cần không?
□ Có nên sử dụng dependency này trong Production không?
□ Nếu dependency upgrade thì application có bị ảnh hưởng không?
Đây chính là cách bạn nên review Helm dependency trong thực tế.
30. 🧠 Dependency không chỉ là "cài Chart khác"
Đừng hiểu:
Dependency
=
Helm install một Chart khác
Hãy hiểu:
Dependency
=
Application Chart có một component phụ thuộc
Helm giúp bạn:
Declare
↓
Resolve
↓
Version
↓
Package
↓
Deploy
31. 🎯 Tổng kết
Sau Lab này, bạn chỉ cần nhớ 6 ý.
1. Dependency là Chart mà Chart của bạn cần
Todo App
└── PostgreSQL
2. Dependency được khai báo trong Chart.yaml
Chart.yaml
│
└── dependencies
3. Helm download dependency
helm dependency update
và lưu dependency trong:
charts/
4. Chart.lock giúp kiểm soát version
Chart.yaml
↓
Dependency requirement
Chart.lock
↓
Resolved dependency
5. Parent Chart có thể truyền Values cho dependency
postgresql:
...
Mental model:
Parent Values
│
▼
Dependency Chart
6. Dependency không có nghĩa "gom mọi thứ vào một Chart"
Hãy phân biệt:
Development
↓
Có thể bundle dependency
với:
Production
↓
Infrastructure thường có lifecycle riêng
🧠 Mental Model cuối Lab
Khi nhìn thấy:
Chart.yaml
với:
dependencies:
hãy nghĩ ngay:
My Application
│
▼
Parent Chart
│
┌─────────┴─────────┐
│ │
▼ ▼
Own Templates Dependencies
│
┌─────────┴─────────┐
▼ ▼
PostgreSQL Redis
Và khi review một Helm Chart do AI tạo, đừng chỉ hỏi "syntax có đúng không?".
Hãy hỏi:
"Tại sao component này lại là dependency? Nó có thực sự thuộc lifecycle của application không? Version có được kiểm soát không? Và production có nên bundle nó hay nên sử dụng infrastructure bên ngoài?"
Đó là mức hiểu Helm Dependency đủ thực tế để review và maintain, thay vì phải thuộc lòng toàn bộ syntax.
All rights reserved