This feature is only available when using the following worker node types:
This feature is an Enterprise feature. See our pricing plans or contact our sales team for more information.
Sleep mode
Not all workloads need to run continuously. Scaling them down saves time and reduces costs. With sleep mode, you can scale workloads based on a set schedule or user activity and ingress.
Sleep mode is intended for pre-production use cases only, and has limitations when used on a standalone vCluster not connected to the platform.
Enable sleep modeβ
To enable sleep mode, add the following configuration to your vcluster.yaml
:
sleepMode:
enabled: true
autoSleep:
afterInactivity: 1h
Sleep mode operationsβ
Sleep mode involves two main actions: sleeping and waking. These actions help save resources when the cluster is not in use.
Sleeping reduces resource consumption and costs during inactive periods.
- Delete bare pods: Pods not managed by controllers are removed permanently.
- Scale down resources: The following resources are scaled down to reduce resource usage:
- Deployments
- ReplicaSets
- ReplicationControllers
- DaemonSets
Waking restore scaled-down resources.
- Restore scaled-down resources: Deployments, ReplicaSets, ReplicationControllers, and DaemonSets are returned to their original state.
- Bare pods are not restored: Bare pods deleted during the Sleeping step cannot be recovered.
Resource exemption in sleep modeβ
In sleep mode, you can prevent specific resources from entering sleep mode by configuring them with the following options:
- Add the annotation
sleepmode.loft.sh/exclude: true
to the resource. - Configure
sleepMode
with specific labels to define which resources should remain active. This allows targeting specific resources based on their labels. - Add labels to workloads that you want to remain active. By using labels, it is possible to control which resources are exempt from sleep mode at a more granular level.
Detect activity in sleep modeβ
Sleep mode tracks certain actions to detect activity and wake the cluster when necessary. To wake a sleeping cluster or update the last active time, sleep mode captures the following actions:
- Accessing cluster resources through API calls (for example
kubectl get <resource>
). - Attempting to contact ingress endpoints (NGINX only).
Ingress activity detection works only with NGINX ingress controllers, using the mirror-target annotation. This overwrites any previously set mirror-target annotation.
Ignore other types of activity in sleep modeβ
The resource exemption feature keeps specifically configured resources active when the vCluster enters sleep mode. The Configure request handling for sleep mode table describes how to ignore requests that keep the cluster awake or wake it up if it is asleep.
Configure request handling for sleep mode table
Annotation | Behavior | Format |
---|---|---|
sleepmode.loft.sh/ignore-all | Ignore all activity. | true or false |
sleepmode.loft.sh/ignore-ingresses | Ignore requests to associated ingresses. | true or false |
sleepmode.loft.sh/ignore-groups | Ignore specified groups the requesting user belongs to. | group2,group3 |
sleepmode.loft.sh/ignore-resources | Ignore requests to specific resource types. | pods,resource2,resource3 |
sleepmode.loft.sh/ignore-verbs | Ignore requests with specific verbs. | create,verb1,verb2 |
sleepmode.loft.sh/ignore-resource-verbs | Ignore requests with specific verbs to specific resources. | myresource.mygroup=create update delete, myresource2.mygroup=create update |
sleepmode.loft.sh/ignore-resource-names | Ignore requests to specific resources with specific names. | myresource.mygroup=name1 name2,myotherresource.mygroup=name1 |
sleepmode.loft.sh/ignore-user-agents | Ignore specific user agents with trailing wildcard support. | kubectl*,argo,useragent3 |
sleepmode.loft.sh/disable-ingress-wakeup | Ignore ingress access. | true |
Add the annotations to the vCluster workload, such as the StatefulSet
or Deployment
running the virtual cluster. You can dynamically ignore any request by adding the X-Sleep-Mode-Ignore
header.
vCluster sleep mode compatibility with the platformβ
You can configure sleep mode in a virtual cluster in two ways:
-
Without an agent: This scales down workloads (like pods) while keeping the control plane active. The cluster remains in a minimal state and can wake up when activity is detected.
-
With an agent: When connected to the platform using an agent, the agent fully manages sleep mode by shutting down the control plane. This reduces resource usage more and enables features like auto-deletion, which arenβt available without the agent.
When a vCluster connects to the platform using an agent, the agent manages sleep mode actions by shutting down the control plane completely. This reduces resource usage and enables features like auto-deletion, which is not available when the vCluster is not connected to the platform using an agent.
Connect to the platformβ
When you connect a vCluster configured for sleep mode to the platform, it stops managing its own sleep mode actions and allows the agent to take control. This requires compatible versions of vCluster and the platform. The vCluster and platform version compatibility with agent installation table provides the steps needed for installing or uninstalling an agent.
vCluster and platform version compatibility with agent installation table
vCluster version | Platform version | Compatibility | Installing an agent | Uninstalling an agent |
---|---|---|---|---|
0.22.x | 4.2.x | β | Update the vCluster config manually, moving it from experimental to external.platform . Convert durations, such as "90m", into seconds, for example, "5400". Schema validation prevents both configurations from being applied at the same time. | Manually revert the configuration. |
0.23.x | 4.2.x | β | Update the vCluster config manually, moving it from experimental to external.platform . Convert durations, such as "90m", into seconds, for example, "5400". Schema validation prevents both configurations from being applied at the same time. | Manually revert the configuration. |
0.24.0 | <4.3.0 | β | These versions are not compatible, as the vCluster version is ahead of the platform, which causes the vCluster creation to be rejected. | Not applicable. |
0.24.0 | β₯4.3.0 | β | No action is required. The platform reads the unified vCluster config and takes over as if it had been configured for the platform all along. | Remove the annotation vcluster.loft.sh/agent-installed from the vCluster config secret in the host cluster to notify the vCluster that it needs to resume sleep mode. The secretβs name is vc-config-[vcluster-name] . |
β₯0.24.0 (future release) | β₯4.3.0 | β | No action is required. The platform reads the unified config and takes over as if it had been configured for the platform all along. | No action is required, and the vCluster resumes sleep mode for workloads only, not the control plane. |
- In version 0.23.x, the platform does not know how to wake a vCluster that has put itself to sleep. Ensure the vCluster is resumed before installing the agent to take over.
- In version 0.24.x, the
autoDelete
configuration is still underexternal.platform
and is set to move undersleepMode
in a later release.external.platform
to be moved under sleepMode in a future release.
Ingress configurationβ
Sync to hostβ
If you install ingress controllers in the vCluster, prevent them from sleeping. This keeps the controllers active and allows them to handle requests that would wake the vCluster. If you install the ingress controller in the host cluster, enable ingress syncing to the host.
sync:
toHost:
ingresses:
enabled: true
Reachability for ingress activity detectionβ
To enable ingress activity detection in your vCluster, ensure the following conditions are met:
- The ingress controller needs to be able to discover the vCluster pod to route traffic correctly.
- Ensure that the DNS lookup for
<vcluster-namespace>.<vcluster-svc-name>.svc.cluster.local
resolves properly. This allows the ingress controller to reach the vCluster's service address. - Ensure that the correct
dnsPolicy
is set in the ingress controller's Helm chart. This ensures DNS resolution works as expected and allows communication between the ingress controller and the vCluster.
Configure sleep mode in a virtual clusterβ
The following examples demonstrate how to configure sleep mode in a virtual cluster.
Ensure you install the necessary prerequisites.
Prerequisitesβ
-
Administrator access to a Kubernetes cluster: See Accessing Clusters with kubectl for more information. Run the command
kubectl auth can-i create clusterrole -A
to verify that your current kube-context has administrative privileges.infoTo obtain a kube-context with admin access, ensure you have the necessary credentials and permissions for your Kubernetes cluster. This typically involves using
kubectl config
commands or authenticating through your cloud provider's CLI tools. -
helm
: Helm v3.10 is required for deploying the platform. Refer to the Helm Installation Guide if you need to install it. -
kubectl
: Kubernetes command-line tool for interacting with the cluster. See Install and Set Up kubectl for installation instructions.
vCluster
: vCluster command-line tool to provision and manage virtual clusters.- Homebrew
- Mac (Intel/AMD)
- Mac (Silicon/ARM)
- Linux (AMD)
- Linux (ARM)
- Download Binary
- Windows Powershell
brew install loft-sh/tap/vcluster
The binaries in the tap are signed using the Sigstore framework for enhanced security.
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-darwin-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-darwin-arm64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
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
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-arm64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
Download the binary for your platform from the GitHub Releases page and add this binary to your $PATH.
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";
[Environment]::SetEnvironmentVariable("Path", $env:Path, [System.EnvironmentVariableTarget]::User);Reboot RequiredYou may need to reboot your computer to use the CLI due to changes to the PATH variable (see below).
Check Environment Variable $PATHLine 4 of this install script adds the install directory
%APPDATA%\vcluster
to the$PATH
environment variable. This is only effective for the current Powershell session, i.e. when opening a new terminal window,vcluster
may not be found.Make sure to add the folder
%APPDATA%\vcluster
to thePATH
environment variable after installing vcluster CLI via Powershell. Afterward, a reboot might be necessary.Confirm that you've installed the correct version of the vCluster CLI.
vcluster --version
docker
: Platform for building and running containerized applications.kind
: Tool for running local Kubernetes clusters in Docker.curl
: Command-line tool for transferring data over the network.
Deploymentβ
A deployment resource in Kubernetes manages a set of identical pods. Configuring sleep mode for a deployment scales down the pods while keeping the control plane active. This setup allows the virtual cluster to reduce resource usage while still being able to monitor activity and trigger wake-up actions when needed.
Configure sleep mode with a deployment resource
Ingress controllerβ
An ingress controller, such as NGINX, manages external HTTP/S traffic to services in a Kubernetes cluster. To configure sleep mode for the ingress controller, make sure it stays responsive to incoming traffic and can wake up the cluster if needed. This setup keeps the ingress controller active, even when the vCluster is in sleep mode and allows the controller to handle requests that trigger the virtual cluster to wake up.
Configure sleep mode with an ingress resource
Istio gatewayβ
Enable Istio integration for sleep mode to work with Istio resources.
When Istio is installed on the host cluster and the Istio integration is enabled, the vCluster syncs Gateway
and VirtualService
resources to the host cluster.
With sleep mode enabled, any traffic routed to a Service
in the vCluster is tracked as activity and keeps the vCluster awake. If the vCluster is asleep, incoming traffic wakes it up.
Configure an ingress gateway for cluster external access
Enable sleep mode with label selectors and schedulesβ
Use label selectors and schedules to configure sleep mode based on inactivity or specific timing:
Sleep mode label selectors and schedule
sleepMode:
enabled: true
autoSleep:
afterInactivity: 3h # Uses Go duration with a max unit of hour
exclude:
selector:
labels:
dont: sleep
sleepMode:
enabled: true
timeZone: America/Denver
autoSleep:
schedule: 30 17 * * 5
autoWakeup:
schedule: 0 7 * * 1
Config referenceβ
sleepMode
required object β
SleepMode holds the native sleep mode configuration for Pro clusters
sleepMode
required object βenabled
required boolean β
Enabled toggles the sleep mode functionality, allowing for disabling sleep mode without removing other config
enabled
required boolean βtimeZone
required string β
Timezone represents the timezone a sleep schedule should run against, defaulting to UTC if unset
timeZone
required string β