Deploy vCluster in minutes
Works with any Kubernetes distro — cloud, on-prem, or private.
Choose how you want to isolate workloads within your cluster.
Pick a tenancy mode and drop it into a vcluster.yaml file.
The virtual cluster uses the nodes owned by the underlying host cluster. Pods from different virtual clusters might be scheduled on the same nodes. Pods use the CNI, CSI, etc. are from the host cluster.
# vcluster.yaml (optional for shared nodes)
sync:
  fromHost:
    nodes:
# set to true for real node specs
      enabled: false
For stricter isolation, you can configure Virtual Nodes, Dedicated Nodes or Private Nodes
The virtual cluster uses a dedicated set of nodes owned by the underlying host cluster. Pods use the CNI, CSI, etc. are from the host cluster.
# vcluster.yaml
sync:
  fromHost:
    nodes:
# set to false to show pseudo nodes
 enabled: true
selector:
labels:
tenant: tenant-1
Make sure the set of nodes you want to dedicate to this virtual cluster, have the label you specified in your vcluster.yaml. To label a node, run this command in your host cluster:
# Get node name
kubectl get nodes
# Add label to node
kubectl label nodes <node-name> tenant=tenant-1
For stricter isolation, you can configure Private Nodes instead.
Nodes are directly joined into the virtual cluster’s control plane and are not part of any other cluster. CNI, CSI, and nodes are not shared and are entirely separate for this virtual cluster.
# vcluster.yaml
privateNodes:
enabled: true
controlPlane:
service:
spec:
# could also be LoadBalancer if available
type: NodePort
Install the CLI and launch your virtual cluster in seconds.
brew install loft-sh/tap/vcluster
vcluster create vc-tenant-1 -f vcluster.yaml
vcluster create --upgrade vc-tenant-1 -f vcluster.yaml
If you make any changes to your vcluster.yaml
, you can use the --upgrade
flag to upgrade the running virtual cluster and apply your changes.
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
vcluster create my-vcluster --namespace team-x
md -Force "$Env:APPDATA\vcluster"; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12';
Invoke-WebRequest -URI "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-windows-amd64.exe" -o $Env:APPDATA\vcluster\vcluster.exe;
$env:Path += ";" + $Env:APPDATA + "\vcluster";
vcluster create my-vcluster --namespace team-x
helm upgrade --install my-vcluster vcluster \
--repo https://charts.loft.sh \
--namespace team-x \
--create-namespace \
--repository-config=''
provider "helm" {
kubernetes {
config_path = "~/.kube/config"
}
}
resource "helm_release" "my_vcluster" {
name = "my-vcluster"
namespace = "team-x"
create_namespace = true
repository = "https://charts.loft.sh"
chart = "vcluster"
}
terraform init
terraform plan
terraform apply
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-vcluster
namespace: argocd
spec:
project: default
source:
chart: vcluster
repoURL: https://charts.loft.sh
targetRevision: *
helm:
releaseName: my-vcluster
destination:
server: https://kubernetes.default.svc
namespace: team-x
kubectl apply -f application.yaml
Install the CLI and launch your virtual cluster in seconds.
brew install loft-sh/tap/vcluster
vcluster platform start
vcluster create vc-tenant-1 -f vcluster.yaml
vcluster create --upgrade vc-tenant-1 -f vcluster.yaml
If you make any changes to your vcluster.yaml
, you can use the --upgrade
flag to upgrade the running virtual cluster and apply your changes.
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
vcluster platform start
vcluster create my-vcluster --namespace team-x
md -Force "$Env:APPDATA\vcluster"; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls,Tls11,Tls12';
Invoke-WebRequest -URI "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-windows-amd64.exe" -o $Env:APPDATA\vcluster\vcluster.exe;
$env:Path += ";" + $Env:APPDATA + "\vcluster";
vcluster platform start
vcluster create my-vcluster --namespace team-x
helm upgrade --install my-vcluster vcluster \
--repo https://charts.loft.sh \
--namespace team-x \
--create-namespace \
--repository-config=''
provider "helm" {
kubernetes {
config_path = "~/.kube/config"
}
}
resource "helm_release" "my_vcluster" {
name = "my-vcluster"
namespace = "team-x"
create_namespace = true
repository = "https://charts.loft.sh"
chart = "vcluster"
}
terraform init
terraform plan
terraform apply
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-vcluster
namespace: argocd
spec:
project: default
source:
chart: vcluster
repoURL: https://charts.loft.sh
targetRevision: *
helm:
releaseName: my-vcluster
destination:
server: https://kubernetes.default.svc
namespace: team-x
kubectl apply -f application.yaml
Add worker nodes to your virtual cluster.
vcluster token create
curl -sfLk "<URL with join token >" | sh -