Basic Installation
Installing Kargo's cluster-side components (e.g. controllers and API server) with default configuration is quick and easy.
If you're looking for a more customized installation of cluster-side components, refer to Advanced Installation for steps, and Common Configurations for guidance on configuring Kargo to address common operational concerns.
If you're a developer looking for instructions for installing the Kargo CLI, see Installing the CLI.
The default configuration is suitable only for trying Kargo in a local cluster that is not internet-facing.
For detailed instructions for a secure installation, refer to Secure Configuration.
Prerequisites
You will need:
-
Helm: These instructions were tested with v3.13.1.
-
The Kargo CLI, to hash the admin account's password.
-
A Kubernetes cluster with cert-manager pre-installed.
notecert-manager is not an absolute dependency, but is required for installation with the default configuration.
The following dependencies are optional, but highly recommended to be pre-installed in your Kubernetes cluster:
-
info
Kargo works best when paired with Argo CD.
-
info
Kargo's verification feature makes use of Argo Rollouts
AnalysisTemplateandAnalysisRunresources internally.Kargo does not require that your application deployments also use Argo Rollouts.
These instructions were tested with:
- Kubernetes: v1.29.3
- cert-manager: v1.16.1
- Argo CD: v2.13.0
- Argo Rollouts: v1.7.2
Installation Steps
-
Generate a password, a signing key, and a database password.
There are no default values for these three fields, so you must provide your own.
Recommended commands for generating a complex password and signing key, for hashing the password as required, and for generating a password for the bundled database are:
pass=$(openssl rand -base64 48 | tr -d "=+/" | head -c 32)echo "Password: $pass"hashed_pass=$(kargo hash-password --password "$pass")signing_key=$(openssl rand -base64 48 | tr -d "=+/" | head -c 32)db_pass=$(openssl rand -base64 48 | tr -d "=+/" | head -c 32)The above commands will leave you with values assigned to
$hashed_pass,$signing_key, and$db_pass. These will be used in the next step. -
Install Kargo with default configuration and your chosen admin account password:
helm install kargo \oci://ghcr.io/akuity/kargo-charts/kargo \--namespace kargo \--create-namespace \--set api.adminAccount.passwordHash=$hashed_pass \--set api.adminAccount.tokenSigningKey=$signing_key \--set database.postgres.password=$db_pass \--wait
Database
The chart installs a minimal PostgreSQL instance alongside Kargo. It runs as
a single, unreplicated instance with no backups or tuning and is meant for
evaluation and development. To use your own database instead, set
database.postgres.enabled to false and point database.external.secretName
at a Secret holding its connection string.
The bundled instance's kargo user is protected by the password you provide
as database.postgres.password, as in the installation steps above. Like the
admin account's token signing key, it is stored in plaintext. To keep it out of
your values, create a Secret in Kargo's namespace holding the password under
the key password and set database.postgres.existingSecret to its name; the
chart then stores no password itself. This is the recommended approach when
installing with a GitOps tool such as
Argo CD.
Schema migrations
On every install and upgrade, the chart runs a Job that applies any pending
database schema migrations. The migrations are embedded in the Kargo image,
and the Job applies them with that image's migrate subcommand, so the
schema it produces is the one the installed version expects. It waits for the
database to accept connections, serializes with any other runner against the
same schema on a lock, and leaves its Pod in place after finishing so that its
logs can be inspected. The next upgrade replaces the Job, and the previous
one is pruned with it.
The Job is an ordinary resource rather than a Helm hook, so it also works
when the chart is rendered with helm template, as GitOps tools do. Ordering
does not matter: the Job waits for the database, and Kargo's components
refuse to serve against a schema that is behind the version they expect.
To apply migrations yourself, for example from a pipeline that manages schema
changes with its own approvals, set database.migrations.enabled to false
and run the same subcommand from the Kargo image against your database:
docker run --rm -e DATABASE_URL='postgres://...' ghcr.io/akuity/kargo:<version> migrate
The migrate subcommand belongs to the control plane binary in the Kargo
image, not to the kargo CLI you install locally.
Migrations are forward-only and each release's schema remains compatible with the previous release's code, so a rollback of Kargo does not require a rollback of the schema.
Troubleshooting
Kargo installation fails with a 401
Verify that you are using Helm v3.13.1 or greater.
Kargo installation fails with a 403
It is likely that Docker is configured to authenticate to ghcr.io with an
expired token. The Kargo Helm chart and images are publicly accessible, so this
issue can be resolved simply by logging out:
docker logout ghcr.io