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 Repository và OCI 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 ↓ DeployTrong 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