Kubernetes Operators — De l’enfer… au paradis
Kubernetes n’est pas compliqué.
Mais mal compris … c’est un enfer.
On va parler de Kubernetes… mais surtout de pourquoi les opérateurs changent complètement la manière de
travailler — et pourquoi c’est puissant mais dangereux si on se plante sur
le mental model.
Illustration suggérée : diagramme moderne et minimal, flat design, lisible (éviter le poster CNCF
illisible).
Kubernetes : délire d’Ops ?
On vous l’a vendu comme un truc d’infra
Complexe
Réservé aux DevOps
Magie noire
On vous a vendu Kubernetes comme un délire d’infra, réservé à des gens chelous.
En réalité… c’est beaucoup plus proche de ce que vous faites déjà.
Chaos scripts — dev entouré de scripts, crons, alertes, terminal chargé, ambiance tendue
(contraste avec la suite).
Kubernetes = API + état + boucle
API REST
Base d’état
Boucle de réconciliation
Pas de mystère : des mécanismes explicites
Kubernetes, c’est juste une API, une base d’état, et une boucle qui corrige la réalité.
Pas de magie — des patterns qu’on retrouve ailleurs en dev.
De vos outils au noyau Linux
flowchart LR
A[Clients] --> B[kube-api]
B --> C[etcd]
B --> D[Controllers]
D --> E[kubelet]
E --> F[containerd]
F --> G[Kernel Linux]
kube-api — point d’entrée
etcd — source de vérité
kubelet — agent sur chaque nœud
container runtime (ex. containerd) — exécution des conteneurs
Tout ça, ce sont des clients : Helm, kubectl, Flux… ils appellent l’API.
L’API parle à etcd, les controllers poussent le travail vers les kubelets, et le runtime lance les
conteneurs.
Schéma ASCII de secours :
Clients → kube-api → etcd
↓
controllers → kubelet → containerd → kernel
Kubernetes ne fait pas tourner vos apps
Il orchestre
Il délègue
Il observe
Ce n’est pas Kubernetes qui « exécute votre métier » comme un process magique : il coordonne, délègue aux
agents, et observe l’état.
La suite : le cœur, c’est la boucle de réconciliation.
(Cette slide remplace l’ancien zoom « kube-api → etcd » seul : le détail etcd est déjà dans la vue
d’ensemble slide 4.)
État voulu → réel : la boucle
flowchart LR
A[Désiré] --> B[API] --> C[Controllers] --> D[Réel]
Des agents exécutent les instructions côté nœud (kubelet, runtime), mais le fil conducteur, c’est : état
voulu, comparaison, correction en boucle.
Sous containerd : cgroups et namespaces
flowchart TD
F[containerd] --> K[Linux Kernel]
Et derrière containerd… le noyau Linux. Cgroups, namespaces…
(pause)
Et ça… vous n’avez pas envie d’y manipuler les fichiers à la main au quotidien.
Kernel danger zone — mécanique dense, style industriel sombre (le « trou du souffleur » sous
Kubernetes).
Kubernetes vous évite de vivre dans le noyau
Manipuler les cgroups à la main
Gérer isolation , CPU , mémoire au niveau noyau
À côté de ça, un cluster qui râle, c’est presque du repos.
Si Kubernetes existe, c’est pour vous éviter de vivre dans ces couches-là.
À côté du noyau, Kubernetes est presque rassurant.
CNI, CSI, CRI : de l’infra branchable
CNI → réseau (ex : Istio, Cilium ,Calico, Flannel, etc.)
CSI → stockage (ex : Ceph, Longhorn , Amazon,etc.)
CRI → runtime (ex : containerd, CRI-O,etc.)
Ici : brancher l’infra — pas encoder la logique métier (≠ opérateur)
On peut brancher réseau, stockage, runtime… mais ce n’est pas notre sujet du jour — et surtout, ne les
confondez pas avec la logique métier.
Brancher l’infra ou coder le métier ?
Type
Rôle
CNI / CSI / CRI
Infrastructure
Opérateur
Logique métier
D’un côté : des briques d’infra branchables.
De l’autre : du code qui encode comment votre système doit se comporter
dans le cluster.
Icônes utiles :
Qui écrit la logique du cluster ?
La logique vit dans les controllers
Ils ferment la boucle : observation, décision, action.
La vraie intelligence de Kubernetes… elle est dans les controllers.
Ce sont eux qui ferment la boucle : observation, décision, action.
Les opérateurs : des controllers spécialisés
Les opérateurs, ce sont des controllers… mais focalisés sur un domaine métier ou un logiciel précis (base,
queue, etc.).
Même mécanisme, autre niveau d’abstraction.
Automatiser le métier… en code dans le cluster
Un opérateur, c’est du code qui dit au cluster comment faire vivre un service au-delà du simple « Pod +
Service » : upgrades, backup, réplication, etc.
Sans opérateur : scripts, crons, humains dans la boucle
Scripts bash
Cron jobs
Interventions humaines
État incohérent
Avant : bricolage, des humains dans la boucle, et un état qui part dans tous les sens dès qu’il y a une
alerte à 3 h du matin.
Automatisation éclatée : la logique reste dans les têtes
Runbooks Confluence
Scripts bash « magiques »
Cron jobs oubliés
Interventions humaines
Avant les opérateurs, l’automatisation existe… mais elle est fragmentée .
Chaque problème a sa solution bricolée.
Et surtout :
la logique est dans la tête des gens, pas dans le système.
Drift, pas de reproductibilité, 3 h du matin
Drift de configuration
Actions non reproductibles
Dépendance aux humains
Incidents à 3 h du matin
Le problème, ce n’est pas juste « moins automatisé ».
C’est :
pas reproductible
pas observable au sens cluster
pas fiable dans le temps
Surtout : impossible de raisonner globalement sur l’état du système.
Vous déclarez ; le système réconcilie
kind: Database
spec:
size: 3
Après : on décrit l’état voulu… et le contrôleur / l’opérateur fait le travail répétitif et les
transitions.
Paradis opérateur — ingénieur calme, infra automatisée, UI claire, atmosphère sereine (contraste
avec slide enfer).
Spec, opérateur, cluster : ça tourne en boucle
flowchart LR
A[Spec] --> B[Operator]
B --> C[Cluster]
C --> B
Dès que le réel diverge, la réconciliation repart.
Le système réobserve, recompare, recorrige. C’est la même philosophie que le reste de Kubernetes, appliquée
à votre domaine.
Quelques exemples réels : d’abord des outils qui étendent des ressources
natives avec des annotations , puis des opérateurs qui posent de vrais CRD
— et un projet maison pour ancrer le discours.
Reflector & Reloader : la puissance des annotations
Outil
Idée
Déclencheur typique
Reflector (EmberStack)
Copie / réplique des Secrets et ConfigMaps (autres namespaces,
miroirs)
Annotations sur la ressource source ou la copie
Reloader (Stakater)
Redémarre les Pods quand un Secret / ConfigMap référencé change
Annotation sur le Deployment / StatefulSet / etc.
Reflector : annotations du type reflector.v1.k8s.emberstack.com/* pour autoriser la réflexion
et cibler où copier.
Reloader : reloader.stakater.com/auto: "true" (ou annotations plus fines par config) pour
lier redéploiement ↔ mise à jour de config.
Ce n’est pas toujours un « gros » opérateur avec CRD : parfois c’est un contrôleur qui
regarde des objets standards et réagit à des annotations .
Très utile pour TLS partagé, configs dupliquées, ou « je change un secret → je veux un rollout » sans
pipeline ad hoc.
Cert-manager, Postgres, Keycloak : la spec devient une entité
Opérateur
CRD (exemples)
Ce que ça matérialise
cert-manager
Certificate, Issuer, ClusterIssuer
Secrets TLS, chaînes ACME / PKI
Postgres Operator (Zalando)
postgresql (acid.zalan.do)
Cluster PostgreSQL (Patroni, volumes, users…)
Keycloak Operator
Keycloak, KeycloakRealm, KeycloakClient, …
Instances Keycloak, royaumes, clients
La spec décrit l’état métier (cert, base, realm) ; le contrôleur crée / met à jour Deployments, Services,
Secrets, etc.
On est dans le pattern « Database, size: 3 » mais en prod : certificats, bases gérées, IdP.
Trois domaines, même mécanisme : CRD + boucle de réconciliation.
Liens :
Un certificat déclaratif, tout le cycle TLS en dessous
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: api-example
spec:
dnsNames:
- api.example.com
La suite est dérivée automatiquement :
CertificateRequest
Challenge ACME
Secret TLS
Tu déclares juste un certificat.
Et derrière : génération de clé, challenge ACME, renouvellement automatique.
Aucun humain dans la boucle pour le cycle de vie du cert.
Certificats : du Certbot au renouvellement automatique
Avant — sans opérateur
Certbot manuel
Scripts cron
Cert expiré = prod down
Avec cert-manager
Déclaratif
Auto-renouvellement
Observabilité native (Certificate, conditions, events)
cert-manager, c’est typiquement : une complexité énorme encapsulée dans un opérateur.
Là, ça vaut clairement le coup — parce que le domaine est clair, répétitif et critique.
Postgres répliqué sans bricoler le failover à la main
apiVersion: acid.zalan.do/v1
kind: postgresql
metadata:
name: my-cluster
spec:
numberOfInstances: 3
Derrière cette spec, le contrôleur s’occupe de :
Réplication
Failover
Backup
Users / rôles
Ça, c’est intéressant parce que ce n’est pas trivial : ce n’est pas
stateless, ce n’est pas safe à bricoler à la main sur du long terme.
Un opérateur mature sur ce terrain, c’est du métier base de données version déclarative.
Quand un opérateur est légitime
Système complexe
Règles claires et stables
État critique pour l’activité
Opérations répétitives
Un opérateur est pertinent quand tu peux formaliser des règles du type « si X alors Y » ,
que tu dois les appliquer souvent , et que tu veux réduire l’erreur
humaine .
Si tu ne peux pas écrire ça proprement… pause … ça, c’est une très mauvaise
idée en opérateur.
Keycloak Credential Manager — le même schéma, chez moi
Objectif : réconcilier des credentials Keycloak (clients, secrets,
rotation…) avec ce qui est déclaré dans le cluster (CRD, Secrets annotés, ou les deux —
selon ton design).
Intérêt conf : montrer le même schéma que les opérateurs « connus » : observe →
compare → corrige sur ton domaine métier.
Je vous montre ça pas pour vendre un produit, mais pour prouver que la logique est la même
: une API Kubernetes, un état désiré, et du code qui parle à Keycloak à la place d’un humain et d’un
runbook.
Lien repo : https://… (README, une spec d’exemple, capture d’un
kubectl get).
Une phrase sur le périmètre exact : ex. clients OAuth uniquement, rotation de secrets,
sync depuis External Secrets, etc.
Schéma minimal : CRD / Secret → Keycloak Credential Manager → API Keycloak,
style diagramme propre (flat design).
Ce qu’un opérateur bien choisi vous apporte
Automatiser du répétitif
Encapsuler de la complexité
Stabiliser un système
On remplace des opérations manuelles par du code — quand c’est le bon outil pour du vrai répétitif et des
règles claires.
On vient de voir du concret (annotations, CRD, projet maison). La question :
quand est-ce un bon outil ?
…mais les opérateurs peuvent aussi devenir un enfer.
Quand ne pas écrire d’opérateur
Logique floue ou en perpétuelle négociation métier
Processus instables (la règle change toutes les semaines)
Dépendances externes imprévisibles
One-shot : automatisation ponctuelle sans cycle de vie
Si tu ne peux pas écrire clairement « si X alors Y » avec des conditions observables… tu
n’as rien à faire dans un opérateur.
Sinon tu recodes un outil métier opaque dans le cluster.
Cinq signaux qu’un opérateur part en vrille
Spec incompréhensible sans lire le code
Effets implicites (créations ailleurs sans que ce soit visible)
Couplage externe fort (APIs fragiles, ordre d’appels magique)
Debug impossible sans les mainteneurs à côté de toi
État non observable (pas de conditions / status utiles)
Un opérateur doit être lisible , prévisible , observable .
Sinon, ce n’est pas de la plateforme : c’est une bombe à retardement avec un
kubectl dessus.
Débugger un opérateur : describe, events, status, logs
kubectl describe (resource + events)
Events du namespace
Status / conditions sur la CRD
Logs du contrôleur
Le debug devient indirect , distribué , parfois opaque .
Si ton opérateur est mal conçu — pas de status clair, pas d’events utiles — bonne chance
pour le post-mortem à 3 h du matin.
Un opérateur, c’est un produit logiciel — pas un script
Code et revues
Tests (unitaires, intégration, e2e si possible)
Maintenance dans la durée
Compatibilité avec les versions Kubernetes
Migrations de CRD / spec
Un opérateur, ce n’est pas un script du vendredi.
C’est un produit logiciel avec un cycle de vie — et une dette si tu
l’abandonnes.
Ensuite : la synthèse « ça part en vrille » — smells qu’on a déjà nommés, mais côté vécu
d’équipe.
Quand l’opérateur devient l’enfer
Logique implicite
Effets de bord
Debugging difficile
Couplage fort
En pratique, ça donne souvent :
Tout mettre en opérateur
Logique métier floue
Effets cachés
Un opérateur mal conçu, c’est un microservice sous LSD.
Un mauvais opérateur, c’est de la complexité distribuée avec un debugger qui vous hait.
Le piège classique : « formation Kubernetes par la trappe » parce qu’on empile des comportements opaques.
Kubernetes, plateforme de programmation
Kubernetes vous évite l’enfer de l’infrastructure bas niveau.
Les bons opérateurs vous évitent l’enfer du manuel — les mauvais vous y renvoient
autrement.
Kubernetes n’est pas qu’un outil d’infra : c’est une surface où l’on encode du
comportement .
Les opérateurs sont l’extension naturelle… à condition de rester honnêtes sur la complexité.
Fil de la conf (rappel) :
Kubernetes n’est pas magique
API + état + boucle ; kernel = vrai « enfer » bas niveau
Controllers / opérateurs : où vit la logique
Avant : vécu (runbooks, scripts, drift) → pourquoi ça casse
Après + boucle ; exemples Reflector/Reloader, panorama CRD, creux cert-manager &
Postgres
Projet perso ; bon usage puis quand ne pas , smells, debug,
coût
Pièges ; plateforme de programmation ; checklist ; dernière phrase + conclusion brutale
Avant d’écrire un opérateur : la checklist
Répétitif
Règles claires
Déclaratif possible
Idempotent
Observable
Si une case importante manque, reculez : pas d’opérateur (ou pas tout de suite).
C’est probablement la slide la plus importante pour une salle de devs.
Kubernetes donne envie d’en mettre partout. Mauvaise idée par défaut.
👉 Tu valides la checklist, ou tu recules .
Les pauses et les regards sur la salle après « Mauvaise idée » font
autant le travail qu’un diagramme.
Votre logique, exécutée par le cluster au lieu d’un humain
Tu vises deux réactions :
« OK, Kubernetes je comprends enfin le cadre. »
« OK, les opérateurs : puissants, mais à manier avec précision. »
Éviter le piège : faire une « formation Kubernetes » sans le vouloir — rester sur le
message comportement / automatisation / risques .
Un opérateur, c’est votre logique métier… mais exécutée par le cluster au lieu d’un humain.
À vous de garder cette logique lisible , testable , et
bornée .
Kubernetes simplifie l’infra — les opérateurs, ça peut simplifier ou empirer
Kubernetes vous évite une partie du chaos du bas niveau.
Mais les opérateurs : soit ils encapsulent intelligemment une complexité maîtrisée, soit
ils recréent un enfer plus sophistiqué .
Ce que la salle retient : les pauses , les « très mauvaise idée »
honnêtes, plus que chaque ligne du deck.