0

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.yamlChart.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

parent chart.

Còn:

PostgreSQL
Redis

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.yamlChart.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ợ enabled hay 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

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í