Skip to content

Create a container with a dedicated (non-shared) disk volume — storage isolation from other boxes #1016

Description

@hsinhoyeh

Summary

Let a container be created with its own dedicated disk volume, isolated from
other containers — instead of every box carving its disk quota out of the one
shared host storage pool. A box that needs guaranteed, non-contended storage
(a database, a build cache, a data-heavy workload) should be able to sit on a
disk that isn't shared with, or starved by, its neighbours.

Today

Boxes get a disk quota (--disk 50GB), but that quota is a limit within the
shared backend storage pool (default, driver dir/zfs). All boxes on a
host draw from the same pool: they share the underlying device's IOPS and free
space, and a noisy or runaway neighbour can contend for both. There's no way to
say "give this box its own volume/disk."

Ask

A create-time option to place a container's disk on a dedicated volume the
box doesn't share:

  • CLI/proto: e.g. containarium create <box> --dedicated-disk[=<size>]
    (and the matching create-request field + MCP create_container arg), so the
    choice is first-class and proto-first like the rest of the create surface.
  • Backend: provision an isolated volume for the box rather than a quota in
    the shared pool. Options to weigh in design:
    • a dedicated Incus storage volume (or a per-box pool) so space + IOPS are
      the box's own;
    • a loopback/dataset-backed volume attached as the box's disk;
    • on the K8s runtime, a dedicated PVC / StorageClass (partly there already
      via storage_class, but not "isolated from other boxes" as a contract).
  • Isolation contract: the box's disk usage can't be starved by neighbours,
    and (ideally) its IO is not co-mingled on the same device where the
    deployment provides separate devices.

Why

  • Noisy-neighbour isolation for storage (we already isolate CPU/mem and
    network; disk is the gap).
  • Predictable capacity — a data box's space isn't eaten by unrelated boxes
    filling the shared pool (cf. the disk-full incidents we've hit).
  • Cleaner teardown / portability of a box's data volume.

Notes

  • Relates to the existing storage_class field (K8s) — that selects a class but
    doesn't guarantee non-shared isolation on the LXC backend.
  • Design should decide the LXC mechanism (dedicated Incus volume vs per-box
    pool vs dataset) and whether size is required or optional (default = today's
    shared-pool quota when the flag is absent, so this is purely additive).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions