From 10f7798afbba48f1b66b95a834c8a28b2bdfa61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Le=20Pr=C3=A9vost-Corvellec=20Arnault?= Date: Thu, 9 Apr 2026 02:52:44 +0200 Subject: [PATCH] Enhance index.html and custom.css for improved content presentation and new assets - Updated index.html to refine content structure, including enhanced blockquotes and lists for better readability. - Added a new section to emphasize Kubernetes as a developer-centric tool. - Improved CSS styles in custom.css for blockquote presentation and slide layout adjustments. - Introduced new SVG and WEBP images for better visual representation of tools used in Kubernetes. --- .../kubernetes-hell-to-heaven/css/custom.css | 22 +- .../img/helmsh-icon.svg | 116 +++++++ .../img/logo-kustomize.B5HO6GxI_1tyDev.webp | Bin 0 -> 15624 bytes content/kubernetes-hell-to-heaven/index.html | 322 +++++++++++++++--- 4 files changed, 406 insertions(+), 54 deletions(-) create mode 100644 content/kubernetes-hell-to-heaven/img/helmsh-icon.svg create mode 100644 content/kubernetes-hell-to-heaven/img/logo-kustomize.B5HO6GxI_1tyDev.webp diff --git a/content/kubernetes-hell-to-heaven/css/custom.css b/content/kubernetes-hell-to-heaven/css/custom.css index 92a704a..5f49f27 100644 --- a/content/kubernetes-hell-to-heaven/css/custom.css +++ b/content/kubernetes-hell-to-heaven/css/custom.css @@ -182,6 +182,13 @@ padding: 0.45em 0.85em; } +.reveal blockquote .blockquote-sub { + display: block; + margin-top: 0.0em; + font-size: 0.88em; + color: var(--text-subtle); +} + .reveal aside.notes { display: none !important; } @@ -238,7 +245,7 @@ } /* - * Slide « boucle » (n° 6) : graphe cyclique Mermaid = très haut ; graphe linéaire + libellés courts. + * Slide « boucle » (API / événements / controllers / réconciliation) : graphe Mermaid assez large — hauteur plafonnée. * Pas de scale() : ça ne réduit pas la hauteur de layout (Reveal mesure scrollHeight). */ .reveal .slides section.slide-boucle { @@ -260,7 +267,16 @@ line-height: 1.15; } -/* Mermaid sur la slide « boucle » : hauteur mini correcte (éviter l’écrasement à ~78px qui tuait les libellés) */ +.reveal section.slide-boucle .slide-boucle-lead { + margin: 0 0 0.45em; + padding: 0; + list-style: none; + font-size: clamp(0.82rem, 2.6vw, 0.95rem); + color: var(--text-muted); + line-height: 1.35; +} + +/* Mermaid sur la slide « boucle » : graphe fusionné (outils + boucle) — un peu plus de hauteur qu’avant */ .reveal section.slide-boucle .mermaid { margin: 0.25em auto 0.15em; line-height: normal; @@ -269,7 +285,7 @@ } .reveal section.slide-boucle .mermaid svg { - max-height: min(34vh, 220px) !important; + max-height: min(42vh, 300px) !important; overflow: visible !important; } diff --git a/content/kubernetes-hell-to-heaven/img/helmsh-icon.svg b/content/kubernetes-hell-to-heaven/img/helmsh-icon.svg new file mode 100644 index 0000000..b713b37 --- /dev/null +++ b/content/kubernetes-hell-to-heaven/img/helmsh-icon.svg @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/content/kubernetes-hell-to-heaven/img/logo-kustomize.B5HO6GxI_1tyDev.webp b/content/kubernetes-hell-to-heaven/img/logo-kustomize.B5HO6GxI_1tyDev.webp new file mode 100644 index 0000000000000000000000000000000000000000..9d61dc7e5e2ab0a0d0dd0a87498933f41a63b419 GIT binary patch literal 15624 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 literal 0 HcmV?d00001 diff --git a/content/kubernetes-hell-to-heaven/index.html b/content/kubernetes-hell-to-heaven/index.html index 3af8d5d..7fb64cf 100644 --- a/content/kubernetes-hell-to-heaven/index.html +++ b/content/kubernetes-hell-to-heaven/index.html @@ -37,27 +37,37 @@

Kubernetes : délire d’Ops ?

-

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. +

    -
  • Complexe
  • -
  • Réservé aux DevOps
  • -
  • Magie noire
  • +
  • « Trop complexe »
  • +
  • Réservé aux spécialistes plateforme
  • +
  • Magie noire / pas « mon » métier
+
+
+

Kubernetes c'est un délire de dev +

+
+

Kubernetes = API + état + boucle

  • API REST
  • -
  • Base d’état
  • -
  • Boucle de réconciliation
  • -
  • Pas de mystère : des mécanismes explicites
  • +
  • Base d’état (etcd)
  • +
  • Boucle de réconciliation → events
  • +
  • Pas de mystère → des mécanismes explicites (controllers, kubelet, containerd, etc.)

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]
+        

+    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 @@
-
-

Kubernetes ne fait pas tourner vos apps

-
    -
  • Il orchestre
  • -
  • Il délègue
  • -
  • Il observe
  • -
- -
-

État voulu → réel : la boucle

+

Kubernetes ne fait pas tourner vos apps : la boucle de contrôle

+
    +
  • Il orchestre · il délègue · il observe
  • +
flowchart LR
-    A[Désiré] --> B[API] --> C[Controllers] --> D[Réel]
+    DS[Spec · désir] --> AP[kube-apiserver]
+    AP <-->|objets cluster| ET[(etcd)]
+    AP --> EV[Watch · événements]
+    EV --> CTRL[Controllers]
+    CTRL -->|réconciliation · requêtes API| AP
+    subgraph NODE[Nœud]
+      K[kubelet] -->|CRI| CD[containerd]
+    end
+    AP -->|spec Pods · synchro| K
+    K -->|status| AP
 

- réinjecte vers les contrôleurs · chaque tour : observer, décider, agir + Les changements d’objets (Pods, etc.) vivent dans l’API ; le kubelet les + synchronise depuis l’API, puis traduit en appels CRI vers + containerd. Le status remonte par le même kubelet vers l’API.

@@ -142,10 +169,10 @@

Kubernetes vous évite de vivre dans le noyau

  • Manipuler les cgroups à la main
  • -
  • Gérer isolation, CPU, mémoire au niveau noyau
  • +
  • Gérer isolation, CPU, mémoire au niveau des noyaux de vos differents noeuds
-

À 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.

-
-

Automatiser le métier… en code dans le cluster

- -

Sans opérateur : scripts, crons, humains dans la boucle

    @@ -347,6 +367,65 @@ spec:
+
+

Exemple Reflector : secret DB → namespace applicatif

+

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://…"
+
+
    +
  • Reflector maintient un Secret du même nom dans app-shop, à jour quand la + source change.
  • +
  • Alternative : miroir manuel avec reflector.v1.k8s.emberstack.com/reflects: "database/db-credentials".
  • +
+ +
+
+

Exemple Reloader : rollout quand le secret miroir change

+

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/
+
+
    +
  • Rotation du mot de passe dans database/db-credentials → Reflector met à jour + app-shop/db-credentials → Reloader déclenche un nouveau rollout.
  • +
  • Sans Reloader, les Pods gardent l’ancienne valeur en mémoire jusqu’à un redémarrage manuel.
  • +
+ +

Cert-manager, Postgres, Keycloak : la spec devient une entité

@@ -453,6 +532,51 @@ spec:

+
+

Quelle techno pour développer votre opérateur ?

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
PisteOutils typiquesÀ retenir
Go (référence)Kubebuilder, controller-runtime, client-goMê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 SDKCLI Red Hat · Go (souvent comme Kubebuilder) · Ansible / HelmGo = solide ; Ansible / Helm = wrapper playbooks / charts — court si la logique métier épaissit.
Autres langagesPython 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.

+ +

Quand un opérateur est légitime

    @@ -477,11 +601,22 @@ spec: 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.
  • +
  • Incident ou compromission de secrets clients : un reload Keycloak + émet des événements côté IdP ; l’opérateur les interroge régulièrement + (ex. toutes les minutes), repère l’écart et propage la correction vers + l’état attendu dans le cluster.
+

Exemple concret de CRD à la slide suivante.

+
+

Exemple — KeycloakClientCredential

+

CRD secrets.carbogame.com/v1alpha1spec.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.

+ +
+
+

Développer son opérateur : réutiliser les autres

+
    +
  • Ne pas tout recoder : un opérateur maison peut s’appuyer sur des opérateurs / contrôleurs + existants pour ce qu’ils font déjà bien.
  • +
  • Ex. Secrets / ConfigMaps vers d’autres namespaces : plutôt que dupliquer la logique et une + deuxième config de ce qui est autorisé, brancher Reflector — une politique + de réflexion, un seul RBAC à raisonner (source vs cibles), moins de surface d’erreur.
  • +
  • Votre code se concentre sur le métier ; la diffusion transverse reste le problème de + l’outil prévu pour ça.
  • +
+ +

Ce qu’un opérateur bien choisi vous apporte

    @@ -587,11 +773,14 @@ spec:
  • Effets cachés
-

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.

@@ -701,7 +890,8 @@ spec: - + +