Skip to main content

Sleep Mode & Auto Delete

vCluster Platform provides two powerful features to reduce Kubernetes cost:

  • Sleep Mode which puts namespaces to sleep when nobody is using them, i.e. purging all pods while keeping all resources inside the namespaces during periods of inactivity
  • Auto-Delete which deletes namespaces that have been idle for a while

Both of these feature typically rely on Loft's inactivity detection.

Working with Sleep Mode​

With sleep mode, you can put namespaces to sleep which means that vCluster Platform will set replicas: 0 for all replica-controlled resources such as Deployments and StatefulSets inside the namespace. This means that Kubernetes will delete all pods but the entire configuration of resources within the namespace is still there.

Sleep mode can be:

  • Invoked manually
  • Triggered by an inactivity timeout (no one has run a kubectl command or accessed an ingress in this namespace for X minutes)

  • Scheduled using a CRON syntax

Manual + Automatic Sleep / Wake-up​

Start Sleep (manual)
  1. Click on Spaces to find the namespace that you want to put to sleep.

  2. Hover over the row of the namespace that you want to put to sleep.

  3. Click on the vertical ellipsis button and select Sleep to put the namespace to sleep.

  4. Notice how the Status column shows that the namespace is now sleeping.

Automatic Wakeup

Note that the namespace will automatically wake up again, once you run a kubectl command or send a Kubernetes request via another tool to the namespace.

Automatic Sleep Mode (individual namespace)
Manual Support only

This only works for namespaces without a template, if you want to change the sleep mode configuration for a namespace created by a template, it must be configured in the template.

  1. Click on Spaces to find the namespace that you want to put to configure automatic sleep mode for.

  2. Hover over the row of the namespace that you want to configure

  3. Click on Edit on the namespace that you want to edit.

  4. Use the Sleep After Inactivity (minutes) field to specify the time to wait before putting the namespace to sleep if there is no more user activity in this namespace.

  5. Click on the button to save the changes.

Wake up namespace
  1. In the Spaces view, hover over the namespace that you want to wake up.

  2. Click on the vertical ellipsis button and select Wake Up to wake up the namespace.

  3. Notice how the Status column shows that the namespace is now running again after a Pending state.

Scheduled Sleep / Wake-up​

Scheduled Sleep & Wake-Up (individual namespace)
Manual Support only

This only works for namespaces without a template, if you want to change the sleep mode configuration for a namespace created by a template, it must be configured in the template.

  1. In the Spaces view, hover over the namespace that you want to put to configure automatic sleep mode for.

  2. Click on the button.

  3. In the Definition section, under the Sleep Mode section. Use the Sleep Schedule field and/or the Wake-Up Schedule field to specify the Cronjob Times when the respective namespace should be put to sleep or woken up.

  4. [Optional] Input a Schedule Timezone for the timezone to apply the schedule.

  5. Click on the button to save the changes.

Working with Auto-Delete​

Loft lets you configure an auto-delete for namespaces that have not been used for a certain period of time (inactivity).

Configure Auto-Delete Timeout
Manual Support only

This only works for namespaces without a template, if you want to change the sleep mode configuration for a namespace created by a template, it must be configured in the template.

  1. In the Spaces view, hover over the namespace that you want to configure auto-delete for.

  2. Click on the button.

  3. Under the Sleep Mode section. Use the Delete After Inactivity (minutes) field to specify the time to wait before deleting the namespace if there was no more user activity within this namespace.

  4. Click on the button to save the changes.

Inactivity Detection​

All requests that are made through the platform count as activity in the namespace.

If your kube-context points to the platform's API server as a proxy before the actual connected cluster's API server, every kubectl request will be an activity and reset the inactivity timeout.

Ingress Requests​

For ingress-nginx based ingresses, activity detection also works automatically. Other ingress controllers are currently not supported. For nginx based ingresses, the platform will add a special annotation to each ingress that will track activity and reset the timer as soon as a request is made to that ingress.


Ingress Wakeup

vCluster Platform supports waking up a namespace through an ingress independent of the underlying ingress controller. Just navigate to the ingress host and you should see a wakeup page for the namespace.

Advanced Configuration​

Exclude Resources From Sleep​

The platform allows you to specify resources that should not sleep within a namespace by providing the annotation sleepmode.loft.sh/exclude: 'true' on either a Deployment, StatefulSet, ReplicaSet or Pod. For example the following Deployment would not sleep, if the namespace is sleeping:

apiVersion: apps/v1
kind: Deployment
metadata:
name: test
annotations:
sleepmode.loft.sh/exclude: "true"
spec:
replicas: 2
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: busybox
image: busybox
command:
- sleep
- "3600"

Long-Living Connections​

It's possible that certain requests such as kubectl exec or kubectl port-forward keep an active connection open to the namespace that prevents it from sleeping. This is in most cases wanted since the namespace shouldn't start sleeping when someone is still clearly using it, however there are cases where the connection might be idle (someone left the laptop open, but is not using it anymore) in which you want to terminate such connections and put the namespace to sleep.

There are multiple ways to approach this problem of active connections preventing a namespace from sleeping:

  1. You can tell the platform to timeout idle streaming connections (such as kubectl exec, kubectl port-forward etc.) after a certain time period with the annotation loft.sh/streaming-connection-idle-timeout: '3600' on a cluster. With this annotation set, the platform will close connections automatically that are idle after the given seconds. By default, the platform will not timeout any connections. This will only apply to new opened connections to that cluster and not affect already running connections.
  2. Tell the platform to ignore all active connections for determining namespace activity via the annotation sleepmode.loft.sh/ignore-active-conntections: 'true'. This will put a namespace to sleep even though there still might be open connections such as kubectl exec or kubectl port-forward.
  3. Configure your kubelets with the flag --streaming-connection-idle-timeout duration(see Kubernetes docs). This behaves essentially as option 1, however this configuration is independent of the platform.