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
Block image

Go

Écrit avec le SDK controller-runtime standard des opérateurs Kubernetes.

Block image

CRD & Reconciler

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

Block image

Image & Helm Chart

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

Tableau de bord web d'Offhours-Guard

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.

Icône Gatus, l'outil de health-check de CNP
Le HomeLab CNP, où tourne Offhours-Guard

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.