Configuration
Helm Values
kubefence is configured via Helm values. The chart renders the TOML plugin
configuration automatically into a ConfigMap — you do not edit the TOML file
directly when using Helm.
Core settings
| Value |
Default |
Description |
image.repository |
ghcr.io/kubefence/nono-nri-plugin |
Plugin container image repository |
image.tag |
"" |
Plugin container image tag. Empty means the chart's appVersion, i.e. the release the chart came from — so --version 0.8.0 pins the image to 0.8.0. Set explicitly for local builds or to pin a digest |
image.pullPolicy |
IfNotPresent |
Kubernetes image pull policy |
namespace |
kube-system |
Namespace for all kubefence resources |
NRI plugin configuration
These values are rendered into the TOML config file loaded by the plugin.
| Value |
Default |
Description |
config.runtimeClasses |
[nono-runc] |
List of RuntimeClass handler names to intercept. Pods whose RuntimeClass handler matches are sandboxed; all others are skipped |
config.defaultProfile |
"default" |
nono profile used when a pod has no nono.sh/profile annotation |
config.nonoBinPath |
"/opt/nono-nri/nono" |
Absolute host path to the nono binary. Copied there by the node-setup DaemonSet init container |
config.socketPath |
"" |
NRI socket path. Empty string uses the runtime default (/var/run/nri/nri.sock) |
config.seccompProfile |
"restricted" |
Seccomp policy injected into every sandboxed container. "restricted" blocks io_uring, ptrace, the seccomp syscall, and pidfd_getfd on top of RuntimeDefault. "runtime-default" applies the Docker RuntimeDefault allowlist. "" disables injection |
RuntimeClass creation
| Value |
Default |
Description |
runtimeClasses.nonoRunc.enabled |
true |
Create the nono-runc RuntimeClass (handler: nono-runc) |
runtimeClasses.kataNono.enabled |
false |
Create the kata-nono-sandbox RuntimeClass |
runtimeClasses.kataNono.handler |
"kata-qemu-runtime-rs" |
Handler name for the Kata RuntimeClass. Must match a handler registered by kata-deploy |
Kata Containers provisioning
| Value |
Default |
Description |
kata.enabled |
false |
Enable the kata-setup DaemonSet. Requires kata-deploy to be installed first |
kata.extensionImage |
"" |
OCI image carrying the nono guest extension (hardened kata-agent policy). Empty means ghcr.io/kubefence/kata-nono-extension:<appVersion>, so a pinned chart pins the extension too. Set explicitly for another registry or to pin a digest |
kata.shareDir |
/opt/kata/share/kata-containers |
Directory where kata-deploy installs kata share files on each node |
kata.qemuConfigPath |
/opt/kata/share/defaults/kata-containers/runtime-rs/runtimes/qemu-runtime-rs/configuration-qemu-runtime-rs.toml |
Path to the kata QEMU configuration file written by kata-deploy. runtime-rs configs sit under a runtime-rs/ prefix |
kata.qemu.machineAccelerators |
"" |
Additional QEMU machine accelerators. Set to "kernel_irqchip=split" for nested-KVM environments (e.g. Kind clusters) |
kata.qemu.seccompSandbox |
"on,obsolete=deny,spawn=deny,resourcecontrol=deny" |
QEMU process-level seccomp sandbox (host kernel). Restricts syscalls available to the QEMU hypervisor process. spawn=deny prevents QEMU from exec'ing host binaries after a VM escape. Written to seccomp_sandbox — runtime-rs's spelling, not the Go runtime's seccompsandbox. Set to "" to disable |
kata.qemu.disableGuestSeccomp |
false |
Maps to disable_guest_seccomp in the kata QEMU config. false enables the kata-agent to apply the container's OCI seccomp profile (written by the NRI plugin) inside the guest VM |
Node setup
| Value |
Default |
Description |
nodeSetup.enabled |
true |
Enable the node-setup DaemonSet that patches containerd to enable NRI and register runtime handlers |
nodeSetup.nri.socketPath |
/var/run/nri/nri.sock |
NRI socket path to configure in containerd |
nodeSetup.nri.pluginPath |
/opt/nri/plugins |
NRI plugin path to configure in containerd |
nodeSetup.nri.configPath |
/etc/nri/conf.d |
NRI config directory to configure in containerd |
containerdConfigPath |
/etc/containerd/config.toml |
Host path to containerd's config file. Shared by the node-setup and kata-setup DaemonSets. They write drop-ins into its conf.d sibling and only edit this file if its imports array does not already cover them |
Host paths
| Value |
Default |
Description |
hostPaths.nriSocket |
/var/run/nri |
Directory holding the NRI socket, mounted into the plugin |
hostPaths.nonoHostDir |
/opt/nono-nri |
Host directory the nono binary and interpreter wrappers are installed into, and the source of the /nono bind-mount |
hostPaths.nriPlugins |
/opt/nri/plugins |
NRI plugin directory on the host |
hostPaths.readyDir |
/run/kubefence |
Where the setup DaemonSets record that they have finished with the node. The plugin waits for those markers before connecting — see Startup ordering. On tmpfs by design, so a reboot forces the setup DaemonSets to re-assert them |
Resources
| Value |
Default |
Description |
resources.requests.cpu |
50m |
CPU request for the plugin container |
resources.requests.memory |
32Mi |
Memory request for the plugin container |
resources.limits.cpu |
200m |
CPU limit for the plugin container. Prevents burst container-creation events from exhausting node memory |
resources.limits.memory |
128Mi |
Memory limit for the plugin container |
Helper images
| Value |
Default |
Description |
helperImages.alpine |
alpine:3.20 |
Alpine image used in privileged init containers. Pin to an immutable digest in production |
helperImages.busybox |
busybox:1.37.0-uclibc |
Busybox image used in privileged init containers. Pin to an immutable digest in production |
TOML Configuration
When using Helm, the chart renders the TOML configuration automatically into a
ConfigMap and mounts it at /etc/nri/conf.d/10-nono-nri.toml inside the
plugin container. You configure the plugin through Helm values — not by editing
the TOML file directly.
If you deploy kubefence without Helm, create the TOML file manually:
# RuntimeClass handler names to intercept (matches pod.GetRuntimeHandler())
runtime_classes = ["nono-runc"]
# nono profile when pod has no nono.sh/profile annotation
default_profile = "default"
# Host path to the nono binary (copied there by the DaemonSet init container)
nono_bin_path = "/opt/nono-nri/nono"
# NRI socket (empty = use runtime default: /var/run/nri/nri.sock)
socket_path = ""
Field reference
| Field |
Required |
Description |
runtime_classes |
Yes |
List of RuntimeClass handler names. The plugin sandboxes pods whose handler matches this list; all others are skipped with zero overhead |
default_profile |
Yes |
nono profile used when a pod has no nono.sh/profile annotation |
nono_bin_path |
Yes |
Absolute path to the nono binary on the host. The plugin checks this path at startup and refuses to start if the file is absent |
socket_path |
No |
NRI socket path. Defaults to /var/run/nri/nri.sock when empty |
seccomp_profile |
No |
Seccomp policy injected into every sandboxed container. See below |
The plugin validates runtime_classes and nono_bin_path at startup. Missing
or empty values cause an immediate exit with an error message.
seccomp_profile values
| Value |
Description |
"restricted" |
Docker RuntimeDefault allowlist minus io_uring_setup, io_uring_enter, io_uring_register, ptrace, seccomp, and pidfd_getfd. Default for AI workloads. Blocks io_uring (CVE-2022-2639, CVE-2023-2598), cross-process inspection, and self-filter removal |
"runtime-default" |
Docker/moby RuntimeDefault allowlist verbatim. Equivalent to seccompProfile.type: RuntimeDefault in the pod security context |
"" (empty) |
Disabled. The plugin injects no seccomp policy. Pods may still set their own policy via securityContext.seccompProfile |
Both profiles use SCMP_ACT_ERRNO as the default action (deny-by-default) and declare only SCMP_ARCH_X86_64. Syscalls already blocked by RuntimeDefault — including bpf, mount, kexec_load, init_module, setns, unshare, process_vm_readv, and userfaultfd — remain blocked in both profiles.
For Kata Containers, the NRI-injected policy takes effect inside the guest VM only when disable_guest_seccomp = false in the kata QEMU config. The kubefence kata-setup DaemonSet sets this automatically when kata.qemu.disableGuestSeccomp: false (the default).