Budget (45 min questions incluses) : - Intro : 4 min - Partie 1 OS : 15 min - Partie 2 KubeSolo : 8 min - Partie 3 workloads : 6 min - Conclusion : 4 min - Questions : 8 min Règle : pendant les attentes (reboot, install), on est sur les slides, jamais sur le terminal.
LIVE 1 : ./demo/10-os-tuning.sh show
LIVE 2 : lsmod | wc -l, systemctl list-timers puis ./demo/10-os-tuning.sh services config.txt : dtparam=audio=off (pilote son), dtoverlay=disable-bt (Bluetooth), vc4-kms-v3d commenté (pilote graphique du GPU, affichage et 3D), camera_auto_detect=0 et display_auto_detect=0 (le firmware ne cherche plus de caméra CSI ni d'écran DSI), max_framebuffers=1. Blacklist : bcm2835_codec / _isp / _v4l2 / _mmal_vchiq (encodage vidéo matériel, traitement d'image caméra), chargés même sans caméra. V1 : avahi, polkit, ModemManager, bluetooth (-10 à -12 Mo).
LIVE 3 : ps -eo pid,user,rss,comm | grep -E "systemd|sd-pam" puis ./demo/10-os-tuning.sh sessions Reboot ensuite avec ./demo/10-os-tuning.sh reboot (systemctl reboot se plaint de logind)
Sources : - doc kernel, sysctl/vm (swappiness) : "For in-memory swap, like zram or zswap [...] values beyond 100 can be considered". Swappiness = coût relatif swap / système de fichiers (0 à 200, défaut 60) ; swap 2x plus rapide que le FS donne 133. Avec une SD lente, on irait vers ~200. - doc kernel, page-cluster : lecture anticipée en swap (3 = 8 pages). Plus bas = latence du premier défaut plus faible. Avec zram, pas de temps d'accès à amortir, chaque page lue en avance est décompressée pour rien. - wiki Arch, Zram, "Optimizing swap on zram" : swappiness 180, page-cluster 0, watermark_boost_factor 0, watermark_scale_factor 125. - Pop!_OS, usr/bin/pop-zram-config : swappiness 180, page-cluster 0 avec zstd (la zram du Raspberry Pi est en zstd). Tests d'utilisateurs Fedora cités par Arch. Le script met 180 comme Arch et Pop!_OS. Les gains mémoire du README ont été mesurés avec 100, la swappiness ne change rien au repos.
Somme des RSS par process : c'est cette méthode qui surestime, slide suivante.
LIVE 4 : sudo sysctl vm.min_free_kbytes vm.swappiness vm.page-cluster puis ./demo/10-os-tuning.sh memory min_free_kbytes : mémoire que le kernel garde toujours libre pour ses allocations urgentes (interruptions, réseau, le pilote wifi brcmfmac). Défaut du kernel ~3 Mo pour 512 Mo, Raspberry Pi OS impose 16 Mo. Baisser de 16 à 8 Mo libère réellement 8 Mo. MemAvailable est l'estimation de ce qu'une appli peut obtenir sans swapper. Par prudence, il retire des marges dérivées de min_free_kbytes : le seuil high (~1,5 x, 24 puis 12 Mo) de la mémoire libre, le seuil low (~1,25 x, 20 puis 10 Mo) du cache récupérable. Les marges fondent avec la réserve : +12 +10 + quelques Mo, soit ~+25. Image : la banque garde 16 euros de côté et l'appli affiche le disponible en retirant 1,5 fois cette réserve plus une autre marge. Réserve à 8 : 8 euros de plus à dépenser, 25 de plus affichés. Coefficients à confirmer dans /proc/zoneinfo (min, low, high) sur un Pi. Risque si on descend trop bas : échecs d'allocation du wifi dans dmesg.
Appliqué avec l'étape boot, après l'enquête cgroups (même reboot).
LIVE 5 (l'enquête) : cat /sys/fs/cgroup/cgroup.subtree_control, cat /proc/cmdline, grep -a cgroup_disable /boot/firmware/*.dtb
LIVE 5 suite : ./demo/10-os-tuning.sh boot network puis ./demo/10-os-tuning.sh reboot Pendant le reboot (~15 s) : slide Bilan OS. Si rien ne revient au bout d'une minute : débrancher / rebrancher.
LIVE 6 : ./demo/10-os-tuning.sh confirm show (tout de suite, sinon rollback au bout de 10 min) Image d'origine : 416 visibles, 142 utilisés, ~274 disponibles, boot 34 s. V1 (article) : 464 / ~129 / ~334. V2 : 462 / 86 / 376. Le bilan montre visible et utilisé, mesurés par free, pas MemAvailable (estimation, gonflée de ~17 Mo par min_free_kbytes : ~85 Mo réels sur les +102 affichés). En live, used ~107 et available ~355 avec les sessions SSH et sudo.
Gains réels étape par étape. min_free_kbytes compté à +8 Mo (la réserve libérée), pas les +25 affichés par MemAvailable. La somme des barres (~85 Mo) est donc inférieure aux +102 de MemAvailable du bilan (274 vers 376), qui incluent l'effet de calcul. gpu_mem reste de loin le plus gros gain.
LIVE 7 : ./demo/20-kubesolo.sh (~3 min) puis revenir aux slides pendant l'install
Mesuré pendant la préparation de la démo "scaler DOOM" : la grille ramait, la cause était KubeSolo et pas DOOM. Mesure à froid (16/10, Pi neuf, KubeSolo 1.2.2, CoreDNS + nginx + DOOM, une session SSH) : ~141 Mio.
LIVE 8 : ./demo/fetch-kubeconfig.sh <user>@<pi> puis kubectl get nodes,pods -A
LIVE 9 : kubectl apply -f demo/manifests/nginx.yaml puis curl http://<pi>:30080 Un Deployment, une ConfigMap (nginx.conf, worker_processes 1), un Service NodePort.
LIVE 10 : kubectl apply -f demo/manifests/doom.yaml puis vnc://<pi>:30900 (mot de passe idbehold) En jeu : ~4 Mio de RAM, 26 fps en ZRLE, 58 % d'un coeur
LIVE 11 : démo 11 du menu (doom-grid à 9 replicas, une fenêtre VNC par pod, en grille 3x3). Entrée pour tout ranger à la fin. Capture de secours : slide de backup "Scaler DOOM" après Merci.
Oui : gérer une flotte comme un seul système (même API, mêmes manifests, GitOps jusqu'au bord) ; tout tourne en local, pas de control plane distant (contrairement à KubeEdge) ; l'équipe connaît déjà Kubernetes. Non : une app sur une machine, systemd + Podman suffisent ; la RAM est le produit ; stockage lent (SD) pour les images et kine ; rien à orchestrer (scaler DOOM sur un seul nœud...). Le chiffre : MemAvailable 376 Mio après le tuning OS, ~141-155 Mio avec KubeSolo 1.2.2 (GOMEMLIMIT 220 MiB), CoreDNS, nginx et DOOM.
Issues : #188 (flags, remplacés par /etc/kubesolo/config.yaml), #197 / #199 (images et pods perdus au redémarrage), #207 (arrêt), #195 (local-path). local-path : plus de 5 min à décompresser, au-delà du timeout de 2 min du kubelet. v1.2.2 apporte aussi les upgrades en place avec rollback automatique. Testée sur le Pi de secours : 7 min, pods conservés (0 restart).
Capture du 16/10 : 9 replicas de doom-grid sur le Pi neuf, KubeSolo 1.2.2, GOMEMLIMIT 220 MiB. Fluide et jouable.
Test du 21/10 sur kubedoom-backup (KubeSolo 1.2.2, GOMEMLIMIT 220 MiB), DOOM en pause (sans client VNC), nginx et DOOM seul à 0. À 22 : le kubelet refuse à l'admission (OutOfmemory) : "requested 16 Mio, used 356 Mio, capacity 362 Mio". Somme des requests > allouable du node, alors que 81 Mio restent disponibles. Le ReplicaSet recrée les pods refusés en boucle (157 en quelques minutes). Jamais de MemoryPressure : les pages des DOOM en pause partent en zram, MemAvailable reste entre 76 et 102 Mio. GC de KubeSolo calme jusqu'à 20 (0,13/s). En jeu (fenêtres VNC ouvertes), c'est le CPU et le réseau qui limitent : 9 testé, fluide.