Skip to content

Release v2.6.0: containerd RuntimeClass (kubectl exec) + node installer#155

Merged
ZhiXiao-Lin merged 6 commits into
mainfrom
release/2.6.0
Jun 27, 2026
Merged

Release v2.6.0: containerd RuntimeClass (kubectl exec) + node installer#155
ZhiXiao-Lin merged 6 commits into
mainfrom
release/2.6.0

Conversation

@ZhiXiao-Lin

Copy link
Copy Markdown
Contributor

v2.6.0 — containerd RuntimeClass + one-click node installer

Brings the release/2.6.0 work onto main.

containerd RuntimeClass (runtimeClassName: a3s-box)

Pods run as libkrun MicroVMs via containerd-shim-a3s-box-v2, with working kubectl exec. Key fixes that made exec work end-to-end:

  • env-file staging — K8s injects ~150 service env vars/pod, which overflow the guest kernel cmdline and silently break boot; env now rides a rootfs file (BOX_EXEC_ENV_FILE).
  • Task.wait() gated on confirmed-running — containerd calls Wait() before Start finishes, so a transient "No such container" was misreported as exit and tore down the still-booting box.
  • box launched as a transient systemd unit (clean memlock/rlimits) and CRI stdout/stderr FIFO write ends held open so the task persists.

Also includes the network + block-IO stats feature for a3s-box stats/top/ps.

Deployment

  • deploy/scripts/install-runtimeclass.sh — idempotent one-command per-node installer (CLI + libkrun + shim + containerd conf.d drop-in + boot-cache warm-up; download / --from-dir modes).
  • README: "Deploy as a Kubernetes RuntimeClass" section.

Validation

Installed + verified on all 5 worker nodes of a cluster: each ran an a3s-box pod and served kubectl exec on the first try. v2.6.0 published (GitHub Release, Homebrew, crates.io, winget); containerd-shim-a3s-box-v2-linux-x86_64 added as a release asset (the tarball doesn't ship it).

a3s-release and others added 6 commits June 26, 2026 14:54
…lation

- Add containerd-shim-a3s-box-v2: route runtimeClassName=a3s-box pods to the
  a3s-box MicroVM runtime via a containerd runtime handler (deploy/shim/ manifests).
- Fix: setsid the libkrun VMM shim so it survives launcher teardown (keeps exec.sock).
- Make a3s-libkrun-sys libkrunfw download resilient (curl retry + abort-on-stall).
- Bump workspace version 2.5.2 -> 2.6.0; CHANGELOG.
Makes the containerd-shim-a3s-box-v2 path actually serve `kubectl exec`
against libkrun MicroVMs, plus the v2.6.0 network/block-IO stats feature.

containerd shim:
- Stage container env in a rootfs file (BOX_EXEC_ENV_FILE) instead of
  inlining it: Kubernetes injects ~150 service env vars per pod, which
  overflow the guest kernel cmdline (COMMAND_LINE_SIZE) and silently
  break boot. Only a small pointer rides the cmdline now.
- Gate Task.wait()'s inspect-poll on the box being confirmed running:
  containerd calls Wait() concurrently with (and before) Start finishes,
  during which `inspect` returns "No such container"; treating that as a
  terminal exit made containerd kill the box it was still starting.
- Launch the box as a transient systemd unit so it runs under a clean
  rlimit/memlock context (libkrun must mlock guest RAM for KVM).
- Hold the CRI stdout/stderr FIFO write ends open so the task persists.

Also includes the network + block-IO stats feature for
`a3s-box stats/top/ps` (net_stats_path threaded through vmm/netproxy/passt).

Validated: kubectl exec end-to-end 4/4 on the production cluster; full
`src` workspace lib tests green (cargo test --workspace --lib).
deploy/scripts/install-runtimeclass.sh provisions a node to run
RuntimeClass=a3s-box pods: installs the a3s-box CLI + helpers + libkrun and the
containerd runtime-v2 shim (containerd-shim-a3s-box-v2), registers the
io.containerd.a3s-box.v2 runtime via an /etc/containerd/conf.d drop-in, restarts
containerd, and warms the one-time per-node boot cache so the first pod boots fast.
Download (default) and --from-dir (air-gapped) modes; idempotent.

README: document the deploy flow — create the RuntimeClass, run the installer on
each node, label the node (a3s-box.io/runtime=true), run a pod.

Validated end-to-end on a 5-node cluster: installer ran on every worker, each then
started an a3s-box pod and served `kubectl exec` on the first try.

Note: v2.6.0's release tarball ships the CLI/libkrun but not the containerd shim
(it is a separate cargo project release.yml does not build); the shim is published
as the release asset containerd-shim-a3s-box-v2-linux-x86_64. Follow-up: have
release.yml build + attach it so future releases are self-contained.
@ZhiXiao-Lin ZhiXiao-Lin merged commit 2f9a316 into main Jun 27, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant