Bối Cảnh & Lý Do: Bài Toán Quản Lý Đa Cluster
Hãy thử hình dung: bạn đang dẫn dắt một platform team chịu trách nhiệm cho 12 microservice được triển khai trên 3 Kubernetes cluster — staging, production-us và production-eu. Mỗi khi thêm một service mới hoặc onboard một cluster mới, ai đó phải thủ công copy lại các manifest Argo CD Application, chỉnh sửa vài giá trị rồi thầm cầu không có gì hỏng. Cách này hoạt động khi có 10 ứng dụng. Đến 50, nó bắt đầu mong manh. Đến 200, không thể kiểm soát được.
Tôi đã từng trải qua điều đó. Tình trạng copy-paste lan tràn đến rất nhanh — và nguyên nhân gốc rễ không phải là giới hạn của Argo CD. Một resource Application chỉ ánh xạ đúng một ứng dụng trên đúng một cluster. Không có vòng lặp, không có templating, không có tự động phát hiện.
Đó là khoảng trống mà Argo CD ApplicationSet lấp đầy. Thay vì viết một Application cho mỗi service trên mỗi cluster, bạn chỉ cần viết một ApplicationSet duy nhất để tự động tạo ra tất cả — sử dụng các generator lấy dữ liệu từ danh sách cluster, cấu trúc Git repo, hoặc một ma trận kết hợp đơn giản. Tôi học được điều này sau khi mất hai ngày để đồng bộ thủ công 40 manifest Application khi chúng tôi thêm cluster thứ tư. Một ApplicationSet duy nhất đã có thể xử lý xong trong vài phút.
ApplicationSet được tích hợp sẵn trong Argo CD từ phiên bản v2.3, chạy dưới dạng một controller riêng biệt theo dõi các resource ApplicationSet và tự động tạo, cập nhật hoặc xóa các object Application tương ứng.
Cài Đặt
Yêu Cầu Trước Khi Cài
- Kubernetes cluster (v1.22+) làm control plane cho Argo CD
kubectlđược cấu hình với quyền cluster-admin- Đã cài đặt
argocdCLI - Các cluster đích đã được đăng ký trong Argo CD (cho các kịch bản đa cluster)
Cài Argo CD với ApplicationSet Controller
Tạo namespace và cài đặt Argo CD. ApplicationSet controller đã được tích hợp sẵn trong bản cài đặt chuẩn từ v2.3, nên không cần bước cài đặt riêng:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Chờ tất cả các component sẵn sàng:
kubectl wait --for=condition=available deployment --all -n argocd --timeout=120s
Kiểm tra ApplicationSet controller đang chạy:
kubectl get deployment argocd-applicationset-controller -n argocd
# NAME READY UP-TO-DATE AVAILABLE
# argocd-applicationset-controller 1/1 1 1
Truy Cập Argo CD UI và CLI
# Lấy mật khẩu admin ban đầu
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# Port-forward để truy cập UI cục bộ
kubectl port-forward svc/argocd-server -n argocd 8080:443
# Đăng nhập qua CLI
argocd login localhost:8080 --username admin --password <PASSWORD> --insecure
Đăng Ký Các Cluster Đích
Đối với triển khai đa cluster, hãy đăng ký từng cluster đích. ApplicationSet sẽ tham chiếu các cluster này theo tên hoặc URL:
# Thêm cluster từ xa (chạy từ kubeconfig context trỏ đến cluster đó)
argocd cluster add production-us --name production-us
argocd cluster add production-eu --name production-eu
argocd cluster add staging --name staging
# Kiểm tra các cluster đã đăng ký
argocd cluster list
Cấu Hình: Viết ApplicationSet Đầu Tiên của Bạn
Hiểu về Generators
Một ApplicationSet có hai phần chính: một generator tạo ra danh sách các bộ tham số, và một template sử dụng các tham số đó để render các manifest Application. Generator xác định những gì được tạo ra — controller sẽ xử lý phần còn lại.
Các generator phổ biến nhất là:
- List generator — danh sách giá trị tường minh do bạn định nghĩa
- Cluster generator — tự động sử dụng các Argo CD cluster đã đăng ký
- Git generator — phát hiện các app từ cấu trúc thư mục Git repo của bạn
- Matrix generator — kết hợp hai generator (ví dụ: mọi app × mọi cluster)
List Generator: Triển Khai Một App Lên Nhiều Cluster
Bắt đầu với trường hợp đơn giản nhất — triển khai một ứng dụng lên nhiều môi trường:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: nginx-ingress-appset
namespace: argocd
spec:
generators:
- list:
elements:
- cluster: staging
url: https://staging.k8s.internal
namespace: ingress-nginx
values:
replicaCount: "1"
- cluster: production-us
url: https://prod-us.k8s.internal
namespace: ingress-nginx
values:
replicaCount: "3"
- cluster: production-eu
url: https://prod-eu.k8s.internal
namespace: ingress-nginx
values:
replicaCount: "3"
template:
metadata:
name: "nginx-ingress-{{cluster}}"
spec:
project: default
source:
repoURL: https://charts.helm.sh/stable
chart: nginx-ingress
targetRevision: "1.41.3"
helm:
parameters:
- name: controller.replicaCount
value: "{{values.replicaCount}}"
destination:
server: "{{url}}"
namespace: "{{namespace}}"
syncPolicy:
automated:
prune: true
selfHeal: true
Áp dụng manifest này:
kubectl apply -f nginx-ingress-appset.yaml -n argocd
Argo CD sẽ tạo ngay ba resource Application — một cho mỗi cluster.
Git Generator: Tự Động Phát Hiện App từ Cấu Trúc Repository
Git generator mới là nhân tố nhân sức mạnh thực sự ở đây. Tổ chức các app của bạn thành các thư mục trong một Git repo và để generator tự động phát hiện chúng. Thêm một thư mục mới sẽ tự động tạo một Application mới — không cần chỉnh sửa manifest nào.
Giả sử repo của bạn có cấu trúc như sau:
apps/
├── api-gateway/
│ └── kustomization.yaml
├── auth-service/
│ └── kustomization.yaml
├── billing-service/
│ └── kustomization.yaml
└── user-service/
└── kustomization.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: microservices-appset
namespace: argocd
spec:
generators:
- git:
repoURL: https://github.com/your-org/k8s-manifests.git
revision: HEAD
directories:
- path: apps/*
template:
metadata:
name: "{{path.basename}}"
spec:
project: default
source:
repoURL: https://github.com/your-org/k8s-manifests.git
targetRevision: HEAD
path: "{{path}}"
destination:
server: https://kubernetes.default.svc
namespace: "{{path.basename}}"
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Với bốn thư mục trong apps/, một ApplicationSet duy nhất này tạo ra bốn resource Application. Push thư mục thứ năm lên — Application thứ năm sẽ xuất hiện tự động, thường trong vòng 30 giây.
Matrix Generator: Mọi App Trên Mọi Cluster
Kết hợp Git generator với Cluster generator để triển khai mọi app được phát hiện lên mọi cluster đã đăng ký — tích chéo đầy đủ:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: all-apps-all-clusters
namespace: argocd
spec:
generators:
- matrix:
generators:
- git:
repoURL: https://github.com/your-org/k8s-manifests.git
revision: HEAD
directories:
- path: apps/*
- clusters:
selector:
matchLabels:
environment: production
template:
metadata:
name: "{{path.basename}}-{{name}}"
spec:
project: default
source:
repoURL: https://github.com/your-org/k8s-manifests.git
targetRevision: HEAD
path: "{{path}}"
destination:
server: "{{server}}"
namespace: "{{path.basename}}"
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Trường clusters.selector lọc cluster theo các nhãn bạn đã gán cho chúng. Gán nhãn cho các cluster khi đăng ký:
# Liệt kê các secret cluster đã đăng ký để tìm tên secret
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster
# Gán nhãn cho secret phù hợp (thay <secret-name> bằng tên ở trên)
kubectl label secret <secret-name> -n argocd environment=production
Xác Minh & Giám Sát
Kiểm Tra Các Application Được Tạo
Sau khi áp dụng ApplicationSet, kiểm tra xem các resource Application đã xuất hiện đúng như mong đợi chưa:
# Liệt kê tất cả Application đã được tạo
argocd app list
# Lọc theo nhãn ApplicationSet (được thêm tự động)
kubectl get applications -n argocd \
-l argocd.argoproj.io/appset-name=microservices-appset
Giám Sát Trạng Thái Đồng Bộ
# Kiểm tra trạng thái đồng bộ của tất cả app cùng lúc
argocd app list -o wide
# Theo dõi các vấn đề đồng bộ
argocd app list | grep -v Synced
# Lấy trạng thái chi tiết của một app cụ thể được tạo ra
argocd app get api-gateway
argocd app logs api-gateway
Đồng Bộ Toàn Bộ App trong một ApplicationSet
# Đồng bộ tất cả app khớp với label selector
kubectl get applications -n argocd \
-l argocd.argoproj.io/appset-name=microservices-appset \
-o name | xargs -I{} argocd app sync {}
Gỡ Lỗi Các Vấn Đề ApplicationSet
Nếu Application không được tạo ra, hãy bắt đầu với log của controller:
kubectl logs -n argocd deployment/argocd-applicationset-controller --tail=50 -f
Ba vấn đề hay gặp nhất là:
- Không có app nào được tạo từ Git generator — kiểm tra repo có thể truy cập và path glob khớp với các thư mục thực tế:
argocd repo list - Cluster không khớp với selector — kiểm tra nhãn cluster:
kubectl get secret -n argocd -l argocd.argoproj.io/secret-type=cluster -o yaml - Lỗi render template — kiểm tra trường status của ApplicationSet:
kubectl describe applicationset <name> -n argocd
Thiết Lập Thông Báo
Notification controller của Argo CD tích hợp với Slack, PagerDuty và email. Thêm một trigger cho các lỗi đồng bộ để bạn được thông báo khi bất kỳ app nào bị drift:
# Trong ConfigMap argocd-notifications-cm
triggers: |
trigger.on-sync-failed: |
- when: app.status.operationState.phase in ['Error', 'Failed']
send: [app-sync-failed]
Trong thực tế, Matrix generator kết hợp với thông báo Slack sẽ thay đổi cách bạn nhìn nhận vấn đề cluster sprawl. Khi một team mới push một thư mục vào đường dẫn apps/ và service của họ xuất hiện trong Argo CD chỉ trong vài phút — đã được đồng bộ trên tất cả production cluster — đó là dấu hiệu rõ ràng cho thấy setup đang phát huy hiệu quả.
ApplicationSet không thay thế các best practice triển khai tốt, nhưng nó loại bỏ các thao tác lặp đi lặp lại làm chậm các team. Hãy bắt đầu với List generator để hiểu hệ thống template, chuyển sang phát hiện dựa trên Git cho các service của bạn, và chỉ dùng đến Matrix khi thực sự cần triển khai tích chéo đầy đủ. Độ phức tạp có chi phí của nó — chỉ trả giá đó khi quy mô đòi hỏi.

