Aller au contenu principal

ApplicationSets


Table des matières

  1. Introduction aux ApplicationSets
  2. List Generator
  3. Git Generator
  4. Cluster Generator
  5. Matrix et Merge
  6. Exercices pratiques

1 - Introduction aux ApplicationSets

Définition

ApplicationSet est un contrôleur qui génère automatiquement des Applications Argo CD à partir de templates.

Cas d'usage

ScénarioSolution
Multi-environnementList Generator
Monorepo avec plusieurs appsGit Generator
Multi-clusterCluster Generator
Combinaisons complexesMatrix Generator

Structure de base

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-appset
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
- env: prod
template:
metadata:
name: 'my-app-{{env}}'
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: 'apps/my-app/overlays/{{env}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{env}}'

🔝 Retour à la table des matières


2 - List Generator

Définition statique

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: environments
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
namespace: development
replicas: "1"
- env: staging
namespace: staging
replicas: "2"
- env: prod
namespace: production
replicas: "5"
template:
metadata:
name: 'myapp-{{env}}'
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: 'apps/myapp/overlays/{{env}}'
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: '{{namespace}}'
syncPolicy:
automated:
prune: true

Résultat

3 Applications générées :

  • myapp-dev → namespace: development
  • myapp-staging → namespace: staging
  • myapp-prod → namespace: production

🔝 Retour à la table des matières


3 - Git Generator

Directories

# Structure du repo :
# apps/
# ├── frontend/
# ├── backend/
# └── worker/

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: apps
namespace: argocd
spec:
generators:
- git:
repoURL: https://github.com/org/gitops.git
revision: HEAD
directories:
- path: apps/*
template:
metadata:
name: '{{path.basename}}'
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: '{{path}}'
destination:
server: https://kubernetes.default.svc
namespace: default

Variables disponibles

VariableDescription
{{path}}Chemin complet (apps/frontend)
{{path.basename}}Nom du dossier (frontend)
{{path[0]}}Premier segment (apps)

Files

# Lire des fichiers JSON/YAML pour générer des apps
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: apps-from-files
spec:
generators:
- git:
repoURL: https://github.com/org/gitops.git
revision: HEAD
files:
- path: "config/**/config.json"
template:
metadata:
name: '{{name}}'
spec:
source:
path: '{{path}}'
destination:
namespace: '{{namespace}}'
// config/frontend/config.json
{
"name": "frontend",
"path": "apps/frontend",
"namespace": "web"
}

🔝 Retour à la table des matières


4 - Cluster Generator

Tous les clusters

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: monitoring
namespace: argocd
spec:
generators:
- clusters: {}
template:
metadata:
name: 'monitoring-{{name}}'
spec:
source:
repoURL: https://github.com/org/gitops.git
path: infrastructure/monitoring
destination:
server: '{{server}}'
namespace: monitoring

Avec labels

spec:
generators:
- clusters:
selector:
matchLabels:
env: production

Variables disponibles

VariableDescription
{{name}}Nom du cluster
{{server}}URL du serveur K8s
{{metadata.labels.X}}Labels du cluster

Exemple multi-cluster

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: nginx-all-clusters
spec:
generators:
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: 'nginx-{{name}}'
spec:
project: default
source:
repoURL: https://github.com/org/gitops.git
path: apps/nginx
destination:
server: '{{server}}'
namespace: web
syncPolicy:
automated:
prune: true
selfHeal: true

🔝 Retour à la table des matières


5 - Matrix et Merge

Matrix Generator

Produit cartésien de deux generators.

spec:
generators:
- matrix:
generators:
- list:
elements:
- env: dev
- env: prod
- clusters:
selector:
matchLabels:
region: us
template:
metadata:
name: 'myapp-{{env}}-{{name}}'

Merge Generator

Combine les résultats avec override.

spec:
generators:
- merge:
mergeKeys:
- env
generators:
- list:
elements:
- env: dev
replicas: "1"
- env: prod
replicas: "5"
- list:
elements:
- env: prod
replicas: "10" # Override
template:
# env=prod aura replicas=10

Exemple complexe

# Déployer sur tous les clusters prod, 
# avec des configs différentes par région
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: regional-apps
spec:
generators:
- matrix:
generators:
- git:
repoURL: https://github.com/org/gitops.git
directories:
- path: apps/*
- clusters:
selector:
matchLabels:
env: production
template:
metadata:
name: '{{path.basename}}-{{name}}'
spec:
source:
path: '{{path}}'
destination:
server: '{{server}}'

🔝 Retour à la table des matières


6 - Exercices pratiques

Exercice 1 : Multi-environnement

# appset-multi-env.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook-envs
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
- env: staging
- env: prod
template:
metadata:
name: 'guestbook-{{env}}'
spec:
project: default
source:
repoURL: https://github.com/argoproj/argocd-example-apps.git
path: guestbook
destination:
server: https://kubernetes.default.svc
namespace: '{{env}}'
syncPolicy:
automated:
prune: true
syncOptions:
- CreateNamespace=true
kubectl apply -f appset-multi-env.yaml
argocd app list

Quiz

Q1. Quelle est la différence entre List et Git Generator ?

Réponse
  • List Generator : Éléments définis statiquement dans l'ApplicationSet
  • Git Generator : Éléments générés dynamiquement depuis la structure du repo Git (dossiers ou fichiers)

Le Git Generator est plus dynamique car il s'adapte automatiquement quand vous ajoutez/supprimez des dossiers.

Q2. Comment déployer sur tous les clusters de production ?

Réponse

Utiliser le Cluster Generator avec un selector :

generators:
- clusters:
selector:
matchLabels:
env: production

🔝 Retour à la table des matières


Points clés à retenir

  • ApplicationSet génère des Applications automatiquement
  • List : définition statique
  • Git : basé sur la structure du repo
  • Cluster : basé sur les clusters enregistrés
  • Matrix : produit cartésien de deux generators
  • Variables : {{path}}, {{name}}, {{server}}

← Chapitre précédent | Chapitre suivant : Multi-cluster →