Triển khai GitOps với ArgoCD: Đưa Kubernetes về trạng thái ‘nguồn chân lý’ duy nhất

Development tutorial - IT technology blog
Development tutorial - IT technology blog

Từng có lúc nào bạn ‘vã mồ hôi’ dùng kubectl edit trực tiếp trên Production chưa?

Thú thật đi, mình và rất nhiều anh em làm hệ thống đều từng ít nhất một lần sửa nhanh thông số trực tiếp trên Cluster vì tình huống khẩn cấp. Kết quả thường thấy là: một tuần sau, không ai nhớ mình đã sửa gì. Khi deploy bản mới, mọi cấu hình ‘fix tay’ đó biến mất, và lỗi cũ lại tái diễn. Đây chính là lúc GitOps xuất hiện để chấm dứt sự hỗn loạn này.

Hiểu đơn giản, GitOps coi Git là “nguồn chân lý” duy nhất (Single Source of Truth). Mọi thay đổi từ hạ tầng đến ứng dụng đều phải qua Git commit. ArgoCD đóng vai trò như một bộ điều khiển hành trình (Cruise Control). Nó liên tục giám sát xem trạng thái thực tế trên Kubernetes có khớp với những gì bạn khai báo trong Git hay không. Nếu phát hiện sai lệch, nó sẽ tự động đưa mọi thứ về đúng quỹ đạo ban đầu.

Quick Start: Đưa ArgoCD lên sàn trong 5 phút

Bạn chỉ cần một Cluster Kubernetes (Minikube, K3s hay EKS). Hãy chạy các lệnh sau để cài đặt:

# Tạo namespace riêng
kubectl create namespace argocd

# Cài đặt bản stable
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Để truy cập giao diện Web UI nhanh nhất, hãy dùng Port-forward:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Bây giờ, hãy mở https://localhost:8080. User mặc định là admin. Mật khẩu được khởi tạo tự động, bạn lấy bằng lệnh này:

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

Lưu ý: Bạn nên đổi mật khẩu ngay và xóa Secret này để đảm bảo bảo mật.

Tại sao ArgoCD ‘ăn đứt’ mô hình Jenkins hay GitHub Actions truyền thống?

Nhiều bạn thắc mắc: “Dùng GitHub Actions chạy kubectl apply cũng xong mà?”. Cách này gọi là Push-based. Bạn đẩy lệnh đi và hy vọng nó thành công. Nhưng nếu Cluster mất kết nối đúng lúc đó, hoặc ai đó vào xóa tay một Deployment, CI/CD của bạn sẽ hoàn toàn mù tịt.

ArgoCD sử dụng mô hình Pull-based với những ưu điểm vượt trội:

  • Tự động đồng bộ (Auto-sync): Nó liên tục ‘poll’ Git. Thấy YAML thay đổi là nó cập nhật Cluster ngay lập tức.
  • Chống trôi cấu hình (Drift Detection): Nếu ai đó sửa tay trên Cluster, ArgoCD sẽ báo trạng thái “OutOfSync”. Bạn có thể đưa hệ thống về trạng thái chuẩn chỉ bằng một cú click.
  • Quan sát trực quan: Dashboard của ArgoCD cho bạn cái nhìn tổng thể về sức khỏe của từng Pod, Service mà không cần gõ lệnh mỏi tay.

Khi xử lý các file cấu hình YAML hay JSON phức tạp, mình thường dùng JSON Formatter để kiểm tra cấu trúc dữ liệu nhanh. Công cụ này giúp tránh những lỗi format ngớ ngẩn trước khi commit lên Git.

Triển khai ứng dụng đầu tiên theo chuẩn GitOps

Giả sử bạn có một Repo chứa file deployment.yaml của ứng dụng Nginx. Chúng ta sẽ tạo một “Application” trên ArgoCD để theo dõi Repo này.

Bước 1: Chuẩn bị Manifest trên Git

Tạo file nginx-app.yaml đơn giản:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

Bước 2: Để ArgoCD quản lý ứng dụng

Thay vì dùng UI, hãy dùng file YAML để cấu hình chính ArgoCD (App-of-Apps pattern):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-nginx-app
  namespace: argocd
spec:
  source:
    repoURL: 'https://github.com/your-username/your-repo.git'
    path: 'manifests'
  destination:
    server: 'https://kubernetes.default.svc'
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Hai tính năng “đắt giá” nhất ở đây là: Prune (tự động xóa tài nguyên thừa trên Cluster khi Git xóa) và SelfHeal (tự phục hồi cấu hình nếu bị tác động bên ngoài).

Kinh nghiệm ‘xương máu’ từ thực tế

Sau khi triển khai GitOps cho nhiều hệ thống lớn, mình rút ra 3 bài học quan trọng:

  1. Tuyệt đối không đẩy Secret lên Git: Đừng bao giờ commit mật khẩu dạng plain text. Hãy dùng Sealed Secrets hoặc External Secrets Operator để kết nối với Vault/AWS Secret Manager.
  2. Tách biệt Repo Code và Repo Manifest: Đây là quy tắc vàng. Khi CI build xong image mới, nó chỉ cần update tag vào Repo Manifest. Cách làm này giúp bạn kiểm soát việc deploy độc lập với quá trình build code.
  3. Tận dụng Kustomize: Thay vì copy-paste YAML cho môi trường Dev/Prod, hãy dùng Kustomize để quản lý các phần khác biệt (như số lượng Replicas hay Resource Limit).

Áp dụng GitOps có thể giúp giảm tới 80% thời gian phục hồi hệ thống (MTTR). Thay vì loay hoay tìm lệnh cứu hỏa, bạn chỉ cần trỏ ArgoCD vào Repo Git và mọi thứ sẽ hồi sinh trong tích tắc. Đó chính là sự an tâm mà mọi kỹ sư DevOps đều hướng tới.

Share: