A Kubernetes CronJob that automatically detects and deletes namespaces associated with deprovisioned Azure Entra ID (formerly Azure AD) users.
A lifecycle automation tool for Kubernetes namespaces. It identifies user-created namespaces, verifies user status through Azure Entra ID, and labels or deletes expired ones.
It runs in two phases:
- Evaluation: Identifies new namespaces and checks if the associated user is valid.
- Cleanup: Deletes namespaces labeled for removal after a grace period, if the user is still missing.
It supports mock, dry-run, and production modes.
Cluster administrators who need to enforce namespace hygiene and lifecycle policies in environments integrated with Entra ID, especially in multi-tenant Kubernetes platforms like Kubeflow.
To safely and automatically manage orphaned namespaces, reduce security risk, and maintain cluster cleanliness without manual intervention.
flowchart TD
A[Start] --> B{Mode}
B -->|Test| C[Use Mock Data]
B -->|Dry Run| D[Preview Actions]
B -->|Prod| E[Real Azure Auth]
C & D & E --> F[Check New Namespaces]
F --> G1{Valid Domain?}
G1 -->|Yes| G2{User Exists?}
G1 -->|No| H[Log & Ignore]
G2 -->|Missing| I[Label for Deletion]
G2 -->|Exists| J[No Action]
flowchart TD
K[Start] --> L[Check Labeled Namespaces]
L --> M{Grace Period Expired?}
M -->|Yes| N{User Still Missing?}
M -->|No| O[Keep Namespace]
N -->|Yes| P[Delete Namespace]
N -->|No| Q[Remove Label]
- ✅ Automated Lifecycle Management – Label-based namespace retention system
- 🔒 Security First – Azure Entra ID user verification with domain allowlist
- 🧪 Testing Friendly – Mock and dry-run support
- ☁️ Safe Operations – Prevent accidental deletion through preview-only mode
# Clone & Setup
git clone https://github.com/StatCan/namespace-cleaner.git
cd namespace-cleaner
# Build the Docker image
make image
# Run unit tests
make test-unit
# Perform a dry-run (no real deletion)
make dry-run
# Deploy in production
make runOur GitHub Actions pipeline includes:
- ✅ Unit testing and dry-run validation
- 🔒 Trivy-based container image vulnerability scanning
- 📦 Docker builds on push
- 📈 Live test coverage badge generation
# configmap.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: namespace-cleaner-config
namespace: das
data:
ALLOWED_DOMAINS: "statcan.gc.ca,cloud.statcan.ca"
GRACE_PERIOD: "90d" # e.g. "24h", "30d"# View job logs
kubectl logs -l job-name=namespace-cleaner
# View cronjob status
kubectl get cronjob namespace-cleaner -o wide
# Reset everything
make stop && make clean && make runSee CONTRIBUTING.md
Unless otherwise noted, the source code of this project is covered under Crown Copyright, Government of Canada, and is distributed under the GNU Affero General Public License.
The Canada wordmark and related graphics associated with this distribution are protected under trademark law and copyright law. No permission is granted to use them outside the parameters of the Government of Canada's corporate identity program. For more information, see Federal identity requirements.
Un CronJob Kubernetes qui détecte et supprime automatiquement les espaces de noms associés aux utilisateurs Azure Entra ID (anciennement Azure AD) déprovisionnés.
Le CronJob fonctionne en deux phases :
- Évaluation : identifie les nouveaux espaces de noms et vérifie si l'utilisateur associé est valide.
- Nettoyage : supprime les espaces de noms étiquetés pour suppression après un délai de grâce, si l'utilisateur est toujours inexistant.
Trois modes sont disponibles : test, simulation (dry-run) et production.
Les administrateurs de clusters Kubernetes dans des environnements partagés (tel que Kubeflow), intégrés avec Entra ID.
Réduire les risques de sécurité et garder un cluster propre grâce à la gestion automatique du cycle de vie des espaces de noms.
Voir CONTRIBUTING.md
Sauf indication contraire, le code source de ce projet est protégé par le droit d'auteur de la Couronne du gouvernement du Canada et distribué sous la licence publique générale affero GNU.
Le mot-symbole « Canada » et les éléments graphiques connexes liés à cette distribution sont protégés en vertu des lois portant sur les marques de commerce et le droit d'auteur. Aucune autorisation n'est accordée pour leur utilisation à l'extérieur des paramètres du programme de coordination de l'image de marque du gouvernement du Canada. Pour obtenir davantage de renseignements à ce sujet, veuillez consulter les Exigences pour l'image de marque.
flowchart TD
A[Début] --> B{Mode}
B -->|Test| C[Utiliser des données simulées]
B -->|Simulation| D[Afficher les actions]
B -->|Production| E[Authentification Azure réelle]
C & D & E --> F[Analyser les nouveaux espaces de noms]
F --> G1{Domaine valide ?}
G1 -->|Oui| G2{Utilisateur existant ?}
G1 -->|Non| H[Consigner et ignorer]
G2 -->|Inexistant| I[Étiqueter pour suppression]
G2 -->|Existant| J[Aucune action]
flowchart TD
K[Début] --> L[Analyser les espaces de noms étiquetés]
L --> M{Délai de grâce expiré ?}
M -->|Oui| N{Utilisateur toujours inexistant ?}
M -->|Non| O[Garder l'espace de noms]
N -->|Oui| P[Supprimer l'espace de noms]
N -->|Non| Q[Retirer l'étiquette]
- ✅ Gestion automatisée du cycle de vie – Système de conservation basé sur des étiquettes
- 🔒 Sécurité avant tout – Vérification des utilisateurs avec Entra ID et liste de domaines autorisés
- 🧪 Tests facilités – Prise en charge des modes test et simulation
- ☁️ Sécurité des opérations – Empêche les suppressions accidentelles grâce au mode aperçu