You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Updates the stale 2.0.4 baseline (21 pass) to the current measured run:
38 Passed / 44 Failed / 15 Skipped. Documents what now passes (streaming,
logs+reopen, most SecurityContext incl. force-RemoveContainer, /proc+/sys
in the chroot, ReadonlyPaths) and groups the 44 failures by root cause:
~22 registry-egress + ~1 busybox-substitution artifacts (not defects),
writable volume mounts (architectural), seccomp/sysctls/AppArmor (guest
features), capabilities (murky/kernel). Adds a Stability section noting
graceful-shutdown VM reaping and the SIGKILL-case TODO.
|**Linux SecurityContext**| RunAsUser/RunAsGroup/RunAsUserName, add/drop capabilities, Privileged, ReadonlyRootfs, ReadonlyPaths/MaskedPaths, SupplementalGroups | OCI `SecurityContext` is not applied to the in-VM process (`guest-init`) | new: security-context |
54
-
|**seccomp / AppArmor / sysctls**| seccomp default/unconfined/localhost, AppArmor permissive/blocking, safe/unsafe sysctls | LSM + sysctl plumbing not implemented in the guest | new: lsm-sysctl |
55
-
|**Streaming**| exec (tty on/off, stdin on/off), attach | exec/attach return an empty error; SPDY streaming demux not wired to the VM agent |#5 streaming |
56
-
|**Container logs**| starting container with log, reopening container log | CRI log writer does not capture container stdout/stderr to `log_path`|#5 log-writer |
57
-
|**Volumes / mounts**| starting with volume, volume host-path symlink, mount propagation (rshared/rslave/rprivate), non-recursive readonly mounts | OCI mount spec (volumes, propagation, ro) not fully honored | new: mounts |
58
-
|**Namespaces**| HostNetwork true/false, HostPID, HostIPC, PodPID, ContainerPID | Pod/host namespace sharing modes not mapped into the microVM | new: namespaces |
59
-
|**Networking**| DNS config, port mapping (host+container, container-only) | DNS config injection + CRI port mapping over TSI not wired |#5 networking |
|**Registry egress** (~22) | Multiple-Containers exec/log/network, image pull/list/status, DNS, port-mapping, port-forward, HostNetwork/PID/IPC, Privileged, ReadOnlyRootfs, NoNewPrivs, image-group SupplementalGroups | webserver/helper images on `registry.k8s.io`/`gcr.io` are unreachable and not overridable via the images file | ❌ environmental |
69
+
|**Writable volume mounts** (~6) | starting container with volume (+ host-path symlink), mount propagation rshared/rslave/rprivate, non-recursive readonly mounts | only read-only mounts (materialized by copy) are supported; writable host-path volumes need a virtio-fs share into the VM, which libkrun configures at boot (containers are created post-boot) | ⚠️ architectural |
70
+
|**seccomp filters** (~3) | seccomp `RuntimeDefault` (wants `Seccomp: 2`), localhost profile, SYS_ADMIN-block | no BPF seccomp filter is installed in the guest child | ✅ guest feature |
71
+
|**sysctls** (~2) | safe/unsafe sysctls | pod sysctls not applied in the guest (`/proc/sys` writes) | ✅ guest feature |
72
+
|**AppArmor** (~2) | unloaded profile, profile blocking writes | LSM not wired in the guest | ✅ guest feature |
73
+
|**Capabilities** (~3) | add/drop capability, drop ALL | capabilities not managed per-container; `brctl` bridge test also needs a `CONFIG_BRIDGE` guest kernel | ⚠️ murky / possibly kernel-limited |
74
+
|**MaskedPaths** (1) | mask `/bin/ls`| masking code is correct, but under the alpine/busybox substitution `/bin/ls` and `/bin/sh` are the same `busybox` binary, so masking `ls` breaks `sh`; the expected stderr needs `sh` to run | ❌ test-image artifact |
75
+
76
+
## Stability
77
+
78
+
-**Graceful shutdown:** on SIGTERM/SIGINT the CRI drains the gRPC server and
79
+
reaps every sandbox VM (kills the shim, unmounts its overlay, removes the
80
+
rootfs dir) — no more orphaned microVMs/overlays across restarts.
81
+
-**TODO:** SIGKILL/crash-case startup reaping (reconcile already marks orphaned
82
+
sandboxes NotReady, but does not yet reap the dead instance's leftover shim
83
+
processes + overlay mounts).
60
84
61
85
## Methodology
62
86
63
-
The baseline is intentionally captured *before* fixing the gaps so each fix can
64
-
be measured against it. Re-run after each CRI feature lands and update the
65
-
"Latest run" table; the goal is to drive Failed → 0 (excluding documented
66
-
test-setup artifacts) and graduate `a3s-box-cri` to a conformant CRI runtime.
87
+
The baseline is captured so each fix is measurable. Re-run after each CRI feature
88
+
lands and update the "Latest run" table; the goal is to drive Failed → 0
89
+
(excluding documented environmental/test-image artifacts) and graduate
90
+
`a3s-box-cri` to a conformant, mature CRI runtime.
0 commit comments