Mise en veille : snapshot/restore Firecracker
Retour a la vue d'ensemble.
Un Workshop n'est pas seulement demarre/detruit : il peut etre suspendu.
Firecracker expose nativement snapshot/create (fige l'etat de la VM et sa
memoire) et snapshot/load (restaure a l'identique), ce qui permet de :
- liberer les ressources du pod parent pendant qu'un Workshop est inactif, sans perdre l'etat de travail de l'agent ;
- reprendre en quelques centaines de millisecondes, sans rejouer le boot du noyau invite ni le setup du devcontainer.
sequenceDiagram
participant U as Utilisateur/api-server
participant C as controller
participant P as Pod parent
participant VM as vm-supervisor
U->>C: spec.desiredState = Suspended
C->>VM: POST /snapshot (canal de controle HTTP)
VM->>VM: fige la VM, publie snapshot.state/snapshot.mem/snapshot.rootfs sur le cache partage
VM-->>C: snapshotDigest
C->>P: supprime le pod (phase Suspending)
C-->>U: status.phase = Suspended, status.snapshotDigest
U->>C: spec.desiredState = Running
C->>P: recree le pod (phase Resuming)
P->>VM: snapshot complet sur le cache ? restore_persisted : boot (depuis image_digest)
VM-->>C: pod Running
C-->>U: status.phase = Running
Best-effort par conception : si l'appel POST /snapshot echoue (pod pas
encore joignable, timeout, ...), la suspension aboutit quand meme, sans
etat fige (ensure_suspended/request_snapshot,
crates/controller/src/reconcile.rs) — mieux vaut honorer
desired_state: Suspended sans snapshot que rester bloque dessus
indefiniment.
Le controller attend la reponse de POST /snapshot pendant
ATELIER_SNAPSHOT_TIMEOUT_SECS (300 s par defaut, valeur
workshops.snapshotTimeoutSeconds du chart). Ce delai couvre la copie du
disque, la publication sur le cache et le televersement vers S3 :
vm-supervisor ne repond qu'une fois tout cela fait, et le pod est supprime
des la reponse. Pendant que le pod s'arrete, le controller ne lui redemande
plus d'instantane.
Le disque fait partie de l'instantane
snapshot/create ne fige que l'etat de la VM et sa memoire. Or cette
memoire contient le cache de pages et le journal du systeme de fichiers de
l'invite : elle ne vaut qu'avec le disque qu'elle decrit. Un instantane
d'Atelier compte donc trois fichiers, publies ensemble dans le
repertoire du Workshop sur le cache partage (et sur S3 quand l'offload est
configure) :
| Fichier | Contenu |
|---|---|
snapshot.state |
etat des peripheriques et des vCPU |
snapshot.mem |
memoire de l'invite |
snapshot.rootfs |
disque racine de la microVM, copie pendant que la VM est figee |
- Le disque est copie entre
snapshot/createet la relance des vCPU (Vm::snapshot_with_disk,crates/firecracker/src/vm.rs) : avant, il serait en retard sur la memoire ; apres, en avance. - La copie conserve les trous du fichier (
cp --sparse=always) : un disque de 6 Gio dont l'invite a ecrit 500 Mio occupe 500 Mio sur le cache. S3, lui, le recoit a sa taille apparente. - A la reprise,
Vm::restore_persistedremet ce disque dans le jail a la place de la copie de l'image, sans le verifier ni l'agrandir :resources.diskn'est pas reapplique a un Workshop repris. - Les trois fichiers ne se publient pas atomiquement. L'etat de la
suspension precedente est retire en premier et le nouveau publie en
dernier (
snapshot_and_publish,crates/vm-supervisor/src/main.rs) : une publication interrompue laisse un instantane incomplet, jamais un melange de deux suspensions. - Un instantane incomplet n'est pas repris : le Workshop redemarre a froid
depuis son image. C'est aussi le sort des instantanes pris avant que le
disque ne soit conserve (
snapshot.stateetsnapshot.memseuls) : leur memoire est perdue, mais les reprendre sur le disque de l'image corrompait le systeme de fichiers de l'invite.
L'API expose ce cycle via POST /v1/workshops/:name/suspend et /resume
(crates/api-server), typiquement utilises par le dashboard pour une mise
en veille manuelle ou une politique d'auto-suspend sur inactivite (a
definir).
Le role OpenBao du Workshop est deliberement laisse intact a travers ce
cycle (pas reprovisionne a chaque resume) : un Workshop suspendu reste "le
meme" Workshop du point de vue identite/secrets (voir
identity-secrets.md).