Kubernetes workload energy governance
Power down and restore workloads on schedule. Reduce cloud costs without manual intervention.
Most development workloads run 24/7 even though teams only use them 8-10 hours a day. That is 60% wasted compute. Aura Power lets you define when workloads should be on and automatically shuts them down outside those hours.
| Problem | Solution |
|---|---|
| Dev/staging clusters running overnight and weekends | Schedule-based power-off with automatic restore |
| No visibility into what is off and why | Web panel with real-time status and savings tracking |
| Fear of accidentally shutting down critical workloads | Guardrails: system namespace protection, ArgoCD/Helm detection, opt-in model |
| Complex tooling requiring cluster admin access | Web panel with role-based access (no kubeconfig needed) |
- Schedule-based governance Define time windows when workloads should be on. Outside those windows, they power off automatically.
- Priority-based conflict resolution Multiple policies can overlap. The highest priority wins. Temporary overrides can supersede policies.
- Guardrails System namespaces are never touched. Workloads managed by ArgoCD, Helm, or Flux are blocked by default (opt-in required).
- Web Panel Real-time dashboard with targets, rules, schedule visualization, metrics, and savings tracking.
- Prometheus + OpenCost integration Real cluster metrics (CPU, memory, nodes) and cost data from OpenCost.
- Split architecture Server (API + Panel) and Controller (Reconciler) run as separate workloads with isolated RBAC.
- CLI Terminal-based operations for scripting and automation.
flowchart TD
Users["Users (Browser / CLI)"]
Server["aura-power-server\n(API + Panel + Auth)\nStatefulSet"]
K8s["Kubernetes API\n(CRDs as message bus)"]
Controller["aura-power-controller\n(Reconciler + Discovery)\nDeployment with leader election"]
Workloads["Your Workloads\n(Deployments, StatefulSets, CronJobs)"]
Users --> Server
Server <-->|"read/write CRDs"| K8s
K8s <-->|"watch + reconcile"| Controller
Controller -->|"scale 0 / restore"| Workloads
style Server fill:#3B82F6,color:#fff,stroke:#1D4ED8
style Controller fill:#10B981,color:#fff,stroke:#059669
style K8s fill:#F59E0B,color:#000,stroke:#D97706
style Workloads fill:#6366F1,color:#fff,stroke:#4338CA
The server handles user interactions and serves the web panel. The controller runs reconciliation loops and executes power-down/restore actions. They communicate exclusively through CRDs.
helm install aura-power oci://ghcr.io/weauratech/charts/aura-power \
--namespace aura-system --create-namespace \
--set server.auth.jwtSecret=$(openssl rand -hex 32) \
--set server.auth.initialAdmin.password=changeme \
--set server.prometheus.url=http://prometheus.monitoring.svc:9090 \
--set server.gateway.enabled=true \
--set server.gateway.gatewayRef.name=my-gateway \
--set server.gateway.gatewayRef.namespace=gateway-ns \
--set server.gateway.gatewayRef.sectionName=https \
--set "server.gateway.hostnames[0]=power.example.com"helm install aura-power oci://ghcr.io/weauratech/charts/aura-power \
--namespace aura-system --create-namespace \
--set server.auth.jwtSecret=$(openssl rand -hex 32) \
--set server.auth.initialAdmin.password=changeme \
--set server.prometheus.url=http://prometheus.monitoring.svc:9090 \
--set server.ingress.enabled=true \
--set server.ingress.className=nginx \
--set server.ingress.host=power.example.com \
--set server.ingress.tls=true \
--set server.ingress.tlsSecretName=power-tlshelm install aura-power oci://ghcr.io/weauratech/charts/aura-power \
--namespace aura-system --create-namespace \
--set server.auth.jwtSecret=$(openssl rand -hex 32) \
--set server.auth.initialAdmin.password=changemeIf you configured an Ingress or Gateway API HTTPRoute, access the panel at the hostname you defined:
https://power.int.example.com
For local testing without Ingress:
kubectl port-forward -n aura-system statefulset/aura-power-server 8080:8080Login with the admin credentials you set during installation.
apiVersion: power.aura.sh/v1alpha1
kind: PowerPolicy
metadata:
name: dev-off-hours
namespace: aura-system
spec:
scope:
namespaces: [dev, staging]
schedule:
desiredState: "on"
windows:
- start: "08:00"
end: "18:00"
days: [1, 2, 3, 4, 5]
timezone: "America/Sao_Paulo"
priority: 10Workloads in dev and staging will power off outside 08:00-18:00 Mon-Fri.
# Single workload
kubectl annotate deployment my-app aura.sh/power-eligible=true
# All workloads in a namespace
kubectl annotate namespace dev aura.sh/power-eligible=true| Resource | Purpose |
|---|---|
PowerPolicy |
Recurring schedule for workload governance |
PowerTarget |
Auto-discovered workload with current state |
PowerOverride |
Temporary exception with automatic expiration |
PowerSchedule |
Named schedule definition (reusable) |
PowerAuditEvent |
Audit trail of all actions taken |
# OCI registry (recommended)
helm install aura-power oci://ghcr.io/weauratech/charts/aura-power
# With custom values
helm install aura-power oci://ghcr.io/weauratech/charts/aura-power -f values.yamlSee charts/aura-power/README.md for full configuration reference.
Pre-built binaries are available on the Releases page.
# Login to the server
aura-power login --server https://power.int.example.com --username admin
# Check status
aura-power status
# Explain a workload's state
aura-power explain dev/my-deployment
# View savings
aura-power savings# Prerequisites: Go 1.25+, Node.js 20+, Docker, Helm 3
# Run tests
make test-all
# Build all binaries
make build-all
# Build Docker images
make docker-build
# Lint
make lintSee CONTRIBUTING.md for the full development guide.
-
Discovery: The controller scans all namespaces for Deployments, StatefulSets, and CronJobs. Creates a
PowerTargetCRD for each. -
Evaluation: For each target, the engine evaluates all active policies and overrides. The highest-priority rule wins.
-
Execution: If the desired state is "off" and the workload is running, the controller scales it to zero (or suspends CronJobs). The original replica count or exact CronJob suspend state is stored in a snapshot for restoration.
-
Guardrails: Before executing, the controller checks for blocks: system namespaces, missing opt-in annotation, active HPAs, ArgoCD/Helm/Flux management. Blocked workloads are never touched.
-
Restoration: When the schedule window opens again, the controller restores workloads to their original state using the stored snapshot.
| Feature | Aura Power | kube-green | CAST AI |
|---|---|---|---|
| Schedule-based power management | Yes | Yes | Yes |
| Web panel | Yes | No | Yes |
| Priority-based conflict resolution | Yes | No | No |
| Temporary overrides | Yes | No | Yes |
| Guardrails (ArgoCD, Helm detection) | Yes | No | N/A |
| Role-based access control | Yes | No | Yes |
| Open source | Yes (Apache 2.0) | Yes (MIT) | No |
| Self-hosted | Yes | Yes | No |
| CronJob support | Yes | Yes | N/A |
| Savings tracking | Yes | No | Yes |
| Prometheus integration | Yes | No | Yes |
| CLI | Yes | No | Yes |
- Issues for bug reports and feature requests
- Discussions for questions and ideas
- Contributing Guide
- Security Policy
- Code of Conduct
Apache License 2.0. See LICENSE for details.
Built by Aura Tech
