GitOps & ArgoCD: Tự Động Hóa Deployment Kubernetes
Danh Mục Bài Viết
- 1. GitOps Là Gì — Và Tại Sao Nó Quan Trọng Hơn Bạn Nghĩ
- 2. ArgoCD: Controller Đứng Canh Cluster Của Bạn 24/7
- 3. Cài Đặt ArgoCD Từ A Đến Z
- 4. App-of-Apps Pattern: Quản Lý Nhiều App Như Một
- 5. Automated Sync, Prune Và SelfHeal
- 6. Những Lỗi Hay Gặp Khi Dùng ArgoCD Production
- 7. FAQ
- 8. Đúc Kết Sau Hơn 1 Năm Dùng GitOps Production
Bạn đã bao giờ deploy lên production bằng cách SSH vào server rồi chạy kubectl apply -f . chưa? Mình đã làm vậy — cho đến khi team có 3 người đồng thời "apply" những thứ khác nhau lên cùng một cluster và không ai biết trạng thái thực sự của hệ thống là gì. GitOps ra đời để giải quyết đúng cái mớ hỗn độn đó.
GitOps Là Gì — Và Tại Sao Nó Quan Trọng Hơn Bạn Nghĩ
GitOps không phải là một tool cụ thể — đó là một tập nguyên tắc: Git là source of truth duy nhất cho cả code lẫn cấu hình hạ tầng. Bất kỳ thay đổi nào trên cluster đều phải đi qua Git commit, được review qua Pull Request, và tự động được sync bởi một agent chạy bên trong cluster.
Khổ nỗi là nhiều team vẫn đang dùng CI/CD theo kiểu "push": pipeline build xong rồi gọi kubectl từ CI runner. CI runner cần có quyền admin trên cluster — một security hole khổng lồ. Nếu CI bị compromise, attacker có toàn quyền.
GitOps đảo ngược mô hình: agent bên trong cluster tự pull từ Git repository và apply thay đổi. CI runner không cần access cluster. Đây là sự khác biệt cơ bản.
Nói thật thì: lần đầu mình nghe "Git là source of truth cho infra" nghe có vẻ buzzword. Nhưng sau một incident production vì ai đó edit ConfigMap trực tiếp trên cluster mà không commit vào Git, mình hiểu ngay tại sao cần nó.
ArgoCD: Controller Đứng Canh Cluster Của Bạn 24/7
ArgoCD là một declarative GitOps continuous delivery tool cho Kubernetes. Nó chạy như một set of controllers bên trong cluster, liên tục so sánh desired state (trong Git) với live state (trên cluster). Khi có drift, nó alert hoặc tự động sync tùy theo cấu hình.
Những điểm làm mình thích nhất: UI trực quan thấy ngay app nào Healthy/Degraded/OutOfSync; RBAC granular cho phép developer xem log nhưng không được sync production; và webhook support giúp sync gần như realtime sau mỗi commit.
Cài Đặt ArgoCD Từ A Đến Z
Cài ArgoCD vào namespace riêng:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlĐợi pods ready rồi lấy initial admin password:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echoPort-forward để access UI:
kubectl port-forward svc/argocd-server -n argocd 8080:443Mở https://localhost:8080, login với user admin và password vừa lấy. Đổi password ngay sau lần đầu đăng nhập.
Trong môi trường production, expose ArgoCD qua Ingress với TLS và SSO (OIDC với Google hoặc GitHub). Đừng để ArgoCD UI public mà không có auth layer.
App-of-Apps Pattern: Quản Lý Nhiều App Như Một
Khi có nhiều services, tạo từng ArgoCD Application thủ công rất mệt. App-of-Apps pattern giải quyết: bạn tạo một "root" Application trỏ tới một thư mục chứa các Application manifest khác.
Cấu trúc Git repo:
gitops-repo/
├── apps/ # Root app trỏ vào đây
│ ├── api-service.yaml
│ ├── frontend.yaml
│ └── worker.yaml
└── manifests/
├── api-service/
├── frontend/
└── worker/Root Application manifest:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: root-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourorg/gitops-repo
targetRevision: HEAD
path: apps
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: trueApply một lần duy nhất, ArgoCD sẽ tự động discover và deploy tất cả apps còn lại. Thêm app mới chỉ cần thêm file vào thư mục apps/ và commit.
Automated Sync, Prune Và SelfHeal
Automated sync: ArgoCD tự sync khi Git có thay đổi. Phù hợp cho staging, cần cân nhắc kỹ cho production.
Prune: Xóa resource trên cluster khi resource đó bị xóa khỏi Git. Rất tiện nhưng có rủi ro — bật cùng với branch protection trên Git.
SelfHeal: Nếu ai edit resource trực tiếp trên cluster (bỏ qua Git), ArgoCD tự revert về desired state. Đây là tính năng "bắt buộc" trong môi trường có nhiều người access cluster.
Những Lỗi Hay Gặp Khi Dùng ArgoCD Production
App stuck ở "Progressing": Thường do Deployment chưa ready (pod crash, image pull error). Check kubectl describe pod và xem resource events trong ArgoCD UI.
Sync loop do annotation bị overwrite: Một số controller (HPA, VPA) tự thêm annotation vào resource. ArgoCD thấy diff và cứ sync mãi. Giải pháp: dùng ignoreDifferences:
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicasOutOfSync nhưng không rõ diff ở đâu: Click vào app trong UI, tab "Diff" sẽ show chi tiết. Hoặc dùng CLI: argocd app diff my-app.
FAQ
Q: ArgoCD có thể quản lý nhiều cluster không?A: Được. Bạn có thể register nhiều cluster vào một ArgoCD instance. Dùng CLI
argocd cluster addđể thêm cluster. Trong production, mình thường chạy ArgoCD trên management cluster riêng biệt.
Q: GitOps có thay thế hoàn toàn CI pipeline không?A: Không. CI (build, test, push image) vẫn là CI. ArgoCD chỉ đảm nhiệm phần CD — sync manifest từ Git xuống cluster. Workflow thường gặp: CI build xong → update image tag trong Git → ArgoCD phát hiện thay đổi → tự sync lên cluster.
Q: Helm chart có dùng được với ArgoCD không?A: Hoàn toàn. ArgoCD hỗ trợ native Helm, Kustomize, Jsonnet và plain YAML. Mình hay dùng Helm cho third-party charts và Kustomize cho internal services.
Đúc Kết Sau Hơn 1 Năm Dùng GitOps Production
GitOps với ArgoCD giải quyết một vấn đề thực sự: ai đã thay đổi gì, khi nào, và tại sao. Mọi thay đổi đều có Git commit, có PR review, có author. Khi incident xảy ra, bạn không phải đoán mò.
Điều mình học được sau khi migrate sang GitOps: đừng cố enable automated sync và prune ngay từ đầu cho production. Bắt đầu với manual sync, làm quen với workflow, rồi mới bật dần. Nóng vội bật hết một lúc rất dễ gặp tình huống app bị prune ngoài ý muốn.
Codebase cũng gọn hơn hẳn — Git repo chính là documentation sống của hệ thống.
