Installation¶
Prerequisites¶
| Requirement | Minimum Version |
|---|---|
| Kubernetes | 1.32+ |
| Helm | 3.16+ or 4.x |
| Prometheus | 2.x (with container_cpu_usage_seconds_total and container_memory_working_set_bytes) |
| cert-manager | 1.12+ (for webhook TLS; optional if installing with --set webhooks.enabled=false) |
In-Place Pod Resize
Kubernetes 1.32+ is required because Attune uses the
In-Place Pod Resize
/resize subresource, which was added in 1.32.
On 1.32, you must enable the InPlacePodVerticalScaling feature gate
on the apiserver, controller-manager, scheduler, and all kubelets.
On 1.33+, the feature is enabled by default (beta).
Install with Helm (recommended)¶
Create a namespace and install the chart from the OCI registry:
kubectl create namespace attune-system
helm install attune \
oci://ghcr.io/attune-io/charts/attune \
--namespace attune-system
Prometheus address
The Prometheus address is configured per-policy in
AttunePolicy.spec.metricsSource.prometheus.address, per namespace via
the AttuneNamespaceDefaults CRD, or globally via the
AttuneDefaults CRD. It is not a Helm chart value.
If neither is set, the operator auto-discovers Prometheus by checking
for the Prometheus Operator CRD, then well-known service names
(prometheus-server, prometheus-kube-prometheus-prometheus) in
common namespaces.
Also available on Docker Hub
The container image is also published to Docker Hub at
docker.io/attuneio/attune for discoverability. For production
use, GHCR is recommended (no rate limits on public packages).
Upgrading¶
CRDs are not updated by helm upgrade
Helm's crds/ directory only installs CRDs on helm install.
Before upgrading, apply the latest CRDs manually:
kubectl apply --server-side --force-conflicts -f \
https://github.com/attune-io/attune/releases/latest/download/crds.yaml
helm upgrade attune \
oci://ghcr.io/attune-io/charts/attune \
--namespace attune-system
Install with OLM (OperatorHub)¶
If your cluster has the Operator Lifecycle Manager installed, you can install Attune directly from OperatorHub.io.
On OpenShift, search for "Attune" in the built-in OperatorHub catalog and click Install.
On other clusters with OLM, install the operator by creating a
Subscription:
# Ensure OLM is installed (https://olm.operatorframework.io/docs/getting-started/)
# Then create the subscription:
kubectl create -f https://operatorhub.io/install/attune.yaml
This subscribes to the stable channel and auto-updates when new versions
are published. The OLM bundle includes all CRDs, RBAC, and the operator
deployment.
Install with raw manifests¶
If you prefer not to use Helm, apply the static install manifest:
kubectl create namespace attune-system
kubectl apply -f \
https://github.com/attune-io/attune/releases/latest/download/install.yaml
Warning
The Prometheus address is configured per-policy in
AttunePolicy.spec.metricsSource.prometheus.address, per namespace via
AttuneNamespaceDefaults, or globally via the AttuneDefaults CRD.
Auto-discovery is also available
if neither is set (see the Helm installation tip above).
Verify the installation¶
Check that the operator pod is running:
kubectl -n attune-system get pods
Expected output:
NAME READY STATUS RESTARTS AGE
attune-6f8b4c7d9f-xk2pq 1/1 Running 0 30s
Verify that the three CRDs are registered:
kubectl get crds | grep attune
attunedefaults.attune.io 2026-01-15T00:00:00Z
attunenamespacedefaults.attune.io 2026-01-15T00:00:00Z
attunepolicies.attune.io 2026-01-15T00:00:00Z
kubectl plugin (optional)¶
The kubectl attune plugin provides quick access to recommendations,
savings estimates, and resize history.
# Install via Krew (recommended)
kubectl krew install attune
# Or build from source
make build-plugin && sudo cp bin/kubectl-attune /usr/local/bin/
See the CLI Reference for available commands.
Next steps¶
Head to the Quick Start to create your first AttunePolicy.