0

Lab 10 — Helm Repository & OCI

🎯 Mục tiêu

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

  • Hiểu Helm Chart được đóng gói và phân phối như thế nào.
  • Phân biệt Helm Chart RepositoryOCI Registry.
  • Biết package một Helm Chart thành file .tgz.
  • Biết push/pull Chart từ một OCI Registry.
  • Hiểu cách Helm Chart được sử dụng trong CI/CD và production.
  • Biết review cách team lưu trữ và version Helm Chart.

Mục tiêu của Lab này không phải học thuộc các loại Registry.

Chỉ cần hiểu flow:

Helm Chart
    ↓
Package
    ↓
Store
    ↓
Version
    ↓
Deploy

Trong production, đây là cách Chart được chia sẻ giữa Platform Team, CI/CD và các Application Team.


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

Ở các Lab trước, chúng ta luôn có:

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

Và deploy trực tiếp:

helm install todo-app .

Điều này ổn khi bạn đang development.

Nhưng hãy tưởng tượng công ty có:

Platform Team
      │
      ▼
Reusable Helm Chart
      │
      ├────────► Team A
      ├────────► Team B
      ├────────► Team C
      └────────► CI/CD

Bạn không muốn mỗi team phải:

git clone platform-repository

rồi lấy Chart từ source code.

Bạn muốn có một nơi trung tâm:

                    Helm Registry
                         │
             ┌───────────┼───────────┐
             ▼           ▼           ▼
         app-chart    redis-chart   ...
             │
             ▼
        Version 1.0.0
        Version 1.1.0
        Version 2.0.0

Đây chính là vấn đề mà Helm Repository / OCI Registry giải quyết.


2. 🧠 Helm Chart Distribution

Mental model đơn giản:

Developer
    │
    │ Helm Chart
    ▼
 Package
    │
    ▼
Registry
    │
    ├────────► Dev
    ├────────► Staging
    └────────► Production

Chart không chỉ là:

templates/
values.yaml
Chart.yaml

Nó còn có thể được:

Package
Store
Version
Download
Deploy

3. 🧠 Helm Repository là gì?

Helm Repository là nơi lưu trữ các packaged Helm Chart.

Ví dụ:

company-helm-repo
│
├── todo-app-1.0.0.tgz
├── todo-app-1.1.0.tgz
├── todo-app-2.0.0.tgz
└── user-api-1.0.0.tgz

File Chart thường có dạng:

todo-app-1.0.0.tgz

Trong đó:

todo-app
    ↓
Chart name

1.0.0
    ↓
Chart version

4. 🧠 OCI là gì?

OCI là viết tắt của Open Container Initiative.

Bạn có thể đã biết Container Registry:

Docker
   ↓
Docker Registry
   ↓
my-app:1.0.0

Ví dụ:

registry.example.com/todo-api:1.0.0

OCI mở rộng mô hình registry để lưu trữ nhiều loại artifact, không chỉ container image.

Helm Chart cũng có thể được lưu dưới dạng OCI artifact.

Mental model:

                OCI Registry
                     │
          ┌──────────┴──────────┐
          │                     │
          ▼                     ▼
    Container Image         Helm Chart
          │                     │
    todo-api:1.0.0       todo-chart:1.0.0

5. 🧠 Repository truyền thống vs OCI

Bạn chỉ cần nhớ sự khác biệt ở mức này:

Traditional Helm Repository
        │
        └── Helm Chart Repository

OCI Registry
        │
        ├── Container Images
        └── Helm Charts

Ví dụ:

Traditional
https://charts.example.com

Trong khi OCI:

oci://registry.example.com/helm

OCI thường rất phù hợp với hệ thống hiện đại vì company đã có sẵn Container Registry.


6. 🏗️ Architecture

Một architecture thực tế:

                         Git
                          │
                          ▼
                    Helm Chart
                          │
                          ▼
                     CI Pipeline
                          │
                 ┌────────┴────────┐
                 │                 │
                 ▼                 ▼
             helm lint        helm test
                 │
                 └───────┬─────────┘
                         ▼
                    Package Chart
                         │
                         ▼
                  OCI Registry
                         │
             ┌───────────┼───────────┐
             ▼           ▼           ▼
            Dev       Staging       Prod

Đây là flow bạn có thể gặp trong production.


7. 🚀 Chuẩn bị Lab

Sử dụng Chart từ Lab trước.

Ví dụ:

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

Kiểm tra:

helm lint .

Nếu pass:

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

Chúng ta bắt đầu package.


8. 📦 Package Helm Chart

Tại sao cần package?

Source code:

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

không phải artifact lý tưởng để phân phối.

Helm có thể đóng gói Chart thành:

todo-app-1.0.0.tgz

Chạy:

helm package .

Kết quả:

Successfully packaged chart and saved it to:
./todo-app-1.0.0.tgz

9. 🧠 .tgz là gì?

.tgz chỉ đơn giản là:

Một file archive chứa Helm Chart.

Có thể hình dung:

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

được đóng gói thành:

todo-app-1.0.0.tgz

Giống như:

Source Code
    ↓
Build Artifact

Trong DevOps, bạn thường muốn phân phối artifact đã được version, thay vì source code tùy ý.


10. 🧪 Kiểm tra package

Bạn có thể xem:

ls -lh *.tgz

Ví dụ:

todo-app-1.0.0.tgz

Kiểm tra Chart:

helm show chart todo-app-1.0.0.tgz

Bạn sẽ thấy:

name: todo-app
version: 1.0.0

Có thể xem Values:

helm show values todo-app-1.0.0.tgz

Mental model:

Chart Package
     │
     ├── Metadata
     ├── Templates
     └── Default Values

11. 🧠 Versioning rất quan trọng

Giả sử:

todo-app-1.0.0.tgz

sau đó bạn sửa Chart.

Không nên overwrite tùy tiện:

todo-app-1.0.0.tgz

Thay vào đó:

todo-app-1.1.0.tgz

hoặc:

todo-app-2.0.0.tgz

Mental model:

Chart
 │
 ├── 1.0.0
 ├── 1.1.0
 └── 2.0.0

Application có thể lựa chọn version phù hợp.


12. 🧠 Chart Version vs Application Version

Đây là điểm dễ nhầm.

Trong:

Chart.yaml

có:

version: 1.0.0

Đây là:

Version của Helm Chart.

Trong khi:

appVersion: "2.5.0"

là:

Version của application mà Chart deploy.

Ví dụ:

name: todo-app
version: 1.3.0
appVersion: "2.5.1"

Có nghĩa:

Helm Chart
    ↓
1.3.0

Todo Application
    ↓
2.5.1

Đừng nhầm hai version này.


13. 🧪 Exercise 1 — Package

Chạy:

helm package .

Sau đó:

ls

Xác nhận:

todo-app-1.0.0.tgz

Tiếp theo:

helm show chart todo-app-1.0.0.tgz

Kiểm tra:

□ Chart name
□ Chart version
□ Application version

14. 🧠 Helm Repository truyền thống

Một Helm Repository truyền thống có thể được hiểu đơn giản như:

HTTP Server
    │
    ├── index.yaml
    ├── todo-app-1.0.0.tgz
    ├── todo-app-1.1.0.tgz
    └── user-api-1.0.0.tgz

index.yaml giúp Helm biết:

Chart nào tồn tại?
Version nào?
Download ở đâu?

15. 🧠 Add Repository

Ví dụ một repository public:

helm repo add bitnami https://charts.bitnami.com/bitnami

Sau đó:

helm repo update

Xem:

helm search repo bitnami

Bạn có thể tìm Chart:

helm search repo bitnami/postgresql

Mental model:

Helm Client
    │
    │ helm repo add
    ▼
Chart Repository
    │
    ▼
index.yaml
    │
    ▼
Available Charts

16. 🧪 Exercise 2 — Tìm Chart

Chạy:

helm search repo bitnami/postgresql

Sau đó:

helm show chart bitnami/postgresql

Bạn không cần cài PostgreSQL.

Mục tiêu của exercise là hiểu:

Repository
   ↓
Chart
   ↓
Version

17. 🧠 OCI Registry

Bây giờ chuyển sang mô hình hiện đại hơn:

OCI Registry

Ví dụ:

oci://registry.example.com/helm

Thay vì:

https://charts.example.com

Bạn có thể coi:

OCI Registry

như một "kho artifact" dùng chung.

                    Registry
                       │
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
     Image           Chart          Other
      │                │
   app:1.0        app-chart:1.0

18. 🧠 Tại sao OCI quan trọng?

Trong môi trường DevOps hiện đại, công ty thường đã có:

Container Registry

Ví dụ:

GitHub Container Registry
Amazon ECR
Google Artifact Registry
Azure Container Registry
Harbor

Nếu Registry đã hỗ trợ OCI artifacts, bạn có thể lưu:

Container Image
+
Helm Chart

trong cùng ecosystem.

Điều này đơn giản hóa infrastructure.


19. 🔐 Login vào OCI Registry

Để push Chart vào private registry, bạn cần authentication.

Ví dụ:

helm registry login registry.example.com

Helm sẽ yêu cầu:

Username
Password / Token

Sau khi login:

Developer
    │
    │ credentials
    ▼
OCI Registry

Trong production, ưu tiên token/credential có scope tối thiểu cần thiết và quản lý qua CI/CD secret manager, thay vì lưu password trực tiếp trong repository.


20. 📦 Push Helm Chart vào OCI

Sau khi package:

todo-app-1.0.0.tgz

Bạn có thể push:

helm push todo-app-1.0.0.tgz \
  oci://registry.example.com/helm

Kết quả conceptually:

OCI Registry
    │
    └── helm/
        └── todo-app
            └── 1.0.0

Bạn vừa biến:

Local Chart

thành:

Versioned Registry Artifact

21. 🧠 Pull Chart từ OCI

Team khác không cần source code của bạn.

Họ chỉ cần:

helm pull oci://registry.example.com/helm/todo-app \
  --version 1.0.0

Kết quả:

todo-app-1.0.0.tgz

Hoặc có thể install trực tiếp từ OCI:

helm install todo-app \
  oci://registry.example.com/helm/todo-app \
  --version 1.0.0

Mental model:

OCI Registry
      │
      │ Helm
      ▼
Application Team
      │
      ▼
Kubernetes

22. 🧠 Không cần clone source code

Đây chính là giá trị của Registry.

Cách cũ

Team A
   │
   ▼
Git Repository
   │
   ▼
Chart Source
   │
   ▼
helm install

Với Registry

Platform Team
      │
      ▼
Build Chart
      │
      ▼
OCI Registry
      │
      ▼
Application Team
      │
      ▼
helm install

Application Team chỉ consume artifact đã được publish.


23. 🧪 Exercise 3 — Local OCI Registry

Nếu bạn không có cloud registry, có thể dùng một OCI-compatible registry local để thực hành.

Ví dụ chạy registry:

docker run -d \
  --name helm-registry \
  -p 5000:5000 \
  registry:2

Kiểm tra:

docker ps

Bạn sẽ có:

localhost:5000

24. 🧪 Login

Với registry local:

helm registry login localhost:5000 \
  --username test \
  --password test

Tùy cấu hình registry local, authentication có thể khác hoặc có thể không được bật.

Mục tiêu của exercise là hiểu flow:

Login
  ↓
Package
  ↓
Push
  ↓
Pull

25. 🧪 Exercise 4 — Push Chart

Package:

helm package .

Sau đó push:

helm push todo-app-1.0.0.tgz \
  oci://localhost:5000/helm

Nếu thành công, Chart đã được lưu vào registry.

Mental model:

todo-app-1.0.0.tgz
        │
        │ helm push
        ▼
localhost:5000
        │
        └── helm/todo-app

26. 🧪 Exercise 5 — Pull Chart

Xóa file local:

rm todo-app-1.0.0.tgz

Sau đó:

helm pull \
  oci://localhost:5000/helm/todo-app \
  --version 1.0.0

Kiểm tra:

ls

Bạn sẽ lại có:

todo-app-1.0.0.tgz

Điều này chứng minh:

Local
  ↓
Push
  ↓
Registry
  ↓
Pull
  ↓
Local

27. 🧪 Exercise 6 — Install trực tiếp từ OCI

Bạn có thể không cần helm pull.

helm install todo-api \
  oci://localhost:5000/helm/todo-app \
  --version 1.0.0

Helm sẽ lấy Chart từ Registry.

Architecture:

OCI Registry
      │
      │
      ▼
     Helm
      │
      ▼
 Kubernetes

Đây là workflow rất phổ biến khi Chart đã được publish.


28. 🧠 Chart Repository vs OCI

Bạn chỉ cần nhớ bảng sau:

Helm Repository OCI Registry
Mục đích Lưu Helm Charts Lưu OCI artifacts
Chart
Container Image
Cách tham chiếu URL oci://
Ecosystem Helm-centric Registry-centric
Production Vẫn gặp Rất phổ biến

Đừng cố học quá sâu sự khác nhau về implementation.

Điều quan trọng là nhận biết:

https://...

thường là Helm Repository truyền thống.

oci://...

là OCI Registry.


29. 🏢 Production Architecture

Một mô hình thực tế:

                         Git
                          │
                          ▼
                    Helm Source
                          │
                          ▼
                         CI
                          │
              ┌───────────┴───────────┐
              │                       │
              ▼                       ▼
          helm lint              helm test
              │                       │
              └───────────┬───────────┘
                          ▼
                    helm package
                          │
                          ▼
                    OCI Registry
                          │
              ┌───────────┼───────────┐
              ▼           ▼           ▼
             Dev       Staging       Prod

Đây là separation rất tốt:

Git
 ↓
Source Code

Registry
 ↓
Release Artifact

Kubernetes
 ↓
Runtime

30. 🧠 Tại sao không deploy trực tiếp từ Git?

Bạn hoàn toàn có thể:

Git
 ↓
Helm install .

Nhưng production thường muốn:

Git
 ↓
CI
 ↓
Build + Test
 ↓
Package
 ↓
Registry
 ↓
Deploy exact artifact

Lý do:

Production nên deploy thứ đã được build và test, thay vì lấy source code thay đổi liên tục.

Ví dụ:

Chart 1.4.2

đã được test.

Production deploy:

Chart 1.4.2

Không phải:

latest code

31. 🧠 Immutability

Một concept quan trọng trong artifact management là:

Không thay đổi artifact đã release.

Ví dụ:

todo-app:1.0.0

đã publish.

Không nên:

1.0.0
   ↓
sửa nội dung
   ↓
push lại

Thay vào đó:

1.0.0
1.1.0
1.2.0

Mental model:

Version
   ↓
Immutable Artifact

Điều này giúp:

Dev
Staging
Production

có thể xác định chính xác mình đang chạy artifact nào.


32. 🚨 Một anti-pattern phổ biến

Không nên:

helm install todo-api \
  oci://registry/.../todo-app

mà không kiểm soát version nếu production yêu cầu reproducibility.

Tốt hơn:

helm install todo-api \
  oci://registry.example.com/helm/todo-app \
  --version 1.4.2

Mental model:

❌ "Deploy latest"

✅ "Deploy version 1.4.2"

33. 🧪 Exercise 7 — Version Upgrade

Tăng Chart version:

version: 1.1.0

Package:

helm package .

Push:

helm push todo-app-1.1.0.tgz \
  oci://localhost:5000/helm

Bây giờ registry có:

todo-app
├── 1.0.0
└── 1.1.0

Bạn có thể install:

helm install todo-api \
  oci://localhost:5000/helm/todo-app \
  --version 1.1.0

34. 🧠 Helm Chart Repository trong Dependency

Quay lại Lab 8.

Bạn đã thấy:

dependencies:
  - name: postgresql
    version: "..."
    repository: "https://..."

Repository đó chính là nơi Helm tìm dependency.

Với OCI, ecosystem cũng có thể sử dụng OCI-based Charts.

Mental model:

Parent Chart
     │
     ▼
Dependency
     │
     ▼
Registry
     │
     ▼
PostgreSQL Chart

Điều này giúp Chart có thể consume dependencies được version hóa.


35. 🧪 Exercise 8 — Review một Chart Production

Hãy tưởng tượng bạn nhận một project:

company-app/

Review:

Chart.yaml

Hỏi:

□ Chart version là gì?

□ App version là gì?

□ Dependencies từ đâu?

□ Chart được publish ở đâu?

□ Helm Repository hay OCI?

□ Có version cố định không?

□ CI có package Chart không?

□ Production deploy artifact nào?

□ Có thể rollback về version cũ không?

Nếu team không trả lời được:

"Production đang deploy chính xác Helm Chart version nào?"

thì release process đang có vấn đề.


36. 🔥 Một Scenario Production

Platform Team release:

company-app-chart:2.3.0

Application Team:

payment-api

sử dụng:

company-app-chart:2.3.0

Sau đó Platform Team release:

company-app-chart:2.4.0

Payment API không tự động bị thay đổi.

Team có thể:

2.3.0
   ↓
Review
   ↓
Test
   ↓
2.4.0

Architecture:

                 OCI Registry
                      │
              ┌───────┴───────┐
              ▼               ▼
        company-app:2.3.0  company-app:2.4.0
              │               │
              ▼               ▼
         Current Prod      Future Upgrade

Đây chính là lợi ích của versioned artifact.


37. 🧠 CI/CD Workflow hoàn chỉnh

Một pipeline có thể trông như:

Developer
    │
    ▼
Git Pull Request
    │
    ▼
┌─────────────────────┐
│ helm lint           │
│ helm template       │
│ tests               │
└─────────┬───────────┘
          │
          ▼
      helm package
          │
          ▼
      OCI Registry
          │
          ▼
       Release
          │
    ┌─────┼─────┐
    ▼     ▼     ▼
   Dev  Stage  Prod

Điểm quan trọng:

Build once
Release many times

Cùng một Chart artifact được promote qua environments.


38. 🚨 Production Tips

1. Không dùng latest

❌ latest

Ưu tiên:

✅ 1.4.2

2. Version Chart rõ ràng

Chart version
≠
Application version

Theo dõi cả hai.


3. Registry nên được bảo vệ

Production registry nên có:

Authentication
Authorization
Audit
Retention
Access Control

4. CI nên là nơi publish

Không nên:

Developer laptop
    ↓
helm push production

Tốt hơn:

Git
 ↓
CI
 ↓
Test
 ↓
Package
 ↓
Registry

5. Artifact đã release nên immutable

1.0.0

đã release thì không sửa nội dung.

Nếu thay đổi:

1.0.1

hoặc version phù hợp.


39. 🎯 Tổng kết

Sau Lab này, bạn chỉ cần nhớ 7 ý.

1. Chart có thể được package

helm package .

→ tạo:

todo-app-1.0.0.tgz

2. Chart có thể được lưu trong Repository

Helm Repository

3. Chart cũng có thể được lưu trong OCI Registry

oci://registry.example.com/helm

4. OCI Registry không chỉ chứa Container Image

OCI Registry
├── Container Images
└── Helm Charts

5. Helm Chart nên được version hóa

1.0.0
1.1.0
2.0.0

6. Production nên deploy artifact đã được publish

Git
 ↓
CI
 ↓
Test
 ↓
Package
 ↓
Registry
 ↓
Production

Không nên phụ thuộc vào source code "latest".


7. Điều quan trọng nhất

Khi nhìn thấy:

oci://...

hãy nghĩ:

"Đây là Helm Chart được lưu dưới dạng OCI artifact trong một Registry."

Khi nhìn thấy:

helm package
helm push
helm pull

hãy nghĩ:

Source
  ↓
Package
  ↓
Registry
  ↓
Versioned Artifact
  ↓
Deploy

🧠 Mental Model cuối Lab

Sau toàn bộ Phase Helm, bạn có thể ghép các kiến thức lại:

                         Git
                          │
                          ▼
                  Reusable Helm Chart
                          │
             ┌────────────┼────────────┐
             │            │            │
             ▼            ▼            ▼
          Values      Templates    Dependencies
             │            │            │
             └────────────┼────────────┘
                          ▼
                     Validation
                          │
                 ┌────────┴────────┐
                 ▼                 ▼
             helm lint       helm template
                 │                 │
                 └────────┬────────┘
                          ▼
                    helm package
                          │
                          ▼
                    OCI Registry
                          │
                    ┌─────┼─────┐
                    ▼     ▼     ▼
                   Dev  Stage  Prod

Và đây cũng chính là mức Helm rất phù hợp với mục tiêu của bạn:

Bạn không cần trở thành người thuộc lòng toàn bộ Helm syntax. Bạn cần đủ hiểu để đọc Chart → hiểu Values → hiểu Dependencies → render ra YAML → validate → review → version → deploy artifact từ Registry.

Nếu AI viết 90% Helm code cho bạn, những phần trên chính là thứ bạn cần đủ chắc để biết AI viết đúng hay sai, thiết kế có hợp lý không, và Chart có thể vận hành an toàn trong production hay không.


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í