Aller au contenu

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

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