Offhours-Guard - Outil personnel, 2026
Un opérateur Kubernetes qui ne paie que pour ce qui sert.
En observant que la majorité des environnements hors-production du cluster CNP tournaient 24h/24 pour rien, j'ai construit Offhours-Guard de ma propre initiative : un opérateur Kubernetes écrit en Go, avec sa propre CRD OffhoursSchedule.
Anecdote assumée : à l'origine, ce n'était pas vraiment un projet FinOps. Je voulais surtout m'empêcher de coder jusqu'à pas d'heure. La fenêtre par défaut arrête les services non-prod de 1h à 5h du matin, bien trop étroite pour être une vraie politique d'économie d'énergie, largement suffisante pour me forcer à fermer le laptop. Le vrai bénéfice sur les coûts est venu après, en l'appliquant aux environnements hors-production de toute la plateforme CNP.
Technologies
Voir tous
Go
Écrit avec le SDK controller-runtime standard des opérateurs Kubernetes.

CRD & Reconciler
OffhoursSchedule est une vraie ressource Kubernetes : chaque app déclare son horaire de sommeil et de réveil en cron + fuseau horaire.

Image & Helm Chart
Publié en open-source, image et chart Helm livrés en continu par CI.

Comment ça marche
Un reconciler qui mémorise l'état, pas un simple cron
Le reconciler scale les déploiements à 0 replica à l'heure dite, en mémorisant le nombre de replicas d'origine pour restaurer l'état exact au réveil, pas un simple « 1 replica » par défaut.
Un tableau de bord web (Tailwind + HTMX) liste chaque application gérée avec son état (Actif / Endormi), le nombre de replicas courant vs. d'origine et le détail des horaires cron, avec un bouton pour forcer un réveil ou un endormissement manuel en un clic, rafraîchi automatiquement toutes les 15 secondes.
Monitoring
Ne pas confondre « éteint exprès » et « en panne »
Un service volontairement arrêté ne doit pas déclencher d'alerte comme s'il était tombé en panne. Offhours-Guard expose un endpoint que Gatus, l'outil de health-check de CNP, interroge à la place du vrai service.
Pendant la fenêtre de sommeil, cet endpoint répond directement 200 OK avec un statut « SLEEPING (managed by Offhours-Guard) ». En dehors de cette fenêtre, il relaie fidèlement le vrai statut de l'application. Le monitoring reste honnête, sans jamais confondre une extinction planifiée avec un incident.

Résultats & suite
Déjà déployé, pensé pour aller plus loin
Aujourd'hui déployé sur la majorité des applications non-critiques de la plateforme CNP, avec jusqu'à -70% de coûts sur les environnements hors-production et une activité nocturne réduite de 24h/24 à 1h-7h.
Prochaine étape : un moteur de recommandation, à la fois statistique et assisté par IA, pour proposer dynamiquement de meilleurs horaires aux gestionnaires de cluster et aux utilisateurs eux-mêmes.