Private Nodes
This feature is only available when using the following worker node types:
- Private Nodes
This feature is an Enterprise feature. See our pricing plans or contact our sales team for more information.
Using private nodes is a tenancy model for vCluster where, instead of sharing the host clusterβs worker nodes, you assign individual worker nodes to a vCluster instance. These private nodes act as the vClusterβs worker nodes and are treated as worker nodes for the vCluster.
Because these nodes are real Kubernetes nodes, vCluster does not sync any resources to the host cluster as no host cluster worker nodes are used. All workloads run directly on the attached nodes as if they were native to the virtual cluster.
This approach can be understood as follows: the control plane creates a virtual Kubernetes context, while the workloads can run on separate physical nodes that exist entirely within that virtual context.
One key benefit of using private nodes is that vCluster can automatically manage the lifecycle of the worker nodes.
To allow nodes to join the virtual cluster, the cluster must be exposed and accessible. One option is to expose a LoadBalancer service and use its endpoint for the worker nodes. vCluster does not need direct access to the nodes; instead, it uses Konnectivity to tunnel requestsβsuch as kubectl logsβfrom the control plane to the nodes.

vcluster.yaml configurationβ
To create a vCluster with private nodes, you'll need to enable the feature as well as set some other configuration options in preparation for worker nodes to join.
# Enable private nodes
privateNodes:
enabled: true
# vCluster control plane options
controlPlane:
distro:
k8s:
image:
tag: v1.31.2 # Kubernetes version you want to use
service:
spec:
type: LoadBalancer # If you want to expose vCluster using LoadBalancer (Recommended option)
# Networking configuration
networking:
# Specify the pod CIDR
podCIDR: 10.64.0.0/16
# Specify the service CIDR
serviceCIDR: 10.128.0.0/16
Scheduling enabled by defaultβ
When private nodes are enabled, scheduling is handled by the virtual cluster and the virtual scheduler is automatically enabled. You do not need to manually configure this in your vcluster.yaml.
# Enabling private nodes enables the virtual scheduler
# Disabling the virtual scheduler is not possible
controlPlane:
advanced:
virtualScheduler:
enabled: true
Other vCluster feature limitationsβ
When private nodes are enabled, certain vCluster features are automatically disabled or unavailable. If you include these options in your vcluster.yaml, they are ignored or might cause configuration errors.
The following features are not available when using private nodes:
sync.*- No resource syncing between virtual and host clustersintegrations.*- Integrations depend on syncing functionalitynetworking.replicateServices- Services are not replicated to hostcontrolPlane.distro.k3s- Only standard Kubernetes (k8s) is supportedcontrolPlane.coredns.embedded: true- Embedded CoreDNS conflicts with custom CNIcontrolPlane.advanced.virtualScheduler.enabled: false- Virtual scheduler cannot be disabledsleepMode.*- No ability to sleep workloads or control plane
# These configurations are NOT supported with private nodes
# Resource syncing between virtual and host clusters is disabled
sync:
services:
enabled: false # Services cannot be synced to host cluster
secrets:
enabled: false # Secrets cannot be synced to host cluster
# All other sync options (pods, configmaps, etc.) are also disabled
# Platform integrations require syncing functionality
integrations:
metricsServer:
enabled: false # Metrics server integration not supported
# All other integrations are disabled due to sync dependency
# Service replication to host cluster is not available
networking:
replicateServices:
enabled: false # Services run entirely within virtual cluster
# Distribution restrictions
controlPlane:
distro:
k3s:
enabled: false # k3s distribution not supported
k8s:
enabled: true # Only standard Kubernetes works
# DNS configuration limitations
coredns:
embedded: false # Embedded CoreDNS conflicts with custom CNI options
advanced:
# Virtual scheduler is required for workload placement
virtualScheduler:
enabled: true # Always enabled (cannot be disabled)
# Host Path Mapper is not supported
hostPathMapper:
enabled: false
# Sleep mode is not available
sleepMode:
enabled: false
# Isolated Control Plane mode is not supported
experimental:
isolatedControlPlane:
enabled: false
Configure addonsβ
vCluster supports addons that extend the functionality of your virtual cluster. You can configure these addons during deployment to adjust networking, observability, and other features for your environment and requirements.
CNIβ
vCluster installs Flannel by default. You can install your own CNI with the following.
privateNodes:
cni:
flannel:
enabled: false
CoreDNSβ
vCluster installs CoreDNS by default to allow cluster DNS resolving of services and pods.
Konnectivityβ
vCluster uses Konnectivity to establish a connection between the control plane and worker nodes for commands such as kubectl logs, kubectl exec, kubectl port-forward. The Konnectivity server runs as part of the vCluster control plane, while an agent is deployed inside the vCluster. If it is not needed or wanted, you can disable Konnectivity in the vCluster config.
Kube proxyβ
vCluster installs Kube Proxy by default to ensure that services are configured on the nodes. Some CNI implement their own kube-proxy functionality. Optionally, you can disable kube-proxy deployment in the vCluster config.
Local Path Provisionerβ
vCluster installs the Local Path Provisioner by default to allow stateful workloads within the vCluster.
Deploy vCluster with private nodesβ
For step-by-step instructions on deploying vCluster with private nodes and joining worker nodes, see the Deploy private nodes guide.
Config referenceβ
privateNodes required object β
PrivateNodes holds configuration for vCluster private nodes mode.
privateNodes required object βenabled required boolean false β
Enabled defines if dedicated nodes should be enabled.
enabled required boolean false βkubelet required object β
Kubelet holds kubelet configuration that is used for all nodes.
kubelet required object βconfig required object {} β
Config is the config for the kubelet that will be merged into the default kubelet config. More information can be found here:
https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration
config required object {} βautoUpgrade required object β
AutoUpgrade holds configuration for auto upgrade.
autoUpgrade required object βenabled required boolean true β
Enabled defines if auto upgrade should be enabled.
enabled required boolean true βimage required string β
Image is the image for the auto upgrade pod started by vCluster. If empty defaults to the controlPlane.statefulSet.image.
image required string βimagePullPolicy required string β
ImagePullPolicy is the policy how to pull the image.
imagePullPolicy required string βnodeSelector required object β
NodeSelector is the node selector for the auto upgrade. If empty will select all worker nodes.
nodeSelector required object βbinariesPath required string β
BinariesPath is the base path for the kubeadm binaries. Defaults to /usr/local/bin
binariesPath required string βcniBinariesPath required string β
CNIBinariesPath is the base path for the CNI binaries. Defaults to /opt/cni/bin
cniBinariesPath required string βconcurrency required integer 1 β
Concurrency is the number of nodes that can be upgraded at the same time.
concurrency required integer 1 βjoinNode required object β
JoinNode holds configuration specifically used during joining the node (see "kubeadm join").
joinNode required object βpreInstallCommands required string[] β
PreInstallCommands are commands that will be executed before containerd, kubelet etc. is installed.
preInstallCommands required string[] βpreJoinCommands required string[] β
PreJoinCommands are commands that will be executed before kubeadm join is executed.
preJoinCommands required string[] βpostJoinCommands required string[] β
PostJoinCommands are commands that will be executed after kubeadm join is executed.
postJoinCommands required string[] βcontainerd required object β
Containerd holds configuration for the containerd join process.
containerd required object βenabled required boolean true β
Enabled defines if containerd should be installed and configured by vCluster.
enabled required boolean true βregistry required object β
Registry holds configuration for how containerd should be configured to use a registries.
registry required object βconfigPath required string β
ConfigPath is the path to the containerd registry config.
configPath required string βmirrors required {key: object} β
Mirrors holds configuration for the containerd registry mirrors. E.g. myregistry.io:5000 or docker.io. See https://github.com/containerd/containerd/blob/main/docs/hosts.md for more details.
mirrors required {key: object} βserver required string β
Server is the fallback server to use for the containerd registry mirror. E.g. https://registry-1.docker.io. See https://github.com/containerd/containerd/blob/main/docs/hosts.md for more details.
server required string βcaCert required string[] β
CACert are paths to CA certificates to use for the containerd registry mirror.
caCert required string[] βskipVerify required boolean β
SkipVerify is a boolean to skip the certificate verification for the containerd registry mirror and allows http connections.
skipVerify required boolean βcapabilities required string[] β
Capabilities is a list of capabilities to enable for the containerd registry mirror. If empty, will use pull and resolve capabilities.
capabilities required string[] βoverridePath required boolean β
OverridePath is a boolean to override the path for the containerd registry mirror.
overridePath required boolean βhosts required object[] β
Hosts holds configuration for the containerd registry mirror hosts. See https://github.com/containerd/containerd/blob/main/docs/hosts.md for more details.
hosts required object[] βserver required string β
Server is the server to use for the containerd registry mirror host. E.g. http://192.168.31.250:5000.
server required string βcaCert required string[] β
CACert are paths to CA certificates to use for the containerd registry mirror host.
caCert required string[] βskipVerify required boolean β
SkipVerify is a boolean to skip the certificate verification for the containerd registry mirror and allows http connections.
skipVerify required boolean βcapabilities required string[] β
Capabilities is a list of capabilities to enable for the containerd registry mirror. If empty, will use pull and resolve capabilities.
capabilities required string[] βoverridePath required boolean β
OverridePath is a boolean to override the path for the containerd registry mirror.
overridePath required boolean βauth required {key: object} β
Auth holds configuration for the containerd registry auth. See https://github.com/containerd/containerd/blob/main/docs/cri/registry.md#configure-registry-credentials for more details.
auth required {key: object} βusername required string β
Username is the username for the containerd registry.
username required string βpassword required string β
Password is the password for the containerd registry.
password required string βidentityToken required string β
IdentityToken is the token for the containerd registry.
identityToken required string βauth required string β
Auth is the auth config for the containerd registry.
auth required string βpauseImage required string β
PauseImage is the image for the pause container.
pauseImage required string βcaCertPath required string β
CACertPath is the path to the SSL certificate authority used to
secure communications between node and control-plane.
Defaults to "/etc/kubernetes/pki/ca.crt".
caCertPath required string βskipPhases required string[] β
SkipPhases is a list of phases to skip during command execution.
The list of phases can be obtained with the "kubeadm join --help" command.
skipPhases required string[] βnodeRegistration required object β
NodeRegistration holds configuration for the node registration similar to the kubeadm node registration.
nodeRegistration required object βcriSocket required string β
CRI socket is the socket for the CRI.
criSocket required string βkubeletExtraArgs required object[] β
KubeletExtraArgs passes through extra arguments to the kubelet. The arguments here are passed to the kubelet command line via the environment file
kubeadm writes at runtime for the kubelet to source. This overrides the generic base-level configuration in the kubelet-config ConfigMap
Flags have higher priority when parsing. These values are local and specific to the node kubeadm is executing on.
An argument name in this list is the flag name as it appears on the command line except without leading dash(es).
Extra arguments will override existing default arguments. Duplicate extra arguments are allowed.
kubeletExtraArgs required object[] βtaints required object[] β
Taints are additional taints to set for the kubelet.
taints required object[] βkey required string β
Required. The taint key to be applied to a node.
key required string βvalue required string β
The taint value corresponding to the taint key.
value required string βeffect required string β
Required. The effect of the taint on pods
that do not tolerate the taint.
Valid effects are NoSchedule, PreferNoSchedule and NoExecute.
effect required string βignorePreflightErrors required string[] β
IgnorePreflightErrors provides a slice of pre-flight errors to be ignored when the current node is registered, e.g. 'IsPrivilegedUser,Swap'.
Value 'all' ignores errors from all checks.
ignorePreflightErrors required string[] βimagePullPolicy required string β
ImagePullPolicy specifies the policy for image pulling during kubeadm "init" and "join" operations.
The value of this field must be one of "Always", "IfNotPresent" or "Never".
If this field is unset kubeadm will default it to "IfNotPresent", or pull the required images if not present on the host.
imagePullPolicy required string β