Articles techniques et exemples de code

ArgoCD Plugin Filter

Un plugin ArgoCD pour activer/désactiver des clusters via un fichier JSON.

31 December 2024
argocdkubernetespython

ArgoCD Plugin Filter

J’ai quatre clusters Kubernetes. Je veux déployer mon app sur prod-eu et prod-us, mais pas sur staging ni dev. Avec les ApplicationSets classiques, c’est du tout ou rien - soit on cible tous les clusters qui matchent un label, soit on hardcode la liste.

Le problème devient vite ingérable. Chaque équipe veut un contrôle fin sur ses déploiements. Modifier les labels des clusters pour chaque app n’est pas réaliste. Et maintenir des listes statiques dans les ApplicationSets, c’est la garantie d’oublier un cluster.

Comment ça marche

Le plugin s’intègre comme un generator dans les ApplicationSets. Au lieu de lister les clusters dans l’ApplicationSet, on délègue au plugin.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
┌─────────────────────────────────────────────────────────────────┐
│                        ApplicationSet                           │
│                                                                 │
│  generators:                                                    │
│    - plugin:                                                    │
│        configMapRef: plugin-filter                              │
│        input:                                                   │
│          parameters:                                            │
│            repo: https://github.com/org/app-config              │
└───────────────────────────┬─────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│                     Plugin Filter (FastAPI)                     │
│                                                                 │
│  1. Clone le repo Git                                           │
│  2. Lit les fichiers .argocd.json                               │
│  3. Filtre les clusters avec enabled: true                      │
│  4. Renvoie la liste à ArgoCD                                   │
└───────────────────────────┬─────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│                          ArgoCD                                 │
│                                                                 │
│  Génère une Application par cluster retourné :                  │
│    - app-prod-eu                                                │
│    - app-prod-us                                                │
│    (staging ignoré car enabled: false)                          │
└─────────────────────────────────────────────────────────────────┘

Chaque équipe contrôle ses déploiements via un fichier .argocd.json dans son repo :

1
2
3
4
5
6
7
{
  "clusters": {
    "prod-eu": { "enabled": true },
    "prod-us": { "enabled": true },
    "staging": { "enabled": false }
  }
}

Le plugin clone le repo, parse les fichiers JSON, et renvoie uniquement les clusters avec enabled: true. ArgoCD génère alors les Applications correspondantes.

L’avantage : le contrôle est déclaratif et versionné. Une PR pour activer un cluster, une autre pour le désactiver. L’historique Git trace tout.

Lancer le plugin

1
python app.py

Variables d’environnement :

  • AUTH_TOKEN : token d’auth pour ArgoCD
  • PAT_TOKEN : token Git pour cloner les repos privés
  • PORT : port du serveur (défaut 8080)

Build Docker

1
2
task build   # Image multi-arch linux/amd64,arm64
task test    # Tests unitaires

Code source

📥 app.py - Plugin FastAPI 📥 Dockerfile - Image Docker 📥 test_app.py - Tests unitaires