Desafio 5: ApplicationSet com Cluster Generator Dinâmico

Criar um ApplicationSet que descobre clusters automaticamente e faz deploy de uma aplicação em todos eles, sem precisar editar o manifesto quando novos clusters são adicionados.

O workshop base usa o List Generator no ApplicationSet - você define uma lista estática de clusters no YAML. Funciona, mas não escala: cada novo cluster exige uma edição manual.

O Cluster Generator resolve isso. Ele consulta os clusters registrados no ArgoCD e gera Applications automaticamente para cada um. Você pode filtrar por labels para controlar quais clusters recebem qual aplicação.

No EKS Capabilities, os clusters são registrados via Kubernetes Secrets com a label argocd.argoproj.io/secret-type: cluster. O Cluster Generator lê esses secrets e usa os metadados como parâmetros no template.

  • Dois clusters registrados no ArgoCD com labels diferentes: env: staging e env: prod
  • ApplicationSet usando Cluster Generator que filtra por label env: staging
  • Deploy da aplicação guestbook apenas nos clusters de staging
  • Quando um novo cluster staging for registrado, o deploy deve acontecer automaticamente

Crie os secrets de registro dos dois clusters e o ApplicationSet com Cluster Generator filtrado por label. Valide que apenas o cluster staging recebe a aplicação.

Dica: O Cluster Generator usa spec.generators[].clusters.selector.matchLabels para filtrar. As labels do secret do cluster ficam disponíveis como {{.metadata.labels.env}} no template.

1. Registrar cluster staging

apiVersion: v1
kind: Secret
metadata:
  name: cluster-staging
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
    env: staging
type: Opaque
stringData:
  name: staging
  server: arn:aws:eks:us-east-1:ACCOUNT_ID:cluster/meu-cluster-staging

2. Registrar cluster prod

apiVersion: v1
kind: Secret
metadata:
  name: cluster-prod
  namespace: argocd
  labels:
    argocd.argoproj.io/secret-type: cluster
    env: prod
type: Opaque
stringData:
  name: prod
  server: arn:aws:eks:us-east-1:ACCOUNT_ID:cluster/meu-cluster-prod

3. ApplicationSet com Cluster Generator

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: guestbook-staging
  namespace: argocd
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  generators:
  - clusters:
      selector:
        matchLabels:
          env: staging
  template:
    metadata:
      name: '{{.name}}-guestbook'
    spec:
      project: default
      source:
        repoURL: https://github.com/argoproj/argocd-example-apps.git
        path: guestbook
        targetRevision: HEAD
      destination:
        name: '{{.name}}'
        namespace: guestbook
      syncPolicy:
        automated:
          prune: true
          selfHeal: true
        syncOptions:
        - CreateNamespace=true
kubectl apply -f cluster-staging.yaml
kubectl apply -f cluster-prod.yaml
kubectl apply -f applicationset-staging.yaml

4. Validar

# Deve mostrar apenas a application do cluster staging
kubectl get applications -n argocd

# Adicionar um novo cluster staging e verificar deploy automático
# Basta criar outro secret com label env: staging

Com List Generator, adicionar 10 clusters = editar o YAML 10 vezes. Com Cluster Generator, você registra o cluster com a label correta e o deploy acontece automaticamente. Em ambientes com dezenas de clusters (multi-region, multi-account), essa diferença é crítica.

  • Usar Matrix Generator para combinar clusters com ambientes (dev/staging/prod)
  • Adicionar Git Generator para descobrir aplicações automaticamente por diretório no repositório
  • Implementar ApplicationSet com Pull Request Generator para preview environments