Attestkeep docs

Install

One Helm command. The chart pulls straight from the registry — there is no repository to add.

Before you start

Install

# installs from the registry; no `helm repo add` needed
helm install attestkeep oci://ghcr.io/attestkeep/charts/attestkeep \
  --namespace attestkeep --create-namespace \
  --set clusterName=production-eu \
  --wait

clusterName is the one value worth setting on the first install, even for a trial. It is the label every notification and every evidence document uses to say which installation it came from, and it cannot be inferred from the cluster. Nothing topological leaves the cluster, so this is a name you choose, not a hostname.

Confirm it is running

kubectl -n attestkeep get pods
kubectl -n attestkeep port-forward svc/attestkeep 8080:8080

Then open http://localhost:8080. The first screen asks for an activation key; see Licensing for where to get one.

The database builds itself

Migrations are compiled into the binary and applied on first connection, each recorded so it runs exactly once. There is no SQL for you to run and no migration step to forget on upgrade.

To use a database you already run, put the DSN in a secret rather than on the command line — an inline value lands in your Helm release history and stays there.

kubectl -n attestkeep create secret generic attestkeep-db \
  --from-literal=dsn='postgres://user:pass@db.internal:5432/attestkeep?sslmode=require'

helm upgrade attestkeep oci://ghcr.io/attestkeep/charts/attestkeep \
  --namespace attestkeep \
  --set postgresql.enabled=false \
  --set externalDsnExistingSecret.name=attestkeep-db

Private registries

Nothing to configure. The operator resolves the same image pull secrets the pod references, and those on its service account, and uses them for both the scan and the signature check.

High availability

The webhook runs two replicas by default, spread across nodes by anti-affinity: one is enough to serve, two to survive a node. The serving certificate lives in a secret rather than on each replica, so a rotation reaches every replica without a restart.

Scanner replicas and volume access mode. Raising scanner.replicas above one while the scan cache is a ReadWriteOnce volume is refused at install. The volume binds to a single node, so the second replica would never schedule — better to fail at install than to leave a pod pending and let you find out later.

Uninstall

helm uninstall attestkeep --namespace attestkeep

Removing the release removes the webhook configuration with it, so admission stops being reviewed the moment it is gone. The database volume is not deleted; findings and evidence survive an uninstall unless you remove the PVC yourself.