k8s-runner is the Kubernetes-native implementation of the RunnerService gRPC API.
Architecture: k8s-runner
Full setup: Local Development
git clone https://github.com/agynio/bootstrap.git
cd bootstrap
chmod +x apply.sh
./apply.sh -ySee bootstrap for details.
# Deploy once (exit when healthy)
devspace dev
# Watch mode (streams logs, re-syncs on changes)
devspace dev -wE2E coverage runs from the centralized suite in
agynio/e2e using the k8s_runner service tag.
See E2E Testing.
The docker capability injects a Docker sidecar. For the rootless
implementation, the sidecar runs nested runc and requires additional
permissions and mounts to allow docker run to work:
allowPrivilegeEscalation: truefor rootlesskit/newuidmap.seccompProfile: UnconfinedandappArmorProfile: Unconfinedbecause default RuntimeDefault/AppArmor profiles block mount-related syscalls (for example mounting/proc) required by nestedrunc.procMount: Unmaskedto avoid/procmount masking interfering with nestedrunccontainer setup.pod.spec.hostUsers: falsewith an init container that writes/etc/subuidand/etc/subgidentries inside the pod user namespace.- HostPath mount for
/dev/net/tun(typeCharDevice). docker-dataemptyDir mounted at/home/rootless/.local/shareso dockerd can create its owndocker/data root with correct ownership.
These settings can require Pod Security Admission exceptions for docker-capable workloads (baseline/restricted clusters may reject them).
CAPABILITY_IMPLEMENTATIONS also supports docker: kata-qemu (and optionally
docker: kata-fc). When enabled, k8s-runner keeps the privileged DinD sidecar
behavior but sets pod.spec.runtimeClassName to match the selected Kata
implementation. The cluster must provide the matching RuntimeClass and schedule
onto KVM-capable nodes. This cannot be validated on local k3d/mac setups.