ApplicationSets
Table des matières
- Introduction aux ApplicationSets
- List Generator
- Git Generator
- Cluster Generator
- Matrix et Merge
- 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énario | Solution |
|---|---|
| Multi-environnement | List Generator |
| Monorepo avec plusieurs apps | Git Generator |
| Multi-cluster | Cluster Generator |
| Combinaisons complexes | Matrix 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: developmentmyapp-staging→ namespace: stagingmyapp-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
| Variable | Description |
|---|---|
{{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
| Variable | Description |
|---|---|
{{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}}