vNode Documentation
website·Indexed 32 days ago
https://vnode.com/docs/vNode is a tenant isolation container runtime for Kubernetes that provides strong node-level isolation between workloads using Linux user namespaces. It integrates with containerd as a RuntimeClass to deliver a lightweight sandbox for pods, offering per-namespace or per-pod isolation granularity and compatibility with vCluster for combined control-plane and node-level isolation.
What's inside vNode
- vNode provides node-level isolation by creating virtual nodes within a shared physical Kubernetes node. This allows for stronger tenant isolation, preventing 'noisy neighbor' issues and cross-tenant interference, while maintaining the cost and performance benefits of shared infrastructure. It is designed to support containerd-based Kubernetes environments on Linux nodes (v1.6+) across public and private clouds, with full CPU and GPU support.
Understand vNode isolation mechanisms
vNode provides a lightweight sandbox for Kubernetes pods that acts as a minimal host environment. It achieves isolation without a hypervisor or guest kernel by using three kernel-level mechanisms: Linux user namespaces, FUSE-based filesystem virtualization, and targeted seccomp filtering. This ensures that processes inside a vNode cannot access other tenants' files, processes, or hardware information, even in the event of a container escape.vNode Architecture Components Reference
The vNode runtime is composed of several specialized components:
- vNode Manager (
vnode-manager): A multi-call binary acting as the CNI plugin (vnode-cni), the containerd shim plugin (containerd-shim-vnode-v2), and the manager service providing FUSE-based/procand/sysfilesystems and seccomp filtering. - vNode Init (
vnode-init): Runs as PID 1 inside each vNode to reap zombie containerd-shim processes. - vNode RunC (
vnode-runc): A fork of RunC that integrates the vNode manager and supports cgroup v2 and Linux user namespaces. - vNode Containerd Shim (
vnode-containerd-shim-runc-v2): Handles ID-mapped mounts and sets up FUSE, seccomp, and the manager API for new vNodes. - vNode Utils (
vnode-utils): Performs helper operations like network namespace setup, bind-path operations, and file copying into vNodes.
- vNode Manager (
Implement full-stack tenant isolation with vCluster and vNode
Full-stack tenant isolation is achieved by combining two layers: vCluster for control-plane isolation and vNode for node-level isolation. vCluster provides each tenant with a dedicated API server and etcd, preventing tenants from interfering with each other's secrets or exhausting API capacity. vNode wraps tenant pods in a hardened sandbox, ensuring that a container escape only reaches the vNode boundary rather than the host node, protecting other tenants' filesystems and processes.Understand the vNode escape landing zone
The 'escape landing zone' refers to the state of an attacker after they have successfully broken out of a container. In vNode, the isolation is enforced at the kernel level rather than via policy or admission controls. Key guarantees after an escape include:
- No root access: The workload's root process (UID 0) maps to a high-numbered unprivileged host UID (65536 or higher).
- Tenant Isolation: Each vNode uses a distinct UID range; kernel file permission checks prevent access to other tenants' files.
- Process Isolation: PID namespaces ensure that only the attacker's own processes are visible in
/proc. - Network Restriction: Seccomp unconditionally blocks
AF_PACKETandSIOCSIFFLAGS(promiscuous mode), preventing raw network access.
Understand vNode's three-layer isolation architecture
vNode secures workloads using three layered kernel-level mechanisms to ensure that even in the event of a container escape, the attacker remains an unprivileged user on the host (UID 65536 or higher) with no access to other tenants' processes, files, or raw network access.
- Layer 1: User Namespaces and UID Mapping: Each vNode is assigned a unique range of 65,536 IDs. Container root (UID 0) is mapped to an unprivileged host UID (≥ 65,536). ID-mapped mounts handle this translation without performance penalties.
- Layer 2: FUSE Filesystem Virtualization: vNode uses a FUSE filesystem (
vnodefs) to mask sensitive host-level information in/procand/sys. It returns per-container data (e.g., container-specific uptime in/proc/uptime) and hides hardware identifiers in/sys/devices/virtual/dmi. - Layer 3: Targeted Seccomp Filtering: vNode uses surgical seccomp rules rather than full kernel reimplementation:
- Blocked: Raw packet socket operations (
AF_PACKET, promiscuous mode, packet multicast) are hard-denied to prevent cross-tenant traffic sniffing. - Intercepted: Mount operations, ownership changes, specific xattr operations, and
rebootare handled in userspace viaseccomp-notifyby thevnode-manager. - Pass-through: All other syscalls hit the real kernel, relying on standard permission checks for the unprivileged host UID.
- Blocked: Raw packet socket operations (
Install vNode using Helm
Install the vNode runtime using Helm. You must provide the platform host URL and the platform access key. If your platform uses a self-signed certificate, add theconfig.platform.insecure=trueflag.helm upgrade --install vnode-runtime vnode-runtime -n vnode-runtime \ --repo https://charts.loft.sh --create-namespace \ --set "config.platform.host=https://platform-your-domain.com" \ --set "config.platform.accessKey=your-access-key" # Add the following only if your platform uses a self-signed certificate: # --set "config.platform.insecure=true"Secure untrusted workloads for Inference Providers
Inference providers should use vNode to sandbox untrusted or privileged customer code to prevent container escapes from affecting the host node. This is critical for:
- Custom or customer-supplied serving containers.
- Model adapters, plugins, or extensions loaded at runtime.
- Fine-tuning or training jobs running alongside serving.
- Privileged GPU workloads requiring device access beyond namespace boundaries.
Recommended Architecture: Layer vNode on top of Private GPU nodes. Private nodes provide the necessary infrastructure boundary, and vNode provides the runtime sandbox to contain escapes.
Verify vNode installation and isolation
To verify that vNode is correctly installed and providing isolation, create a privileged test pod using thevnoderuntime class and check for UID remapping and process isolation.# 1. Create a privileged test pod echo "apiVersion: v1 kind: Pod metadata: name: vnode-test spec: runtimeClassName: vnode hostPID: true terminationGracePeriodSeconds: 1 containers: - image: ubuntu:jammy name: vnode-test command: ['tail', '-f', '/dev/null'] securityContext: privileged: true" | kubectl apply -f - kubectl wait --for=condition=ready pod vnode-test # 2. Verify UID remapping # Root should be remapped to a high unprivileged host UID (e.g., 589824) kubectl exec vnode-test -- cat /proc/self/uid_map # 3. Verify process isolation # Should only show pod-specific processes, not host processes kubectl exec -it vnode-test -- ps -ef --forestInstall vNode using Helm
Install the vNode runtime using the Helm chart from the Loft repository. You must provide the platform host and access key. If your platform uses a self-signed certificate, add theconfig.platform.insecure=trueflag.helm upgrade --install vnode-runtime vnode-runtime -n vnode-runtime \ --repo https://charts.loft.sh --create-namespace \ --set "config.platform.host=https://platform-your-domain.com" \ --set "config.platform.accessKey=your-access-key" # Add the following only if your platform uses a self-signed certificate: # --set "config.platform.insecure=true"Prerequisites for installing vNode
Before installing vNode, ensure the following requirements are met:
- An existing vCluster Platform installation.
- A license plan that includes vNode (verify via Platform Config → License and Billing).
- A valid platform access key (not required when deploying inside a Tenant Cluster).
- A Kubernetes cluster with Linux kernel 6.1+, containerd 1.7 or 2.0, and Kubernetes 1.24+.
Determine when to use vNode for workload isolation
vNode provides strong workload isolation by wrapping workloads in hardened sandboxes that contain container escapes at the vNode boundary. It is the only model that adds strong isolation while keeping tenants on shared worker nodes.
Use vNode when:
- Isolation must exceed namespace boundaries, but dedicated nodes are too expensive.
- Tenants run privileged workloads (e.g., Docker-in-Docker, nested Kubernetes, or GPU workloads) on shared infrastructure.
- Compliance requirements prohibit namespace-only isolation but do not mandate fully dedicated nodes.
Note: vNode is not a replacement for dedicated nodes if the tenant requires fully separate infrastructure, dedicated CNI/CSI, or independent node lifecycle control.