-On vous l’a vendu comme un truc d’infra
+On nous l’a surtout vendu comme un truc d’infra.
+ Moi aussi, je suis passé par ce réflexe. +
++Kubernetes c'est un délire de dev +
+
flowchart LR
- A[Clients] --> B[kube-api]
- B --> C[etcd]
- B --> D[Controllers]
- D --> E[kubelet]
- E --> F[containerd]
- F --> G[Kernel Linux]
+
+ flowchart LR
+ B[kube-api]
+ subgraph Clients
+ A01[kubectl]
+ A02@{ img: "img/helmsh-icon.svg", pos: "b", h: 44, constraint: "on" }
+ A03@{ img: "img/logo-kustomize.B5HO6GxI_1tyDev.webp", pos: "b", h: 36, constraint: "on" }
+ end
+ A01 --> B
+ A02 --> B
+ A03 --> B
+ D --> B
+ B --> C[etcd]
+ B --> D[Controllers]
+ D --> E[kubelet]
+ E --> F[containerd]
+ F --> G[Kernel Linux]
+ classDef logoBare fill:transparent,stroke:transparent,stroke-width:0px;
+ class A02,A03 logoBare;
- kube-api — point d’entrée
@@ -91,34 +113,39 @@
-À côté de ça, un cluster qui râle, c’est presque du repos.
+À côté de ça, un cluster qui râle, c'est presque du repos.
Le secret « source de vérité » vit avec la base ; Reflector recrée un miroir là où l’app tourne.
+# Namespace database — secret maître (ex. mot de passe géré par l’opérateur / la DBA)
+apiVersion: v1
+kind: Secret
+metadata:
+ name: db-credentials
+ namespace: database
+ annotations:
+ reflector.v1.k8s.emberstack.com/reflection-allowed: "true"
+ reflector.v1.k8s.emberstack.com/reflection-auto-enabled: "true"
+ reflector.v1.k8s.emberstack.com/reflection-auto-namespaces: "app-shop"
+stringData:
+ DATABASE_URL: "postgres://…"
+
+ app-shop, à jour quand la
+ source change.reflector.v1.k8s.emberstack.com/reflects: "database/db-credentials".Le Deployment monte le secret copié ; Reloader redémarre les Pods si le Secret (ou ConfigMap) référencé + est mis à jour.
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: shop-api
+ namespace: app-shop
+ annotations:
+ reloader.stakater.com/auto: "true"
+spec:
+ template:
+ spec:
+ containers:
+ - name: api
+ envFrom:
+ - secretRef:
+ name: db-credentials # copie Reflector depuis database/
+
+ database/db-credentials → Reflector met à jour
+ app-shop/db-credentials → Reloader déclenche un nouveau rollout.| Piste | +Outils typiques | +À retenir | +
|---|---|---|
| Go (référence) | +Kubebuilder, controller-runtime, client-go |
+ Même patterns que l’upstream (reconcile, owner refs). Sous pic + d’événements : goroutines + files + back-off → peu de RAM en plus — + le Pod opérateur ne part pas en limite quand le cluster s’emballe. | +
| Operator SDK | +CLI Red Hat · Go (souvent comme Kubebuilder) · Ansible / Helm | +Go = solide ; Ansible / Helm = wrapper playbooks / charts — court si la logique métier épaissit. | +
| Autres langages | +Python Kopf, Rust kube-rs, Java (Fabric8, Quarkus)… | +Si équipe ou libs métier ; moins d’exemples tout faits côté core k8s. | +
Go + controller-runtime pour un opérateur maison sérieux ; sinon : celui que l’équipe + livre et maintient le mieux.
+Charge ↑ : un runtime qui gonfle la RAM par événement mange votre quota ; Go + controller-runtime,
+ non.
Exemple concret de CRD à la slide suivante.
KeycloakClientCredentialCRD secrets.carbogame.com/v1alpha1 — spec.source (realm, client) →
+ spec.target (Secret, rafraîchissement, mapping des clés).
apiVersion: secrets.carbogame.com/v1alpha1
+kind: KeycloakClientCredential
+metadata:
+ name: gitea-creds
+ namespace: keycloak
+spec:
+ source:
+ keycloakServer: prod-keycloak
+ realm: operator
+ clientId: gitea
+ target:
+ secretName: gitea-secret-creds
+ namespace:
+ - gitea
+ refreshPeriod: 10m
+ fields:
+ clientId: key
+ clientSecret: secret
+
+ Extrait type ; en chart Helm, namespace et keycloakServer sont injectés via
+ include "common.namespace" …, {{ .Values.global.env }}-keycloak, etc.
-Un opérateur mal conçu, c’est un microservice sous LSD.
+Un opérateur mal conçu, c’est un microservice dont plus personne ne tient les règles du jeu.