Skip to content

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).