Lab 4 — Deploy Application with ArgoCD
🎯 1. Mục tiêu
Sau Lab này, bạn sẽ:
- Hiểu cách ArgoCD lấy Kubernetes Manifest từ Git.
- Tạo một ArgoCD Application để deploy Todo App.
- Thực hiện Manual Sync và Automatic Sync.
- Hiểu trạng thái
Synced,OutOfSync,Healthy. - Biết cách kiểm tra khi ArgoCD deploy application không thành công.
Prerequisites
- Đã hoàn thành Lab 1–3.
- Có Kubernetes Cluster đang chạy.
- Đã cài ArgoCD.
- Đã có Todo App hoặc một Kubernetes application có Manifest.
- Có Git Repository chứa Kubernetes Manifest.
🤔 2. Vấn đề thực tế
Giả sử bạn có Todo App gồm:
Frontend
Backend
PostgreSQL
Nếu deploy thủ công, mỗi lần thay đổi configuration bạn có thể phải chạy:
kubectl apply -f namespace.yaml
kubectl apply -f backend.yaml
kubectl apply -f frontend.yaml
kubectl apply -f postgres.yaml
Lúc đầu không có vấn đề gì.
Nhưng khi team bắt đầu phát triển:
Developer A ──┐
Developer B ──┼──► Git
Developer C ──┘
│
▼
Kubernetes
Bạn sẽ bắt đầu gặp các câu hỏi:
- Manifest hiện tại trên Kubernetes có giống Git không?
- Ai đã thay đổi Deployment?
- Thay đổi đó có được commit không?
- Nếu Pod bị sửa thủ công thì làm sao đưa về trạng thái chuẩn?
- Có cần SSH vào server để deploy không?
Đây chính là vấn đề mà GitOps muốn giải quyết.
Với ArgoCD, flow sẽ trở thành:
Developer
│
│ git push
▼
┌───────────────┐
│ Git Repository│
│ │
│ Kubernetes │
│ Manifests │
└───────┬───────┘
│
│ Watch
▼
┌───────────────┐
│ ArgoCD │
└───────┬───────┘
│
│ Sync
▼
┌───────────────┐
│ Kubernetes │
│ │
│ Todo App │
└───────────────┘
Điểm quan trọng:
Bạn không còn nói với Kubernetes:
"Hãy chạy file YAML này."Thay vào đó, bạn nói với ArgoCD:
"Application của tôi được định nghĩa trong Git. Hãy đảm bảo Kubernetes giống Git."
🧠 3. Hiểu nhanh
3.1. ArgoCD Application là gì?
ArgoCD Application là một resource mô tả:
Deploy cái gì, lấy từ Git ở đâu và deploy vào Kubernetes nào.
Có thể hình dung:
ArgoCD Application
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
Git Repo Path Kubernetes
│ │
│ │
▼ ▼
manifests/ todo-app
Ví dụ:
spec:
source:
repoURL: https://github.com/example/gitops.git
path: apps/todo
destination:
server: https://kubernetes.default.svc
namespace: todo-app
Bạn chỉ cần hiểu 3 thông tin chính:
| Thành phần | Ý nghĩa |
|---|---|
repoURL |
Git Repository chứa Manifest |
path |
Folder chứa Application |
destination |
Kubernetes Cluster + Namespace cần deploy |
3.2. Git là Source of Truth
Trong GitOps, Git được xem là Source of Truth.
Ví dụ Git có:
replicas: 3
thì Kubernetes được kỳ vọng có:
replicas = 3
Nếu Kubernetes đang có:
replicas = 5
ArgoCD phát hiện:
Git Kubernetes
replicas: 3 replicas: 5
│ │
└───── Diff ─────┘
│
▼
OutOfSync
Đây là một trong những ý tưởng quan trọng nhất của GitOps.
🏗️ 4. Architecture
Trong Lab này, chúng ta sử dụng mô hình:
GitHub
│
│ Kubernetes YAML
▼
┌───────────────┐
│ Git Repository│
│ │
│ apps/ │
│ todo/ │
└───────┬───────┘
│
│ Watch / Pull
▼
┌───────────────┐
│ ArgoCD │
│ │
│ Application │
└───────┬───────┘
│
│ Sync
▼
┌───────────────┐
│ Kubernetes │
│ │
│ namespace │
│ deployment │
│ service │
└───────┬───────┘
│
▼
Todo App
Có một điểm rất đáng chú ý:
ArgoCD không cần bạn SSH vào Kubernetes Node để deploy.
ArgoCD chạy bên trong Kubernetes và sử dụng Kubernetes API để tạo/update resources.
📁 5. Chuẩn bị Git Repository
5.1. Tạo cấu trúc Repository
Tạo một Git Repository dành cho GitOps.
Ví dụ:
gitops-repo/
│
└── apps/
│
└── todo/
├── namespace.yaml
├── backend.yaml
├── frontend.yaml
├── postgres.yaml
└── services.yaml
Trong production, repository thường được tổ chức rõ ràng hơn:
gitops-repo/
│
├── apps/
│ ├── todo/
│ └── nginx/
│
├── environments/
│ ├── dev/
│ ├── staging/
│ └── production/
│
└── README.md
Nhưng trong Lab này, chúng ta bắt đầu đơn giản.
5.2. Kiểm tra Manifest
Ví dụ:
kubectl apply --dry-run=client -f apps/todo/
Nếu Manifest hợp lệ, bạn có thể commit:
git add .
git commit -m "Add todo application manifests"
git push
💡 Tại sao nên kiểm tra trước?
ArgoCD sẽ đọc Manifest từ Git.
Nếu YAML sai:
Git
│
▼
ArgoCD
│
▼
Invalid Manifest
│
▼
❌ Sync Failed
Vì vậy:
Git commit không có nghĩa là application chắc chắn deploy thành công.
🚀 6. Tạo ArgoCD Application
Bây giờ chúng ta nói với ArgoCD:
"Hãy lấy Todo App từ Git Repository này và deploy vào Kubernetes."
Có hai cách tạo Application:
CLI
│
└── argocd app create
Manifest
│
└── Application YAML
Trong GitOps, cách thứ hai thường phù hợp hơn vì chính Application definition cũng có thể được quản lý bằng Git.
Nhưng để hiểu bản chất, Lab này sẽ bắt đầu bằng CLI.
6.1. Kiểm tra ArgoCD
Kiểm tra ArgoCD:
kubectl get pods -n argocd
Bạn cần thấy các Pod chính đang chạy:
argocd-server
argocd-repo-server
argocd-application-controller
Nếu các thành phần này chưa chạy, quay lại Lab 3 — Install ArgoCD.
6.2. Đăng nhập ArgoCD CLI
Kiểm tra:
argocd version
Nếu chưa login:
argocd login localhost:8080
Trong trường hợp ArgoCD Server đang được port-forward:
kubectl port-forward svc/argocd-server \
-n argocd 8080:443
Sau đó:
argocd login localhost:8080 --insecure
Đăng nhập bằng account đã tạo trong Lab 3.
🧩 7. Tạo Application
Giả sử Git Repository của bạn là:
https://github.com/<your-user>/gitops-repo.git
Tạo Application:
argocd app create todo-app \
--repo https://github.com/<your-user>/gitops-repo.git \
--path apps/todo \
--dest-server https://kubernetes.default.svc \
--dest-namespace todo-app
Hãy đọc command này theo cách đơn giản:
todo-app
│
├── Repo: GitHub repository
│
├── Path: apps/todo
│
├── Cluster: Kubernetes hiện tại
│
└── Namespace: todo-app
Không cần học thuộc command.
Điều quan trọng là hiểu:
Git Repository
+
Path
+
Destination
↓
ArgoCD Application
🔍 8. Kiểm tra Application
Chạy:
argocd app list
Bạn có thể thấy:
NAME CLUSTER NAMESPACE STATUS
todo-app https://kubernetes.default.svc todo-app OutOfSync
Tại sao OutOfSync?
Bởi vì:
Git
│
│ manifests tồn tại
▼
ArgoCD
│
│ chưa deploy
▼
Kubernetes
│
└── chưa giống Git
Đây là trạng thái hoàn toàn bình thường.
🔄 9. Sync Application
Bây giờ hãy yêu cầu ArgoCD đồng bộ:
argocd app sync todo-app
ArgoCD sẽ thực hiện:
Git
│
│ Read Manifest
▼
ArgoCD
│
│ Compare
▼
Kubernetes
│
│ Apply
▼
Todo App
Sau đó kiểm tra:
argocd app get todo-app
Bạn muốn thấy:
Sync Status: Synced
Health Status: Healthy
👀 10. See Result — Kiểm tra Kubernetes
Kiểm tra namespace:
kubectl get ns
Kiểm tra resources:
kubectl get all -n todo-app
Ví dụ:
NAME READY STATUS
pod/todo-backend-xxxxx 1/1 Running
pod/todo-frontend-xxxxx 1/1 Running
pod/todo-postgres-xxxxx 1/1 Running
NAME TYPE CLUSTER-IP
service/todo-backend ClusterIP 10.x.x.x
service/todo-frontend ClusterIP 10.x.x.x
service/todo-postgres ClusterIP 10.x.x.x
Điều quan trọng ở đây:
Bạn không chạy:
kubectl apply -f ...
nhưng application vẫn được deploy.
Lý do:
Git
↓
ArgoCD
↓
Kubernetes
📊 11. Quan sát Application trên ArgoCD UI
Mở ArgoCD UI.
Bạn sẽ thấy:
todo-app
Sync: Synced
Health: Healthy
ArgoCD cũng hiển thị dependency giữa các resource:
todo-app
│
├── Namespace
│
├── Deployment
│ │
│ └── ReplicaSet
│ │
│ └── Pod
│
└── Service
Đây là một trong những điểm rất hay của ArgoCD:
Thay vì phải chạy nhiều
kubectl get ..., bạn có thể nhìn application từ góc nhìn tổng thể.
🧪 12. Exercise — Thay đổi Application
Bây giờ chúng ta thử điều quan trọng nhất của GitOps.
Giả sử Deployment đang có:
spec:
replicas: 1
Thay thành:
spec:
replicas: 2
Commit:
git add .
git commit -m "Scale todo backend to 2 replicas"
git push
Nếu Application đang sử dụng Manual Sync, ArgoCD sẽ phát hiện:
Git Kubernetes
replicas: 2 replicas: 1
│ │
└─────── Diff ──────────┘
│
▼
OutOfSync
Kiểm tra:
argocd app get todo-app
Bạn sẽ thấy:
Sync Status: OutOfSync
🔄 13. Sync lần nữa
Chạy:
argocd app sync todo-app
Sau đó:
kubectl get deployment -n todo-app
Bạn sẽ thấy:
READY
2/2
Flow lúc này:
Developer
│
│ git push
▼
Git
│
▼
ArgoCD
│
│ detect change
▼
Sync
│
▼
Kubernetes
│
▼
2 replicas
Đây chính là GitOps workflow cơ bản.
⚡ 14. Bật Automatic Sync
Manual Sync nghĩa là:
Git change
│
▼
ArgoCD detects
│
▼
Developer
│
│ argocd app sync
▼
Kubernetes
Trong production, chúng ta thường muốn giảm thao tác thủ công.
Có thể bật:
Automatic Sync
Bằng command:
argocd app set todo-app --sync-policy automated
Kiểm tra:
argocd app get todo-app
🧪 15. Exercise — Test Automatic Sync
Tiếp tục thay đổi:
replicas: 3
Commit:
git add .
git commit -m "Scale todo backend to 3 replicas"
git push
Lần này không chạy:
argocd app sync todo-app
Chờ ArgoCD phát hiện Git thay đổi.
Kiểm tra:
kubectl get deployment -n todo-app
Nếu Automatic Sync hoạt động:
READY
3/3
Bạn vừa tạo được flow:
git push
│
▼
ArgoCD
│
│ automatic sync
▼
Kubernetes
Đây mới là trải nghiệm GitOps mà chúng ta muốn hướng tới.
🛡️ 16. Self-Healing — ArgoCD tự sửa Drift
Đây là một tính năng rất quan trọng.
Drift nghĩa là:
Kubernetes đã khác với trạng thái được định nghĩa trong Git.
Ví dụ Git:
replicas: 3
Nhưng một developer chạy:
kubectl scale deployment todo-backend \
--replicas=1 \
-n todo-app
Bây giờ:
Git Kubernetes
3 replicas 1 replica
│ │
└──── Drift ──────┘
ArgoCD sẽ phát hiện:
OutOfSync
Nếu bật Self-Healing:
argocd app set todo-app \
--sync-policy automated \
--self-heal
ArgoCD có thể tự đưa Kubernetes về trạng thái Git:
Git
│
│ replicas = 3
▼
ArgoCD
│
│ detect drift
▼
Kubernetes
│
└── replicas = 3
💡 Tư duy quan trọng
GitOps không chỉ là:
"Deploy application bằng Git."
Mà còn là:
"Đảm bảo hệ thống luôn hướng về trạng thái được định nghĩa trong Git."
🧹 17. Prune — Xóa Resource không còn trong Git
Giả sử Git có:
Deployment
Service
ConfigMap
Sau đó bạn xóa:
ConfigMap
khỏi Git.
Nếu chỉ sync thông thường, resource cũ có thể vẫn tồn tại tùy policy.
Trong GitOps, chúng ta thường muốn:
Git
│
├── Deployment
└── Service
↓
Kubernetes
│
├── Deployment
└── Service
Resource không còn được Git quản lý sẽ được loại bỏ khi prune được bật.
Có thể bật:
argocd app set todo-app \
--sync-policy automated \
--auto-prune
⚠️ Production Warning
auto-prune rất mạnh.
Nếu bạn vô tình xóa resource khỏi Git:
Git
│
│ resource deleted
▼
ArgoCD
│
│ auto-prune
▼
Kubernetes
│
└── resource deleted
Vì vậy:
Không nên bật
auto-prunemột cách thiếu kiểm soát trên production.
Cần có:
- Pull Request review.
- Branch protection.
- CI validation.
- Permission phù hợp.
- Backup đối với dữ liệu quan trọng.
🔎 18. Exercise — Tạo Drift
Đây là bài thực hành quan trọng nhất của Lab.
Bước 1 — Kiểm tra Git
Giả sử:
replicas: 3
Bước 2 — Thay đổi trực tiếp Kubernetes
kubectl scale deployment todo-backend \
--replicas=1 \
-n todo-app
Bước 3 — Kiểm tra
kubectl get deployment -n todo-app
Bạn sẽ thấy:
1/1
Bước 4 — Kiểm tra ArgoCD
argocd app get todo-app
Nếu Self-Healing chưa bật:
Sync Status: OutOfSync
Nếu đã bật Self-Healing:
ArgoCD
│
│ detect drift
▼
Auto Sync
│
▼
replicas = 3
Kiểm tra lại:
kubectl get deployment -n todo-app
Kết quả mong đợi:
3/3
🎯 Bạn vừa tận mắt thấy GitOps Self-Healing hoạt động.
🧠 19. Hiểu trạng thái của ArgoCD
Khi làm việc với ArgoCD, bạn sẽ thường xuyên gặp hai khái niệm:
Sync Status
Health Status
Sync Status
Cho biết:
Kubernetes có giống Git không?
Synced
↓
Git = Kubernetes
OutOfSync
↓
Git ≠ Kubernetes
Health Status
Cho biết:
Application có đang hoạt động bình thường không?
Ví dụ:
Healthy
Progressing
Degraded
Missing
Unknown
Vì vậy có thể xảy ra:
Synced + Healthy
→ Git đúng với Kubernetes và application đang chạy tốt.
Hoặc:
Synced + Degraded
→ Kubernetes đúng với Git nhưng application đang lỗi.
Đây là điểm rất quan trọng.
Synced không có nghĩa là application đang khỏe.
🐛 20. Troubleshooting cơ bản
20.1. Application bị OutOfSync
Kiểm tra:
argocd app diff todo-app
Command này cho bạn biết:
Git Kubernetes
────────────────────────────────
replicas: 3 replicas: 1
Sau đó kiểm tra:
argocd app sync todo-app
20.2. Application bị Degraded
Đầu tiên:
kubectl get pods -n todo-app
Nếu Pod:
CrashLoopBackOff
ImagePullBackOff
Pending
thì vấn đề có thể nằm ở application chứ không phải ArgoCD.
Xem chi tiết:
kubectl describe pod <pod-name> -n todo-app
Xem log:
kubectl logs <pod-name> -n todo-app
💡 Kinh nghiệm thực tế
Đừng thấy:
ArgoCD = Red
rồi kết luận:
"ArgoCD bị lỗi."
ArgoCD có thể chỉ đang báo rằng application của bạn đang lỗi.
🔐 21. Production Tips
21.1. Không nên deploy production bằng kubectl thủ công
Không phải tuyệt đối cấm kubectl.
Nhưng production nên ưu tiên:
Pull Request
↓
Review
↓
Merge
↓
Git
↓
ArgoCD
↓
Kubernetes
Thay vì:
SSH
↓
kubectl edit
↓
Production
21.2. Git nên có Pull Request Review
Thay vì:
Developer
│
│ push directly
▼
main
Nên:
Developer
│
▼
Feature Branch
│
▼
Pull Request
│
├── CI
├── Validation
└── Review
│
▼
main
│
▼
ArgoCD
Điều này giúp tránh việc một thay đổi YAML sai làm production deployment thất bại.
21.3. Không commit Secret trực tiếp
Không nên:
stringData:
password: my-production-password
rồi commit vào Git.
Ở các Lab tiếp theo chúng ta sẽ xử lý vấn đề này bằng các giải pháp như:
Sealed Secrets
External Secrets
Secret Manager
Vault
🧪 22. Final Exercise
Hãy tự thực hiện toàn bộ flow mà không nhìn lại các bước phía trên.
Task
- Tạo Git Repository.
- Đưa Todo App Manifest vào Git.
- Tạo ArgoCD Application.
- Deploy application.
- Kiểm tra
Synced. - Kiểm tra
Healthy. - Bật Automatic Sync.
- Thay đổi replicas từ
3 → 4. - Push Git.
- Quan sát ArgoCD tự deploy.
- Dùng
kubectl scaleđể tạo Drift. - Bật Self-Healing.
- Quan sát ArgoCD tự khôi phục trạng thái.
Flow cuối cùng cần đạt:
Developer
│
│ git push
▼
┌─────────────┐
│ Git │
│ Source of │
│ Truth │
└──────┬──────┘
│
│ Detect Change
▼
┌─────────────┐
│ ArgoCD │
│ │
│ Auto Sync │
│ Self-Heal │
└──────┬──────┘
│
│ Reconcile
▼
┌─────────────┐
│ Kubernetes │
│ │
│ Todo App │
└─────────────┘
🧠 23. Tổng kết
Trước Lab:
Developer
│
│ kubectl apply
▼
Kubernetes
Sau Lab:
Developer
│
│ git push
▼
Git
│
▼
ArgoCD
│
▼
Kubernetes
Bạn đã xây dựng được vòng lặp GitOps cơ bản:
┌──────────────────────┐
│ │
▼ │
Git ──► ArgoCD ──► Kubernetes
▲ │
│ │
└────── Drift ─────────┘
Điểm quan trọng nhất cần nhớ không phải là command:
argocd app create
argocd app sync
mà là tư duy:
Git định nghĩa trạng thái mong muốn. ArgoCD liên tục quan sát và đưa Kubernetes về trạng thái đó.
Ở Lab tiếp theo, chúng ta sẽ đi sâu hơn vào ArgoCD Sync, Self-Healing và các chiến lược đồng bộ, để hiểu rõ ArgoCD thực sự xử lý thay đổi như thế nào trong môi trường thực tế.
All rights reserved