Upgrade vCluster Platform
Upgrade vClustervClusterAn open-source software product that creates and manages tenant clusters within Kubernetes infrastructure. vCluster provides tenant isolation capabilities while reducing infrastructure costs. Platform using the vCluster CLI, Helm, or GitOps, matching however you originally installed it. If you installed in an air-gapped environment, see Upgrade in an air-gapped environment instead of the steps below.
If you are using a vCluster Platform version earlier than v4.0, upgrade to v4.0 first by following the v3 to v4 upgrade instructions.
Platform 4.12 also removes the resources that deployed apps before this release. If you have any apps deployed, see Upgrade to Platform 4.12 after completing the upgrade steps below.
Upgrade the platform
- Review the release notes for the target version to understand any breaking changes or new features.
- Test the upgrade in a non-production environment before applying it to your production setup.
Upgrade the platform using:
- CLI
- Helm
To upgrade the platform using the vcluster CLI, update $PLATFORM_VERSION with a valid platform version and run:
RELEASE_NAMESPACE=vcluster-platform # Replace with the namespace of the platform deployment if different
PLATFORM_VERSION='' # Set this to a specific version or leave empty for latest
vcluster platform start --upgrade --version=$PLATFORM_VERSION --namespace=$RELEASE_NAMESPACE --values=vcluster-platform.yaml
To upgrade the platform using helm, update $PLATFORM_VERSION with a valid platform version and run:
RELEASE_NAME=vcluster-platform # Replace with the release name if different
RELEASE_NAMESPACE=vcluster-platform # Replace with the namespace of the platform deployment if different
PLATFORM_VERSION='' # Set this to a specific version or leave empty for latest
helm upgrade $RELEASE_NAME vcluster-platform -n $RELEASE_NAMESPACE --repository-config '' --repo https://charts.loft.sh \
--version $PLATFORM_VERSION \
--reuse-values \
-f vcluster-platform.yaml
Helm 4 keeps the apply method a release was created with, so upgrades need no extra flags. If you switch a release to server-side apply with --server-side=true, the upgrade fails with a conflict on any field the platform has written itself. The most common one is data.config in the loft-manager-config secret after you edit the config in the UI. Add --force-conflicts to let Helm take ownership of those fields. Either way, keep the config section of your values file in sync with changes made in the UI. The upgrade replaces the secret with the values from the file.
The $PLATFORM_VERSION environment variable specifies the vCluster Platform version to deploy.
The vcluster-platform.yaml file is optional and defines Helm values to use when upgrading the vCluster Platform deployment.
Upgrade a GitOps-managed deployment​
If you installed the platform using GitOps (see Install with ArgoCD), upgrade by updating the chart version in your GitOps manifests and letting
your GitOps tool apply it, rather than running vcluster platform start or
helm upgrade directly against the cluster.
- ArgoCD
- Flux
Update spec.source.targetRevision on the platform Application to the
target version, then sync.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: vcluster-platform
namespace: argocd
spec:
source:
targetRevision: "4.12.0" # Replace with the target version
chart: vcluster-platform
repoURL: "https://charts.loft.sh"
Commit the change to the repository ArgoCD watches. With automated sync enabled, ArgoCD applies the new chart version on its next sync. To apply it right away instead of waiting, trigger a sync:
argocd app sync vcluster-platform
The platform creates and updates its own CRDs when it starts, so the
Application needs no CRD-specific sync options.
Update spec.chart.spec.version on the platform HelmRelease to the target
version, then reconcile.
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: vcluster-platform
namespace: vcluster-platform
spec:
chart:
spec:
version: "4.12.0" # Replace with the target version
chart: vcluster-platform
sourceRef:
kind: HelmRepository
name: vcluster-platform
Commit the change to the repository Flux watches. Flux applies the new chart version on its next reconciliation. To apply it right away instead of waiting, trigger a reconciliation:
flux reconcile helmrelease vcluster-platform -n vcluster-platform
The platform creates and updates its own CRDs when it starts, so the
HelmRelease needs no CRD policy settings.
Verify the upgrade​
These checks apply to every upgrade method. Replace vcluster-platform with
your platform namespace if you installed it elsewhere.
Wait for the rollout to finish.
kubectl rollout status deployment/loft -n vcluster-platform
Confirm the deployment runs the version you upgraded to.
kubectl get deployment -n vcluster-platform loft \
-o jsonpath='{.spec.template.spec.containers[0].image}'
The platform upgrades connected agents automatically once its own upgrade completes, so you don't upgrade them separately. To check one, run the same command against the connected cluster's context, using the namespace the agent is installed in.
If the rollout doesn't finish, inspect the pod and its logs.
kubectl get pods -n vcluster-platform -l app=loft
kubectl logs -n vcluster-platform -l app=loft --tail=50
Upgrade to Platform 4.12​
If you have apps deployed on a cluster, tenant cluster, or space, upgrading to Platform 4.12 doesn't disrupt them. Each app's underlying Helm release keeps running exactly as before. What changes is how the platform manages that release. Platform 4.12 removes the old resources that used to represent a deployed app:
- The old Task API.
- The HelmRelease resource, in both its cluster-scoped variant and the legacy
virtualcluster.loft.sh/v1API group variant. - The chart-discovery endpoints that backed the old Apps UI.
Once these are gone, the platform can no longer update, upgrade, or delete an app through the old flow. Until you migrate it, an app shows up as a plain Helm release with no platform-side management. Migrate each app to keep managing it through the platform.
This removal doesn't affect the spec.template.helmRelease field on a tenant cluster or tenant cluster template. That field describes the vCluster chart's own Helm release, and is unrelated to the removed app-deployment resources.
Migrate an existing app deployment​
These resources are replaced by AppInstance, which deploys an App into a tenant cluster, space, or connected cluster. Migrating an existing app to AppInstance is a UI action, not a CLI or API migration.
To find the migration action, open the App's cluster or tenant cluster and click the Apps button. This is the same view used to update an installed App.
The Apps table's Type column tells these apart. A Legacy App row shows the Migrate action when its original App still exists, and the App must include the version referenced by the Helm release. A Template App row is declared in the tenant cluster or space configuration itself, continues to use that configuration, and doesn't need this migration.
The Migrate action:
- Reads the app name and version from the annotations the old flow set on the existing Helm release.
- Opens a prefilled AppInstance form so you can review the release name, namespace, app version, and parameters before saving.
- Creates an AppInstance that runs
helm upgrade --installagainst the existing release name and namespace. This adopts the release in place instead of installing a second release.
Because saving the AppInstance performs a Helm upgrade, review the prefilled version and parameters first. Whether the application's workloads restart depends on the chart and resulting manifest changes.
Migrate each Legacy App that you want the platform to continue managing. There's no deadline, but an App remains unmanaged by the platform until you migrate it.
If the action isn't available, confirm that the original App and referenced version still exist. Restore the App definition before migrating, or manage the existing Helm release outside the platform.
Move standalone snapshot credentials​
Platform 4.12 ignores snapshots.auto.storage.<provider>.credential.secretNamespace for standalone tenant clusters, and instead always reads the credential Secret from the Platform project namespace that contains the VirtualClusterInstance.
Before upgrading each affected standalone tenant cluster:
- Find the credential
secretNameand anysecretNamespaceconfigured for S3, OCI, or Azure snapshot storage. - Copy or recreate that Secret in the Platform project namespace that contains the VirtualClusterInstance. Skip this step when the Secret is already there.
- Remove
secretNamespacefrom the tenant cluster configuration and any template that supplies it. - Confirm that the Secret contains the required keys for the configured storage provider.
snapshots:
auto:
storage:
type: s3
s3:
credential:
# Platform 4.12 ignores this namespace for standalone tenant clusters.
secretNamespace: backup-secrets
secretName: aws-credentials
snapshots:
auto:
storage:
type: s3
s3:
credential:
# Create this Secret in the VirtualClusterInstance project namespace.
secretName: aws-credentials
Pod-based tenant clusters continue to resolve secretNamespace in their connected control plane cluster. For standalone requirements and storage limitations, see Auto snapshots on standalone tenant clusters.