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: falseFor 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-1Make 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-1For 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: NodePortInstall the CLI and launch your virtual cluster in seconds.
brew install loft-sh/tap/vclustervcluster create vc-tenant-1 -f vcluster.yamlvcluster create --upgrade vc-tenant-1 -f vcluster.yamlIf 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 vclustervcluster create my-vcluster --namespace team-xmd -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-xhelm 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 applyapiVersion: 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-xkubectl apply -f application.yamlInstall the CLI and launch your virtual cluster in seconds.
brew install loft-sh/tap/vclustervcluster platform startvcluster create vc-tenant-1 -f vcluster.yamlvcluster create --upgrade vc-tenant-1 -f vcluster.yamlIf 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 vclustervcluster platform startvcluster create my-vcluster --namespace team-xmd -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 startvcluster create my-vcluster --namespace team-xhelm 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 applyapiVersion: 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-xkubectl apply -f application.yamlAdd worker nodes to your virtual cluster.
vcluster token createcurl -sfLk "<URL with join token >" | sh -