📅 Ngày 7: App of Apps Pattern¶
🎯 Mục tiêu hôm nay¶
- Hiểu pattern "App of Apps" để quản lý hàng trăm ứng dụng
- Tạo Root Application quản lý Child Applications
- Thiết kế cấu trúc Git chuẩn cho mô hình này
📖 Lý thuyết¶
Vấn đề: Quản lý nhiều Applications¶
Khi team lớn lên, bạn có hàng chục/trăm ArgoCD Applications. Nếu tạo thủ công từng cái → rối, khó quản lý, không scalable.
Giải pháp: App of Apps¶
┌─────────────────────────────────────────────────────┐
│ APP OF APPS PATTERN │
│ │
│ ┌─────────────────────────┐ │
│ │ ROOT APPLICATION │ │
│ │ (Quản lý tất cả apps) │ │
│ └──────────┬──────────────┘ │
│ │ │
│ ┌────────┼────────┬──────────┐ │
│ ▼ ▼ ▼ ▼ │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │ App │ │ App │ │ App │ │ App │ │
│ │ FE │ │ BE │ │ DB │ │ ... │ │
│ └──────┘ └──────┘ └──────┘ └──────┘ │
│ │
│ ✅ Chỉ cần quản lý 1 root app │
│ ✅ Thêm app mới = thêm 1 file YAML vào Git │
│ ✅ Xóa app = xóa 1 file YAML khỏi Git │
└─────────────────────────────────────────────────────┘
Cấu trúc Git¶
repo/
├── apps/ ← Root App trỏ đến đây
│ ├── root-app.yaml ← Root Application
│ └── children/ ← Child Applications
│ ├── frontend-app.yaml
│ ├── backend-app.yaml
│ └── database-app.yaml
└── manifests/ ← Actual K8s manifests
├── frontend/
│ ├── deployment.yaml
│ └── service.yaml
├── backend/
│ ├── deployment.yaml
│ └── service.yaml
└── database/
├── statefulset.yaml
└── service.yaml
App of Apps vs ApplicationSet¶
| App of Apps | ApplicationSet | |
|---|---|---|
| Cách tạo app | Mỗi app = 1 YAML file | Template tự động generate |
| Linh hoạt | Cao (mỗi app cấu hình riêng) | Trung bình (dùng template) |
| Khi nào dùng | Apps khác nhau nhiều | Apps giống nhau, khác vài param |
| Scale | Tốt (đến ~100 apps) | Tuyệt vời (1000+ apps) |
🔧 Thực hành¶
Bước 1: Xem cấu trúc mẫu¶
Bước 2: Push lên Git¶
Bước 3: Tạo Root Application¶
# Áp dụng root app
kubectl apply -f apps/root-app.yaml
# Sync root app → tự động tạo các child apps
argocd app sync root-app
# Kiểm tra
argocd app list
# → Phải thấy: root-app, frontend, backend, database
Bước 4: Quan sát ArgoCD UI¶
- Mở ArgoCD UI
- Bạn sẽ thấy Root App và 3 Child Apps
- Click vào Root App → thấy 3 child Application resources
- Click vào mỗi child → thấy actual K8s resources
Bước 5: Thêm app mới¶
# Tạo file child app mới
cat <<EOF > apps/children/monitoring-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: monitoring
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/<YOUR_USERNAME>/argocd-demo-app.git
targetRevision: HEAD
path: manifests/monitoring
destination:
server: https://kubernetes.default.svc
namespace: monitoring
syncPolicy:
automated:
selfHeal: true
syncOptions:
- CreateNamespace=true
EOF
# Commit & push → ArgoCD tự create app mới!
❓ FAQ¶
Q: App of Apps hay ApplicationSet tốt hơn?¶
A: Phụ thuộc vào use case: - App of Apps: Khi mỗi app có cấu hình riêng biệt, team muốn kiểm soát chi tiết - ApplicationSet: Khi nhiều app giống nhau, chỉ khác vài tham số (name, namespace, env)
Nhiều team dùng cả hai: App of Apps cho top-level grouping, ApplicationSet cho dynamic generation.
Q: Root App bị xóa thì sao?¶
A: Phụ thuộc vào finalizer:
- Có resources-finalizer.argocd.argoproj.io: Xóa root → xóa tất cả children + resources
- Không có finalizer: Xóa root → children vẫn tồn tại (orphaned)
📚 Bài tập & Ôn tập¶
⏮️ Ngày trước: Day 06 — Multi-cluster ⏭️ Ngày tiếp: Day 08 — ApplicationSet