Napwake 0.2.0 is in release candidatesRead the changelog

30Get started
Menu

Open source · for Kubernetes

Non-prod environments that sleep when nobody’s using them, and wake when someone does.

Pauses idle Kubernetes workloads in staging, preview and dev, and wakes them on the first request.

It never deletes a workload or its data.

Free and open source under Apache 2.0.

What Napwake does with one environment

devasleepqaasleeppr-38awakepr-41asleepdemoasleeppr-42awakepr-57asleeppreview-7asleeppr-60awakeperfasleepsandboxasleep
The rooms are examples: kubectl napwake status shows yours.

01 Before you install

One command, and a report you can send your team.

A team that works 10 hours a day, five days a week, uses staging 50 of 168 hours. The other 70%, it’s idle. kubectl napwake scan shows your cluster’s own number before you install anything.

kubectl napwake scan
staging (EKS us-east-1): 31 workloads in 11 namespaces
Node autoscaler: Karpenter (consolidates when underutilized after 1m)
History: the last 7 days, from monitoring/prometheus-operated
 
  19 workloads are idle right now, reserving 28.5 vCPU and 77.5 GiB of memory.
  They cost $871/month while running, $1.19 an hour: each hour asleep frees that.
  Replaying the last 7 days, Napwake would have paused 24 of 26 unmanaged workloads for 2,796 hours in all,
  and freed $159: about $691/month.
  …
Report: /tmp/napwake-scan-2803149716.html (opened in your browser; --open=false to skip)
file:///tmp/napwake-scan-2803149716.htmlExample cluster
$ kubectl napwake scan
Open the example report
  1. Read-only. It runs with your kubeconfig, and installs nothing in the cluster.
  2. Lit for nobody: your cluster as a hotel at night, with what’s idle right now lit up, and what it costs while it runs, at your nodes’ list prices.
  3. With Napwake: the lights go off in the rooms nobody’s using, and the last week, replayed from Prometheus, says what pausing would have freed.

Send it to your team: it’s one self-contained file, with nothing loaded from elsewhere, and it prints cleanly to PDF. Open the example report in a new tab

02 Four doors

Every workload is a door.

Shut is asleep, ajar is waking up, open is awake. A note on the door means it needs you. The plain word first, then the one kubectl napwake status prints.

  • Asleep· paused

    Scaled to zero. The Deployment or StatefulSet stays, and so do its Services, its PVCs and their data. Only the pods are removed. Its Services now point at the doorman.

  • Waking up· resuming

    A request, an activity annotation or the forecast woke it. Its replicas are being restored, and requests wait at the door until a pod is Ready.

  • Awake· running

    Running as usual, with nothing in front of it. Its activity clock runs. After idleAfter with no sign of use, an hour by default, it’s paused again.

  • Needs you· needs attention

    A note pinned on the door. Something stops Napwake doing its job, and kubectl napwake status says what to fix.

03 How a wake works

Private doors open on a request.
Public ones can ask first.

Behind a VPN, single sign-on or an allowlist, the first request wakes a paused workload. On a public URL, most requests are robots. Set napwake.dev/wake: ask there, and the doorman asks first. Either way, the app and its Ingress don’t change.

Behind your VPN or SSO

The first request wakes it.

  1. 01 · Waking up

    Someone opens staging. The doorman holds the first request, and wakes it.

  2. 02 · Waking up

    Their browser gets the waking page at once. It reloads every 3 seconds.

  3. 03 · Awake

    A pod is Ready, and the page opens the app.

On a public URL

With napwake.dev/wake: ask, a person wakes it.

  1. 01 · Asleep

    Someone opens the preview. The doorman asks first. Their browser gets the asleep page, and nothing wakes.

  2. 02 · Waking up

    They press Wake it. That wakes it, and the waking page carries on.

  3. 03 · Awake

    A pod is Ready, and the page opens the app.

What everyone else gets while a workload is asleep, behind your VPN or SSO and on a public URL set to ask
Everyone elseBehind your VPN or SSOOn a public URL, set to ask
Scripts, API clients and database driversHeld until a pod is Ready, for up to wake.maxWait, 2 minutes by default. After that, the connection is closed and the wake goes on.Turned away. Over HTTP, a 503 that says how to wake it. Nothing wakes.
Known probes, scrapers and uptime monitorsA 503 at both doors, or a 200 for Google’s load balancer. Nothing wakes.
Tooling, by an annotation or kubectl napwake wakeWakes it, at both doors.
The forecast, if you turn it onWakes it 15 minutes before people usually come, at both doors.

It needs a readiness probe that passes only once the app can serve, so the held request reaches an app that’s ready. Behind your VPN or SSO, an HTTPS health check can’t be read, and wakes it every time. Wake on request, in the docs, has the cases where a caller sees something else.

04 Who it’s for

For any environment that isn’t production.

For platform and infrastructure engineers who run staging, preview and dev environments on their own Kubernetes clusters.

What it won’t do

  • Delete anything. Its one action is to pause, which scales a workload to zero. A StatefulSet whose PVCs would be deleted on scale-down is never paused.
  • Guess who’s a person. On an environment anyone can reach, set it to ask. Then only a click on Wake it wakes it, and robots are turned away.
  • Run to a timetable. It pauses on idleness, not at 8pm. A workload idle all afternoon is paused, and a request at midnight wakes it.
  • Replace your autoscaler. While a workload runs, its HPA or KEDA decides how many replicas it needs. Napwake only decides whether it should run at all.

How it compares

05 Start

Scan, then try one workload.

The Quickstart takes one workload from idle and costing money to paused while idle, measuring it in dry-run first so nothing pauses until you say so.

$ brew install napwake/tap/kubectl-napwake
$ kubectl napwake scan

Free and open source under Apache 2.0.