# Akuity Platform Documentation
> Akuity is a fully-managed Kubernetes application delivery platform powered by Argo. The Akuity Platform offers managed Argo CD and Kargo, GitOps tooling, AI-powered observability and remediation through Akuity Intelligence, and a self-hosted deployment option for regulated and air-gapped environments.
This file contains all documentation content in a single document following the llmstxt.org standard.
## Akuity Platform Architecture
The Akuity Platform automates the deployment of the upstream version of Argo CD, but packages it in a unique hybrid architecture that significantly improves performance and scalability.
## Control Plane vs. Data Plane
There are two common approaches to deploying Argo CD:
- in a control plane cluster that manages multiple workload clusters.
- in each workload cluster.
Argo CD in a control plane cluster provides the better experience for developers by serving as a single pane of glass for the whole company infrastructure. However, it requires some security compromises and introduces management and scalability challenges. For an in-depth comparison, see our [*How many do you need? - Argo CD Architectures Explained*](https://akuity.io/blog/argo-cd-architectures-explained/) blog post.
One of the unique innovations of the Akuity Platform is that **it separates Argo CD’s data plane from the control plane** and allows to get the best of both worlds.
The Akuity Platform hosts and manages the Argo CD frontend - the control plane that enables developers to manage the desired state of their applications and gain visibility into the state of managed infrastructure. The Argo CD Application Controller, however, is running inside of the managed workload clusters and seamlessly connected back to the control plane by the Akuity Agent.

This separation allows to move the most critical Argo CD component closer to the infrastructure it manages and provides numerous benefits:
* **Improved security**. The Argo CD controller is running inside of the managed cluster, so no external cluster access is required. You can leverage the Akuity Platform to
manage private clusters without exposing Kubernetes API server.
* **Less Management Burden**. No cluster access means no cluster credentials. Administrators no longer need to store and maintain cluster credentials in Argo CD
settings and deal with revoked access tokens.
* **Improved Scalability**. Higher scalability is achieved by allowing the work of the controller to be distributed and delegated to individual clusters.
* **Less Networking Costs**. With the controller running in the managed cluster the heavy Kubernetes resource processing happens in-cluster instead of over the network.
Only the relevant pieces of metadata presented in the Argo CD UI are sent over the network. In our real-world testing, this has been shown to reduce traffic consumption
by as much as **80%**.
To summarize, the Akuity Platform provides a single Argo CD interface for managing infrastructure across many clusters, _without_ the compromises on security or scalability that would typically be required.
## Flexible Architecture
Argo CD consists of several components that serve different purposes. The following diagram shows the high-level architecture of Argo CD:

* **API server** - the stateless service that provides the API and UI for Argo CD.
* **Application Controller** - the Kubernetes controller that continuously reconciles the state of managed applications and applies changes from Git to managed Kubernetes clusters.
* **Application Set** - the controller that automates Argo CD application management.
* **Image Updater** - the controller that monitors Docker registries and automatically updates image tags in Git repositories.
* **Repo Server** - the service responsible for interacting with Git and generating manifests using config management tools such as
[Helm](https://helm.sh/) or [Kustomize](https://kustomize.io/).
* **Dex** - the OpenID Connect identity provider used for authentication and authorization.
With the unqiue agent-based architecture for Argo CD provided by the Akuity Platform, **the location of the Application Set, Repo Server, and Image Updater components is configurable**.
Depending on the use case the desired location of some components varies. For example, some organizations choose to run Repo Server in each cluster, closer to managed workloads. Other organizations prefer to have tighter control over the Git repository and like to run Repo Server in a dedicated cluster with Git access.
---
## Akuity Platform Overview
The Akuity Platform is a fully-managed Kubernetes application delivery platform powered by Argo.
## Getting started
To get up and running as quickly as possible, checkout the [getting started guide](03-argocd/01-getting-started/10-create-argo-cd-instance.mdx) that will walk you through the fundamentals of the Akuity Platform in just minutes and leave you with a fully operational Argo CD instance.
## What is Argo?
Argo is a set of open source tools for Kubernetes to run workflows, manage clusters, and implement the GitOps operational framework.
For more info about Argo go to [the Argo Project website](https://argoproj.github.io/).
## Minimum knowledge required
To use this documentation and the Akuity Platform effectively, basic familiarity with the following technologies and concepts is suggested:
- Containerization ([Docker](https://www.docker.com/), [containerd](https://containerd.io/), etc.)
- [Kubernetes](https://kubernetes.io)
- Application lifecycle management
- [GitOps](https://akuity.io/gitops)
- [Argo CD](https://argo-cd.readthedocs.io)
## How to give feedback and get help?
If you have any feedback regarding this documentation or the product, please [send us an email](mailto:info@akuity.io).
For help please reach out to us through [the contact form on our website](https://akuity.io/connect-with-akuity).
---
## Akuity Platform Networking Requirements
### Egress Traffic Rules
- Allow port `443` (TCP) for secure HTTPS and TCP communication.
### Domain Access
The following domains need to be configured and allowlisted for access :
#### US Region
- `akuity.cloud`
- `*.cd.akuity.cloud`
- `*.cdsvcs.akuity.cloud`
- `*.kargo.akuity.cloud`
- `*.kargosvcs.akuity.cloud`
#### EU Region
- `eu.akuity.cloud`
- `*.cd.eu.akuity.cloud`
- `*.cdsvcs.eu.akuity.cloud`
- `*.kargo.eu.akuity.cloud`
- `*.kargosvcs.eu.akuity.cloud`
### IP Allowlisting
#### Akuity Platform IPs
If your workload cluster restricts egress traffic by IP, add the following Akuity Platform addresses to your cluster's allow list so that the Akuity Platform Agent can reach the Akuity Platform:
##### US Region :
```
35.83.167.172
35.164.149.26
44.227.111.216
13.248.239.50
166.117.206.69
```
##### EU Region :
```
63.180.120.65
3.74.238.191
63.180.42.11
166.117.35.43
99.83.186.100
```
#### Outbound IPs for External Service Allowlisting
When Akuity Platform components _on the controlplane_ (one notable example is when an app-of-apps is used) connects to your external services (such as Git repositories, container registries, or other endpoints), its outbound traffic originates from the following IP addresses. If your external service restricts access by IP — for example, when using [GitHub App IP allow lists](https://docs.github.com/en/organizations/managing-organization-settings/restricting-access-to-your-organizations-ip-allow-list) — add these addresses to permit access:
##### US Region:
```
52.40.235.49
35.85.123.223
52.32.37.241
```
##### EU Region:
```
63.177.220.72
3.68.60.214
3.120.93.7
```
#### Cloudflare IPs
The Akuity Platform uses Cloudflare as a sub-processor to provide CDN and security services. Cloudflare only processes limited network-level metadata (IP addresses and HTTP request data) and does not access or retain customer application data, credentials, or stored content. Cloudflare is compliant with ISO 27001, SOC 2 Type II, PCI-DSS, GDPR, and other leading security standards.
When accessing resources behind IP allowlists (such as private Git repositories or artifact registries), you must add Cloudflare's IP ranges to your allowlist. This ensures that traffic from the Akuity Platform, which routes through Cloudflare, can successfully reach your protected resources.
[Cloudflare IP Ranges](https://www.cloudflare.com/ips/)
For more information about Akuity's sub-processors, see the [Sub-Processor list](https://trust.akuity.io).
---
## Bring Your Own Key (BYOK)
> **Availability:** Enterprise plan add-on — this feature is not included by default with the Enterprise plan. Contact your account team to discuss pricing and enablement.
## Overview
By default, Akuity Platform encrypts all sensitive data (cluster credentials, API secrets, notification configurations, and more) at rest using Akuity-managed encryption keys.
With **Bring Your Own Key (BYOK)**, you can supply your own encryption key material. Your organization's data will be encrypted exclusively with your key, giving you:
- **Key material ownership** — you generate the cryptographic key material used to protect your data
- **Org-scoped isolation** — your data is encrypted with a key distinct from other customers
- **Key rotation control** — if you ever need to rotate your key, the platform handles re-encryption automatically
This is designed for organizations with strict data governance requirements, compliance mandates (SOC 2 Type II, FedRAMP, HIPAA, etc.), or internal policies requiring customer-supplied key material.
---
## How it works
1. **You generate a key** — a 32-byte cryptographically random value, base64-encoded (see below).
2. **You share it with Akuity securely** — send the key to your account team via an approved secure channel (e.g., 1Password share link, encrypted email). Do not send it in plain text over Slack or email.
3. **Akuity provisions the key** — your account team registers it with the platform, scoped to your organization.
4. **All new writes use your key** — from that point forward, any sensitive field written for your organization is encrypted with your key material.
5. **Existing data is migrated** — a background re-encryption job re-encrypts any data previously written with the platform-managed key.
---
## Generating a key
Your key must be a **32-byte cryptographically random value**, base64-encoded. Use one of the following methods:
**Linux / macOS (openssl):**
```bash
openssl rand -base64 32
```
**Linux / macOS (dd + /dev/urandom):**
```bash
dd if=/dev/urandom bs=32 count=1 2>/dev/null | base64
```
The output will be a 44-character base64 string, for example:
```
4K1tGHHqhJPYSbMgTnfnUsCaZb9P1w7Fl3Xu8Ae1RJA=
```
**Requirements:**
- Exactly 32 bytes of random data (256-bit key)
- Base64-encoded
- Generated using a cryptographically secure random source — do not use general-purpose random number generators
---
## Key rotation
If you need to rotate your encryption key (for example, due to a security incident or internal compliance policy), contact your Akuity account team. Here is how the process works:
1. Generate new key material using the method above.
2. Share it with your Akuity account team via a secure channel.
3. The platform provisions the new key as the active key for your organization.
4. A background re-encryption job migrates existing data to the new key.
5. The old key remains available for decryption until migration completes, then is retired.
No downtime is required during rotation.
---
## Requirements and limitations
- Available as a **paid add-on** for Enterprise plans only — not included by default. Contact your account team.
- Key provisioning is handled by Akuity — you supply the key material, and your account team registers it on your behalf.
- Key material must be a 32-byte cryptographically random value, base64-encoded.
---
---
## Private Connectivity (AWS PrivateLink)
> **Availability:** Enterprise plan feature, currently available for AWS only. Contact your account team to enable it for your organization. Not available on self-hosted installations.
## Overview
By default, your Argo CD and Kargo instances (and the Akuity Agents connected to them) communicate with the Akuity Platform over the public internet, protected by TLS and optional IP allow lists.
With **private connectivity**, this traffic flows over [AWS PrivateLink](https://aws.amazon.com/privatelink/) instead: the Akuity Platform exposes a VPC endpoint service, and your VPCs reach it through interface endpoints. Traffic never leaves the AWS network.
Private connectivity can be enabled independently for:
- The **instance** (the Argo CD or Kargo dashboard and API)
- Each **cluster or agent** (the Akuity Agent's connection to the control plane)
You can mix both modes — for example, keep the dashboard public while agents in your production VPC connect privately.
## How it works
1. You connect your AWS account to your Akuity organization. The Akuity Platform allow-lists the account on its VPC endpoint service.
1. You create an interface endpoint in your VPC pointing at the Akuity endpoint service, with private DNS enabled.
1. You switch instances, clusters, or agents to Private. They receive private hostnames that resolve to your interface endpoint and are unreachable from the public internet.
## Connecting an AWS account
1. Navigate to Organization Settings → Private Connectivity.
1. Click Add and enter your 12-digit AWS Account ID.
1. Click the info icon next to the account to open its connection details, and note the AWS Service Name for each region — you need it to create the interface endpoint in the next step.
:::note
An AWS account can be connected to only **one** Akuity organization. If the account is already connected to another organization (including one where it is still pending removal), adding it will fail.
:::
## Creating the interface endpoint
In each VPC that needs private connectivity (for example, the VPCs of clusters running the Akuity Agent):
1. Make sure the VPC has both DNS resolution and DNS hostnames enabled — private DNS does not work without them.
1. In the AWS console, go to VPC → Endpoints → Create endpoint.
1. For Service category, select Other endpoint services, enter the AWS Service Name from the connection details, and click Verify service.
1. Select the VPC, then choose one subnet per Availability Zone where your clients (for example, the cluster nodes) run.
1. Keep the IP address type as IPv4.
1. Attach a security group that allows **inbound** TCP `443` from your clients (for example, the VPC or cluster CIDR). Clients connect *to* the endpoint's network interfaces, so an outbound-only rule is not enough.
1. Under Additional settings, enable DNS name (private DNS). This makes the Akuity private hostnames resolve to your interface endpoint inside the VPC.
Connections are accepted automatically. Once the endpoint is available, its state appears in the connection details in the dashboard.
For a detailed walkthrough of each option, see the AWS documentation on [creating an interface endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html).
:::note
Create the endpoint in a region the Akuity endpoint service supports (shown in the connection details). Clients in other regions can still use it over VPC peering or Transit Gateway, or you can create a cross-region interface endpoint if your region is listed as supported.
:::
## Enabling private connectivity
### Argo CD or Kargo instance
1. Navigate to Settings → External Access on the instance.
1. Under Private Connectivity, select Private.
1. Click Save.
The instance's hostname changes to a private hostname (shown in the dashboard), which only resolves and routes inside VPCs with an interface endpoint. Switching back to Public restores the public hostname.
:::note
A private instance cannot use a custom domain (FQDN) — the two settings are mutually exclusive. Remove the custom domain before switching to private.
:::
### Clusters and agents
Each Argo CD cluster and Kargo agent has its own Private Connectivity setting, available when connecting it or editing it later. Agents switched to Private reach the control plane through your interface endpoint instead of the public internet.
To change the default for newly connected agents, use Private Connectivity under the instance's agent default settings. To change many existing agents at once, use the batch update in the agent customization settings.
:::note
Integration (direct) clusters are agentless and always use public connectivity. Akuity-managed Kargo agents are also always public.
:::
## Disconnecting an AWS account
Disconnect an account from Organization Settings → Private Connectivity using the delete action next to it.
Disconnecting the **last** account is blocked while any instance, cluster, or agent in the organization still uses private connectivity — the error message lists the affected instances. Switch them to Public first, then disconnect the account.
:::caution
After the account is removed from the allow list, existing interface endpoints in that account stop working. Delete them on the AWS side to avoid confusion and costs.
:::
---
## Verifying Images
Akuity continuously scans its published images for known vulnerabilities (CVEs) and publishes the results of that triage as [OpenVEX](https://openvex.dev/) assessments. VEX ("Vulnerability Exploitability eXchange") records, for each CVE a scanner might flag, whether the image is actually affected — and when it is not, _why_ (for example, the vulnerable code is present in a bundled OS library but is never reachable in an execute path). Folding these assessments into your own scans drops the false positives Akuity has already triaged.
The assessments are attached to **each image digest** as a signed [cosign](https://github.com/sigstore/cosign) attestation (keyless, via Sigstore / GitHub OIDC), so they travel with the image — there is no extra endpoint to configure, and the signature proves Akuity authored the assessment for exactly the image you are running. They cover the publicly available Akuity images you run in your own clusters, on **both Akuity Cloud and self-hosted**:
- `quay.io/akuity/agent` — the Akuity agent
- `quay.io/akuity/argocd` — Akuity's Argo CD build
- `ghcr.io/akuity/kargo` — Kargo
## Apply the assessments with Grype
Verify and extract the attestation, then pass it to [Grype](https://github.com/anchore/grype) with `--vex`. Verifying first means you only apply assessments whose Akuity signature checks out:
```bash
IMAGE=quay.io/akuity/agent: # or quay.io/akuity/argocd, ghcr.io/akuity/kargo
# Verify Akuity's signature and extract the OpenVEX document in one step.
# A digest may carry more than one attestation (assessments are appended as
# dispositions change), so take the most recent by timestamp.
cosign verify-attestation --type openvex \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity https://github.com/akuityio/cve-triage/.github/workflows/attest-vex.yml@refs/heads/main \
"$IMAGE" \
| jq -s 'map(.payload | @base64d | fromjson | .predicate) | max_by(.timestamp)' > akuity-vex.json
# Scan, applying the assessments. CVEs Akuity has marked not_affected are
# suppressed (Grype lists them under its ignored set with vex-status
# not_affected) and annotated with the justification.
grype "$IMAGE" --vex akuity-vex.json
```
A CVE is suppressed only when Akuity has dispositioned it **and** your scanner still reports it — assessments are added as CVEs are triaged, so a freshly built image may surface findings that are not yet dispositioned.
## Verify provenance only
To simply confirm that an image carries an authentic Akuity assessment (for example, as a release gate), run the `verify-attestation` step on its own; it exits non-zero if the signature or signer identity does not match:
```bash
cosign verify-attestation --type openvex \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity https://github.com/akuityio/cve-triage/.github/workflows/attest-vex.yml@refs/heads/main \
quay.io/akuity/argocd:
```
:::info Scope of the assessments
Akuity attaches an assessment to the **latest patch of each supported release line**. An assessment pertains to that specific digest; older patches keep the assessment they received while they were current. Suppression is keyed to the exact package versions present in the image, so an assessment authored for one patch will not mis-apply to an image built from different package versions.
The attestation is signed by Akuity's vulnerability-triage workflow, a distinct identity from the workflow that builds and signs each release image.
:::
---
## Argo CD Security-Hardened Images
### Security Scan 2026-08-10
Argo CD security-hardened images include precisely what is needed to run Argo CD. As a result, we build smaller-sized images with a reduced number of CVEs. By not including a package manager and inserting the needed runtime dependencies, the attack surface is significantly reduced.
Below you will find the weekly-updated security scans of Akuity's security-hardened Argo CD images compared with the open source images.
---
## Akuity v2.14.21-distroless vs Argo CD v2.14.21
[Full list of open source Argo CD vulnerabilities in this release](https://argo-cd.readthedocs.io/en/latest/snyk/v2.14.21/quay.io_argoproj_argocd_v2.14.21.html)
quay.io/akuity/argocd:v2.14.21-distroless
Vulnerabilities (34)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
busybox
CVE-2023-39810
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26157
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26158
HIGH
1.37.0-r50
1.37.0-r58
git-lfs
CVE-2025-68121
CRITICAL
3.7.1-r0
3.7.1-r4
git-lfs
CVE-2025-61726
HIGH
3.7.1-r0
3.7.1-r3
git-lfs
CVE-2025-61731
HIGH
3.7.1-r0
3.7.1-r3
git-lfs
CVE-2025-61732
HIGH
3.7.1-r0
3.7.1-r4
git-lfs
CVE-2026-27140
HIGH
3.7.1-r0
3.7.1-r14
git-lfs
CVE-2026-32280
HIGH
3.7.1-r0
3.7.1-r14
git-lfs
CVE-2026-32281
HIGH
3.7.1-r0
3.7.1-r14
git-lfs
CVE-2026-32283
HIGH
3.7.1-r0
3.7.1-r14
git-lfs
CVE-2026-33814
HIGH
3.7.1-r0
3.7.1-r12
git-lfs
CVE-2026-56852
HIGH
3.7.1-r0
3.7.1-r18
libcrypto3
CVE-2026-31789
CRITICAL
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2025-15467
HIGH
3.6.0-r3
3.6.1-r0
libcrypto3
CVE-2025-69421
HIGH
3.6.0-r3
3.6.1-r0
libcrypto3
CVE-2026-28386
HIGH
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2026-28387
HIGH
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2026-28388
HIGH
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2026-28389
HIGH
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2026-28390
HIGH
3.6.0-r3
3.6.2-r0
libcrypto3
CVE-2026-45447
HIGH
3.6.0-r3
3.6.3-r0
libexpat1
CVE-2026-25210
HIGH
2.7.3-r0
2.7.4-r0
libexpat1
CVE-2026-45186
HIGH
2.7.3-r0
2.8.1-r0
libexpat1
CVE-2026-56408
HIGH
2.7.3-r0
2.8.2-r0
libssl3
CVE-2026-31789
CRITICAL
3.6.0-r3
3.6.2-r0
libssl3
CVE-2025-15467
HIGH
3.6.0-r3
3.6.1-r0
libssl3
CVE-2025-69421
HIGH
3.6.0-r3
3.6.1-r0
libssl3
CVE-2026-28386
HIGH
3.6.0-r3
3.6.2-r0
libssl3
CVE-2026-28387
HIGH
3.6.0-r3
3.6.2-r0
libssl3
CVE-2026-28388
HIGH
3.6.0-r3
3.6.2-r0
libssl3
CVE-2026-28389
HIGH
3.6.0-r3
3.6.2-r0
libssl3
CVE-2026-28390
HIGH
3.6.0-r3
3.6.2-r0
libssl3
CVE-2026-45447
HIGH
3.6.0-r3
3.6.3-r0
usr/local/bin/argocd
Vulnerabilities (44)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/argoproj/argo-cd/v2
CVE-2026-45738
HIGH
2.14.21
github.com/expr-lang/expr
CVE-2025-68156
HIGH
v1.17.0
1.17.7
github.com/go-git/go-billy/v5
CVE-2026-44973
HIGH
v5.6.2
5.9.0
github.com/go-git/go-git/v5
CVE-2026-45022
HIGH
v5.13.2
5.19.0
github.com/go-git/go-git/v5
CVE-2026-71556
HIGH
v5.13.2
5.19.2
github.com/go-jose/go-jose/v4
CVE-2026-34986
HIGH
v4.0.2
4.1.4
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.4.0
0.5.1
go.opentelemetry.io/otel/sdk
CVE-2026-24051
HIGH
v1.33.0
1.40.0
go.opentelemetry.io/otel/sdk
CVE-2026-39883
HIGH
v1.33.0
1.43.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.37.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.37.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.37.0
0.52.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.39.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.39.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.39.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.39.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.24.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.24.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.68.1
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.68.1
1.82.1
oras.land/oras-go/v2
CVE-2026-50151
HIGH
v2.5.0
2.6.1
oras.land/oras-go/v2
CVE-2026-50163
HIGH
v2.5.0
2.6.2
stdlib
CVE-2025-68121
CRITICAL
v1.24.6
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2025-61726
HIGH
v1.24.6
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.24.6
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.24.6
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.24.6
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.24.6
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.24.6
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.24.6
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.24.6
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.24.6
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.24.6
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.24.6
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.24.6
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.24.6
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.24.6
1.25.11, 1.26.4
usr/local/bin/gpg-wrapper.sh
Vulnerabilities (16)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
stdlib
CVE-2025-68121
CRITICAL
v1.21.13
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.13
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.13
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.13
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.13
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.13
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.13
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.13
1.25.11, 1.26.4
usr/local/bin/helm
Vulnerabilities (43)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/containerd/containerd
CVE-2024-25621
HIGH
v1.7.23
1.7.29
github.com/containerd/containerd
CVE-2026-53488
HIGH
v1.7.23
1.7.33
github.com/docker/cli
CVE-2025-15558
HIGH
v25.0.1+incompatible
29.2.0
github.com/docker/docker
CVE-2026-34040
HIGH
v25.0.6+incompatible
29.3.1
github.com/docker/docker
CVE-2026-41567
HIGH
v25.0.6+incompatible
github.com/docker/docker
CVE-2026-42306
HIGH
v25.0.6+incompatible
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.4.0
0.5.1
golang.org/x/crypto
CVE-2024-45337
HIGH
v0.27.0
0.31.0
golang.org/x/crypto
CVE-2025-22869
HIGH
v0.27.0
0.35.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.27.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.27.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.27.0
0.52.0
golang.org/x/net
CVE-2024-45338
HIGH
v0.26.0
0.33.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.26.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.26.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.26.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.26.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.21.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.18.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.65.0
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.65.0
1.82.1
stdlib
CVE-2025-68121
CRITICAL
v1.22.7
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2025-61726
HIGH
v1.22.7
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.22.7
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.22.7
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.22.7
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.22.7
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.22.7
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.22.7
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.22.7
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.22.7
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.22.7
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.22.7
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.22.7
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.22.7
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.22.7
1.25.11, 1.26.4
usr/local/bin/kustomize
Vulnerabilities (17)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
golang.org/x/text
CVE-2026-56852
HIGH
v0.16.0
0.39.0
stdlib
CVE-2025-68121
CRITICAL
v1.21.12
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.12
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.12
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.12
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.12
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.12
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.12
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.12
1.25.11, 1.26.4
---
## Akuity v2.13.9-distroless vs Argo CD v2.13.9
[Full list of open source Argo CD vulnerabilities in this release](https://argo-cd.readthedocs.io/en/latest/snyk/v2.13.9/quay.io_argoproj_argocd_v2.13.9.html)
quay.io/akuity/argocd:v2.13.9-distroless
Vulnerabilities (35)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
busybox
CVE-2023-39810
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26157
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26158
HIGH
1.37.0-r50
1.37.0-r58
git-lfs
CVE-2025-68121
CRITICAL
3.7.0-r1
3.7.1-r4
git-lfs
CVE-2025-61726
HIGH
3.7.0-r1
3.7.1-r3
git-lfs
CVE-2025-61731
HIGH
3.7.0-r1
3.7.1-r3
git-lfs
CVE-2025-61732
HIGH
3.7.0-r1
3.7.1-r4
git-lfs
CVE-2026-27140
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32280
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32281
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32283
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-33814
HIGH
3.7.0-r1
3.7.1-r12
git-lfs
CVE-2026-56852
HIGH
3.7.0-r1
3.7.1-r18
libcrypto3
CVE-2026-31789
CRITICAL
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2025-15467
HIGH
3.5.2-r1
3.6.1-r0
libcrypto3
CVE-2025-69421
HIGH
3.5.2-r1
3.6.1-r0
libcrypto3
CVE-2026-28386
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28387
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28388
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28389
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28390
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-45447
HIGH
3.5.2-r1
3.6.3-r0
libexpat1
CVE-2025-59375
HIGH
2.7.1-r3
2.7.2-r0
libexpat1
CVE-2026-25210
HIGH
2.7.1-r3
2.7.4-r0
libexpat1
CVE-2026-45186
HIGH
2.7.1-r3
2.8.1-r0
libexpat1
CVE-2026-56408
HIGH
2.7.1-r3
2.8.2-r0
libssl3
CVE-2026-31789
CRITICAL
3.5.2-r1
3.6.2-r0
libssl3
CVE-2025-15467
HIGH
3.5.2-r1
3.6.1-r0
libssl3
CVE-2025-69421
HIGH
3.5.2-r1
3.6.1-r0
libssl3
CVE-2026-28386
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28387
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28388
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28389
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28390
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-45447
HIGH
3.5.2-r1
3.6.3-r0
usr/local/bin/argocd
Vulnerabilities (49)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/argoproj/argo-cd/v2
CVE-2025-59531
HIGH
2.13.9
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2025-59537
HIGH
2.13.9
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2025-59538
HIGH
2.13.9
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2026-45738
HIGH
2.13.9
github.com/expr-lang/expr
CVE-2025-68156
HIGH
v1.17.2
1.17.7
github.com/go-git/go-billy/v5
CVE-2026-44973
HIGH
v5.6.1
5.9.0
github.com/go-git/go-git/v5
CVE-2026-45022
HIGH
v5.13.1
5.19.0
github.com/go-git/go-git/v5
CVE-2026-71556
HIGH
v5.13.1
5.19.2
github.com/go-jose/go-jose/v4
CVE-2026-34986
HIGH
v4.0.5
4.1.4
github.com/golang-jwt/jwt
CVE-2025-30204
HIGH
v3.2.2+incompatible
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.4.0
0.5.1
go.opentelemetry.io/otel/sdk
CVE-2026-24051
HIGH
v1.30.0
1.40.0
go.opentelemetry.io/otel/sdk
CVE-2026-39883
HIGH
v1.30.0
1.43.0
golang.org/x/crypto
CVE-2025-22869
HIGH
v0.32.0
0.35.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.32.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.32.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.32.0
0.52.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.33.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.33.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.33.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.33.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.23.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.21.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.66.2
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.66.2
1.82.1
oras.land/oras-go/v2
CVE-2026-50151
HIGH
v2.5.0
2.6.1
oras.land/oras-go/v2
CVE-2026-50163
HIGH
v2.5.0
2.6.2
stdlib
CVE-2025-68121
CRITICAL
v1.23.1
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2025-61726
HIGH
v1.23.1
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.23.1
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.23.1
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.23.1
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.23.1
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.23.1
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.23.1
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.23.1
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.23.1
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.23.1
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.23.1
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.23.1
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.23.1
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.23.1
1.25.11, 1.26.4
usr/local/bin/gpg-wrapper.sh
Vulnerabilities (16)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
stdlib
CVE-2025-68121
CRITICAL
v1.21.13
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.13
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.13
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.13
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.13
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.13
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.13
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.13
1.25.11, 1.26.4
usr/local/bin/helm
Vulnerabilities (44)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/containerd/containerd
CVE-2024-25621
HIGH
v1.7.12
1.7.29
github.com/containerd/containerd
CVE-2026-53488
HIGH
v1.7.12
1.7.33
github.com/docker/cli
CVE-2025-15558
HIGH
v25.0.1+incompatible
29.2.0
github.com/docker/docker
CVE-2026-34040
HIGH
v25.0.6+incompatible
29.3.1
github.com/docker/docker
CVE-2026-41567
HIGH
v25.0.6+incompatible
github.com/docker/docker
CVE-2026-42306
HIGH
v25.0.6+incompatible
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.2.0
0.5.1
golang.org/x/crypto
CVE-2024-45337
HIGH
v0.25.0
0.31.0
golang.org/x/crypto
CVE-2025-22869
HIGH
v0.25.0
0.35.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.25.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.25.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.25.0
0.52.0
golang.org/x/net
CVE-2024-45338
HIGH
v0.23.0
0.33.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.23.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.23.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.23.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.23.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.10.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.16.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.58.3
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.58.3
1.82.1
stdlib
CVE-2025-68121
CRITICAL
v1.22.6
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.22.6
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.22.6
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.22.6
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.22.6
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.22.6
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.22.6
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.22.6
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.22.6
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.22.6
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.22.6
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.22.6
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.22.6
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.22.6
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.22.6
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.22.6
1.25.11, 1.26.4
usr/local/bin/kustomize
Vulnerabilities (17)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
golang.org/x/text
CVE-2026-56852
HIGH
v0.16.0
0.39.0
stdlib
CVE-2025-68121
CRITICAL
v1.21.12
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.12
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.12
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.12
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.12
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.12
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.12
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.12
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.12
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.12
1.25.11, 1.26.4
---
## Akuity v2.12.13-distroless vs Argo CD v2.12.13
[Full list of open source Argo CD vulnerabilities in this release](https://argo-cd.readthedocs.io/en/latest/snyk/v2.12.13/quay.io_argoproj_argocd_v2.12.13.html)
quay.io/akuity/argocd:v2.12.13-distroless
Vulnerabilities (35)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
busybox
CVE-2023-39810
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26157
HIGH
1.37.0-r50
1.37.0-r58
busybox
CVE-2026-26158
HIGH
1.37.0-r50
1.37.0-r58
git-lfs
CVE-2025-68121
CRITICAL
3.7.0-r1
3.7.1-r4
git-lfs
CVE-2025-61726
HIGH
3.7.0-r1
3.7.1-r3
git-lfs
CVE-2025-61731
HIGH
3.7.0-r1
3.7.1-r3
git-lfs
CVE-2025-61732
HIGH
3.7.0-r1
3.7.1-r4
git-lfs
CVE-2026-27140
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32280
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32281
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-32283
HIGH
3.7.0-r1
3.7.1-r14
git-lfs
CVE-2026-33814
HIGH
3.7.0-r1
3.7.1-r12
git-lfs
CVE-2026-56852
HIGH
3.7.0-r1
3.7.1-r18
libcrypto3
CVE-2026-31789
CRITICAL
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2025-15467
HIGH
3.5.2-r1
3.6.1-r0
libcrypto3
CVE-2025-69421
HIGH
3.5.2-r1
3.6.1-r0
libcrypto3
CVE-2026-28386
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28387
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28388
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28389
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-28390
HIGH
3.5.2-r1
3.6.2-r0
libcrypto3
CVE-2026-45447
HIGH
3.5.2-r1
3.6.3-r0
libexpat1
CVE-2025-59375
HIGH
2.7.1-r3
2.7.2-r0
libexpat1
CVE-2026-25210
HIGH
2.7.1-r3
2.7.4-r0
libexpat1
CVE-2026-45186
HIGH
2.7.1-r3
2.8.1-r0
libexpat1
CVE-2026-56408
HIGH
2.7.1-r3
2.8.2-r0
libssl3
CVE-2026-31789
CRITICAL
3.5.2-r1
3.6.2-r0
libssl3
CVE-2025-15467
HIGH
3.5.2-r1
3.6.1-r0
libssl3
CVE-2025-69421
HIGH
3.5.2-r1
3.6.1-r0
libssl3
CVE-2026-28386
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28387
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28388
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28389
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-28390
HIGH
3.5.2-r1
3.6.2-r0
libssl3
CVE-2026-45447
HIGH
3.5.2-r1
3.6.3-r0
usr/local/bin/argocd
Vulnerabilities (53)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/argoproj/argo-cd/v2
CVE-2025-47933
CRITICAL
2.12.13
2.13.8, 2.14.13
github.com/argoproj/argo-cd/v2
CVE-2025-59531
HIGH
2.12.13
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2025-59537
HIGH
2.12.13
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2025-59538
HIGH
2.12.13
2.14.20
github.com/argoproj/argo-cd/v2
CVE-2026-45738
HIGH
2.12.13
github.com/expr-lang/expr
CVE-2025-68156
HIGH
v1.17.2
1.17.7
github.com/go-git/go-billy/v5
CVE-2026-44973
HIGH
v5.6.1
5.9.0
github.com/go-git/go-git/v5
CVE-2026-45022
HIGH
v5.13.1
5.19.0
github.com/go-git/go-git/v5
CVE-2026-71556
HIGH
v5.13.1
5.19.2
github.com/go-jose/go-jose/v3
CVE-2026-34986
HIGH
v3.0.3
3.0.5
github.com/golang-jwt/jwt
CVE-2025-30204
HIGH
v3.2.2+incompatible
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.2.0
0.5.1
go.opentelemetry.io/otel/sdk
CVE-2026-24051
HIGH
v1.21.0
1.40.0
go.opentelemetry.io/otel/sdk
CVE-2026-39883
HIGH
v1.21.0
1.43.0
golang.org/x/crypto
CVE-2025-22869
HIGH
v0.31.0
0.35.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.31.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.31.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.31.0
0.52.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.33.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.33.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.33.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.33.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.12.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.21.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.59.0
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.59.0
1.82.1
k8s.io/kubernetes
CVE-2024-10220
HIGH
v1.29.6
1.28.12, 1.29.7, 1.30.3
k8s.io/kubernetes
CVE-2024-5321
HIGH
v1.29.6
1.27.16, 1.28.12, 1.29.7, 1.30.3
oras.land/oras-go/v2
CVE-2026-50151
HIGH
v2.3.0
2.6.1
oras.land/oras-go/v2
CVE-2026-50163
HIGH
v2.3.0
2.6.2
stdlib
CVE-2025-68121
CRITICAL
v1.22.4
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.22.4
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.22.4
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.22.4
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.22.4
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.22.4
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.22.4
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.22.4
1.25.11, 1.26.4
usr/local/bin/gpg-wrapper.sh
Vulnerabilities (16)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
stdlib
CVE-2025-68121
CRITICAL
v1.21.13
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.13
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.13
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.13
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.13
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.13
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.13
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.13
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.13
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.13
1.25.11, 1.26.4
usr/local/bin/helm
Vulnerabilities (45)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
github.com/containerd/containerd
CVE-2024-25621
HIGH
v1.7.12
1.7.29
github.com/containerd/containerd
CVE-2026-53488
HIGH
v1.7.12
1.7.33
github.com/docker/cli
CVE-2025-15558
HIGH
v25.0.1+incompatible
29.2.0
github.com/docker/docker
CVE-2024-41110
CRITICAL
v25.0.5+incompatible
23.0.15, 26.1.5, 27.1.1, 25.0.6
github.com/docker/docker
CVE-2026-34040
HIGH
v25.0.5+incompatible
29.3.1
github.com/docker/docker
CVE-2026-41567
HIGH
v25.0.5+incompatible
github.com/docker/docker
CVE-2026-42306
HIGH
v25.0.5+incompatible
github.com/moby/spdystream
CVE-2026-35469
HIGH
v0.2.0
0.5.1
golang.org/x/crypto
CVE-2024-45337
HIGH
v0.21.0
0.31.0
golang.org/x/crypto
CVE-2025-22869
HIGH
v0.21.0
0.35.0
golang.org/x/crypto
CVE-2025-47913
HIGH
v0.21.0
0.43.0
golang.org/x/crypto
CVE-2026-39828
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-39829
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-39830
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-39831
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-39832
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-39835
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-42508
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-46595
HIGH
v0.21.0
0.52.0
golang.org/x/crypto
CVE-2026-46597
HIGH
v0.21.0
0.52.0
golang.org/x/net
CVE-2024-45338
HIGH
v0.23.0
0.33.0
golang.org/x/net
CVE-2026-25681
HIGH
v0.23.0
0.55.0
golang.org/x/net
CVE-2026-27136
HIGH
v0.23.0
0.55.0
golang.org/x/net
CVE-2026-33814
HIGH
v0.23.0
0.53.0
golang.org/x/net
CVE-2026-39821
HIGH
v0.23.0
0.55.0
golang.org/x/oauth2
CVE-2025-22868
HIGH
v0.10.0
0.27.0
golang.org/x/text
CVE-2026-56852
HIGH
v0.14.0
0.39.0
google.golang.org/grpc
CVE-2026-33186
CRITICAL
v1.58.3
1.79.3
google.golang.org/grpc
GHSA-hrxh-6v49-42gf
HIGH
v1.58.3
1.82.1
stdlib
CVE-2025-68121
CRITICAL
v1.22.4
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.22.4
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.22.4
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.22.4
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.22.4
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.22.4
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.22.4
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.22.4
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.22.4
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.22.4
1.25.11, 1.26.4
usr/local/bin/kustomize
Vulnerabilities (18)
The below table displays CRITICAL and HIGH severence vulnerabilities only
Package
ID
Severity
Installed Version
Fixed Version
golang.org/x/text
CVE-2026-56852
HIGH
v0.14.0
0.39.0
stdlib
CVE-2024-24790
CRITICAL
v1.21.10
1.21.11, 1.22.4
stdlib
CVE-2025-68121
CRITICAL
v1.21.10
1.24.13, 1.25.7, 1.26.0-rc.3
stdlib
CVE-2024-34156
HIGH
v1.21.10
1.22.7, 1.23.1
stdlib
CVE-2025-61726
HIGH
v1.21.10
1.24.12, 1.25.6
stdlib
CVE-2025-61729
HIGH
v1.21.10
1.24.11, 1.25.5
stdlib
CVE-2026-25679
HIGH
v1.21.10
1.25.8, 1.26.1
stdlib
CVE-2026-27145
HIGH
v1.21.10
1.25.11, 1.26.4
stdlib
CVE-2026-32280
HIGH
v1.21.10
1.25.9, 1.26.2
stdlib
CVE-2026-32281
HIGH
v1.21.10
1.25.9, 1.26.2
stdlib
CVE-2026-32283
HIGH
v1.21.10
1.25.9, 1.26.2
stdlib
CVE-2026-33811
HIGH
v1.21.10
1.25.10, 1.26.3
stdlib
CVE-2026-33814
HIGH
v1.21.10
1.25.10, 1.26.3
stdlib
CVE-2026-39820
HIGH
v1.21.10
1.25.10, 1.26.3
stdlib
CVE-2026-39822
HIGH
v1.21.10
1.25.12, 1.26.5, 1.27.0-rc.2
stdlib
CVE-2026-39836
HIGH
v1.21.10
1.25.10, 1.26.3
stdlib
CVE-2026-42499
HIGH
v1.21.10
1.25.10, 1.26.3
stdlib
CVE-2026-42504
HIGH
v1.21.10
1.25.11, 1.26.4
---
---
## Security
---
## Akuity Platform Members
## Inviting a new member
1. Select the Organization you want to invite a new member to from the pull down menu.
2. Switch to the Members tab.
3. Click Invite member button on the lower left side of the page.

4. Enter one or more Email addresses to invite to the organization.
5. Assign a Role [(Owner, Member)](./index.md#roles) for the invited user.
6. If you choose Member role, you can also assign them to specific [Teams](./60-teams.md) and [Workspaces](./70-workspaces.md) with designated roles.
7. Click the Send button.
8. Invitation emails will be sent to the specified email addresses.
## Managing Members in a Team:
You can [Manage members in a Team](./60-teams.md#managing-members-in-a-team).
## Managing Members in a Workspace:
You can [Manage members in a Workspace](./70-workspaces.md#managing-users-and-teams-in-workspaces).
---
## Technical Contacts
Technical Contacts are the people in your organization who should be notified of critical communications from Akuity, such as security advisories (CVEs), major updates, and platform changes that require action.
By designating Technical Contacts, you ensure that important notices reach the right people in your organization, even if they are not the organization owner.
:::info
The `owner` role on the Organization is required to manage Technical Contacts. Organization members can view the list but cannot edit it.
By default, an organization owner's email is set as the initial Technical Contact.
:::
## Managing Technical Contacts
To manage Technical Contacts for your organization:
1. Click the Organization drop-down on the left navigation menu and click Settings.
2. Click the Contacts tab.
3. Choose email addresses from your organization members, or type any email address. Distribution list addresses are also supported.
4. Click Update to apply the changes.

:::note
An organization must have at least 1 and can have at most 5 Technical Contacts. Keep the list focused on the people who can act on security and platform notices.
:::
---
## Akuity Platform API Keys
## Creating an API Key
1. Select the Organization you want to create a key for, from the pull down menu.
2. Switch to the API Keys tab.
2. Click + New Key button on the lower right side of the page.
3. Enter a Description for the key.
4. In the Expires In field, set an expiry for the key or select No expiration. Valid time units are "s", "m", "h", "d", "w" or put 0 for no expiry.
5. Assign a Role [(Owner, Member)](./index.md#roles) that you want to assign to the key.
6. Click the Create button.
7. Copy the values for `AKUITY_API_KEY_ID` and `AKUITY_API_KEY_SECRET`
## Using your API key
You can use your API key with the [akuity CLI](../03-automation/index.mdx) or the [Akuity API](../03-automation/30-api.mdx).
---
## Akuity Platform Audit Logs
## Audit Logs
The Audit Logs feature allows you to view all the actions taken by users in your organization. This feature is useful for organizations that need to track the actions taken by users for compliance reasons or for organizations that need to troubleshoot issues. The Audit Logs feature is available to users with the `Owner` role.
To view the Audit Logs, follow these steps:
1. Select the Organization you want to view the audit logs for, from the pull down menu.
2. Switch to the Audit Logs tab.
3. The Audit Logs page will display a list of all the actions taken by users in your organization. The list includes the following information:
- `Timestamp`: The date and time the action was taken.
- `Object`: The object the action was taken on.
- `Actor`: The user who took the action.
- `Action`: The action taken by the user.
- `Details`: Additional details about the action.

Instance level audit logs are also available. They show the actions taken on a particular Argo CD or Kargo instance in your organization. To view the instance level audit logs, follow these steps:
1. Select the Organization you want to view the audit logs for, from the pull down menu.
2. Switch to the ArgoCD or Kargo tab.
3. Click on the instance you want to view the audit logs for.
4. Click on the Audit Logs tab.
5. The Audit Logs page will display a list of all the actions taken on the instance.

## Audit Logs Archive
The Audit Logs Archive is a feature that allows you to download a ZIP file of the weekly audit logs for your organization. This feature is useful for organizations that need to store audit logs for compliance reasons or for organizations that need to analyze the audit logs in a different tool. The Audit Logs Archive feature is available to users with the `Owner` role.
To download the Audit Logs Archive, follow these steps:
1. Select the Organization you want to download the audit logs for, from the pull down menu.
2. Switch to the Audit Logs tab.
3. Click the Archive button on the upper right side of the page.

4. Click the Download icon to download the logs of the corresponding week.

5. The ZIP file will contain a JSON file for each day of the week.
The audit logs are created weekly. The ZIP file will contain a JSON file for each day of the week. The JSON files contain the audit logs for that day.
---
## Akuity Platform Custom Roles
Custom roles add support for Role Based Access Control (RBAC) for resources in the Akuity Platform (e.g. an Instance, or an Organization). Users can create and attach custom roles to API Keys to limit their access.
:::note
Support for custom roles on organization members is coming soon.
:::
## Managing Custom Roles
Only users with the Owner role in an organization can manage custom roles. They are read-only for everyone else.
1. Select the Organization you want to create a role for, from the pull down menu.
2. Switch to the Custom Roles tab.
3. Click on the "Create New Role" button to create a new role.

4. Provide the name, description, and permissions of role. Then create the role. Please note that you can only add granular permissions for ArgoCD Instance, ArgoCD Cluster, Kargo Instance and Kargo Agent.

5. You can then use that role when creating an API key.

## Available permissions
Here is a table of current permissions which can be used in a custom role
| Resource | Get | Create | Update | Delete |
|-------------------|-----|--------|--------|--------|
| Organization | ✅ | ❌ | ✅ | ✅ |
| Custom Roles | ✅ | ✅ | ✅ | ✅ |
| Billing | ✅ | ✅ | ✅ | ✅ |
| API Keys | ✅ | ✅ | ✅ | ✅ |
| Argo CD Instance | ✅ | ✅ | ✅ | ✅ |
| Argo CD Cluster | ✅ | ✅ | ✅ | ✅ |
| Kargo Instance | ✅ | ✅ | ✅ | ✅ |
| Kargo Agent | ✅ | ✅ | ✅ | ✅ |
| SSO Configuration | ✅ | ✅ | ✅ | ✅ |
| Member Role | ❌ | ❌ | ✅ | ❌ |
| Audit Log | ✅ | ❌ | ❌ | ❌ |
| OIDC Map | ✅ | ❌ | ✅ | ❌ |
| Notification Config | ✅ | ✅ | ✅ | ✅ |
| Teams | ✅ | ✅ | ✅ | ✅ |
| Team Members | ✅ | ✅ | ❌ | ✅ |
| Workspaces | ✅ | ✅ | ✅ | ✅ |
| Workspace Members | ✅ | ✅ | ❌ | ✅ |
| Workspace Member Role| ❌ | ❌ | ✅ | ❌ |
| Workspace API Keys | ✅ | ✅ | ✅ | ✅ |
| Workspace Custom Role| ✅ | ✅ | ✅ | ✅ |
| Kubernetes Dashboard | ✅ | ❌ | ❌ | ❌ |
| Akuity Intelligence | ✅ | ✅ | ✅ | ✅ |
---
## Notifications
Notifications are a way to keep track of important events on the Akuity Platform. You can receive notifications for a variety of events, such as usage alerts of applications, audit logs, and more. Notifications can be sent using 3 different methods: email, webhook, and Akuity Platform UI.
For critical communications from the Akuity team, such as security advisories and major platform changes, see [Technical Contacts](./100-technical-contacts.md).
## Notification Center
The Notification Center is where you can view all the notifications that have been sent to you through Akuity Platform UI. You can access the Notification Center by clicking on the bell icon (🔔) in the top right corner of the Akuity Platform and then clicking on Notifications Center. The Notification Center will display all the notifications that have been sent to you, and you can view the details of each notification by clicking on it.

### Settings
You can manage your notification settings by going to the Settings tab in the Notification Center page. You can enable or disable notifications for each event type. You can also choose the method of notification for each event type. You can choose to receive notifications via email, or the Akuity Platform UI.

#### Notifications Categories
The different categories of notifications are:
1. Product Updates - Notifications related to product updates, such as new releases, bug fixes, etc.
1. New Product Version - New product versions related to Akuity Platform.
1. Custom - Custom alerts used by Akuity team.
1. Usage Alerts - Notifications related to usage alerts, such as reaching usage limits, etc.
1. audit - Audit log events.
1. free-trial-expiring - Trial expiration.
1. usage - Usage alert events.
1. Instance Alerts - Notifications related to your instances state.
1. agent-health - Agent health events (connected/disconnected).
1. cname-alert - Domain misconfiguration or expiration.
#### Email Notifications
Email notifications are sent to the email address associated with your account. An email notification is sent when an event occurs that you have subscribed to. You can manage your email notifications by going to the Settings tab in the Notification Center page. You can enable or disable email notifications for each event type.
An example of an email notification for Usage Alerts is shown below:

#### Akuity Platform UI Notifications (Web Notifications)
Akuity Platform UI notifications are notifications that are displayed in the Akuity Platform UI. These notifications are displayed in the top right corner of the Akuity Platform, and you can view them by clicking on the bell icon (🔔). Akuity Platform UI notifications are sent when an event occurs that you have subscribed to. You can manage your Akuity Platform UI notifications by going to the Settings tab in the Notification Center page. You can enable or disable Akuity Platform UI notifications for each event type.
An example of an Akuity Platform UI notification for Product Updates is shown below:

## Organization Notifications
Organization notifications allow you to receive alerts for events happening within your organization. These can be configured to be sent via Webhook, Email or Akuity Platform UI (Web). Some notifications like for example usage related are set up by default.
### Webhook Notifications
Webhook notifications are sent to a URL that you specify.
When a webhook notification is sent, the Akuity Platform will send a POST request to the specified URL with the notification details in the request body. The request body will contain a JSON object with the following fields:
- eventTime - The time at which the event occurred.
- eventType - The type of event that occurred.
- organizationId - The ID of the organization to which the event is related.
- eventId - The ID of the event.
- <eventTypeData> - Additional data related to the eventType.
To set up an organization notification, follow these steps:
1. Select the Organization you want to create a notification for, from the pull down menu.
1. Click on the Settings button.
1. Switch to the Notifications tab.
1. Click the + Add New Notification button.
1. Fill notification details in the dialog.
- Type: Select Webhook.
- Name: Name of the webhook.
- URL: URL of the webhook.
- Secret: Secret for validate webhook payload signature.
- Events: Event types to subscribe (`*` for all events). Please refer to [notification categories](#notifications-categories) for information about specific events.
- Argo CD Instances: If set, webhook will receive events that only related to the chosen Argo CD instances.
- Kargo Instances: If set, webhook will receive events that only related to the chosen Kargo instances.
- Argo CD Clusters: Only applicable for `agent-health` events. If set, webhook will receive events that only related to the chosen Argo CD clusters.
- Kargo Agents: Only applicable for `agent-health` events. If set, webhook will receive events that only related to the chosen Kargo agents.
:::note
The filter fields above support regular expressions. The value is wrapped in `^...$`. For example, `test.*` matches all names starting with `test`.
:::
1. Click the Add button.

The notification will be added to the list. To view the delivery history, click on the View button.

Click on the Send testing event button to send a test event.

The webhook will be sent a test ping event and the response will be displayed. If you see a tick mark, the webhook was successfully sent. You can click on the + icon to view the response.

An example of a webhook notification for `audit` event is shown below:

```json
{
"eventTime": "2024-08-23T13:21:30.647737Z",
"eventType": "WEBHOOK_EVENT_TYPE_AUDIT",
"organizationId": "yswhibye4b9xy0e",
"eventId": "c2txb45sbae7m5m9",
"auditEvent": {
"timestamp": "2024-08-23 13:21:30.622450296 +0000 UTC",
"action": "created",
"actor": {
"type": "akuity_user_email",
"id": "user@example.com"
},
"object": {
"type": "custom_role",
"id": {
"name": "test",
"kind": "",
"group": ""
},
"parentId": {
"name": "",
"parentName": "",
"applicationName": ""
}
},
"details": {
"message": "",
"patch": "",
"actionType": ""
}
}
}
```
For more information on the webhook schema, refer to the [Notification Webhook Schema](/akuity-portal/reference/notifications).
### Email Notifications
Email notifications are sent to the email addresses that you specify.
To set up an email notification, follow these steps:
1. Select the Organization you want to create a notification for, from the pull down menu.
1. Click on the Settings button.
1. Switch to the Notification tab.
1. Click the + Add New Notifications button.
1. Fill notification details in the dialog.
- Type: Select Email.
- Name: Name of the notification configuration.
- Recipients: List of email addresses to send notifications to. You can also select org owner through `@org-owner`, everyone in the org with `@org-all` and everyone in the workspace by `@workspace-all` options.
- Events: Event types to subscribe (`*` for all events). Please refer to [notification categories](#notifications-categories) for information about specific events.
- Argo CD Instances: If set, emails will be sent for events that only related to the chosen Argo CD instances.
- Kargo Instances: If set, emails will be sent for events that only related to the chosen Kargo instances.
- Argo CD Clusters: Only applicable for `agent-health` events. If set, emails will be sent for events that only related to the chosen Argo CD clusters.
- Kargo Agents: Only applicable for `agent-health` events. If set, emails will be sent for events that only related to the chosen Kargo agents.
:::note
The filter fields above support regular expressions. The value is wrapped in `^...$`. For example, `test.*` matches all names starting with `test`.
:::
1. Click the Add button.

### Web Notifications
Web notifications are displayed in [Akuity Platform Notifications Centre UI](#akuity-platform-ui-notifications-web-notifications).
To set up a web notification, follow these steps:
1. Select the Organization you want to create a notification for, from the pull down menu.
1. Click on the Settings button.
1. Switch to the Notifications tab.
1. Click the + Add New Notification button.
1. Fill notification details in the dialog.
- Type: Select Email.
- Name: Name of the notification configuration.
- Recipients: List of users to send notifications to. You can also select org owner through `@org-owner`, everyone in the org with `@org-all` and everyone in the workspace by `@workspace-all` options.
- Events: Event types to subscribe (`*` for all events). Please refer to [notification categories](#notifications-categories) for information about specific events.
- Argo CD Instances: If set, emails will be sent for events that only related to the chosen Argo CD instances.
- Kargo Instances: If set, emails will be sent for events that only related to the chosen Kargo instances.
- Argo CD Clusters: Only applicable for `agent-health` events. If set, emails will be sent for events that only related to the chosen Argo CD clusters.
- Kargo Agents: Only applicable for `agent-health` events. If set, emails will be sent for events that only related to the chosen Kargo agents.
:::note
The filter fields above support regular expressions. The value is wrapped in `^...$`. For example, `test.*` matches all names starting with `test`.
:::
1. Click the Add button.

---
## Akuity Platform SSO
The Akuity Platform supports the following Single Sign-On (SSO) providers:
- [Microsoft (Azure AD)](https://azure.microsoft.com/products/active-directory)
- [Google Workspace](https://workspace.google.com)
- [Okta](https://www.okta.com)
- OpenID Connect
- SAML
:::info
Akuity Platform SSO is available on Enterprise plans only. Please [contact our Sales Team](https://akuity.io/talk-to-sales/) to access the feature.
Note that this feature only applies to the Akuity Platform, and is separate from SSO for Argo CD. Argo CD SSO is available in all Professional and Enterprise plans.
:::
## Configuring SSO
:::note
The `owner` role on the Organization is required to configure SSO.
:::
To configure SSO for an Organization on the Akuity Platform:
1. Go to Organization > SSO.

2. Click Add Configuration.
**Microsoft (Azure AD)**
3. [Register an application with the Microsoft identity platform](https://auth0.com/docs/authenticate/identity-providers/enterprise-identity-providers/azure-active-directory/v2) with the following settings:
- Set Redirect URI to `https://auth.akuity.io/login/callback`
4. [Add the following Delegated Permissions to the registered application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis#add-permissions-to-access-web-apis):
- `Users > User.Read`
- `Directory > Directory.Read.All`
5. [Generate a client secret.](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#add-credentials)
6. Populate the configuration details inside the form:
- Client ID: Application (client) ID
- Client Secret: Client Secret
- Azure AD Domain: Your Azure AD domain name. You can find this on your Azure AD directory's overview page in the Microsoft Azure portal.
- Domain Aliases: Additional domains to match organization members (e.g. `some-org.com`).
- Auto Add Member: Allow your organization members to join your organization with the `member` role automatically.
:::note
For security purposes, your domain and domain aliases will be submitted to Akuity for manual review and approval.
:::

**Google Workspace**
3. [Register an application to the Google Workspace](https://auth0.com/docs/authenticate/identity-providers/enterprise-identity-providers/google-apps#set-up-your-app-in-google) with the following settings:
- Authorized JavaScript origins to `https://auth.akuity.io`
- Set Redirect URI to `https://auth.akuity.io/login/callback`
4. Populate the configuration details inside the form:
- Client ID: Application (client) ID
- Client Secret: Client Secret
- Google Workspace Domain: Google Workspace domain name for your organization.
- Domain Aliases: Additional domains to match organization members (e.g. `some-org.com`).
- Auto Add Member: Allow your organization members to join your organization with the `member` role automatically.
:::note
For security purposes, your domain and domain aliases will be submitted to Akuity for manual review and approval.
:::

5. Test the connection.
**Okta**
:::caution
Okta native integration does not support groups claim, please use generic SAML/OIDC instead if you want to use IDP groups mapping features.
:::
3. Create an Okta OIDC Application.
- In your Okta Admin Dashboard, Select Applications > Applications, and Create App Integration.
- Select Create New App.
- Choose OIDC as the Sign-in method and Web Application as Application Type.
- Set Sign-in redirect URIs with `https://auth.akuity.io/login/callback` and select Create.
- Copy your `Client ID` and `Client Secret`.
- (Optional) You can configure Initiate login URI to skip Akuity login page.
- Set Login initiated by under General Settings as Either Okta or App
- Set Login flow as OIDC Compliant
- Set Initiate login URI as `https://akuity.cloud/api/auth/login/sso/` (ID can be found in Organization tab in Akuity Dashboard)
4. Populate the configuration details on the form.
- Client ID: Okta OIDC Application Client ID
- Client Secret: Okta OIDC Application Client Secret
- Okta Domain: Your [Okta domain](https://developer.okta.com/docs/guides/find-your-domain/main/).
- Domain Aliases: Additional domains to match organization members (e.g. `some-org.com`).
- Auto Add Member: Allow your organization members to join your organization with the `member` role automatically.
:::note
For security purposes, your domain and domain aliases will be submitted to Akuity for manual review and approval.
:::

**OpenID Connect**
3. Create an OIDC Application.
- Set Allowed Callback URL to `https://auth.akuity.io/login/callback`
4. Populate the configuration details on the form.
- Client ID: OIDC Application Client ID
- Email Domain: Your organization's domain name
- Domain Aliases: Additional domains to match organization members (e.g. `some-org.com`).
- Channel:
- `Front Channel` uses `response_mode=form_post` and `response_type=id_token`
- `Back Channel` uses `response_type=code`
- Discovery URL: OIDC Discovery URL to fill Issuer details
- Issued details:
- Client Secret: OIDC Application Client Secret (required for the `Back Channel`)
- Issuer: URL of the Issuer Identifier.
- Authorization Endpoint: URL of the OpenID Provider's OAuth 2.0 Authorization Endpoint.
- Token endpoint: URL of the OpenID Provider's OAuth 2.0 Token Endpoint (required for the `Back Channel`).
- Jwks URL: URL of the OpenID Provider's JSON Web Key Set document.
- Auto Add Member: Allow your organization members to join your organization with the `member` role automatically.
:::note
For security purposes, your domain and domain aliases will be submitted to Akuity for manual review and approval.
:::

**SAML**
3. Create an OIDC Application.
- Set Allowed Callback URL to `https://auth.akuity.io/login/callback?connection={your organization id}`
- Set Entity ID to `urn:auth0:akuity:{your organization id}`
- Organization ID can be found in the top-right side of the `Organization` page.

4. Populate the configuration details on the form.
- Domain: Your organization's domain name
- Domain Aliases: Additional domains to match organization members (e.g. `some-org.com`).
- Configuration (XML): Use Metadata XML to configure SAML SSO.
- Configuration (Manual): Manually configure SAML SSO.
- Sign-In Endpoint: SAML single login URL.
- Disable Sign-out: When disabled, a specific Sign Out URL can be set.
- Sign-Out Endpoint: SAML single logout URL.
- Sign Request: When enabled, the SAML authentication request will be signed.
- Signature Algorithm: Algorithm to use to sign the SAML assertions.
- Digest Algorithm: Algorithm to use to the sign request digest
- Base64 Encoded Signing Cert: Base64 encoded signing certificate
- Protocol Binding: HTTP binding supported by the IdP
- IdP Initiated SSO: When enabled, users can log in directly from their Identity Provider without first visiting the Akuity Platform.
:::warning Security Risk: IdP-Initiated SSO
Auth0, the identity provider powering Akuity Platform authentication, does not recommend enabling IdP-Initiated SSO.
In an IdP-Initiated flow, Auth0 receives an unsolicited response from the IdP and the application receives an unsolicited response from Auth0. Neither entity can verify that the user actually started the flow. This opens the possibility of a **Login CSRF attack**, where an attacker can trick a legitimate user into unknowingly logging into the application with the identity of the attacker.
Whenever possible, keep this disabled and let authentication be initiated from the Akuity Platform (the default). Only enable this if your IdP requires initiating the login flow and you understand the risks involved.
:::
:::note
For security purposes, your domain and domain aliases will be submitted to Akuity for manual review and approval.
:::

**Okta with SAML**
3. In your Okta Admin Dashboard, go to Applications -> Applications -> Create App Integration

4. Select SAML 2.0 as the Sign-in method, and click Next

5. Provide the app name and logo, then click Next.

6. In Configure SAML section set :
a. Single Sign-On URL: `https://auth.akuity.io/login/callback?connection=`
b. Audience URI (SP Entity ID): `urn:auth0:akuity:`
c. In the Attributes Statements section, add :
| Name | Name format | Value |
|-------------|-------------|----------------|
| email | Unspecified | user.email |
| given_name | Unspecified | user.firstName |
| family_name | Unspecified | user.lastName |
d. In the Group Attribute Statements section, add the following (you can modify the group regex according to your needs) :
| Name | Name format | Filter |
|-------------|-------------|----------------------|
| groups | Unspecified | Matches regex : `.*` |

e. Click Next and Finish

7. Go to the Application details page, select Sign On tab and then find and click the View SAML setup instructions button on the right side

8. This will open a `How to Configure SAML 2.0 for Application` page, where you can find the XML IDP metadata. Copy the XML.

7. Now, go to Akuity, and from the Type dropdown select SAML.
9. Choose XML as the Configuration type and paste the Metadata you copied in the Metadata XML input.

10. Add your SSO email domain in the Domain input field
11. Click on the Enforce SSO toggle if you want to enforce SSO login for your organization members. If this is disabled, users will have the option to log in with SSO or with social login like Google.
:::warning Important
Enforcing SSO will require all organization users to use SSO for login. If your SSO configuration is broken, you may be locked out from your account and require contact with support.
Make sure to thoroughly test your SSO configuration before enforcing it for all users.
:::
12. Optionally, enable the IdP Initiated SSO toggle if you want users to be able to log in directly from Okta without first visiting the Akuity Platform.
:::warning Security Risk: IdP-Initiated SSO
Auth0, the identity provider powering Akuity Platform authentication, does not recommend enabling IdP-Initiated SSO.
In an IdP-Initiated flow, Auth0 receives an unsolicited response from the IdP and the application receives an unsolicited response from Auth0. Neither entity can verify that the user actually started the flow. This opens the possibility of a **Login CSRF attack**, where an attacker can trick a legitimate user into unknowingly logging into the application with the identity of the attacker.
Whenever possible, keep this disabled and let authentication be initiated from the Akuity Platform (the default). Only enable this if your IdP requires initiating the login flow and you understand the risks involved.
:::
13. Create the configuration by clicking the Add button.
13. Now, if you try to log in with an email associated with the domain you just configured, you will be redirected to Okta.
## IDP Groups Mapping
:::caution
IDP Groups does not work for Okta native integration as Okta does not support groups claim. Please use generic SAML/OIDC option instead to connect with Okta if you want to use this feature.
:::
To configure IDP Groups for an Organization in the Akuity Platform:
1. Go to Organization > SSO.

2. Click Add New Rule.

3. In the Add OIDC Group Mapping select the role and specify the corresponding OIDC Group for your provider.

4. Click the Add button.
:::note
In the SSO settings, if the Auto Add Member is checked the new user willjoin your organization with the `member` role automatically.

:::
## OIDC Team Mapping
:::caution
OIDC Team Mapping does not work for Okta native integration as Okta does not support groups claim. Please use generic SAML/OIDC option instead to connect with Okta if you want to use this feature.
:::
This feature allows you to map users with a specific OIDC group to a team in your organization.
Your organization must have at least one Team.
To configure this feature for an Organization in the Akuity Platform:
1. Go to Organization > SSO.

2. Scroll down to the "OIDC Team Mapping" section and click Add New Mapping.

3. In the modal that appears, specify an OIDC group and select an existing team from the dropdown.

4. Click the Add button.
Now, when a user logs in with the specified IDP group, they will be added to the selected team in your organization.
---
## Akuity Platform Teams
Teams are a way to group users within an organization.
:::info
Akuity Platform Teams is available on Professional and Enterprise plans only. Please [contact our Sales Team](https://akuity.io/talk-to-sales/) to access the feature.
:::
:::note
The `owner` role on the Organization is required to manage teams. The `member` role can only view teams.
:::
## Managing Teams
To create a team in an organization:
1. Go to Organization > Teams. Click Add Team button on the lower left side of the page.

2. Enter a Name and a Description for the team, then click Add.

To update the team description:
1. Click the second button on the right side of the team.

2. Enter the new description and click Save.

To delete a team:
1. Click the third button on the right side of the team.

2. Click Confirm to confirm the deletion.

## Managing Members in a Team:
To add members to a team:
1. Click the first button on the right side of the team just created.

2. Switch Add tab. Use the search bar to find the Organization members you want to add to the team, and click Add on the right side of the member to add them to the team.

To remove a member from the team:
1. Switch to the Members tab.
2. Click the Delete button on the right side of the member to remove them from the team.

---
## Akuity Platform Workspaces
Workspaces are a way to group resources within an organization. Argo CD instances, Kargo instances, Organization users and Teams can be grouped into Workspaces.
:::info
Akuity Platform Workspaces is available on all plans. Different plans have different limits on the number of Workspaces that can be created:
- **Starter**: 1 Workspace
- **Professional**: 3 Workspaces
- **Enterprise**: Unlimited Workspaces
Please [contact our Sales Team](https://akuity.io/talk-to-sales/) to change your plan if you need more Workspaces.
:::
:::note
The `owner` role on the Organization is required to manage Workspaces, including creating, updating, and deleting them.
:::
## Roles
### Admin
Admins have full access to all resources within the Workspace. They can add or remove Argo CD instances, Kargo instances, Organization users and Teams from the Workspace. They can not delete the Workspace itself. The user who creates the Workspace automatically assumes an Admin role.
### Member
Members get read access to all resources within the Workspace, but cannot edit any settings. They also have no access to Workspace settings.
## Managing Workspaces
When creating an Organization, a default Workspace is created automatically. Click the Organization drop-down on the left navigation menu and click Workspaces to view the all Workspaces in an Organization.

To create a new Workspace:
1. Click Create button on the upper right side of the page.

2. Enter a Name and a Description for the Workspace, then click Create.

To update the Workspace name or description:
1. Click the Workspace on the Workspaces page.

2. Click the Settings tab and click the General menu.

3. Enter the new name or description and click Save.

To delete a Workspace:
1. Enter the Workspace name under the Danger Zone section.
2. Click the I know what I am doing, delete workspace button to confirm the deletion.

## Managing Users and Teams in Workspaces
Workspace admin can add or remove users and teams from the Workspace.
To add a user or a team to a Workspace:
1. Click the Settings tab and click the Teams and People menu.

2. User the search bar to find the Organization user or Teams you want to add to the Workspace.

3. Select the workspace role in the drop-down and click Add to add them to the Workspace.

To change the role of a user or a Team in a Workspace:
1. Click the role drop-down and select the new role for a user or a Team.

To remove a user or a Team from a Workspace:
1. Click the Remove button on the right side of the user or Team, and click the Confirm button on the pop-up to confirm the removal.

## Creating an API Key
1. Switch to the API Keys tabs

2. Click + New Key button on the lower right side of the page

3. Enter a Description for the key.

4. In the Expires In field, set an expiry for the key or select No expiration. Valid time units are "s", "m", "h", "d", "w" or put 0 for no expiry.
5. Assign a Role [(Admin, Member)](#roles) that you want to assign to the key.
6. Click the Create button.
7. Copy the values for `AKUITY_API_KEY_ID` and `AKUITY_API_KEY_SECRET`
## Custom Roles
Custom roles can be created to provide more granular access to resources within a Workspace. Only the `owner` of the Organization or the `Admin` of the Workspace can create custom roles. It is read-only for Workspace `Member` role.
To create a custom role for a particular workspace:
1. Click the Settings tab and click the Custom Roles menu.

2. Click the + Create New Role button.

3. Provide the name, description, and permissions of role. Then create the role.

4. You can then use that role when creating an API key for the Workspace.

### Available Permissions
Here is a table of current permissions which can be used in a custom role
| Resource | Get | Create | Update | Delete |
|-------------------|-----|--------|--------|--------|
| Members | ✅ | ✅ | ❌ | ✅ |
| ArgoCD Instances | ✅ | ✅ | ✅ | ✅ |
| ArgoCD Clusters | ✅ | ✅ | ✅ | ✅ |
| Kargo Instances | ✅ | ✅ | ✅ | ✅ |
| Kargo Agents | ✅ | ✅ | ✅ | ✅ |
| API Keys | ✅ | ✅ | ✅ | ✅ |
| Custom Roles | ✅ | ✅ | ✅ | ✅ |
| Member Role | ❌ | ❌ | ✅ | ❌ |
---
## SSO Domain Verification
Domain verification lets your organization confirm ownership of email domains for use with SSO configuration. Once a domain is verified, it can be added as a domain alias in your organization's SSO settings.
:::info
Domain verification is managed by your organization's owners.
Contact Akuity Support if you encounter issues during the verification process.
:::
## Add a Domain Alias
1. Navigate to **Organizations > Settings > Domain Verification**.
2. In the **New Domain Aliases** field, type your domain (e.g. if your org email is `user@example.com`, enter `example.com`).

3. Press **Enter** to add multiple domains and click **+ New**.
:::note
Akuity team will review your request and approve the domain on their end.
:::
## Verification Status
The domain table shows the current status for each alias:
| Status | Description |
|----------|--------------------------------------------------|
| Verified | Domain ownership confirmed; available for SSO |
| Pending | Domain added but verification not yet complete |
Once a domain is **Verified**, it can be used as a tenant domain or domain alias in your organization's [SSO](https://docs.akuity.io/akuity-portal/organizations/sso) configuration.
---
## Multi Factor Authentication
Multi Factor Authentication (MFA) is a security feature that requires users to provide two or more verification factors to access the Akuity Platform. This adds an extra layer of security to your account and helps protect your data.
:::note IMPORTANT
Multi Factor Authentication is available at the organization level. Once MFA is enabled, **every user** in the organization *must* set up MFA to access the Akuity Platform. Otherwise, users will not be able to log in.
:::
:::info
MFA is available on Professional and Enterprise plans only. Please [contact our Sales Team](https://akuity.io/talk-to-sales/) to access the feature.
This feature is only available on SaaS and not available on Self-Hosted.
The `owner` role on the Organization is required to manage MFA settings.
:::
## Enabling MFA
To enable MFA for your organization:
1. Click the Organization drop-down on the left navigation menu and click Settings.

2. Click the MFA tab.

3. Click the Enabled toggle and confirm the action.

4. MFA has been enabled. **Remember: every user in the organization must set up MFA** to access the Akuity Platform. The next time a user logs in, they will be prompted to set up MFA.
## Managing MFA
You can view the MFA status of all users in the organization on the MFA page. The MFA status can be one of the following:
- **Enrolled**: The user has set up MFA.
- **Not Enrolled**: The user has not set up MFA.

In case a user is locked out of their account and they can no longer access the MFA code, the organization `owner` can reset the MFA for the user. To reset MFA for a user:
1. Click on the three dots next to the user and click Reset MFA.
2. This will send a request to the support team to reset the MFA for the user. The support team will reset the MFA for the user.
Once MFA is reset for a user, the user will be prompted to set up MFA the next time they log in.
---
## Quotas
Quotas in the Akuity Platform help organizations manage and control resource usage effectively. By setting quotas, organizations can ensure that instances do not exceed allocated resources, maintaining optimal performance and cost management.
Quotas can be set for different Argo CD and Kargo instances within the organization. Each Argo CD instance can have a quota for the maximum number of applications allowed, while each Kargo instance can have quotas for different stages.
## Managing Quotas
To manage quotas for your organization:
1. Click the Organization drop-down on the left navigation menu and click Settings.

2. Click the Quotas tab.

3. Here, you can view and manage the quotas for different Argo CD and Kargo instances.
4. To add a new quota for the Argo CD instance, go to the Deploy tab and click on the Add New Quotas button.

5. In the Name dropdown, you can select the instance for which you want to set the quota. Next to that is the Applications Limit field where you can set the maximum number of applications allowed for that instance. After setting the desired values, click on the Add button to save the changes.

6. The new quota will be added to the list of quotas for the organization. Here, you can see the current application count and the applications limit for the instance.

7. A similar process can be followed to add quotas for Kargo instances by navigating to the Promote tab. You can add limits for the stages for each Kargo instance.

---
## Organizations
Organizations provide control over your Akuity Platform resources by allowing team members different levels of access within the organization.
## Changing contexts
If you belong to multiple organizations, the dashboard's context switcher component is useful for selecting which of those organization you intend to actively work with.
The context switcher is a drop-down list located at the top of the left navigation menu, directly under the Akuity logo.
### Organizations across regions
The Akuity Platform operates across multiple regions. If you have organizations in more than one region, they all appear together in a single view inside the context switcher. Selecting an organization from a different region will redirect you to that region's portal.
## Roles
### Owner
Owners have full access to all Argo CD instances owned by the organization. They have permission to edit all organization settings and download archives of the organization's Audit Log records. The user who creates the organization automatically assumes an Owner role.
### Member
Members get access to Argo CD instances owned by the organization, but cannot edit instance settings. They also have no access to organization settings.
### Custom
Members with the Owner role in an organization can manage custom roles, which can then be assigned to API Keys. Read more about [Custom Roles](/akuity-portal/organizations/custom-roles)
---
## Akuity Platform Declarative Management
## Platform-specific settings
Declarative management of platform-specific settings is implemented using [`akuity` CLI](/akuity-portal/automation).
### Managing Argo CD Instances
Use the following steps to manage existing Argo CD instances with the Akuity Platform:
1. **Export Configuration**: Use the `akuity argocd export --organization-name ` command to export the existing instance configuration.
> Note: `yq` provides a convenient way to split the output into multiple files.
```shell
akuity argocd export demo --organization-name demo | yq -s '.metadata.name' -
```
1. **Compare Configuration**: Use the `akuity argocd diff --organization-name ` command to compare local configuration with the current state of the Akuity Platform.
```shell
akuity argocd diff demo --organization-name demo -f argocd/demo/
```
1. **Apply Changes**: Use the `akuity argocd apply -f ` command to apply changes to the Akuity Platform.
```shell
akuity argocd apply -f argocd/demo/
```
#### Configuration specifications
The declarative configuration that defines Argo CD instance state has the same format as open-source Argo CD and described
[here](https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/). The Akuity Platform specific settings,
such as instance name, IP allows lists and other additional features are defined using `argocd.akuity.io/v1alpha1/ArgoCD` resource.
Example of the declarative configuration:
```yaml
apiVersion: argocd.akuity.io/v1alpha1
kind: ArgoCD
metadata:
name: test-inst
spec:
version: v2.6.0
description: test-inst
instanceSpec:
ipAllowList:
- ip: "1.2.3.4"
description: dummy entry
declarativeManagementEnabled: true
```
The reference specifications are available [here](../../../../akuity-portal/reference/declarative-specs).
### Managing Kargo Instances
Use the following steps to manage existing Kargo instances with the Akuity Platform:
1. **Export Configuration**: Use the `akuity kargo export --organization-name ` command to export the existing instance configuration.
```shell
akuity kargo export demo --organization-name demo | yq -s '.metadata.name' -
```
1. **Compare Configuration**: Use the `akuity kargo diff --organization-name ` command to compare local configuration with the current state of the Akuity Platform.
```shell
akuity kargo diff demo --organization-name demo -f kargo/demo/
```
1. **Apply Changes**: Use the `akuity kargo apply -f ` command to apply changes to the Akuity Platform.
```shell
akuity kargo apply -f kargo/demo/
```
#### Configuration specifications
The reference specifications are available [here](../../../../akuity-portal/reference/declarative-specs).
### Automated workflow
The GitOps workflow is implemented using GitHub Actions and is provides the following experience:
1. Engineers make changes to the declarative configuration of the Akuity Platform in the `argocd` directory and create Pull Request
with the proposed changes.
1. GitHub action workflow compares the proposed changes with the current state of the Akuity Platform and posts detected changes as a comment to the Pull Request.
1. Reviewers review the proposed changes and detected changes report and approve the Pull Request.
1. GitHub action workflow applies the proposed changes to the Akuity Platform.
See the example live demo at https://github.com/akuity/akp-declarative/.
---
## Agent installation with Helm
The Akuity Platform provides an official Helm chart for installing and registering the Akuity agent on a cluster. The chart handles both registering the agent with the Akuity Platform and deploying the agent components in a single step. It supports both **Argo CD** cluster agents and **Kargo** agents, selected with the `agentType` value.
The chart is published to the OCI registry at `oci://quay.io/akuity/akuity-platform-charts/akuity-agent`.
## Overview
When installed, the chart runs a registration job that:
1. Creates (or upserts) the agent entry in the Akuity Platform using the Akuity CLI.
2. Fetches the generated agent manifests from the platform.
3. Applies the agent manifests to the cluster.
The agent is designed to be provisioned as part of a cluster bootstrapping process. Rather than registering clusters manually after they are created, we recommend embedding this Helm chart into the platform infrastructure that is already in place. For example Terraform - so that every new cluster is registered automatically on creation.
## Choosing the agent type
The `agentType` value selects which agent to install:
- `argocd` (default) — registers the cluster with an Argo CD instance and installs the Argo CD cluster agent.
- `kargo` — registers a Kargo agent with a Kargo instance and installs the Kargo agent.
In both cases `clusterName` is the name the agent is registered under (the cluster name for Argo CD, the agent name for Kargo) and `instanceName` is the Argo CD or Kargo instance to attach to.
## Prerequisites
- An Akuity Platform organization and an existing Argo CD or Kargo instance to register the agent with.
- An Akuity API key. Generate one from the **API Keys** tab on the organization profile page in the Akuity Portal UI, or see [the CLI reference](../05-reference/cli/index.mdx) for the `akuity apikey create` command.
- Helm v3 and `kubectl` access to the target cluster.
## Installing an Argo CD agent
```sh
helm install akuity-agent oci://quay.io/akuity/akuity-platform-charts/akuity-agent \
--namespace akuity-agent \
--create-namespace \
--set clusterName= \
--set instanceName= \
--set organizationName= \
--set akuityApiKeyId= \
--set akuityApiKeySecret=
```
`agentType` defaults to `argocd`, so it does not need to be set explicitly.
## Installing a Kargo agent
```sh
helm install akuity-kargo-agent oci://quay.io/akuity/akuity-platform-charts/akuity-agent \
--namespace akuity \
--create-namespace \
--set agentType=kargo \
--set clusterName= \
--set instanceName= \
--set organizationName= \
--set akuityApiKeyId= \
--set akuityApiKeySecret=
```
By default the chart installs a **self-hosted** Kargo agent (`kargo.selfHosted=true`): the agent runs in your cluster and the chart applies its manifests. The Kargo agent installs a mutating admission webhook in its namespace; the registration job waits for that webhook to become ready before completing, so the install may take a little longer than the Argo CD agent.
Set `kargo.selfHosted=false` for an **Akuity-managed** agent. In that case the agent is run by Akuity, no manifests are produced for the cluster, and the chart only registers the agent (it does not apply anything to your cluster).
:::warning
Each Kargo agent should be installed into a single namespace. The Kargo agent's webhook selects namespaces by the agent's instance and name labels, so reusing the same `clusterName` (agent name) and `instanceName` across multiple namespaces can cause their webhooks to interfere with each other. Use a distinct `clusterName` per agent.
`helm uninstall` removes the registration job but does **not** remove the in-cluster Kargo agent, including its cluster-scoped `MutatingWebhookConfiguration`. To remove an agent, delete it from the Akuity Portal UI so the platform tears down its in-cluster resources cleanly. Leaving an agent's resources behind (for example by deleting its namespace manually) can orphan the webhook configuration and block future installs.
:::
## Configuration reference
### Common values
| Value | Description | Required |
|---|---|---|
| `agentType` | Agent to install: `argocd` (default) or `kargo` | No |
| `clusterName` | Name to register the agent under (cluster name for Argo CD, agent name for Kargo) | Yes |
| `instanceName` | Name of the Argo CD or Kargo instance to register with | Yes |
| `organizationName` | Name of your Akuity organization | Yes |
| `akuityApiKeyId` | Akuity API key ID | Yes |
| `akuityApiKeySecret` | Akuity API key secret | Yes |
| `akuityServerUrl` | Akuity Platform API URL (defaults to `https://akuity.cloud`) | No |
| `version` | Pin a specific agent version | No |
| `agentSize` | Agent resource size | No |
| `labels` | Labels to apply to the agent, e.g. `["env=prod", "team=platform"]` | No |
| `annotations` | Annotations to apply to the agent | No |
| `disableAutoUpdate` | Disable automatic agent updates | No |
| `extraArgs` | Extra arguments to pass to the agent create command | No |
| `rbac.extraRules` | Extra policy rules appended to the registration job's ClusterRole, for granting permissions to additional resources the agent manifests may require | No |
### Argo CD options (`agentType: argocd`)
| Value | Description | Required |
|---|---|---|
| `argocd.project` | Project to associate the cluster with | No |
| `argocd.namespaceScoped` | Install the agent in namespace-scoped mode | No |
| `argocd.stateReplication` | Enable state replication | No |
| `argocd.redisTunneling` | Enable Redis tunneling | No |
| `argocd.disableAutoUpgrade` | Disable automatic agent upgrades | No |
| `argocd.argoprojCustomImageRegistry` | Custom image registry for Argo CD (argoproj) images | No |
:::warning Deprecated
The Argo CD options moved under the `argocd.*` key. The previous top-level keys (`project`, `namespaceScoped`, `stateReplication`, `redisTunneling`, `disableAutoUpgrade`, `argoprojCustomImageRegistry`) are **deprecated** but still honored for backwards compatibility, and will be removed in a future release. If a value is set both at the top level and under `argocd.*`, the `argocd.*` value takes precedence (for booleans, either being `true` enables the flag). Migrate existing values files to the `argocd.*` keys.
:::
### Kargo options (`agentType: kargo`)
| Value | Description | Required |
|---|---|---|
| `kargo.selfHosted` | Run the agent in this cluster (`true`, default) or as an Akuity-managed agent (`false`) | No |
| `kargo.agentNamespace` | Namespace to install the Kargo agent into (defaults to the release namespace) | No |
| `kargo.akuityArgocdName` | Name of an Akuity-managed Argo CD instance to associate with this agent | No |
| `kargo.selfManagedArgocdUrl` | URL of a self-managed Argo CD instance to associate with this agent | No |
| `kargo.argocdNamespace` | Target Argo CD namespace for the agent | No |
| `kargo.kargoCustomImageRegistry` | Custom image registry for Kargo images | No |
| `kargo.akuityCustomImageRegistry` | Custom image registry for Akuity images | No |
| `kargo.kustomizationPath` | Path to a `kustomization.yaml` with extra Kargo agent kustomizations | No |
| `kargo.defaultShard` | Set this agent as the instance's default shard | No |
## Embedding in Terraform
For clusters managed by Terraform, use the [`helm_release`](https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release) resource to register each cluster as part of provisioning. This ensures the agent is always installed when a new cluster is created, without any manual steps.
```hcl
variable "akuity_api_key_id" {
type = string
sensitive = true
}
variable "akuity_api_key_secret" {
type = string
sensitive = true
}
resource "helm_release" "akuity_agent" {
name = "akuity-agent"
repository = "oci://quay.io/akuity/akuity-platform-charts"
chart = "akuity-agent"
namespace = "akuity-agent"
create_namespace = true
set {
name = "clusterName"
value = var.cluster_name
}
set {
name = "instanceName"
value = var.argocd_instance_name
}
set {
name = "organizationName"
value = var.akuity_organization_name
}
set {
name = "akuityApiKeyId"
value = var.akuity_api_key_id
type = "string"
}
set_sensitive {
name = "akuityApiKeySecret"
value = var.akuity_api_key_secret
}
}
```
:::note
Store `akuityApiKeyId` and `akuityApiKeySecret` in a secrets manager (such as AWS Secrets Manager or HashiCorp Vault) and pass them into Terraform as sensitive variables rather than hardcoding them in the configuration.
:::
---
## The Akuity API
The Akuity API allows you to manage the Akuity Platform resources using the REST API.
## Getting an API Key
In order to use the API you will first need to [create an API key](../02-organizations/20-api-keys.mdx). Copy the following values from your API key:
- `AKUITY_API_KEY_ID`
- `AKUITY_API_KEY_SECRET`.
## Accessing the API
:::note
The API Server address is `https://akuity.cloud/api/v1/`
You can browse the [current API Reference](../05-reference/api.mdx).
:::
You can connect from your local workstation, with any tool that speaks HTTP (such as [postman](https://www.postman.com), [httpie](https://httpie.io), [curl](https://curl.se), [wget](https://www.gnu.org/software/wget/) etc.).
## Authentication
The API allows you to authenticate via HTTP basic auth using the `Authorization` Header.
### Basic Auth
[Basic auth](https://en.wikipedia.org/wiki/Basic_access_authentication) has been around for a long time, and is pretty simple. You will pass in a http header that looks like this.
```sh
Authorization: Basic
```
where credentials is the [Base64](https://en.wikipedia.org/wiki/Base64) encoding of `AKUITY_API_KEY_ID` and `AKUITY_API_KEY_SECRET` joined by a single colon :
```sh
export AKUITY_API_KEY_ID=mySecretKeyId
export AKUITY_API_KEY_SECRET=blahblahSecretValueBlahblah
export API_CRED=`echo -n $AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET | base64`
echo -n $API_CRED
> bXlTZWNyZXRLZXlJZDpibGFoYmxhaFNlY3JldFZhbHVlQmxhaGJsYWg=
```
:::note
In zsh, a `%` symbol is placed at the end of a line where zsh inserted a newline for us.
It is important to include echo’s -n option when piping content to an encoder to avoid a
newline character being included in the encoded output.
If the credentials are not working, check to make sure your base64 encoded value is correct
```sh
echo -n "$AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET" | base64 | base64 -d
```
:::
## API Examples
**curl**
### Curl
This command will returns the organizations for this API KEY using the basic auth header.
```sh
curl -H "Authorization: Basic `echo -n $AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET | base64`" https://akuity.cloud/api/v1/organizations
```
This is the same command, but we are using the basic auth `-u` flag in Curl. Which is a little easier since we don't need to Base64 encode the header ourselves.
```sh
curl -u $AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET https://akuity.cloud/api/v1/organizations
```
**httpie**
### httpie
This command will returns the organizations for this API KEY using the basic auth header.
```sh
http -A basic -a $AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET https://akuity.cloud/api/v1/organizations
```
**wget**
### wget
This command will returns the organizations for this API KEY using the basic auth header.
Note: For some reason the `--user`, and `--password` flags didn't work, that is why we are doing it the hard way.
```sh
wget -q -O- --header="Authorization: Basic `echo -n $AKUITY_API_KEY_ID:$AKUITY_API_KEY_SECRET | base64`" https://akuity.cloud/api/v1/organizations
```
---
## The Akuity CLI
The Akuity CLI allows you to manage the Akuity Platform resources using the operating system's command line. See [the CLI reference](../05-reference/cli/index.mdx) section for all available commands.
## Installation
**Mac**
### Homebrew
```sh
brew install akuity
```
### Manual
1. Download the latest release with the script:
```sh
arch=$(uname -m)
[ "$arch" = "x86_64" ] && arch=amd64
curl -L -o akuity "https://dl.akuity.io/akuity-cli/$(curl -sL https://dl.akuity.io/akuity-cli/stable.txt)/darwin/${arch}/akuity"
```
The following architectures are available to download: `amd64`, `arm64`
:::note
To download a specific version, replace the `$(curl -sL https://dl.akuity.io/akuity-cli/stable.txt)` portion of the command with the specific version.
For example, to download version v0.9.3 on Mac, use:
```sh
arch=$(uname -m)
[ "$arch" = "x86_64" ] && arch=amd64
curl -L -o akuity "https://dl.akuity.io/akuity-cli/v0.9.3/darwin/${arch}/akuity"
```
:::
Alternatively, you can download the CLI binary from the Akuity Portal UI using the `CLI` button in the left navigation bar.
2. Make the `akuity` binary executable:
```sh
chmod +x ./akuity
```
3. Move the `akuity` binary to a file location on your system `PATH`.
```sh
sudo mv ./akuity /usr/local/bin/akuity
sudo chown root: /usr/local/bin/akuity
```
:::note
Make sure `/usr/local/bin` is in your `PATH` environment variable.
:::
4. Check whether the version you've installed is the one you wanted:
```sh
akuity version
```
:::note
If your system shows
> "akuity" can't be opened because Apple cannot check it for malicious software.
you can allow running it by the following command:
```sh
sudo xattr -d com.apple.quarantine /usr/local/bin/akuity
```
:::
**Linux or WSL**
1. Download the latest release with the command:
```sh
arch=$(dpkg --print-architecture)
curl -sSL -o akuity "https://dl.akuity.io/akuity-cli/$(curl -sL https://dl.akuity.io/akuity-cli/stable.txt)/linux/${arch}/akuity"
chmod +x akuity
sudo mv akuity /usr/local/bin/akuity
```
The following architectures are available to download: `amd64`, `arm64`, `ppc64le`, `s390x`
:::note
To download a specific version, replace the `$(curl -sL https://dl.akuity.io/akuity-cli/stable.txt)` portion of the command with the specific version.
For example, to download version v0.9.3 on Linux, type:
```sh
arch=$(dpkg --print-architecture)
curl -sSL -o akuity "https://dl.akuity.io/akuity-cli/v0.9.3/linux/${arch}/akuity"
chmod +x akuity
sudo mv akuity /usr/local/bin/akuity
```
:::
Alternatively, you can download the CLI binary from the Akuity Portal UI using the `CLI` button in the left navigation bar.
2. Make the `akuity` binary executable:
```sh
chmod +x /usr/local/bin/akuity
```
3. Check whether the version you've installed is the one you wanted:
```sh
akuity version
```
**Windows**
1. Download the latest release with the command:
```sh
Invoke-WebRequest -URI https://dl.akuity.io/akuity-cli/$(Invoke-WebRequest https://dl.akuity.io/akuity-cli/stable.txt)/windows/amd64/akuity.exe -OutFile akuity.exe
```
The following architectures are available to download: `amd64`
:::note
To download a specific version, replace the `$(Invoke-WebRequest https://dl.akuity.io/akuity-cli/stable.txt)` portion of the command with the specific version.
For example, to download version v0.9.3 on Windows, type:
```sh
Invoke-WebRequest -URI "https://dl.akuity.io/akuity-cli/v0.9.3/windows/amd64/akuity.exe" -OutFile akuity.exe
```
:::
Alternatively, you can download the CLI binary from the Akuity Portal UI using the `CLI` button in the left navigation bar.
1. Append or prepend the `akuity` binary folder to your `PATH` environment variable.
1. Check whether the version you've installed is the one you wanted:
```sh
akuity version
```
## Login to Akuity Platform:
```sh
akuity login
```
Alternatively, you can generate an API token from the Akuity Portal UI using the API Keys tab on the organization profile page and expose the key
using `AKUITY_API_KEY_ID`, `AKUITY_API_KEY_SECRET`, and optionally `AKUITY_SERVER_URL` environment variables:
```sh
export AKUITY_API_KEY_ID=
export AKUITY_API_KEY_SECRET=
akuity argocd instance list --organization-name
```
---
## API
---
## Akuity
## akuity
```
akuity [flags]
```
### Options
```
-h, --help help for akuity
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
* [akuity config](akuity_config.md) - Configure Akuity CLI
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
* [akuity login](akuity_login.md) - Authenticate with an Akuity server
* [akuity logout](akuity_logout.md) - Remove authentication for an Akuity server
* [akuity organization](akuity_organization.md) - Interact with Akuity organizations
* [akuity version](akuity_version.md) - Display the version of the Akuity CLI
* [akuity whoami](akuity_whoami.md) - Display information about the currently authenticated user
---
## Akuity_argocd
## akuity argocd
Interact with ArgoCD resources
```
akuity argocd [flags]
```
### Options
```
-h, --help help for argocd
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
* [akuity argocd addon](akuity_argocd_addon.md) - Interact with ArgoCD Addons
* [akuity argocd addon-repo](akuity_argocd_addon-repo.md) - Interact with ArgoCD Addon repos
* [akuity argocd apply](akuity_argocd_apply.md) - Apply an Argo CD specification
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
* [akuity argocd diff](akuity_argocd_diff.md) - Diff an Argo CD specification against local files
* [akuity argocd export](akuity_argocd_export.md) - Export an Argo CD specification
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_addon Repo
## akuity argocd addon-repo
Interact with ArgoCD Addon repos
```
akuity argocd addon-repo [flags]
```
### Options
```
-h, --help help for addon-repo
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
* [akuity argocd addon-repo create](akuity_argocd_addon-repo_create.md) - Create a addon repo
* [akuity argocd addon-repo delete](akuity_argocd_addon-repo_delete.md) - Delete a addon repo
* [akuity argocd addon-repo list](akuity_argocd_addon-repo_list.md) - List instance addon repos
---
## Akuity_argocd_addon Repo_create
## akuity argocd addon-repo create
Create a addon repo
```
akuity argocd addon-repo create [flags]
```
### Examples
```
akuity argocd addon-repo create \
--organization-name= \
--instance-name= \
--revision= \
```
### Options
```
-h, --help help for create
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
-r, --revision string Target revision (default "HEAD")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon-repo](akuity_argocd_addon-repo.md) - Interact with ArgoCD Addon repos
---
## Akuity_argocd_addon Repo_delete
## akuity argocd addon-repo delete
Delete a addon repo
```
akuity argocd addon-repo delete [flags]
```
### Examples
```
akuity argocd addon-repo delete \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for delete
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon-repo](akuity_argocd_addon-repo.md) - Interact with ArgoCD Addon repos
---
## Akuity_argocd_addon Repo_list
## akuity argocd addon-repo list
List instance addon repos
```
akuity argocd addon-repo list [flags]
```
### Examples
```
akuity argocd addon-repo list \
--organization-name= \
--instance-name=
```
### Options
```
-h, --help help for list
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon-repo](akuity_argocd_addon-repo.md) - Interact with ArgoCD Addon repos
---
## Akuity_argocd_addon
## akuity argocd addon
Interact with ArgoCD Addons
```
akuity argocd addon [flags]
```
### Options
```
-h, --help help for addon
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
* [akuity argocd addon list](akuity_argocd_addon_list.md) - List instance addon
* [akuity argocd addon sync](akuity_argocd_addon_sync.md) - Sync a addon
* [akuity argocd addon update](akuity_argocd_addon_update.md) - Update a addon
---
## Akuity_argocd_addon_cluster Customization
## akuity argocd addon cluster-customization
Manage cluster customizations for an addon
```
akuity argocd addon cluster-customization [flags]
```
### Options
```
-h, --help help for cluster-customization
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon](akuity_argocd_addon.md) - Interact with ArgoCD Addons
* [akuity argocd addon cluster-customization list](akuity_argocd_addon_cluster-customization_list.md) - List cluster customizations for an addon
* [akuity argocd addon cluster-customization get](akuity_argocd_addon_cluster-customization_get.md) - Get a cluster customization by index, including its full patch
* [akuity argocd addon cluster-customization add](akuity_argocd_addon_cluster-customization_add.md) - Add a cluster customization to an addon
* [akuity argocd addon cluster-customization update](akuity_argocd_addon_cluster-customization_update.md) - Update a cluster customization by index
* [akuity argocd addon cluster-customization delete](akuity_argocd_addon_cluster-customization_delete.md) - Delete a cluster customization by index
---
## Apply to clusters whose name is in a list
## akuity argocd addon cluster-customization add
Add a cluster customization to an addon
```
akuity argocd addon cluster-customization add [flags]
```
### Examples
```
# Apply to clusters whose name is in a list
akuity argocd addon cluster-customization add \
--organization-name= \
--instance-name= \
--description="Pin image tag for prod" \
--patch-file=patch.yaml \
--name-in=prod-cluster,staging-cluster \
# Apply to clusters matching a label (env IN [prod, staging])
akuity argocd addon cluster-customization add \
--organization-name= \
--instance-name= \
--description="Override namespace" \
--patch-file=patch.yaml \
--label-in=env=prod,staging \
# Apply to all clusters
akuity argocd addon cluster-customization add \
--organization-name= \
--instance-name= \
--description="Global override" \
--patch-file=patch.yaml \
--all-clusters \
```
### Options
```
--all-clusters Apply customization to all clusters (mutually exclusive with selector flags)
--description string Description of the cluster customization (required)
-h, --help help for add
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--label-in stringArray Label filter IN: key=val1[,val2] — cluster label key matches any value (repeatable)
--label-not-in stringArray Label filter NOT IN: key=val1[,val2] — cluster label key matches none of the values (repeatable)
--name-in strings Name filter: cluster name IN the given comma-separated list (repeatable)
--name-not-in strings Name filter: cluster name NOT IN the given comma-separated list (repeatable)
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--patch-file string Path to a YAML or JSON file containing the patch (required)
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
---
## Akuity_argocd_addon_cluster Customization_delete
## akuity argocd addon cluster-customization delete
Delete a cluster customization by index
```
akuity argocd addon cluster-customization delete [flags]
```
:::note Index shifting after deletion
Cluster customizations are stored as an ordered list. When you delete an entry, all customizations with a higher index shift down by one. For example, if you delete index 0, the former index 1 becomes the new index 0. Run [`akuity argocd addon cluster-customization list`](akuity_argocd_addon_cluster-customization_list.md) after a deletion to see the updated indices before performing further operations.
:::
### Examples
```
akuity argocd addon cluster-customization delete \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for delete
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
---
## Akuity_argocd_addon_cluster Customization_get
## akuity argocd addon cluster-customization get
Get a cluster customization by index, including its full patch
```
akuity argocd addon cluster-customization get [flags]
```
### Examples
```
akuity argocd addon cluster-customization get \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for get
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
---
## Akuity_argocd_addon_cluster Customization_list
## akuity argocd addon cluster-customization list
List cluster customizations for an addon
```
akuity argocd addon cluster-customization list [flags]
```
### Examples
```
akuity argocd addon cluster-customization list \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for list
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
---
## Update the patch file only (selector unchanged)
## akuity argocd addon cluster-customization update
Update a cluster customization by index
```
akuity argocd addon cluster-customization update [flags]
```
Selector flags (`--name-in`, `--name-not-in`, `--label-in`, `--label-not-in`) **append** new filter entries to the existing cluster selector. Use `--clear-name-filters` or `--clear-label-filters` to remove existing filters before adding new ones. Use `--all-clusters` to clear the entire selector.
### Examples
```
# Update the patch file only (selector unchanged)
akuity argocd addon cluster-customization update \
--organization-name= \
--instance-name= \
--patch-file=patch.yaml \
# Append a new label filter without touching existing filters
akuity argocd addon cluster-customization update \
--organization-name= \
--instance-name= \
--label-not-in=env=staging \
# Replace name filters: clear existing, add new
akuity argocd addon cluster-customization update \
--organization-name= \
--instance-name= \
--clear-name-filters \
--name-in=prod-cluster \
```
### Options
```
--all-clusters Clear the entire cluster selector, applying to all clusters
--clear-label-filters Remove all existing label filters (can be combined with --label-in/--label-not-in to replace)
--clear-name-filters Remove all existing name filters (can be combined with --name-in/--name-not-in to replace)
--description string New description
-h, --help help for update
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--label-in stringArray Append a label IN filter: key=val1[,val2] (repeatable)
--label-not-in stringArray Append a label NOT IN filter: key=val1[,val2] (repeatable)
--name-in strings Append a name IN filter (comma-separated cluster names)
--name-not-in strings Append a name NOT IN filter (comma-separated cluster names)
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--patch-file string Path to a YAML or JSON file with the updated patch
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon cluster-customization](akuity_argocd_addon_cluster-customization.md) - Manage cluster customizations for an addon
---
## Akuity_argocd_addon_list
## akuity argocd addon list
List instance addon
```
akuity argocd addon list [flags]
```
### Examples
```
akuity argocd addon list \
--organization-name= \
--instance-name=
```
### Options
```
-h, --help help for list
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon](akuity_argocd_addon.md) - Interact with ArgoCD Addons
---
## Akuity_argocd_addon_sync
## akuity argocd addon sync
Sync a addon
```
akuity argocd addon sync [flags]
```
### Examples
```
akuity argocd addon sync \
--organization-name= \
--instance-name= \
```
### Options
```
--apply-out-of-sync-only Sync only out-of-sync resources
-l, --cluster-selector.label-filters string Cluster selector label filters
-n, --cluster-selector.name-filters string Cluster selector name filters
--create-namespace Namespace Auto-Creation ensures that namespace specified as the application destination exists in the destination cluster.
-h, --help help for sync
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
-p, --propagation-policy string Specify propagation policy for deletion of application's resources. One of: foreground|background (default "foreground")
--prune Allow deleting unexpected resources
--prune-last Allow the ability for resource pruning to happen as a final, implicit wave of a sync operation
--replace Use a kubectl create/replace instead apply
--respect-ignore-diff When syncing changes, respect fields ignored by the ignoreDifferences configuration
-r, --revision string Sync to a specific revision (default "HEAD")
--server-side Use server-side apply while syncing the application
--validate disables resource validation (equivalent to 'kubectl apply --validate=false') (default true)
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon](akuity_argocd_addon.md) - Interact with ArgoCD Addons
---
## Akuity_argocd_addon_update
## akuity argocd addon update
Update a addon
```
akuity argocd addon update [flags]
```
### Examples
```
akuity argocd addon update \
--organization-name= \
--instance-name= \
```
### Options
```
--apply-out-of-sync-only Sync only out-of-sync resources
--auto-heal Set self healing when sync is automated
--auto-sync Auto sync policy
-l, --cluster-selector.label-filters string Cluster selector label filters
-n, --cluster-selector.name-filters string Cluster selector name filters
--create-namespace Namespace Auto-Creation ensures that namespace specified as the application destination exists in the destination cluster.
--disable Disable addon
--enable Enable addon
-h, --help help for update
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--name-template string Name tempate
--namespace-template string Namespace tempate
--non-cascade Perform a non cascaded deletion of all application resources
--on-conflict-action string On conflict action (One of skip,overwrite) (default "overwrite")
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--project-template string Project tempate
-p, --propagation-policy string Specify propagation policy for deletion of application's resources. One of: foreground|background (default "foreground")
--prune-last Allow the ability for resource pruning to happen as a final, implicit wave of a sync operation
--prune-resources Set automatic pruning when sync is automated
--replace Use a kubectl create/replace instead apply
--respect-ignore-diff When syncing changes, respect fields ignored by the ignoreDifferences configuration
--server-side Use server-side apply while syncing the application
--validate disables resource validation (equivalent to 'kubectl apply --validate=false') (default true)
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd addon](akuity_argocd_addon.md) - Interact with ArgoCD Addons
---
## Akuity_argocd_apply
## akuity argocd apply
Apply an Argo CD specification
```
akuity argocd apply [flags]
```
### Options
```
-f, --filenames stringArray Path to filenames or directories of manifests
-h, --help help for apply
--name ArgoCD The ArgoCD instance name. The name of ArgoCD instance in the manifests takes priority over this flag.
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
--prune strings The types of resource that will be pruned if they don't exist in the manifests. The value can be 'all', 'appprojs', 'apps', 'appsets', 'clusters', 'cmps', 'repo-credentials'.
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
---
## Akuity_argocd_cluster
## akuity argocd cluster
Interact with ArgoCD clusters
```
akuity argocd cluster [flags]
```
### Options
```
-h, --help help for cluster
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
* [akuity argocd cluster create](akuity_argocd_cluster_create.md) - Create a cluster
* [akuity argocd cluster delete](akuity_argocd_cluster_delete.md) - Delete a cluster
* [akuity argocd cluster get](akuity_argocd_cluster_get.md) - Get instance clusters
* [akuity argocd cluster get-agent-manifests](akuity_argocd_cluster_get-agent-manifests.md) - Get cluster agent manifests
* [akuity argocd cluster list](akuity_argocd_cluster_list.md) - List instance clusters
* [akuity argocd cluster update](akuity_argocd_cluster_update.md) - Update a cluster
* [akuity argocd cluster upgrade](akuity_argocd_cluster_upgrade.md) - Upgrade a batch of clusters to a particular version
---
## Akuity_argocd_cluster_create
## akuity argocd cluster create
Create a cluster
```
akuity argocd cluster create [flags]
```
### Examples
```
akuity argocd cluster create \
--organization-name= \
--instance-name= \
```
### Options
```
--agent-size string Agent size (One of small,medium,large,auto) (default "small")
--akuity-custom-image-registry string Custom image registry for Akuity images
--annotation stringArray Cluster annotation (e.g. --annotation 'key1' or 'key1=value1')
--argoproj-custom-image-registry string Custom image registry for Argoproj images
--disable-auto-update Disable automatic updates of agent components
--disable-auto-upgrade Disable automatic updates of agent components (DEPRECATED: use --disable-auto-update instead)
--force Disables optional cluster settings validation
-h, --help help for create
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--kustomization-path string Path to kustomization.yaml that contains cluster agent kustomization
--label stringArray Cluster label (e.g. --label 'key1' or 'key1=value1')
-n, --namespace string Target namespace (default "akuity")
--namespace-scoped Namespace scoped cluster installation
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--project string Argo CD Project cluster belongs to
--redis-tunneling Tunnels agent redis connection instead of using a direct connection (default 'false')
--state-replication Enables agent state replication (default 'false')
--upsert Update if exists
--version string Desired cluster agent target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_delete
## akuity argocd cluster delete
Delete a cluster
```
akuity argocd cluster delete [flags]
```
### Examples
```
akuity argocd cluster delete \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for delete
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_get Agent Manifests
## akuity argocd cluster get-agent-manifests
Get cluster agent manifests
```
akuity argocd cluster get-agent-manifests [flags]
```
### Examples
```
akuity argocd cluster get-agent-manifests \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for get-agent-manifests
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--offline-installation When set to true the agent manifests will be bundle snapshot of all Argo CD settings including applications and projects
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
--use-id Use cluster id instead of name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_get
## akuity argocd cluster get
Get instance clusters
```
akuity argocd cluster get [flags]
```
### Examples
```
akuity argocd cluster get \
--organization-name= \
--instance-name= \
<(optional) cluster-name or cluster-id>
```
### Options
```
-h, --help help for get
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_list
## akuity argocd cluster list
List instance clusters
```
akuity argocd cluster list [flags]
```
### Examples
```
akuity argocd cluster list \
--organization-name= \
--instance-name= \
--label='key1=val1'
```
### Options
```
-h, --help help for list
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--label stringArray Cluster label (e.g. --label 'key1' or 'key1=value1')
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_update
## akuity argocd cluster update
Update a cluster
```
akuity argocd cluster update [flags]
```
### Examples
```
akuity argocd cluster update \
--organization-name= \
--instance-name= \
```
### Options
```
--agent-size string Agent size (One of small,medium,large,auto)
--akuity-custom-image-registry string Custom image registry for Akuity images
--annotation stringArray Cluster annotation (e.g. --annotation 'key1' or 'key1=value1')
--argoproj-custom-image-registry string Custom image registry for Argoproj images
--disable-auto-update Disable automatic updates of agent components
--disable-auto-upgrade Disable automatic updates of agent components (DEPRECATED: use --disable-auto-update instead)
--force Disables optional cluster settings validation
-h, --help help for update
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--kustomization-path string Path to kustomization.yaml that contains cluster agent kustomization
--label stringArray Cluster label (e.g. --label 'key1' or 'key1=value1')
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--project string Argo CD Project cluster belongs to
--version string Desired cluster agent target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_cluster_upgrade
## akuity argocd cluster upgrade
Upgrade a batch of clusters to a particular version
```
akuity argocd cluster upgrade [flags]
```
### Examples
```
akuity argocd cluster upgrade \
--organization-name= \
--instance-name= \
--version= \
--clusters=,,..
```
### Options
```
--clusters strings List of cluster names to upgrade (e.g. --clusters name1,name2,name3)
-h, --help help for upgrade
--instance-id string ArgoCD instance ID
--instance-name string ArgoCD instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Desired cluster agent target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd cluster](akuity_argocd_cluster.md) - Interact with ArgoCD clusters
---
## Akuity_argocd_diff
## akuity argocd diff
Diff an Argo CD specification against local files
```
akuity argocd diff [flags]
```
### Options
```
-f, --filenames stringArray Path to filenames or directories of manifests
-h, --help help for diff
--ignore-errors Ignore errors when comparing files
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
---
## Akuity_argocd_export
## akuity argocd export
Export an Argo CD specification
```
akuity argocd export [flags]
```
### Examples
```
akuity argocd export \
--organization-name= \
```
### Options
```
-h, --help help for export
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
---
## Akuity_argocd_instance
## akuity argocd instance
Interact with ArgoCD instances
```
akuity argocd instance [flags]
```
### Options
```
-h, --help help for instance
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd](akuity_argocd.md) - Interact with ArgoCD resources
* [akuity argocd instance create](akuity_argocd_instance_create.md) - Create an instance
* [akuity argocd instance delete](akuity_argocd_instance_delete.md) - Delete an instance
* [akuity argocd instance get](akuity_argocd_instance_get.md) - Get instances
* [akuity argocd instance list](akuity_argocd_instance_list.md) - List instances
* [akuity argocd instance update](akuity_argocd_instance_update.md) - Update an instance
* [akuity argocd instance versions](akuity_argocd_instance_versions.md) - List available instance versions
---
## Akuity_argocd_instance_create
## akuity argocd instance create
Create an instance
```
akuity argocd instance create [flags]
```
### Examples
```
akuity argocd instance create \
--organization-name= \
```
### Options
```
--description string Instance description
-h, --help help for create
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Instance version (default "stable")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_instance_delete
## akuity argocd instance delete
Delete an instance
```
akuity argocd instance delete [flags]
```
### Examples
```
akuity argocd instance delete \
--organization-name= \
```
### Options
```
-h, --help help for delete
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_instance_get
## akuity argocd instance get
Get instances
```
akuity argocd instance get [flags]
```
### Examples
```
akuity argocd instance get \
--organization-name= \
<(optional) instance-name or instance-id>
```
### Options
```
-h, --help help for get
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_instance_list
## akuity argocd instance list
List instances
```
akuity argocd instance list [flags]
```
### Examples
```
akuity argocd instance list \
--organization-name=
```
### Options
```
-h, --help help for list
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_instance_update
## akuity argocd instance update
Update an instance
```
akuity argocd instance update [flags]
```
### Examples
```
akuity argocd instance update \
--organization-name= \
```
### Options
```
--description string Instance description
-h, --help help for update
--name string Instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Instance version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_argocd_instance_versions
## akuity argocd instance versions
List available instance versions
```
akuity argocd instance versions [flags]
```
### Options
```
-h, --help help for versions
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity argocd instance](akuity_argocd_instance.md) - Interact with ArgoCD instances
---
## Akuity_config
## akuity config
Configure Akuity CLI
```
akuity config [flags]
```
### Options
```
-h, --help help for config
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
* [akuity config set](akuity_config_set.md) - Set default value for the CLI
---
## Akuity_config_set
## akuity config set
Set default value for the CLI
```
akuity config set [flags]
```
### Examples
```
akuity config set \
--organization-name=
```
### Options
```
-h, --help help for set
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity config](akuity_config.md) - Configure Akuity CLI
---
## Akuity_kargo
## akuity kargo
Interact with Kargo resources
```
akuity kargo [flags]
```
### Options
```
-h, --help help for kargo
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
* [akuity kargo apply](akuity_kargo_apply.md) - Apply a Kargo instance specification
* [akuity kargo diff](akuity_kargo_diff.md) - Diff a Kargo specification against local files
* [akuity kargo export](akuity_kargo_export.md) - Export a Kargo specification
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_agent
## akuity kargo agent
Interact with Kargo agents
```
akuity kargo agent [flags]
```
### Options
```
-h, --help help for agent
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
* [akuity kargo agent create](akuity_kargo_agent_create.md) - Create an agent
* [akuity kargo agent delete](akuity_kargo_agent_delete.md) - Delete an agent
* [akuity kargo agent get](akuity_kargo_agent_get.md) - Get instance agents
* [akuity kargo agent get-manifests](akuity_kargo_agent_get-manifests.md) - Get agent manifests
* [akuity kargo agent list](akuity_kargo_agent_list.md) - List instance agents
* [akuity kargo agent update](akuity_kargo_agent_update.md) - Update an agent
* [akuity kargo agent upgrade](akuity_kargo_agent_upgrade.md) - Upgrade a batch of agents to a particular version
---
## Akuity_kargo_agent_create
## akuity kargo agent create
Create an agent
```
akuity kargo agent create [flags]
```
### Examples
```
akuity kargo agent create \
--organization-name= \
--instance-name= \
```
### Options
```
--agent-namespace string Kargo agent namespace (default "akuity")
--agent-size string Agent size (One of small,medium,large) (default "small")
--akuity-argocd-id string Akuity Managed ArgoCD instance ID
--akuity-argocd-name string Akuity Managed ArgoCD instance name
--akuity-custom-image-registry string Custom image registry for Akuity images
--annotation stringArray Agent annotation (e.g. --annotation 'key1' or 'key1=value1')
--argocd-namespace string Target ArgoCD Namespace
--default-shard Set agent as default shard?
--disable-auto-update Disable automatic updates of agent components
-h, --help help for create
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--kargo-custom-image-registry string Custom image registry for Kargo images
--kustomization-path string Path to kustomization.yaml that contains kargo agent kustomization
--label stringArray Agent label (e.g. --label 'key1' or 'key1=value1')
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--self-hosted[=false] Is the Kargo agent self-hosted?
--upsert Update if exists
--version string Target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_delete
## akuity kargo agent delete
Delete an agent
```
akuity kargo agent delete [flags]
```
### Examples
```
akuity kargo agent delete \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for delete
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_get Manifests
## akuity kargo agent get-manifests
Get agent manifests
```
akuity kargo agent get-manifests [flags]
```
### Examples
```
akuity kargo agent get-manifests \
--organization-name= \
--instance-name= \
```
### Options
```
-h, --help help for get-manifests
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_get
## akuity kargo agent get
Get instance agents
```
akuity kargo agent get [flags]
```
### Examples
```
akuity kargo agent get \
--organization-name= \
--instance-name= \
<(optional) agent-name or agent-id>
```
### Options
```
-h, --help help for get
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_list
## akuity kargo agent list
List instance agents
```
akuity kargo agent list [flags]
```
### Examples
```
akuity kargo agent list \
--organization-name= \
--instance-name= \
--label='key1=val1'
```
### Options
```
-h, --help help for list
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--label stringArray Agent label (e.g. --label 'key1' or 'key1=value1')
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_update
## akuity kargo agent update
Update an agent
```
akuity kargo agent update [flags]
```
### Examples
```
akuity kargo agent update \
--organization-name= \
--instance-name= \
```
### Options
```
--agent-size string Agent size (One of small,medium,large)
--akuity-custom-image-registry string Custom image registry for Akuity images
--annotation stringArray Agent annotation (e.g. --annotation 'key1' or 'key1=value1')
--default-shard Set agent as default shard?
--disable-auto-update Disable automatic updates of agent components
-h, --help help for update
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--kargo-custom-image-registry string Custom image registry for Kargo images
--kustomization-path string Path to kustomization.yaml that contains kargo agent kustomization
--label stringArray Agent label (e.g. --label 'key1' or 'key1=value1')
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Desired kargo agent target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_agent_upgrade
## akuity kargo agent upgrade
Upgrade a batch of agents to a particular version
```
akuity kargo agent upgrade [flags]
```
### Examples
```
akuity kargo agent upgrade \
--organization-name= \
--instance-name= \
--version= \
--agents=,,..
```
### Options
```
--agents strings List of agent names to upgrade (e.g. --agents name1,name2,name3)
-h, --help help for upgrade
--instance-id string Kargo instance ID
--instance-name string Kargo instance name
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Desired kargo agent target version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo agent](akuity_kargo_agent.md) - Interact with Kargo agents
---
## Akuity_kargo_apply
## akuity kargo apply
Apply a Kargo instance specification
```
akuity kargo apply [flags]
```
### Options
```
-f, --filenames stringArray Path to filenames or directories of manifests
-h, --help help for apply
--name Kargo The Kargo instance name. The name of Kargo instance in the manifests takes priority over this flag.
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
--prune strings The types of resource that will be pruned if they don't exist in the manifests. The value can be 'agents', 'all', 'analysis-templates', 'cluster-message-channels', 'cluster-promotion_tasks', 'message-channels', 'project-configs', 'projects', 'promotion-tasks', 'repo-credentials', 'stages', 'warehouses'.
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
---
## Akuity_kargo_diff
## akuity kargo diff
Diff a Kargo specification against local files
```
akuity kargo diff [flags]
```
### Options
```
-f, --filenames stringArray Path to filenames or directories of manifests
-h, --help help for diff
--ignore-errors Ignore errors when comparing files
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
---
## Akuity_kargo_export
## akuity kargo export
Export a Kargo specification
```
akuity kargo export [flags]
```
### Examples
```
akuity kargo export \
--organization-name= \
```
### Options
```
-h, --help help for export
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
---
## Akuity_kargo_instance
## akuity kargo instance
Interact with Kargo instances
```
akuity kargo instance [flags]
```
### Options
```
-h, --help help for instance
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo](akuity_kargo.md) - Interact with Kargo resources
* [akuity kargo instance create](akuity_kargo_instance_create.md) - Create an instance
* [akuity kargo instance delete](akuity_kargo_instance_delete.md) - Delete an instance
* [akuity kargo instance get](akuity_kargo_instance_get.md) - Get instances
* [akuity kargo instance list](akuity_kargo_instance_list.md) - List instances
* [akuity kargo instance update](akuity_kargo_instance_update.md) - Update an instance
* [akuity kargo instance versions](akuity_kargo_instance_versions.md) - List available instance versions
---
## Akuity_kargo_instance_create
## akuity kargo instance create
Create an instance
```
akuity kargo instance create [flags]
```
### Examples
```
akuity kargo instance create \
--organization-name= \
```
### Options
```
--description string Instance description
-h, --help help for create
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Instance version (default "stable")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_instance_delete
## akuity kargo instance delete
Delete an instance
```
akuity kargo instance delete [flags]
```
### Examples
```
akuity kargo instance delete \
--organization-name= \
```
### Options
```
-h, --help help for delete
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_instance_get
## akuity kargo instance get
Get instances
```
akuity kargo instance get [flags]
```
### Examples
```
akuity kargo instance get \
--organization-name= \
<(optional) instance-name or instance-id>
```
### Options
```
-h, --help help for get
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_instance_list
## akuity kargo instance list
List instances
```
akuity kargo instance list [flags]
```
### Examples
```
akuity kargo instance list \
--organization-name=
```
### Options
```
-h, --help help for list
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_instance_update
## akuity kargo instance update
Update an instance
```
akuity kargo instance update [flags]
```
### Examples
```
akuity kargo instance update \
--organization-name= \
```
### Options
```
--description string Instance description
-h, --help help for update
--org-id string Alias for organization-id
--org-name string Alias for organization-name
--organization-id string Akuity cloud organization ID
--organization-name string Akuity cloud organization name
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
--version string Instance version
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_kargo_instance_versions
## akuity kargo instance versions
List available instance versions
```
akuity kargo instance versions [flags]
```
### Options
```
-h, --help help for versions
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity kargo instance](akuity_kargo_instance.md) - Interact with Kargo instances
---
## Akuity_login
## akuity login
Authenticate with an Akuity server
```
akuity login [flags]
```
### Options
```
-h, --help help for login
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
---
## Akuity_logout
## akuity logout
Remove authentication for an Akuity server
```
akuity logout [flags]
```
### Options
```
-h, --help help for logout
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
---
## Akuity_organization
## akuity organization
Interact with Akuity organizations
```
akuity organization [flags]
```
### Options
```
-h, --help help for organization
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
* [akuity organization get](akuity_organization_get.md) - Get organizations
* [akuity organization list](akuity_organization_list.md) - List organizations
---
## Akuity_organization_get
## akuity organization get
Get organizations
```
akuity organization get [flags]
```
### Examples
```
akuity organization get \
<(optional) organization-name or organization-id>
```
### Options
```
-h, --help help for get
-o, --output string Output format. One of (json, yaml, wide) (default "wide")
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity organization](akuity_organization.md) - Interact with Akuity organizations
---
## Akuity_organization_list
## akuity organization list
List organizations
```
akuity organization list [flags]
```
### Examples
```
akuity organization list
```
### Options
```
-h, --help help for list
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity organization](akuity_organization.md) - Interact with Akuity organizations
---
## Akuity_version
## akuity version
Display the version of the Akuity CLI
```
akuity version [flags]
```
### Options
```
-h, --help help for version
--short Print short version only
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
---
## Akuity_whoami
## akuity whoami
Display information about the currently authenticated user
### Synopsis
Display information about the currently authenticated user, including their username and expiration time of the access token.
```
akuity whoami [flags]
```
### Options
```
-h, --help help for whoami
```
### Options inherited from parent commands
```
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity
--no-color Disable colored output (default true)
--server string The server url of the Akuity cloud (default "https://akuity.cloud")
```
### SEE ALSO
* [akuity](akuity.md) -
---
## CLI
Akuity CLI is a command line interface for the Akuity Platform. See [CLI Getting Started](/akuity-portal/automation) to learn how to
install and use it.
---
## Crossplane Provider
Manage Akuity Platform resources as Kubernetes-native custom resources with the [Akuity Crossplane provider](https://marketplace.upbound.io/providers/akuity/provider-crossplane-akuity/latest).
| Resource | Link |
| --- | --- |
| Documentation, resources & upgrade notes | https://marketplace.upbound.io/providers/akuity/provider-crossplane-akuity |
| Source code | https://github.com/akuity/provider-crossplane-akuity |
| Examples | https://github.com/akuity/provider-crossplane-akuity/tree/main/examples |
The [marketplace documentation](https://marketplace.upbound.io/providers/akuity/provider-crossplane-akuity/latest?tab=documentation) covers installation, provider configuration, every managed resource, and upgrade notes.
## Example
Configure a `ProviderConfig` that every managed resource references:
```yaml
apiVersion: akuity.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
name: akuity
spec:
organizationId:
credentialsSecretRef:
namespace: crossplane-system
name: akuity-provider-secret
key: credentials
```
The referenced Secret holds JSON with `apiKeyId` and `apiKeySecret`. The provider targets the US region (`https://akuity.cloud`) by default; EU customers should set `spec.serverUrl` to `https://eu.akuity.cloud`.
## FAQ
**Do I need an Akuity API key?**
Yes. Create one (see [API Keys](/akuity-portal/organizations/api-keys)) and store its `apiKeyId` and `apiKeySecret` as JSON in the Secret referenced by the `ProviderConfig` above.
**Where do I report a bug or request a feature?**
Open an issue at https://github.com/akuity/provider-crossplane-akuity/issues.
---
## Argo CD Spec
```yaml
apiVersion: argocd.akuity.io/v1alpha1
kind: ArgoCD
metadata:
name: test
spec:
description: "instance description"
instanceSpec:
appSetDelegate:
managedCluster:
clusterName: laptop
assistantExtensionEnabled: true
auditExtensionEnabled: true
backendIpAllowListEnabled: true
clusterCustomizationDefaults:
autoUpgradeDisabled: false
appReplication: true
redisTunneling: true
kustomization:
images:
- name: quay.io/akuity/agent
newName: my-company.io/akuity/agent
- name: quay.io/argoproj/argocd
newName: my-company.io/argoproj/argocd
declarativeManagementEnabled: true
secrets:
sources:
- clusters:
matchExpressions:
- key: test-label
operator: In
values:
- true
secrets: {}
extensions:
- id: argo_rollouts
version: v0.3.7
imageUpdaterDelegate:
managedCluster:
clusterName: laptop
imageUpdaterEnabled: true
ipAllowList:
- description: test
ip: 192.0.0.1/32
appsetPolicy:
policy: sync
overridePolicy: false
repoServerDelegate:
managedCluster:
clusterName: laptop
subdomain: my-subdomain
syncHistoryExtensionEnabled: true
version: v3.4.2-ak.87
```
---
## Cluster Spec
```yaml
apiVersion: argocd.akuity.io/v1alpha1
kind: Cluster
metadata:
name: test-cluster-update
namespace: test
labels:
test-label: "true"
annotations:
test-annotation: "false"
spec:
namespaceScoped: true
description: test-inst
data:
size: small
autoUpgradeDisabled: true
appReplication: true
targetVersion: 0.4.1
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- test.yaml
datadogAnnotationsEnabled: false
eksAddonEnabled: false
multiClusterK8sDashboardEnabled: true
redisTunneling: false
argocdNotificationsSettings:
inClusterSettings: false
autoscalerConfig:
applicationController:
resourceMaximum:
cpu: "6"
mem: 16Gi
resourceMinimum:
cpu: "2"
mem: 4Gi
repoServer:
replicaMaximum: 10
replicaMinimum: 2
resourceMaximum:
cpu: "4"
mem: 6Gi
resourceMinimum:
cpu: "1"
mem: 1Gi
```
---
## ConfigManagementPlugin Spec
```yaml
apiVersion: argoproj.io/v1alpha1
kind: ConfigManagementPlugin
metadata:
annotations:
akuity.io/enabled: "true"
akuity.io/image: ghcr.io/travisghansen/argo-cd-helmfile:v0.3.6
name: helmfile
spec:
discover:
fileName: helmfile.yaml
find: {}
generate:
args:
- generate
command:
- argo-cd-helmfile.sh
init:
args:
- init
command:
- argo-cd-helmfile.sh
parameters:
dynamic:
args:
- parameters
command:
- argo-cd-helmfile.sh
```
---
## ConfigMap Specs
## argocd-cm
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
data:
users.anonymous.enabled: "false"
kustomize.buildOptions: --load_restrictor none
admin.enabled: "false"
accounts.alice: apiKey, login
accounts.alice.enabled: "true"
accounts.bob: login
accounts.bob.enabled: "false"
application.links: '[{"title":"Datadog Events","url":"https://us3.datadoghq.com/event/explorer?query=kube_cluster_name%3A{{.application.spec.destination.name}}%20kube_namespace%3A{{.application.spec.destination.namespace}}%20source%3Akubernetes"}]'
exec.enabled: "false"
helm.enabled: "true"
kustomize.enabled: "true"
resource.links: '[{"title":"Datadog Logs","url":"https://us3.datadoghq.com/logs?query=pod_name%3A{{.resource.metadata.name}}","if":"resource.kind
== \"Pod\""}]'
dex.config: |
connectors:
# GitHub example
- type: github
id: github
name: GitHub
config:
clientID: aabbccddeeff00112233
clientSecret: $dex.github.clientSecret
orgs:
- name: your-github-org
resource.customizations.health.certmanager.k8s.io_Certificate: |
hs = {}
hs.status = "Progressing"
hs.message = "Waiting for certificate"
return hs
```
## argocd-rbac-cm
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
data:
policy.default: role:readonly
policy.csv: |
p, role:org-admin, applications, *, */*, allow
p, role:org-admin, clusters, get, *, allow
g, your-github-org:your-team, role:org-admin
```
## argocd-notification-cm
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
trigger.on-sync-status-unknown: |
- when: app.status.sync.status == 'Unknown'
send: [my-custom-template]
template.my-custom-template: |
message: |
Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
defaultTriggers: |
- on-sync-status-unknown
```
## argocd-image-updater-config
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-image-updater-config
data:
registries.conf: |-
registries:
- prefix: docker.io
name: Docker
api_url: https://registry-1.docker.io
credentials: secret:argocd/argocd-image-updater-secret#my-docker-credentials
git.email: akuity@akuity.io
git.user: akuity
```
## argocd-image-updater-ssh-config
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-image-updater-ssh-config
data:
config: |-
Host *
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa
```
## argocd-ssh-known-hosts-cm
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/name: argocd-ssh-known-hosts-cm
app.kubernetes.io/part-of: argocd
name: argocd-ssh-known-hosts-cm
data:
ssh_known_hosts: |
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
gitlab.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFSMqzJeV9rUzU4kWitGjeR4PWSa29SPqJ1fVkhtj3Hw9xjLVXVYrU9QlYWrOLXBpQ6KWjbjTDTdDkoohFzgbEY=
gitlab.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAfuCHKVTjquxvt6CM6tdG4SLp1Btn/nOeHHE5UOzRdf
gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgMtXL583qmBpzeQ+jqCMRgBqB98u3z++J1sKlXHWfM9dyhSevkMwSbhoR8XIq/U0tCNyokEi/ueaBMCvbcTHhO7FcwzY92WK4Yt0aGROY5qX2UKSeOvuP4D6TPqKF1onrSzH9bx9XUf2lEdWT/ia1NEKjunUqu1xOB/StKDHMoX4/OKyIzuS0q/T1zOATthvasJFoPrAjkohTyaDUz2LN5JoH839hViyEG82yB+MjcFV5MU3N1l1QL3cVUCh93xSaua1N85qivl+siMkPGbO5xR/En4iEY6K2XPASUEMaieWVNTRCtJ4S8H+9
ssh.dev.azure.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H
vs-ssh.visualstudio.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Hr1oTWqNqOlzGJOfGJ4NakVyIzf1rXYd4d7wo6jBlkLvCA4odBlL0mDUyZ0/QUfTTqeu+tm22gOsv+VrVTMk6vwRU75gY/y9ut5Mb3bR5BV58dKXyq9A9UeB5Cakehn5Zgm6x1mKoVyf+FFn26iYqXJRgzIZZcZ5V6hrE0Qg39kZm4az48o0AUbf6Sp4SLdvnuMa2sVNwHBboS7EJkm57XQPVU3/QpyNLHbWDdzwtrlS+ez30S3AdYhLKEOxAG8weOnyrtLJAUen9mTkol8oII1edf7mWWbWVf0nBmly21+nZcmCTISQBtdcyPaEno7fFQMDD26/s0lfKob4Kw8H
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
```
## argocd-tls-certs-cm
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-tls-certs-cm
namespace: argocd
labels:
app.kubernetes.io/name: argocd-tls-certs-cm
app.kubernetes.io/part-of: argocd
data:
server.example.com: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
```
---
## Argo CD Instance Specs
Argo CD Instance Specs can be used declaratively to apply specs to a Kargo instance on the Akuity Platform. See [akuity argocd apply](/akuity-portal/reference/cli/akuity_argocd_apply) to learn how use it.
---
## Secret Specs
## Controller Secrets
### argocd-secret
```yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-secret
type: Opaque
stringData:
dex.github.clientSecret: my-github-oidc-secret
webhook.github.secret: shhhh! it's a github secret
```
### argocd-notifications-secret
```yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-notifications-secret
type: Opaque
stringData:
email-username: test@argoproj.io
email-password: password
```
### argocd-image-updater-secret
```yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-image-updater-secret
type: Opaque
stringData:
my-docker-credentials: abcd1234
```
### application-set-secret
```yaml
apiVersion: v1
kind: Secret
metadata:
name: application-set-secret
type: Opaque
stringData:
my-appset-secret: xyz456
```
## Repository Secrets
:::info
All repository credentials are required to have a prefix of `repo-` for the name of the secret.
:::
### repo-argoproj-https-creds
```yaml
apiVersion: v1
kind: Secret
metadata:
name: repo-argoproj-https-creds
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repo-creds
stringData:
url: https://github.com/argoproj
type: helm
password: my-password
username: my-username
```
### repo-my-private-https-repo
```yaml
apiVersion: v1
kind: Secret
metadata:
name: repo-my-private-https-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: https://github.com/argoproj/argocd-example-apps
password: my-password
username: my-username
insecure: "true"
forceHttpBasicAuth: "true"
enableLfs: "true"
```
### repo-my-private-ssh-repo
```yaml
apiVersion: v1
kind: Secret
metadata:
name: repo-my-private-ssh-repo
namespace: argocd
labels:
argocd.argoproj.io/secret-type: repository
stringData:
url: ssh://git@github.com/argoproj/argocd-example-apps
sshPrivateKey: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
insecure: "true"
enableLfs: "true"
```
---
## Argo CD Custom Resources
## Application
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: helm-guestbook
spec:
destination:
namespace: helm-guestbook
server: http://cluster-test:8001
project: default
source:
path: helm-guestbook
repoURL: https://github.com/argoproj/argocd-example-apps
targetRevision: HEAD
```
## ApplicationSet
```yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook
spec:
generators:
- list:
elements:
- cluster: test
url: http://cluster-test:8001
- cluster: stage
url: http://cluster-stage:8001
template:
metadata:
name: '{{cluster}}-guestbook'
spec:
project: default
source:
path: helm-guestbook
repoURL: https://github.com/argoproj/argocd-example-apps
targetRevision: HEAD
destination:
server: '{{url}}'
namespace: guestbook
```
## AppProject
```yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: my-project
spec:
description: Example Project
```
---
## Kargo Instance Specs
Kargo Instance Specs can be used declaratively to apply specs to a Kargo instance on the Akuity Platform. See [akuity kargo apply](/akuity-portal/reference/cli/akuity_kargo_apply) to learn how use it.
---
## Kargo Agent Spec
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: KargoAgent
metadata:
annotations:
app: kargo
labels:
app: kargo
name: test-agent
namespace: test-namespace
spec:
description: test-description
data:
# Set akuityManaged to false if the agent is self-hosted, and this should not be changed anymore once it is set.
akuityManaged: false
# this needs to be the ArgoCD instance ID, and once it is set, it should not be changed.
remoteArgocd: ""
# this can be configured in self-hosted mode, if the remote argocd is not provided, and if this is provided, the remote argocd will be ignored.
argocdNamespace: argocd
# configure this based on the situation of self-hosted or not.
autoUpgradeDisabled: true
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
images:
- name: ghcr.io/akuity/kargo
newName: quay.io/fake/kargo
- name: quay.io/akuityio/argo-rollouts
newName: quay.io/fake/argo-rollouts
- name: quay.io/akuity/agent
newName: quay.io/fake/agent
kind: Kustomization
size: medium
targetVersion: 0.5.52
```
---
## Kargo Configmap Spec
```yaml
apiVersion: v1
data:
adminAccountEnabled: "true"
adminAccountTokenTtl: 24h
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/component: api
app.kubernetes.io/instance: kargo
app.kubernetes.io/name: kargo
name: kargo-cm
```
---
## Kargo Secret Spec
```yaml
apiVersion: v1
data:
adminAccountPasswordHash: $2a$10$wThs/VVwx5Tbygkk5Rzbv.V8hR8JYYmRdBiGjue9pd0YcEXl7.Kn.
kind: Secret
metadata:
labels:
app.kubernetes.io/component: api
app.kubernetes.io/instance: kargo
app.kubernetes.io/name: kargo
name: kargo-secret
```
---
## Kargo Spec
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Kargo
metadata:
name: test
spec:
description: test-description
# only set one of fqdn and subdomain
fqdn: test.akuity.kargo.io
subdomain: ""
kargoInstanceSpec:
agentCustomizationDefaults:
kustomization:
apiVersion: kustomize.config.k8s.io/v1beta1
images:
- name: ghcr.io/akuity/kargo
newName: quay.io/fake/kargo
- name: quay.io/akuityio/argo-rollouts
newName: quay.io/fake/argo-rollouts
- name: quay.io/akuity/agent
newName: quay.io/fake/agent
kind: Kustomization
backendIpAllowListEnabled: true
secrets:
sources:
- clusters:
matchExpressions:
- key: app
operator: In
values:
- kargo
secrets: {}
globalCredentialsNs:
- test1
- test2
globalServiceAccountNs:
- test3
- test4
ipAllowList:
- description: test-ip
ip: 77.77.77.77
- description: test ip
ip: 88.88.88.88
oidcConfig:
enabled: true
dexEnabled: true
# dexConfig should be set only if dexEnabled is true
dexConfig: |
connectors:
# GitHub example
- type: github
id: github
name: GitHub
config:
clientID: aabbccddeeff00112233
clientSecret: $GITHUB_CLIENT_SECRET
orgs:
- name: your-github-org
teams:
- red-team
adminAccount:
claims:
email:
values:
- admin@akuity.io
groups:
values:
- admin-group@akuity.io
sub:
values:
- admin-sub@akuity.io
viewerAccount:
claims:
email:
values:
- viewer@akuity.io
groups:
values:
- viewer-group@akuity.io
sub:
values:
- viewer-sub@akuity.io
# cliClientId, clientId, dexConfigSecret, additionalScopes, issuerUrl are oidc configs, and should be set only if dexEnabled is false
cliClientId: ""
clientId: ""
dexConfigSecret: null
additionalScopes: null
issuerUrl: ""
version: v1.10.4-ak.0
```
---
## Kargo Custom Resources
## Project
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Project
metadata:
name: kargo-demo-11
spec:
promotionPolicies:
- stage: test
autoPromotionEnabled: true
- stage: uat
autoPromotionEnabled: true
- stage: prod
autoPromotionEnabled: false
```
## Warehouse
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
name: kargo-demo
namespace: kargo-demo-11
spec:
subscriptions:
- git:
repoURL: https://github.com//kargo-demo-gitops.git
branch: new-helm
- image:
repoURL: public.ecr.aws/nginx/nginx
semverConstraint: ^1.24.0
```
## Stage
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: test
namespace: kargo-demo-11
spec:
requestedFreight:
- origin:
kind: Warehouse
name: kargo-demo
sources:
direct: true
promotionTemplate:
spec:
vars:
- name: gitRepo
value: https://github.com//kargo-demo-gitops.git
- name: targetBranch
value: 11/stage/${{ ctx.stage }}
- name: outPath
value: ./out
steps:
- task:
name: base-promo-process
as: base
- uses: git-push
config:
path: ${{ vars.outPath }}
targetBranch: ${{ vars.targetBranch }}
- uses: argocd-update
config:
apps:
- name: ${{ ctx.project }}-${{ ctx.stage }}
sources:
- repoURL: ${{ vars.gitRepo }}
desiredRevision: ${{ outputs.base.commit }}
verification:
analysisTemplates:
- name: kargo-demo
```
## AnalysisTemplate
```yaml
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: kargo-demo
namespace: kargo-demo-11
spec:
metrics:
- name: test
provider:
job:
metadata:
spec:
backoffLimit: 1
template:
spec:
containers:
- name: test
image: alpine:latest
command:
- sleep
- "20"
restartPolicy: Never
```
## PromotionTask
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: PromotionTask
metadata:
name: base-promo-process
namespace: kargo-demo-11
spec:
vars:
- name: gitRepo
- name: targetBranch
- name: outPath
- name: imageRepo
value: public.ecr.aws/nginx/nginx
steps:
- uses: git-clone
config:
repoURL: ${{ vars.gitRepo }}
checkout:
- commit: ${{ commitFrom(vars.gitRepo).ID }}
path: ./src
- branch: ${{ vars.targetBranch }}
create: true
path: ${{ vars.outPath }}
- uses: git-clear
config:
path: ${{ vars.outPath }}
- uses: yaml-update
as: update-image
config:
path: ./src/charts/kargo-demo/values.yaml
updates:
- key: image.name
value: ${{ vars.imageRepo }}:${{ imageFrom(vars.imageRepo).Tag }}
- uses: helm-template
config:
path: ./src/charts/kargo-demo
releaseName: kargo-demo
valuesFiles:
- ./src/charts/kargo-demo/stages/${{ ctx.stage }}/values.yaml
outPath: ${{ vars.outPath }}
- uses: git-commit
as: commit
config:
path: ${{ vars.outPath }}
messageFromSteps:
- update-image
- uses: compose-output
config:
commit: ${{ task.outputs.commit.commit }}
```
---
## Declarative Specs
The Akuity CLI can be used to apply declarative specs to the Akuity Platform. See [akuity argocd apply](/akuity-portal/reference/cli/akuity_argocd_apply) and [akuity kargo apply](/akuity-portal/reference/cli/akuity_kargo_apply) to learn how to use them.
### ArgoCD Example:
First create your ArgoCD spec then apply it with the following command:
`akuity argocd apply -f argocd-spec.yaml --organization-name `
```yaml
apiVersion: argocd.akuity.io/v1alpha1
kind: ArgoCD
metadata:
name: declarative-specs
spec:
description: ""
instanceSpec:
clusterCustomizationDefaults:
kustomization: {}
declarativeManagementEnabled: true
subdomain: 5b0rw97jfpseuaiz
shard: ""
version: v2.8.0
```
| File | Manageable via Argo CD | Manageable via Declarative Specs |
|-----------------------------------------------------------------------------------------------------------------------------------------|------------------------|------------------------------------------------------------------------------------|
| [`argocd-cm.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-cm.yaml) | No | Yes |
| [`argocd-rbac-cm.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-rbac-cm.yaml) | No | Yes |
| [`argocd-secret.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-secret.yaml) | No | Yes |
| [`argocd-ssh-known-hosts-cm.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-ssh-known-hosts-cm.yaml) | Yes | Yes |
| [`argocd-tls-certs-cm.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-tls-certs-cm.yaml) | Yes | Yes |
| [`single repo credentials`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-repositories.yaml) | Yes | Yes |
| [`repo template credentials`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/argocd-repo-creds.yaml) | Yes | Yes |
| [`application.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/application.yaml) | Yes | Yes |
| [`project.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/project.yaml) | Yes | Yes |
| [`applicationset.yaml`](https://github.com/argoproj/argo-cd/blob/master/docs/operator-manual/applicationset.yaml) | Yes | Yes |
### Kargo Example:
First create your Kargo spec then apply it with the following command:
`akuity kargo apply -f kargo-spec.yaml --organization-name `
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Kargo
metadata:
name: test-2
spec:
description: test-description
version: v1.2.2
```
There is a more comprehensive example [here](./20-kargo-instance-specs/kargo-spec.md).
| File | Manageable via Kargo | Manageable via Declarative Specs |
|-----------------------------------------------------------------------|----------------------|---------------------------------------|
| [`kargo-cm.yaml`](./20-kargo-instance-specs/kargo-cm-spec.md) | No | Yes |
| [`kargo-secret.yaml`](./20-kargo-instance-specs/kargo-secret-spec.md) | No | Yes |
---
## Reference
---
## Notification Webhook Schema
### AgentHealthEvent {#akuity-notifications-webhook-v1-AgentHealthEvent}
`AgentHealthEvent` contains metadata for an agent health event.
| Field | Type | Description |
| ----- | ---- | ----------- |
| instance_id | string | The instance ID. |
| instance_name | string | The instance name. |
| cluster_id | string | The cluster ID. |
| cluster_name | string | The cluster name. |
| status | string | The agent status: "connected" or "disconnected". |
| timestamp | google.protobuf.Timestamp | The time the status change occurred. |
| kargo | bool | Whether this is a Kargo agent (true) or Argo CD cluster (false). |
### AuditEvent {#akuity-notifications-webhook-v1-AuditEvent}
`AuditEvent` contains metadata for an audit event.
| Field | Type | Description |
| ----- | ---- | ----------- |
| timestamp | string | The time the event was triggered. |
| action | string | The action that was performed. |
| actor | [AuditEvent.EventAuditActor](#akuity-notifications-webhook-v1-AuditEvent-EventAuditActor) | The actor that triggered the event. |
| object | [AuditEvent.EventAuditObject](#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject) | The object that was acted upon. |
| details | [AuditEvent.EventAuditDetails](#akuity-notifications-webhook-v1-AuditEvent-EventAuditDetails) | The details of the event. |
### AuditEvent.EventAuditActor {#akuity-notifications-webhook-v1-AuditEvent-EventAuditActor}
| Field | Type | Description |
| ----- | ---- | ----------- |
| type | string | The type of actor. |
| id | string | The ID of the actor. |
| ip | string | The IP address of the actor. |
### AuditEvent.EventAuditDetails {#akuity-notifications-webhook-v1-AuditEvent-EventAuditDetails}
| Field | Type | Description |
| ----- | ---- | ----------- |
| message | string | The message associated with the event. |
| patch | string | The patch associated with the event. |
| action_type | string | The action type. |
### AuditEvent.EventAuditObject {#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject}
| Field | Type | Description |
| ----- | ---- | ----------- |
| type | string | The type of object. E.g. "team_member", "team", "custom_role", "kargo_instance", etc. |
| id | [AuditEvent.EventAuditObject.EventAuditObjId](#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject-EventAuditObjId) | The ID of the object. |
| parent_id | [AuditEvent.EventAuditObject.EventAuditParentId](#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject-EventAuditParentId) | The parent ID of the object. |
### AuditEvent.EventAuditObject.EventAuditObjId {#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject-EventAuditObjId}
| Field | Type | Description |
| ----- | ---- | ----------- |
| name | string | The name of the object. |
| kind | string | The kind of object. |
| group | string | The group of the object. |
### AuditEvent.EventAuditObject.EventAuditParentId {#akuity-notifications-webhook-v1-AuditEvent-EventAuditObject-EventAuditParentId}
| Field | Type | Description |
| ----- | ---- | ----------- |
| name | string | The name of the parent. |
| parent_name | string | The name of the parent object's parent (if present). |
| application_name | string | The name of the application. |
### PingEvent {#akuity-notifications-webhook-v1-PingEvent}
`PingEvent` contains metadata for a ping event.
| Field | Type | Description |
| ----- | ---- | ----------- |
| notification_config_id | string | NotificationConfigID is the organization notification config ID that triggered the ping |
### UsageUpdateEvent {#akuity-notifications-webhook-v1-UsageUpdateEvent}
| Field | Type | Description |
| ----- | ---- | ----------- |
| product | string | The product associated with the usage update. E.g. "ArgoCD", "Kargo", "Akuity Agent". |
| usage_type | string | The type of usage. E.g. "applications", "projects". |
| usage_threshold | double | The usage threshold. |
| max_limit | int64 | The maximum limit. |
| usage | int64 | The current usage. |
### WebhookEventPayload {#akuity-notifications-webhook-v1-WebhookEventPayload}
`WebhookEventPayload` is the payload sent to the webhook endpoint.
| Field | Type | Description |
| ----- | ---- | ----------- |
| event_time | google.protobuf.Timestamp | The time the event was triggered. |
| event_type | WebhookEventType | The type of event. |
| organization_id | string | The organization ID. |
| event_id | string | The event ID. |
| ping_event | [PingEvent](#akuity-notifications-webhook-v1-PingEvent) | Metadata for a ping event. |
| usage_event | [UsageUpdateEvent](#akuity-notifications-webhook-v1-UsageUpdateEvent) | Metadata for a usage update event. |
| audit_event | [AuditEvent](#akuity-notifications-webhook-v1-AuditEvent) | Metadata for an audit event. |
| agent_health_event | [AgentHealthEvent](#akuity-notifications-webhook-v1-AgentHealthEvent) | Metadata for an agent health event. |
---
## Terraform Provider
Manage Akuity Platform resources declaratively with the [Akuity Terraform provider](https://registry.terraform.io/providers/akuity/akp/latest).
| Resource | Link |
| --- | --- |
| Documentation, resources & upgrade guides | https://registry.terraform.io/providers/akuity/akp/latest/docs |
| Source code | https://github.com/akuity/terraform-provider-akp |
| Examples | https://registry.terraform.io/providers/akuity/akp/latest/docs#example-usage |
The [registry documentation](https://registry.terraform.io/providers/akuity/akp/latest/docs) covers installation, provider configuration, every resource and data source, and per-version upgrade guides.
## Example
```hcl
terraform {
required_providers {
akp = {
source = "akuity/akp"
}
}
}
provider "akp" {
org_name = "your-organization-name"
}
```
Authenticate by setting `AKUITY_API_KEY_ID` and `AKUITY_API_KEY_SECRET` in the environment. The provider targets the US region (`https://akuity.cloud`) by default; EU customers should set `server_url` (or the `AKUITY_SERVER_URL` environment variable) to `https://eu.akuity.cloud`.
## FAQ
**Do I need an Akuity API key?**
Yes. Create one (see [API Keys](/akuity-portal/organizations/api-keys)) and provide it via the `AKUITY_API_KEY_ID` and `AKUITY_API_KEY_SECRET` environment variables.
**Where do I report a bug or request a feature?**
Open an issue at https://github.com/akuity/terraform-provider-akp/issues.
---
## Create an Argo CD Instance
## Account Setup
:::info
For access to the Akuity Platform please [create an Akuity user account](https://hubs.li/Q02l2XGR0). After completing the registration process, activate your account using the link sent to your email.
:::
After registering and activating your account, if this is your first time using the platform, you must also create an organization:
1. Click the create or join link.
2. Click + New organization in the upper right hand corner of the dashboard.
3. Name your organization following the rules listed below the Organization Name field.
## Create an Argo CD Instance
1. Navigate to Argo CD.
2. Click + Create in the upper right hand corner of the dashboard.
3. Name your instance following the rules listed below the Instance Name field.
4. (Optionally) Choose the Argo CD version you want to use.
5. Click + Create.
It will take several seconds to create your new Argo CD instance (Progressing status next to your new instance's name), so please be patient.
Continue on to the [next section](./20-connect-kubernetes-cluster.mdx) to learn about connecting your new Argo CD instance to a running Kubernetes cluster.
---
## Connect a Kubernetes Cluster
:::info
To move on, you'll need a new or existing Kubernetes cluster to which you can connect your new Argo CD instance.
The Akuity Platform's unique, hybrid architecture works with local clusters managed by the likes of [k3d](https://k3d.io) or [kind](https://kind.sigs.k8s.io) just as easily as it works with any other cluster.
:::
Create a Kubernetes Cluster Using `kind` (Optional)
1. [Install the `kind` CLI](https://kind.sigs.k8s.io/docs/user/quick-start#installation).
2. Create a cluster using `kind`.
```
kind create cluster --name akuity-connected-cluster
```
You should see the following output:
```
Creating cluster "akuity-connected-cluster" ...
✓ Ensuring node image (kindest/node:v1.25.2) 🖼
✓ Preparing nodes 📦 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-akuity-connected-cluster"
You can now use your cluster with:
kubectl cluster-info --context kind-akuity-connected-cluster
Thanks for using kind! 😊
```
3. Check that the cluster works by running `kubectl get nodes`.
```
% kubectl get nodes
NAME STATUS ROLES AGE VERSION
akuity-connected-cluster-control-plane Ready control-plane 74s v1.25.2
```
Fetching the nodes will demonstrate that `kubectl` can connect to the cluster and query the API server. The node should be in the "Ready" status.
After your new Argo CD instance is created successfully (Healthy status next to your new instance's name):
1. Navigate to Argo CD → _your instance_ → Clusters.
1. Click + Connect a cluster to add a Kubernetes cluster.
1. Input your Cluster Name.
1. Click Connect Cluster.
1. In the Install Akuity Agent pop-up screen, click Copy to Clipboard
:::caution
Before pasting the next command, make sure you're connected to the correct cluster.
:::
1. Paste the copied command into your terminal and run it to apply the agent manifest.
:::note
If you come across any errors while trying to apply the agent manifest, it is recommended to download the agent manifest and apply it manually inside your cluster using the `kubectl apply` command.
:::
Once the agent has been successfully installed into your Kubernetes cluster, you should see the cluster listed in the Akuity dashboard with a green heart icon next to the cluster name. This indicates that the cluster is in a healthy state.
Now that your Argo CD instance is connected to a Kubernetes cluster, move on to the [next section](./30-enable-admin-user.mdx) to learn about enabling remote access to your instance.
---
## Enable the Argo CD `admin` Account
:::note
Argo CD instances you create inside the Akuity Platform do not enable the `admin` user by default.
:::
To enable the `admin` user on an Argo CD instance:
1. Navigate to Argo CD → _your instance_ → Settings → System Accounts.
1. Enable the Admin Account switch.
1. Click Set password. Then either:
* Specify a custom password and click Submit or
* Click Regenerate password to generate a strong password. The password will not be displayed. Click Copy to copy the new password to your clipboard.
Now that the `admin` user is enabled, move on to the [next section](./40-access-argo-cd-instance.mdx) to learn about accessing your Argo CD instance.
---
## Accessing Argo CD
:::info
If you have not already enabled the `admin` user for your instance, follow [these instructions](./30-enable-admin-user.mdx).
:::
:::info
You can find the instance URL for Argo CD by visiting Argo CD → _your instance_. It is found in the upper left hand corner of the screen, to the right of the instance name and health status.

:::
## Access the Argo CD Dashboard
1. Click on the _instance-id_.cd.akuity.cloud.
2. Log in with the username `admin` and the password set (or generated) while [enabling the `admin` user](./30-enable-admin-user.mdx).
## Access Argo CD using the `argocd` CLI
1. Install the `argocd` CLI:
**Mac w/Homebrew**
```
brew install argocd
```
**Linux or WSL**
```
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd
```
**Windows w/ Powershell**
```
Invoke-WebRequest -Uri https://github.com/argoproj/argo-cd/releases/latest/download/argocd-windows-amd64.exe -OutFile argocd.exe
```
:::note
You will also need to move `argocd.exe` onto your `PATH`.
:::
1. Log in by using the following command and following the prompts:
```
argocd login --grpc-web
```
At this point, you're ready to use your Akuity-managed Argo CD instance as normal. To try it out by deploying an Application in [the next section](./deploy-an-application).
---
## Deploy an Application
After [accessing Argo CD](./40-access-argo-cd-instance.mdx), to deploy an `Application`:
**UI**
1. In the Argo CD UI, navigate to Applications.
2. Click on NEW APP.
3. Under GENERAL,
1. set Application Name to `helm-guestbook`.
2. set Project Name to `default`.
4. Under SOURCE,
1. set Repository URL to `https://github.com/argoproj/argocd-example-apps`.
2. Set Path to `helm-guestbook`.
5. Under DESTINATION, set Cluster URL to your cluster URL.
- The URL will be in the format `https://cluster-:8001`, where `` is the name used [connecting your Kubernetes cluster](./20-connect-kubernetes-cluster.mdx).
6. Set Namespace to `default`.
7. Click on CREATE.
The `helm-guestbook` `Application` will be created but will not be synced automatically (because the sync policy was left to the default of `Manual`).
8. Click on the `helm-guestbook` Application card, review the resources to be created in the cluster by clicking on APP DIFF.
9. Then click on SYNC and SYNCHRONIZE.
**CLI**
1. Use the `argocd` CLI to create an Application named `helm-guestbook`.
```
argocd app create helm-guestbook \
--repo https://github.com/argoproj/argocd-example-apps.git \
--path helm-guestbook \
--dest-server https://cluster-:8001 \
--dest-namespace default
```
- In `dest-server` URL (`https://cluster-:8001`), replace `` with the name used when [connecting your Kubernetes cluster](./20-connect-kubernetes-cluster.mdx).
The `helm-guestbook` `Application` will be created but will not be synced automatically (because the sync policy was left to the default of `Manual`).
2. Check the diff for the Application.
```
argocd app diff helm-guestbook
```
3. Sync the Application.
```
argocd app sync helm-guestbook
```
Congratulations! You have successfully deployed an application to the Akuity Platform Argo CD Instance.
---
## Getting Started
---
## Sync History

To facilitate the metrics representation of synchronization events, we have introduced a synchronization history feature. It represents the synchronization event counts and duration in time series format. You can also use various filters and group by results. The feature also includes detailed table of individual events. This feature can be viewed from 3 levels.
#### 1. Argo CD Application
- Covers all the synchronization events happened in the particular Argo CD application.
- You will need to install sync history extension in order to see this view. Go to Argo CD → _your instance_ → Settings → Extensions. Click Install in Akuity Sync History extension.
- You can then go to the instance's Argo CD UI, Select any Application and click on Application Details. Then panel will have the Sync History tab.

#### 2. Argo CD Instance
- Covers all the synchronization events happened in all the Application under this Instance.
- You can see this in Summary tab of Instance on Akuity Platform.
#### 3. Organization
:::note
**only accessible by an Organization owner and not anyone else.**
:::
- Covers all the synchronization events happened in all the Application of All Instance belongs to the organization.
- You can see this in Summary tab of your oganization page.
### Filters
Events can be filtered by combining various parameters. Available filters are **Instance Name**, **Application Name**, **Project Name**, **Initiator**, **Repository** and **Label**.
> Note that not all filters are available in all views. For example, Sync History Extension in Argo CD cannot have filters Instance name and Application name.
Quick and custom time range filter is also available. For example, you can select the events in last year or last week.
### Group By and Interval
This is specifically useful for graph representation. You can group events by **Status** (Successful/Failed), **Application**, **Instance**, **Project** or **Initiator**.
Interval can help adjusting time series graphs frequency. You can select interval by **Hour**, **Day**, **Week**, **Month** or **Year**.
### Reports
Filters and Group By can be combined to create shareable reports that will be useful to diagnos issues or anamoly efficiently. You can either copy the URL from browser and share OR Click on the copy icon in right side of filter section.
### Events Table
Events table include a list of detailed synchronization events. Filters will be applied to the table as well. Details of individual event includes **Application Name**, **Application Project**, **Application Repository**, **Application Labels**, **Event start and end date**, **Sync Event initiator**, **Event status** and **Message**.
---
## Akuity Platform Dashboard
The [Akuity Platform dashboard](https://akuity.cloud) is where you provision, and manage all aspects of your Argo CD instances.
---
## Advanced Settings
---
## General
### Installation Namespace
- Use the Installation Namespace field to deploy the agent to a different namespace. The default namespace is `akuity`.
:::note
Operators can only configure this setting during the initial deployment of the agent.
:::
### State Replication
- The State Replication toggle allows disconnecting the cluster from the Akuity Platform without losing core Argo CD features. See [State Replication](./20-state-replication.md) for more information.
:::note
Operators can only configure this setting during the initial deployment of the agent.
:::
### Redis Tunneling
- The Redis Tunneling toggle enables the ability to connect to Redis over a web-socket tunnel that allows using Akuity agent behind HTTPS proxy.
### Private Connectivity
- The Private Connectivity setting controls how the agent connects to the Akuity Platform. Public connects over the public internet, while Private connects through an AWS interface endpoint in your VPC using AWS PrivateLink. See [Private Connectivity (AWS PrivateLink)](/akuity-portal/security/private-link) for the full setup guide.
:::note
Private requires a connected AWS account with an available PrivateLink connection. Integration (direct) clusters are agentless and always use public connectivity.
:::
### Auto Update
- Toggle Auto Apply Changes off to prevent the agent from automatically upgrading its components.
:::note[Manual Updates to the Akuity Agent]
With auto upgrades disabled, users must apply the agent updates manually. To accomplish this, go to the Clusters menu for the Argo CD instance and click Install Agent on the desired cluster, then run the provided command with the `kubectl` context set for the corresponding cluster.
:::
### Namespace Scoped
- Toggle Namespace Scoped to limit the agent to only deploying resources into its namespace.
:::note
Operators can only configure this setting during the initial deployment of the agent.
:::
### Agent Size
- In the Agent Size section, choose the size of your Akuity Agent. This selection only impacts the resources allocated to the Akuity Agent within your cluster and does not impact your billing in any way.
Optimized Default Agent Sizes
|Agent Size | Controller Memory |Controller CPU | Repo Server Memory | Repo Server CPU | Repo Server Replicas |
|-----------|-------------------|---------------|--------------------|-----------------|----------------------|
|Small |0.5GB |0.25CPU |0.25GB |0.25CPU |2 |
|Medium |1GB |0.50CPU |0.50GB |0.25CPU |2 |
|Large |2GB |1CPU |0.50GB |0.25CPU |3 |
|Auto |Auto |Auto |Auto |Auto |Auto |
:::caution
Custom Agent Sizes will override manually created [`Agent Kustomizations`](/argocd/managing-instances/clusters/agent-advanced-settings#agent-size-kustomization). All other Kustomizations will remain the same.
:::
#### Cluster Autoscaling (Auto)
When you set a cluster's size to **Auto**, the Akuity Agent continuously right-sizes the Argo CD application controller and repo server running in that cluster.
CPU and memory are adjusted based on actual resource usage. Repo server replica count is adjusted based on the live request queue, using the [`argocd_repo_pending_request_total`](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/) metric: if requests are backing up, it adds a replica; if the queue is empty, it removes one. Application controller status and operation processor counts are adjusted based on the number of managed applications.
If a pod is OOMKilled, the agent detects it immediately and scales up both memory and CPU resources.
CPU and memory scale up when average usage exceeds **80%** of the current allocation, and scale down when it drops below **30%**, preventing flapping.
### Labels & Annotations
- Add applicable labels and annotations as key/value pairs in the Labels and Annotations sections of the Advanced settings menu.
* Click + Add to add a key/value pair.
* Click the trash bin icon next to a key/value pair to delete it.
### Managed Cluster Kubeconfig
- Use the Managed Cluster Kubeconfig field to use a different kubeconfig than the default `in-cluster` kubeconfig. This is useful if you want to e.g. connect a [vCluster](https://www.vcluster.com/)
from a host cluster.
* The agent needs to be installed into a location where there is a secret configured with a `kubeconfig`.
* The default Secret Name is `cluster-config`, this is configurable.
* If you have the kubeconfig located under a specific key in the secret, that's also configurable (see Secret Key)
### Notifications Settings Source
- Use the Notifications Settings Source setting to configure where the notification controller reads its configuration (ConfigMaps and Secrets).
Choose from the available options:
- **"Control Plane"**: Uses the control plane cluster for notification settings (default behavior)
- **"Agent Host"**: Uses the managed cluster for notification settings
:::info
This feature is only available in Akuity Argo CD (versions with the `-ak` postfix) and is not available in the open-source version of Argo CD.
:::
:::note
When using this feature, you need to ensure that the required notification configuration exists on the managed cluster:
- **ConfigMap**: `argocd-notifications-cm` - Contains notification templates and triggers
- **Secrets**: Any secrets needed for notification services (e.g., Slack webhooks, email SMTP credentials, etc.)
These resources must be present in the managed cluster's namespace where the notification controller is running.
:::
This feature allows the notification controller to read notification settings from the managed cluster while continuing to manage Argo CD applications from the control plane. This is useful when you want to keep notification configuration separate from application management.
---
## Manifests Customization
### Akuity Custom Image Registry
- Enter where to pull the agent image from using the Akuity Custom Image Registry field. The default registry is [`quay.io/akuity`](https://quay.io/repository/akuity/agent?tab=tags).
### Argoproj Custom Image Registry
- Enter where to pull the Argo CD images from using the Argoproj Custom Image Registry field. The default registry is [`quay.io/argoproj`](https://quay.io/repository/argoproj/argocd?tab=tags).
### Notifications Controller Log Level
- Set the logging level of the `argocd-notifications-controller`: `debug|info|warn|error (default "info")`.
### Repo Server Env Variables
- Enter an environment variable that you would like to configure for the `argocd-repo-server`.
Example:
```yaml
ARGOCD_EXEC_TIMEOUT: 'value'
ARGOCD_REPO_SERVER_PARALLELISM_LIMIT: 'value'
HELM_REGISTRY_CONFIG: 'value'
```
:::info
Please contact [`support`](https://support.akuity.io/) on best practices and optimization of the `argocd-repo-server`.
:::
### Custom CA Bundle
- Use the Custom CA Bundle field to provide a PEM bundle of one or more CA certificates that the agent workloads should trust in addition to the well-known public CAs. This is typically needed when the agent runs behind a TLS-intercepting proxy (for example, Zscaler) or connects to services that use certificates issued by a private CA.
When a bundle is set, every agent workload combines it with the default trust store and mounts the result at `/etc/ssl/certs/ca-certificates.crt`, so all components — including `git` — trust the additional CAs. Updating or clearing the bundle restarts the agent workloads automatically.
:::note
- A single certificate or a bundle of several certificates is accepted. All certificates must be valid (unexpired) PEM-encoded `CERTIFICATE` blocks.
- New clusters inherit the bundle configured in [`Agent Default Settings`](/argocd/managing-instances/settings/advanced/agent-default-settings), unless a bundle is provided when connecting the cluster.
- Integration (direct) clusters are agentless and do not support a custom CA bundle.
:::
### Kustomization
- The Akuity Platform supports customizing the Akuity Agent manifests using a `Kustomization`.
#### Agent Size Kustomization:
In some cases the optimized default Agent sizes might not be enough for all use cases. The following example describes how to increase the resource limits/request for both the `argocd-repo-server` & `argocd-application-controller`.
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-repo-server
spec:
template:
spec:
containers:
- name: argocd-repo-server
resources:
limits:
memory: 2Gi
requests:
cpu: 750m
memory: 1Gi
target:
kind: Deployment
name: argocd-repo-server
```
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patches:
- patch: |-
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-application-controller
spec:
template:
spec:
containers:
- name: argocd-application-controller
resources:
limits:
memory: 4Gi
requests:
cpu: 1000m
memory: 2Gi
target:
kind: Deployment
name: argocd-application-controller
```
---
## State Replication
The State Replication feature on the Akuity Platform allows you to disconnect a managed cluster from the platform without losing core Argo CD features. This feature is immutable and can only be enabled during cluster creation. Once
enabled, all Application and Project CRDs are synced to the managed clusters, and the application controller in the managed cluster is switched to work with the managed cluster instead of the Akuity Platform control plane cluster.
## Enabling State Replication
To enable the State Replication feature during cluster connection, follow these steps:
1. Under Advanced settings, locate the flag called State Replication.
1. Toggle the flag to enable State Replication.
1. Complete the cluster connection process.
## Using State Replication
Once the State Replication feature is enabled, the application controller in the managed cluster will work with the managed cluster instead of the control plane cluster. This means that even if the connection to the control plane is lost, core ArgoCD functionality will still be working.
:::caution
Changing the version of the instance won't update CRDs in the managed cluster, because Akuity Agent doesn't have permission to do that, hence the agent manifest needs to be reapplied manually.
:::
### UI Access
To access the Argo CD UI in the managed cluster, follow these steps:
1. Log in using the [Argo CD CLI](https://argo-cd.readthedocs.io/en/stable/cli_installation/) in [core](https://argo-cd.readthedocs.io/en/stable/operator-manual/core/) mode.
```bash
kubectl config set-context --current --namespace=akuity # change current kube context to the akuity agent namespace
argocd login --core
```
1. Make the UI locally available.
```bash
argocd admin dashboard
```
---
## Credential Rotation
The agent in each managed cluster contains several components which require credentials from the Akuity Platform. You can easily rotate credentials for those from the Akuity Platform.
You can rotate the credentials for a single managed cluster or multiple at once.
- To rotate the credentials of multiple clusters, go to _your instance_ → clusters tab → click security icon above the clusters table. Either select All Clusters or Selected Clusters and click on Rotate.
- To rotate the credentials of an individual cluster, go to _your instance_ → clusters tab → click on the three-dot button under Action column → Click on Rotate Credentials → Click on Confirm.
This will trigger an update to the cluster(s) in the background.
> NOTE: If the cluster has Auto Upgrade disabled, you must re-apply the manifest.
---
## Support Access
Support Access allows Akuity support engineers to access the `argocd-application-controller` pod in managed clusters when troubleshooting is required. This feature provides temporary, time-limited access that can be enabled and disabled as needed.
## Enabling Support Access
To enable support access for a managed cluster:
1. Navigate to your Argo CD instance → Clusters tab.
2. Find the cluster you want to enable access for.
3. Under the Actions tab, click on the three-dot button.
4. Locate the Manage Support Access section.

5. Toggle the Enabled switch to enable access.
6. Set the Duration field to specify how many minutes the access should remain active.
7. Click Save to apply the changes.

Once enabled, Akuity support engineers will have access to the `argocd-application-controller` pod in the specified cluster for the configured duration.
## Disabling Support Access
Support access can be disabled in the following ways:
### Automatic Expiration
Access will be automatically removed after the specified number of minutes elapses.
### Manual Disabling
To manually disable support access before the timer expires:
1. Navigate to the cluster details as described above.
2. Toggle the Enabled switch to disable access.
3. Click Ok to apply the changes.
## Security Considerations
- Support access is temporary and automatically expires after the specified duration.
- Access is limited to the `argocd-application-controller` pod only.
- You can monitor and control when support access is active.
- Access can be revoked immediately at any time by disabling the feature.
---
## Maintenance Mode
Maintenance Mode allows you to temporarily exclude managed clusters from health monitoring and alerting when performing planned maintenance activities. This feature helps prevent false alerts during scheduled maintenance windows while ensuring monitoring is automatically restored after the maintenance period. You maintain full control to disable maintenance mode at any time. The Argo CD applications continue to sync and deploy normally and the cluster remains operational for application workloads.
## Enabling Maintenance Mode
To enable maintenance mode for a managed cluster:
1. Navigate to your Argo CD instance → Clusters tab.
2. Find the cluster you want to put into maintenance mode.
3. Under the Actions column, click on the three-dot button.
4. Locate the Enable Maintenance Mode section.

5. Enter the expiration day and time for maintenance mode. This is the date and time when maintenance mode will automatically expire and monitoring will be restored.
6. Click Save to apply the changes.

Once enabled, the cluster will be excluded from health monitoring and alerting. The 🔧 icon indicates that the cluster is in maintenance mode.

## Disabling Maintenance Mode
Maintenance mode can be disabled in the following ways:
### Automatic Expiration
Maintenance mode will be automatically disabled after the expiration time that you set to ensure monitoring is restored. If maintenance activities require more time, you will need to manually re-enable maintenance mode.
### Manual Disabling
To manually disable maintenance mode before the expiration time:
1. Navigate to the cluster actions as described above.
2. Locate the Disable Maintenance Mode section.
3. Click Disable to apply the changes.

---
## Regenerate Manifests
The **Regenerate Manifests** feature allows you to bump the cluster generation, which triggers the agent to re-apply all manifests in the managed cluster. This is useful when you need to force a refresh of the cluster configuration or recover from inconsistent states.
You can regenerate manifests for a single managed cluster or multiple at once.
- To regenerate manifests for multiple clusters, go to _your instance_ → clusters tab → click refresh icon above the clusters table. Either select All Clusters or Selected Clusters and click on Regenerate.

- To regenerate manifests for an individual cluster, go to _your instance_ → clusters tab → click on the three-dot button under Action column → Click on Regenerate Manifests → Click on Confirm.

---
## Akuity Agent
The Akuity Agent is a component installed into a managed cluster allowing it to be managed by an Argo CD instance on the Akuity Platform. Every cluster agent which is installed into Kubernetes clusters will have a corresponding cluster entry in Argo CD and will be available as an Argo CD Application destination.
## Requirements
To manage a cluster in the Akuity Platform, the cluster agent only needs outbound internet access to the Akuity Platform control plane. It is unnecessary for the Kubernetes API server endpoint to be public.
## Installation
To install and connect an agent, you must have already created an Argo CD instance in the Akuity Platform, as well as a kubectl context to a cluster you wish to be managed.
1. Navigate to a single Argo CD instance.
1. From the Clusters tab, click + Connect a cluster.
1. Provide a name for the cluster and click + Connect cluster.
1. Once the cluster entry has been created, installation manifests will be generated specific to the cluster.
1. Copy the installation command and run in a terminal with kubectl context to your cluster.
The installation will install the required components into an `akuity` Namespace. Once the Akuity Agent shows as available in the Akuity Platform Portal, it is possible to deploy to the cluster using Argo CD.
### Connecting to an Upbound MCP
To connect an Argo CD instance on the Akuity Platform to an Upbound managed control plane (MCP), you must have already [created an Argo CD instance](/argocd/getting-started/create-argo-cd-instance) and configured an [Upbound MCP](https://docs.upbound.io/getstarted/).
1. Create a kubeconfig file for your Upbound MCP using the `up ctx` command . This example saves the kubeconfig to a file named `mcp-kubeconfig.yaml`.
```
up ctx -a -f mcp-kubeconfig.yaml
```
The resulting kubeconfig file will look like:
```yaml
apiVersion: v1
clusters:
- cluster:
server: https://proxy.upbound.io/v1/controlPlanes/....
name: upbound-akuity-dev
contexts:
- context:
cluster: upbound-akuity-dev
user: upbound-akuity-dev
name: upbound-akuity-dev
current-context: upbound-akuity-dev
kind: Config
preferences: {}
users:
- name: upbound-akuity-dev
user:
exec:
apiVersion: client.authentication.k8s.io/v1
args:
- organization
- token
command: up
env:
- name: ORGANIZATION
value:
- name: UP_PROFILE
value:
interactiveMode: IfAvailable
provideClusterInfo: false
```
Store the `server` and `ORGANIZATION` field values from the kubeconfig as those will be necessary to connect to AKP ArgoCD.
2. Go to Upbound console. Go to the My Account page and create a new `Token` from the `API Tokens` section.

3. Navigate to the required Argo CD instance in Akuity Platform.
4. From the Clusters tab, click + Integration.
5. Provide the name for the cluster.
6. Choose `Upbound` option under `Provider` section inside the modal and put the `Server`, `Token` and `Organization Name` values you recorded previously in the respective input fields.

7. Click + Connect cluster.
8. Once the cluster is connected, you will see a new entry in the cluster table with an upbound logo beside the name.

## Upgrading
Once installed, agents are automatically upgraded upon updates to Argo CD instances (e.g. upgrading Argo CD itself, resizing, applying new labels or annotations). When Argo CD configuration is updated, the agent version will be also be updated to the latest appropriate version compatible with the Argo CD instance.
## Uninstalling
To uninstall the Akuity Agent from a managed cluster:
1. In Argo CD, first delete any applications which are currently deploying to the cluster. As a convenience, the Akuity Platform automatically labels all Argo CD Applications with `cluster=` label, allowing you to easily filter applications by destination cluster name.
:::tip
If you wish to preserve existing resources in the cluster, or the cluster is no longer available, you can perform a [non-cascaded delete](https://argo-cd.readthedocs.io/en/stable/user-guide/app_deletion/). A non-cascaded delete is a non-destructive operation which deletes only the Argo CD application object, and none of the underlying resources in the cluster.
:::
2. Once all applications targeting the cluster have been removed, run the following commands to delete the agent resources:
```shell
kubectl delete namespace akuity
kubectl delete clusterrole akuity-agent-
kubectl delete clusterrole akuity-argocd-application-controller-
kubectl delete clusterrolebinding akuity-agent-
kubectl delete clusterrolebinding akuity-argocd-application-controller-
```
Alternatively, if you have downloaded the agent installation manifest you could execute:
```shell
kubectl delete -f akuity-manifests-.yaml
```
3. In the Portal UI, navigate to the Clusters tab of the Argo CD instance and click the trash icon next to the cluster to remove the entry.
## FAQ
Q: Why do the cluster URLs use HTTP? Clusters in open-source Argo CD use HTTPS.
A: In the Akuity Platform, every cluster URL is an alias for `localhost`, and there is **no**
unencrypted communication that leaves the local `application-controller` pod on your cluster. You confirm
this by checking an `application-controller` pod on your cluster. An easy way to check for this is to grep for the
presence of `hostAliases`, like this:
```shell
kubectl get pod argocd-application-controller- -o yaml | grep -A 3 hostAliases
```
The output will be
```yaml
hostAliases:
- hostnames:
- cluster- # Where is the name of your cluster.
ip: 127.0.0.1
```
---
## Control Plane
The control plane components include Argo CD API Server, Application Controller (powering app-of-apps pattern), and Application Set Controller.
The Akuity Platform control plane components are continiously monitored by Akuity engineers to ensure the platform is running smoothly.
Optionally you can expose Prometheus metrics for the control plane components to allow you to monitor the platform yourself.
## Exposing Prometheus Metrics
To expose Prometheus metrics for the control plane components:
1. Navigate to the Argo CD → _your instance_ → Settings → External Access section.
2. Scroll down to the Controlplane Metrics section.
3. Toggle the Enable switch.
4. Provide the username and password for the metrics endpoint.
5. Click Save.
The metrics endpoint will be available at `-metrics.cdsvcs.akuity.cloud`:
* `/argocd-server` - Exposes metrics for the Argo CD API Server.
* `/application-controller` - Exposes metrics for the Argo CD Application Controller.
* `/application-set-controller` - Exposes metrics for the Argo CD Application Set Controller.
---
## Akuity Datadog Addon
Datadog is a powerful monitoring platform that integrates seamlessly with Argo CD components `argocd-repo-server` and `argocd-application-controller`.
When using Datadog for your monitoring, ensure [Datadog Agent](https://docs.datadoghq.com/integrations/argocd/) is installed in your cluster.
## Datadog Addons via Akuity Portal
If you’re using the Akuity Portal (UI), enabling Datadog is straightforward:
1. Navigate to your cluster settings on [akuity.cloud](https://akuity.cloud/).
2. Click on Add to enable the Datadog option under the Addons section.
3. Update the cluster and apply your changes.
## Datadog Addons via Declarative Specs
To configure Datadog integration declaratively using the Cluster custom resource definition (CRD), you can set the `datadogAnnotationsEnabled` flag to `true`.
Below is an example configuration for metrics collection of `argocd-repo-server` and `argocd-application-controller` in a dev cluster:
```
apiVersion: argocd.akuity.io/v1alpha1
kind: Cluster
metadata:
labels:
env: dev
name: dev
namespace: akuity
spec:
data:
datadogAnnotationsEnabled: true
appReplication: false
autoUpgradeDisabled: false
multiClusterK8sDashboardEnabled: true
size: large
targetVersion: 0.5.58
```
## Datadog Addons via Akuity Terraform Provider
To integrate using infrastructure-as-code, the Datadog addon can be enabled in your Terraform configuring the `akp_cluster` resource.
Below is the example configuration:
```
resource "akp_cluster" "example" {
instance_id = data.akp_instance.example.id
name = "test-cluster"
namespace = "akuity"
labels = {
test-label = true
}
annotations = {
test-annotation = false
}
spec = {
namespace_scoped = true
description = "test-description"
data = {
size = "small"
auto_upgrade_disabled = true
target_version = "0.5.58"
managed_cluster_config = {
secret_key = "secret"
secret_name = "secret-name"
}
datadog_annotations_enabled = true
eks_addon_enabled = false
}
}
```
---
## Prometheus Operator
## ServiceMonitors
The Prometheus Operator supports the use of `ServiceMonitor` resources to scrape metrics from Argo CD components.
Deployment of the Prometheus Operator and corresponding `ServiceMonitor` resources to each managed cluster is the responsibility of the cluster administrator and is considered out of scope for this document.
Below is an example configuration for scraping metrics from both the `argocd-repo-server` and `argocd-application-controller` for a single managed cluster:
:::info
The `metadata.namespace` field must match the namespace where the Akuity Agent is deployed (default: `akuity`).
The `metadata.labels.release` should align with a label defined in the Prometheus Operator's `serviceMonitorSelector`, particularly when using [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml).
:::
```yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: argocd-repo-server-metrics
namespace: akuity
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
app.kubernetes.io/name: argocd-repo-server
endpoints:
- port: metrics
interval: 30s
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: argocd-application-controller-metrics
namespace: akuity
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
app.kubernetes.io/name: argocd-metrics
endpoints:
- port: metrics
interval: 30s
```
## Akuity Managed Cluster Dashboard
A reference Grafana dashboard can be downloaded below to get started:

Download Akuity Dashboard
---
## Akuity Agent(20-agent)
The Argo CD controllers deployed alongside the Agent can be monitored using the standard set of Prometheus metrics available for each component. In most cases, monitoring the `application-controller`, `repo-server`, and `notifications-controller` provides sufficient coverage. While the `akuity-agent` itself does not expose Prometheus metrics, it includes a readinessProbe as part of its deployment. Monitoring the Ready condition of the pods is a reliable way to ensure they are connected and functioning correctly.
---
## Monitoring
The Akuity Platform includes a control plane hosted by Akuity and an Akuity Agent deployed in each managed cluster.
Each component has its own dedicated monitoring solution.
---
## General Settings
## Change Version
The version of a managed Argo CD instance can be upgraded (or downgraded) easily using the Akuity Platform.
1. Navigate to Argo CD → _your instance_ → Settings → General.
1. Under Change Version, select your desired version.
1. Click Save.
Once saved, the Akuity Platform will automatically update the instance. After the operation is complete, the instance will show a healthy status in the dashboard, indicating success.
:::caution
Changing the version of the instance will trigger an update of the Akuity Agent on all connected clusters. The operation is carried out by a temporary job executed in the agent's namespace.
Automatic updates to the Akuity Agent can be disabled by default for all clusters on an instance and per cluster. See Disable Auto Upgrade in [Agent Advanced Settings](../20-clusters/10-agent-advanced-settings.mdx).
:::
:::note
A similar job is used when modifying cluster options such as Agent size, Labels or Annotations, to automatically update the agent configuration in the connected clusters.
:::
## Applications in any namespace
The [Applications in any namespace](https://argo-cd.readthedocs.io/en/stable/operator-manual/app-any-namespace/)
is an Argo CD feature that allows you to store Application resources in any namespace of a control plane cluster.
To enable this feature, navigate to Argo CD → _your instance_ → Settings → General and
toggle the App In Any Namespace switch.
Once feature is enabled, you can create additional namespaces as well as Application resources in new namespace of a control plane cluster
using [declarative management approach](./10-features/30-declarative-management.md). Make sure to allow the additional namespaces in the
required Argo CD project as [described](https://argo-cd.readthedocs.io/en/latest/operator-manual/app-any-namespace/#allowing-additional-namespaces-in-an-appproject) in the official documentation. Example:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: test
namespace: argocd
spec:
destinations:
- name: '*'
namespace: '*'
server: '*'
sourceNamespaces:
- test
sourceRepos:
- '*'
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: test
spec:
destination:
name: test
namespace: default
project: test
source:
path: guestbook
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
```
To apply this manifest, run `akuity argocd apply --name -f .yaml`. This will create the application resource in the `test` namespace.
## Instance Termination Protection
Instance termination protection prevents an Argo CD instance from being accidentally deleted. When enabled, any attempt to delete the instance will be blocked until the protection is explicitly disabled.
To enable termination protection:
1. Navigate to Argo CD → _your instance_ → Settings → General.
2. Toggle the Enable Termination Protection switch.
3. Optionally, enter a message in the Instance Protection Notes field. This message is displayed to anyone who attempts to delete the instance, and can be used to explain why the instance is protected or who to contact for more information.
4. Click Save.

---
## Webhooks
Argo CD polls Git repositories every three minutes to detect changes to the manifests. To eliminate this delay from polling, the
Argo CD API server can be configured to receive webhook events from any of the following services:
* [Bitbucket](https://bitbucket.org/)
* [Bitbucket Server](https://www.atlassian.com/software/bitbucket/enterprise)
* [GitHub](https://github.com/)
* [GitLab](https://about.gitlab.com/)
* [Gogs](https://gogs.io/)
:::note
The webhook handler doesn't differentiate between branch events and tag events where the branch and tag names are the same.
:::
A hook event for a push to branch `x` will trigger a refresh for an app pointing to the same repo with targetRevision: `refs/tags/x`.
## Configuring webhooks
The webhook should be configured using the appropriate Git provider user interface. For any Git provider, you would need to configure
a payload URL, content type, and optional shared secret.
The payload URL is your Argo CD instance hostname followed by `/api/webhook` path. For example
`https://my-argocd-instance.cd.akuity.cloud/api/webhook`. The content type should be `application/json`.
:::note
ApplicationSet generator webhooks use the same payload URL.
:::
## Configuring shared secrets
Configuring a webhook shared secret is optional since Argo CD treats all webhooks as nothing more than untrusted cues to refresh configuration from a trusted source (a process that already occurs at three-minute intervals). However, if access to your Argo CD instance is not narrowly restricted to [clients with specific IPs or within specific CIDR ranges](./20-security-and-access/40-external-access.md), then configuring a webhook secret is recommended to prevent the possibility of DDoS attacks:
1. Navigate to Argo CD → _your instance_ → Settings → Webhooks.
2. For each Git provider you wish to configure, click the corresponding button and specify a shared secret.
3. Click Save.
:::info
After a shared secret is added, it will never be displayed again in the dashboard, but can be redefined or removed.
:::
---
## Custom Styles
Custom Styles allows you to personalize the appearance of your Argo CD dashboard with custom logos, themes, and colors. All custom style settings can be located by navigating to Argo CD → _your instance_ → Settings → Custom Styles.
## Dashboard Logo
You can customize the logo displayed in the sidebar of the Argo CD dashboard.
To upload a custom logo:
1. Click Upload.
1. Select your logo image file.
1. Optionally, check Compress logo to reduce the file size.
1. Click Save.
:::tip
The recommended logo resolution is 40x40 pixels.
:::
## Theme
Select a pre-built theme to change the overall color scheme of the dashboard. Available themes:
- Default
- RedGold
- Navy
- Slack
- Asphalt
- Lavender
- Terra
- Beachball
To change the theme:
1. Select a theme from the Theme dropdown.
1. Preview the changes in the preview panel below.
1. Click Save.
## Color Customization
For more granular control, you can customize individual color elements:
- **Sidebar**: The navigation sidebar background and text colors
- **Page wrapper**: The main content area background
- **Base primary button**: Primary action button colors
- **Base secondary button**: Secondary action button colors
- **Primary text and Link**: Text and hyperlink colors
The preview panel shows how your changes will look across different views:
- **Applications**: The main applications list view
- **Application Details**: Individual application detail page
- **Drawer**: Side panel drawers
## Edit as CSS
For advanced customization, click Edit as CSS to directly edit the CSS styles. This allows full control over the dashboard appearance beyond the pre-built options.
---
## Chat & Banner
Chat & Banner settings allow you to add a support chat link and display banner messages in your Argo CD dashboard. All settings can be located by navigating to Argo CD → _your instance_ → Settings → Chat & Banner.
## Chat
The Chat feature adds a help link to your Argo CD dashboard, typically used to direct users to a support channel.
To configure the chat link:
1. Enter the support **URL** (e.g., your Slack channel or help desk URL).
1. Enter a **Message** to display as the link text (defaults to "Chat now!" if not specified).
1. Click Save.
## Banner
The Banner feature displays a message at the top of every page in the Argo CD UI. This is useful for announcements such as maintenance windows or important notices. For more details, see the [Argo CD Banners documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/custom-styles/#banners).
To configure a banner:
1. Enter the **Message** to display.
1. Optionally, enter a **URL** to make the entire banner text a clickable link.
1. Optionally, toggle Permanent to prevent users from dismissing the banner.
1. Click Save.
:::note
- You can have banner content without a URL, but not the other way around.
- You can have either a permanent banner or a closeable banner, but not both.
- Permanent banners display only one line of text, so keep the message short.
- Every time the banner is updated, users who previously dismissed it will see it again.
:::
---
## Manifest Generation
## Repo Server Delegate
The Akuity platform allows you to delegate Git and Helm repository access to one of the connected clusters.
This is useful when you don't want to provide all connected clusters access to private Helm or Git repositories.
### Enabling Git Delegate
Git Delegate settings are located in Argo CD → _your instance_ → Settings → Manifest Generation.
1. Switch from All Managed Clusters to Single Managed Cluster
1. Select the cluster you want to use as the Repo Server Delegate.
2. Click Save.
:::tip
If you wish to use ApplicationSets when enabling Repo Server Delegate you will also need to enable [Application Set Delegate](./30-declarative-management.md#applicationset-delegate) to allow your ApplicationSets access private Helm and Git repositories.
:::
The Akuity Platform allows you to choose which config management tools are available for your users.
## Kustomize and Helm
Helm and Kustomize are two config management tools supported natively by Argo CD. Use the following steps
to configure Helm and Kustomize settings:
1. Navigate to Argo CD → _your instance_ → Settings → Manifest Generation.
1. Locate the desired tool section and make the required settings changes
1. Click Save to apply the changes.
## Config Management Plugins
[Config management plugins](https://argo-cd.readthedocs.io/en/stable/operator-manual/config-management-plugins/) is a feature of
Argo CD that allows connecting any config management tool with a first-class end-user experience. Akuity Platform provides
a user interface that allows registering config management plugins. Use the following steps to register a new plugin:
1. Navigate to Argo CD → _your instance_ → Settings → Manifest Generation.
1. Locate the Config Management Plugins section and click Add New Plugin.
1. Provide the plugin name, image, and version.
1. Configure Generate command and other optional settings.
1. Click Save to apply the changes.
:::tip
When a Config Management Plugin (CMP) is configured on the Akuity Platform, the control plane’s `repo-server` is automatically disabled to prevent arbitrary containers from running in the cluster. As a result, when using the `app-of-apps` pattern, you’ll need to either register all clusters or enable the [Repo Server Delegate](/argocd/managing-instances/settings/features/manifest-generation#repo-server-delegate) feature to ensure applications sync correctly.
:::
### Migration From Config Management Plugins v1
Akuity Platform supports version 2 of the config management plugins
(aka [sidecar plugins](https://argo-cd.readthedocs.io/en/stable/operator-manual/config-management-plugins/#sidecar-plugin)). The first version is deprecated
and not supported by the Akuity Platform. Use the following steps to migrate from version 1 to version 2:
1. Convert the v1 config management plugin to v2 plugin spec. The example below compares `kasane` plugin v1 and v2 versions:
* v1 configuration:
```yaml
apiVersion: v1
data:
configManagementPlugins: |
- name: kasane
init:
command: [kasane, update]
generate:
command: [kasane, show]
```
* v2 spec:
```yaml
init:
command:
- kasane
- update
generate:
command:
- kasane
- show
```
1. Register the v2 plugin using the converted specification. Provide the plugin name and the Docker image that contains the plugin binary.
---
## Notifications(10-features)
Argo CD allows notifications to be configured using [Kubernetes ConfigMaps and Secrets](https://argo-cd.readthedocs.io/en/latest/operator-manual/notifications/). The Akuity Platform provides a convenient way to configure notifications through its dashboard.
All notification settings can be located by navigating to Argo CD → _your instance_ → Settings → Notifications.
:::tip
Check out our how to add [GitHub commit status notifications for Argo CD](/tutorials/notifications/) on the Akuity Platform.
:::
## Configure services
1. Select the Configuration tab.
2. Click + Add New:
1. Select the type of service.
2. Enter all required fields (these will vary by service type).
3. Click Add.
Repeat these steps if you want to add more services.
:::note
Configuration tab doesn't currently support all possible services. For now, only Email and Slack are supported. We are continuing to add support for additional services. If you want to add more services, you can use the YAML Editor tab.
:::
3. Click Save to persist the configuration to a `ConfigMap`.
:::note
The platform automatically injects `.context.argocdUrl` for you. This means that if you have specified a Custom Domain in Argo CD → _your instance_ → Settings → Security & Access → External Access, `.context.argocdUrl` will automatically be updated. You can override its value using the YAML Editor functionality, in which case the Akuity Platform will leave it as you specified.
:::
## Configure triggers and templates
Argo CD comes with a [catalog of predefined triggers and templates](https://argo-cd.readthedocs.io/en/latest/operator-manual/notifications/catalog/).
1. Select the Configuration tab.
2. Click Import From Catalog.
3. Click Confirm.
You can also define your own Triggers or Templates.
Each Trigger uses one Template. You need to add a Template first, or you can add it in the Add Trigger modal:
4. Select the Configuration tab.
5. Click Templates.
6. Click + Add Template.
7. Enter a unique Name.
8. Input configuration in the Template field. Refer to the [Argo CD templates documentation](https://argo-cd.readthedocs.io/en/latest/operator-manual/notifications/templates/) for more details.
9. Click Add.
Once your Template is visible in the list, go back and add a new Trigger:
10. Click + Add Trigger
11. Fill in all required fields.
12. Select or add a new Template by following the above steps.
13. Click Add.
Repeat these steps if you want to add more triggers or templates.
14. Click Save to persist the configuration to a `ConfigMap`.
## Secrets
The Akuity Platform allows you to easily manage sensitive information that can be referenced elsewhere in the configuration of your notifications using a `$` sign (e.g. `$slack-token`).
To add a new secret:
1. Select the Secrets tab.
2. Then:
1. Click + New Secret.
2. Enter the secret name (without a `$`) in the Key column.
3. Press the Enter key on your keyboard.
4. Enter the secret's value in the Value column.
Repeat these steps if you want to add more secrets.
3. Click Save to persist the data in a `Secret`.
:::info
After a secret is added, it will never be displayed again in the dashboard, but can be redefined or removed.
:::
## Reading settings from a different cluster
:::info
This feature is only available in Akuity Argo CD (versions with the `-ak` postfix) and is not available in the open-source version of Argo CD.
:::
This feature allows the notification controller to read notification settings from the managed cluster while continuing to manage Argo CD applications from the control plane. This is useful when you want to keep notification configuration separate from application management.
By default, the controller reads notification settings from the control plane cluster where it manages applications.
### Configuration
This feature is configured through the cluster's [Advanced Settings](/argocd/managing-instances/clusters/agent-advanced-settings#notifications-settings-source) in the Akuity Platform UI.
:::note
When using this feature, you need to ensure that the required notification configuration exists on the managed cluster:
- **ConfigMap**: `argocd-notifications-cm` - Contains notification templates and triggers
- **Secrets**: Any secrets needed for notification services (e.g., Slack webhooks, email SMTP credentials, etc.)
These resources must be present in the managed cluster's namespace where the notification controller is running.
:::
## Control Plane Notifications
Setting Control Plane Notifications will allow a notification controller to monitor and trigger notifications for apps beyond its own cluster. This includes:
- Apps deployed to the control plane (app of apps)
- Integration clusters (e.g., Kargo, Upbound)
By default, a notification controller can only watch and notify for apps deployed to its own cluster. This setting extends this capability to include the control plane and integration cluster apps.
To configure this setting:
1. Navigate to the Control Plane Notifications section in the Notifications settings tab.
1. Enable the feature.
1. Select the cluster from the dropdown menu.
---
## Declarative management
There are two types of settings that can be managed using the declarative approach:
* End users/developers specific settings such as `Application`, `ApplicationSet`, and `AppProject` resources.
* Platform-specific settings such as IP allow lists, system accounts and availability of additional Argo CD components.
## Developers-specific settings
Declarative management allows you to use the Argo CD control plane on the Akuity platform to host `Application`, `ApplicationSet`, and `AppProject` resources. This is used for implementing:
* Argo CD's [app of apps pattern](https://youtu.be/2pvGL0zqf9o) to declaratively specify one Argo CD `Application` resource that points to a Git repository consisting only of other `Application` resources.
* [`ApplicationSet`](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/#the-applicationset-resource) resources to manage a set of Argo CD `Application`s.
The resources deployed into the control plane must specify the namespace `argocd` and the destination name `in-cluster` (server `https://kubernetes.default.svc`). The child `Application`s (that deploy anything other than an `Application`, `ApplicationSet`, or `AppProject`) must target a connected cluster other than `in-cluster`.
### Example: App of Apps
The parent `Application` created via the Argo CD dashboard:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: example-apps
namespace: argocd
spec:
destination:
namespace: argocd
name: in-cluster
project: default
source:
repoURL: 'https://github.com/argoproj/argocd-example-apps'
path: apps
targetRevision: HEAD
helm: # Set the destination cluster for the child Applications in the Helm chart.
values: |-
spec:
destination:
name: my-cluster
```
- The `destination.name` is `in-cluster` and the `destination.namespace` is `argocd`. This will deploy child `Application`s into the Argo CD control plane on the Akuity Platform.
The child `Application` created by the parent app:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: helm-guestbook
namespace: argocd
spec:
destination:
name: my-cluster
namespace: default
project: default
source:
path: helm-guestbook
repoURL: 'https://github.com/argoproj/argocd-example-apps'
targetRevision: HEAD
```
- The `destination.name` is `my-cluster`, which is an external cluster connected to the Argo CD instance on the Akuity Platform (See ["Connect a Kubernetes cluster"](../../../01-getting-started/20-connect-kubernetes-cluster.mdx)). This is where the resources for the `guestbook` app will be deployed (i.e., the `Deployment` and `Service`).
### Enabling declarative management
To enable declarative management:
1. Navigate to Argo CD → _your instance_ → Settings → General.
1. Scroll down to Control Plane Cluster (in-cluster) and toggle the Enabled switch.
1. Click Save.
Once the Argo CD instance has finished progressing, the `in-cluster` destination will be available.
---
## Application Set
By default, the ApplicationSet Controller will run on the Control Plane which is fine for most use cases. ApplicationSet Delegate (Single Managed Cluster) compliments the [Repo Server Delegate](/argocd/managing-instances/settings/features/manifest-generation#repo-server-delegate) by allowing ApplicationSets that use webhooks, private Helm, or private git repositories to access the credentials needed to perform git operations.
### ApplicationSet Delegate
1. Switch from Control plane to Single Managed Cluster
1. Select the cluster you want to use as the ApplicationSet Delegate.
2. Click Save.
### Policy (Global)
A Policy defines how application is synced between the generator and the cluster. Default is 'empty', options: 'sync' (create & update & delete), 'create-only', 'create-update' (no deletion), 'create-delete' (no update)
### Allow Override
Starting with Argo CD v2.8 a policy can be specified per [ApplicationSet](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Controlling-Resource-Modification/#managed-applications-modification-policies). Enabling the override will allow a policy per ApplicationSet to override a global policy.
### Progressive Syncs
:::note Alpha
This feature is currently in Alpha status.
:::
The Progressive Syncs feature allows you to control the order in which the ApplicationSet controller will create or update the Applications owned by an ApplicationSet resource. This is useful when you need to roll out changes to applications in a controlled, sequential manner rather than all at once.
For more details on Progressive Syncs, see the [Argo CD Progressive Syncs documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Progressive-Syncs/).
To enable Progressive Syncs:
1. Navigate to Argo CD → _your instance_ → Settings → Application Set.
1. Scroll down to Progressive Syncs and toggle the Enabled switch.
1. Click Save.
### Using secrets in ApplicationSets
For security reasons, the Akuity platform enforces that all secret references in ApplicationSets point to the platform-managed secret named `application-set-secret`. This ensures that the credentials used by your ApplicationSets are securely managed and audited by the platform.
:::note
Apart from the `application-set-secret` the ApplicationSets can also point to argocd repo credentials.
:::
Setting Up Secrets
To configure secrets for use with ApplicationSets:
1. Navigate to Argo CD → _your instance_ → Settings → Application Set.
1. Scroll down to Secrets and add your key-value pairs (e.g., tokens, credentials) that you want to store in the application-set-secret.
1. Save the configuration. The platform will automatically create or update the application-set-secret.
### Plugins Generator
The ApplicationSet Plugin Generator allows you to configure custom plugin generators that can be used with ApplicationSets. This feature enables you to extend the functionality of ApplicationSet generators by providing your own custom logic for generating application parameters.
For detailed information about implementing plugin generators, see the [Argo CD Plugin Generator documentation](https://argo-cd.readthedocs.io/en/latest/operator-manual/applicationset/Generators-Plugin/).
#### Adding a Plugin
1. Navigate to Argo CD → _your instance_ → Settings → Application Set.
1. Scroll down to the Plugins Generator section.
1. Configure the following fields:
* **Name**: A unique identifier for your plugin (the field is pre-filled with `plugin-`, so you would enter something like `my-custom-plugin` to create `plugin-my-custom-plugin`)
* **Base URL**: The base URL of the Kubernetes service exposing your plugin in the cluster (e.g., `http://myplugin.plugin-ns.svc.cluster.local`). In most cases, this will be a deployment running on your cluster and not publicly accessible.
* **Request Timeout**: Timeout for requests to the plugin in seconds
* **Token**: A token used to authenticate HTTP requests to your plugin
1. Click + Add Plugin to add the plugin configuration.
1. Click Save to apply the changes.
:::tip
The token should be a strong, randomly generated string that will be used to authenticate requests between the ApplicationSet controller and your plugin.
:::
:::note
The base URL should point to a Kubernetes service that exposes your plugin. The service should be accessible from the ApplicationSet controller's namespace.
**Important**: If your plugin service is not publicly accessible, you will need to enable the [ApplicationSet Delegate](#applicationset-delegate) feature and delegate to the cluster where your plugin service is running.
:::
---
## Image Updater
The Akuity Platform can easily enable and configure the [Argo CD Image Updater](https://argocd-image-updater.readthedocs.io/en/stable/). The Image Updater settings are located in Argo CD → _your instance_ → Settings → Image Updater.
To enable the Image Updater, go to its setting tab mentioned above, toggle Enable and click on Save.
If Image Updater is Enabled, you will get an option below to select a cluster in which you want to run the Image Updater. You can select All Managed Clusters or Single Managed Cluster of your choice.
Once the Image Updater is configured on the Akuity Platform, all the operational configurations can be done in the Argo CD instance itself, such as the [`git` write-back method](https://argocd-image-updater.readthedocs.io/en/stable/basics/update-methods/#git-write-back-method) or [update strategies](https://argocd-image-updater.readthedocs.io/en/stable/basics/update-strategies/#semver-update-to-semantic-versions).
## Logs
The Argo CD Image Updater runs in your connected cluster, so the logs can be viewed using below command on the cluster.
```shell
# namespace is 'akuity' unless you configure different in cluster settings.
kubectl logs deployment.apps/argocd-image-updater -n `
```
In the settings, you can configure the log level from the Log Level dropdown.
## Git
### Git Access for Write-Back Method
Before you choose `git` as a write back method, you would need to give an access of the relevant git repository to let Image Updater commit changes.
### Git Commit Options
Configure the `git` commit username, email, and message used by the Image Updater. This configuration is optional.
1. Fill the User field.
1. Fill the Email field.
1. Fill the Commit Message Template input. The template is a [Go `text/template` string](https://pkg.go.dev/text/template). Therefore, metadata can be accessed using variables. two common top-level variables are:
1. `AppName` - the name of the Application.
1. `AppChanges` - the list of the changes, which contains:
1. `Image` - the image name.
1. `OldTag` - the previous tag or SHA digest before the update.
1. `NewTag` - the update's new tag or SHA digest.
1. Click Save.
## Container Registries
To configure custom private [container registries](https://argocd-image-updater.readthedocs.io/en/stable/configuration/registries/#configuration-of-container-registries):
1. Click the Add Container Registry button.
1. Fill the relevant fields Prefix, Name, API URL, Default Namespace, Credentials, Credential Expire Time and Rate Limit. Hover over the help icon to see more information about a field.
1. Move to the Secrets tab to define private container registry credentials and use it from the dropdown of the Credentials field mentioned in the above step.
1. Click Save.
## SSH Client Configuration
The Image Updater supports setting the SSH Client Configuration (i.e., modifying the `~/.ssh/config`). This is used in edge cases when, for example, you need to use the deprecated `ssh-rsa` algorithm. See further explanation in this [pull request](https://github.com/argoproj-labs/argocd-image-updater/pull/373) on the upstream project.
```yaml
Host *
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa
```
---
## Secrets
The Akuity Platform provides a way to manage and synchronize secrets between the control plane and
your Kubernetes clusters. This capability is built in to the platform and requires no additional
configuration to enable in your clusters.
:::caution
The Akuity Platform's secret syncing feature is designed for **convenience** and is not as a comprehensive secret
management solution. It's best suited for syncing a small number of secrets for Argo CD use cases, such as
repository credentials or notification secrets.
**For proper secrets management, consider using a dedicated solution like
[External Secrets Operator (ESO)](https://external-secrets.io/) or [OpenBao](https://www.openbao.org/).**
:::
## Overview
Secrets management has two main components:
1. Syncing secrets from your managed clusters to be used by the Argo CD control plane hosted on the
Akuity Platform.
2. Syncing secrets from the Argo CD control plane to your managed clusters.
Additionally, the settings tab can now create what are called "managed secrets." This is a shortcut
for creating Argo CD secrets without needing to access the Argo CD dashboard directly (though they
can still be managed there as well).
These features can be used separately or together, depending on your needs.
## Syncing Secrets to the Argo CD Control Plane
### Selecting which Secrets to Sync
For security, secrets will not synced unless explicitly allowed by a control plane administrator.
This can be done in the "Secrets" settings of the instance as shown below:
Allowed secrets are configured by creating a Secret Source. A Secret Source has two fields, one of
which must always be set:
1. **Cluster Selector**: A label selector for a clusters you wish to sync secrets from. The [labels
for the cluster](../../20-clusters/10-agent-advanced-settings.mdx#labels--annotations) are
specified when connecting a cluster to the Akuity Platform. If this field is left empty, then the
Label Selector will match secrets from all clusters.
2. **Label Selector**: A [set-based label
selector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)
for the secrets you wish to sync. If this field is left empty, then the Label Selector will match
all secrets for all matching clusters
:::tip
You can use both Cluster and Label selectors to select specific secrets from specific clusters for
more fine grained control
:::
### Creating Secrets
:::warning
If you create a secret syncing selector _after_ creating a secret in Kubernetes, the secret will not
sync until Kubernetes resyncs or you reapply the secret. This is due to the limitation of the
Kubernetes API, which only informs when a secret is updated/created.
:::
To sync secrets from your managed clusters to the Argo CD control plane, you need to create a secret
in your managed cluster with the appropriate labels. The Akuity agent will automatically detect
these secrets and sync them to the Argo CD control plane.
Secrets must be created in the Agent namespace within a managed cluster (`akuity` by default) and
must have the label `akuity.io/secret-sync: "true"` to opt-in to syncing.
**Argo CD Secrets (repo-creds, repository)**
For Argo CD repository credentials, add the standard `argocd.argoproj.io/secret-type` label.
The `argocd.argoproj.io/secret-type` label is what enables Argo CD treat the secret as
repository credentials or other Argo CD secret types.
To sync the secret from a managed cluster to the control plane, you must also opt-in with the
sync label (`akuity.io/secret-sync: "true"`).
You can create [secrets
declaratively](https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-repo-creds-yaml/)
following Argo CD's format. Here is an example secret that can be used to sync a Git repository credential:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: argoproj-https-creds
namespace: akuity
labels:
argocd.argoproj.io/secret-type: repo-creds
# This label is required to enable syncing of this secret
akuity.io/secret-sync: "true"
# This label could be used to select this secret for syncing
team: my-team
stringData:
url: https://github.com/argoproj
type: helm
password: my-password
username: my-username
```
**Arbitrary Secrets**
You can sync any secret to the control plane by adding the `akuity.io/secret-sync: "true"`
label. This is useful for syncing secrets that don't fit the Argo CD secret types, such as external secrets
managed by other tools, or custom credentials used by ApplicationSet generators or notification triggers.
Here is an example of an arbitrary secret that can be synced to the control plane:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: my-custom-credentials
namespace: akuity
labels:
# This label is required to enable syncing of this secret
akuity.io/secret-sync: "true"
# This label could be used to select this secret for syncing
team: my-team
stringData:
api-key: my-api-key
endpoint: https://api.example.com
```
Synced secrets will be available in the Argo CD control plane and can be used in your applications.
Once the secret is synced, you will see it appear in the managed secrets list in the "Secrets" settings of
the instance:

### Blocked Secrets
For security, certain secrets are never allowed to be synced/mutated by managed clusters.
Secrets that meet any of the following criteria are denied:
* Secrets with the following names:
* `argocd-secret`
* `argocd-initial-admin-secret`
* Secrets of the following [types](https://kubernetes.io/docs/concepts/configuration/secret/#secret-types):
* `kubernetes.io/service-account-token`
* Secrets with the following labels:
* `argocd.argoproj.io/secret-type=cluster`
Attempting to sync/mutate denied secrets will be rejected by the Akuity Platform.
### Adoptable Secrets
Certain system secrets can be "adopted" by a managed cluster when synced. These secrets are
pre-existing in the control plane, but when a managed cluster syncs its own version, the cluster
takes ownership and the control plane defers to the cluster's values.
| Secret Name | Purpose |
| ----------- | ------- |
| `argocd-notifications-secret` | Notification service credentials (Slack tokens, email passwords, etc.) |
| `argocd-image-updater-secret` | Image registry credentials for the Argo CD Image Updater |
| `application-set-secret` | Credentials used by ApplicationSets (configured via the Application Set settings page) |
When a managed cluster adopts one of these secrets, the Akuity Platform UI will display a warning banner
indicating which cluster owns the secret, and the edit controls will be disabled to prevent conflicting changes.
**To modify an adopted secret**, update it directly on the managed cluster that owns it.
**To return control to the Akuity Platform**, remove the `akuity.io/secret-sync: "true"` label
from the secret on the managed cluster, or delete the secret entirely from the managed cluster.
Once ownership is released, the warning banner will disappear and you'll be able to edit the secret
again from the Akuity Platform dashboard.
## Creating and updating managed secrets
Managed secrets can be created and updated directly from the "Secrets" settings of the instance.
Essentially, this is a convenience wrapper around creating a Kubernetes secret with some extra
goodies to make syncing work, so it should look familiar.
**Create**
To create a managed secret, follow the steps below:
You can use a match expression to match labels on the clusters you wish to sync this secret to
or you can allow it to sync to all clusters
**Update**
To update an existing managed secret, click on the edit icon of the secret in the list you wish
to edit and then edit any fields desired
**Delete**
To delete an existing managed secret, click on the delete icon of the secret in the list you wish
to delete and then confirm the deletion.
## Syncing Secrets to Managed Clusters
Secrets that are synced to the Argo CD control plane or created as managed secrets can also be
synced back down to your managed clusters. This enables workflows where a cluster acts "seed"
cluster that syncs to all of your other managed clusters.
### Authorizing secrets to be synced
Each secret must be explicitly authorized to be synced to a cluster. This can be done on secret
creation or by editing an existing secret:
All Clusters will sync the secret to all other clusters. Selected Clusters allows you to use a label
selector to select which clusters the secret should be synced to. This should match the [labels
specified when connecting a
cluster](../../20-clusters/10-agent-advanced-settings.mdx#labels--annotations).
### Advanced: Syncing from one cluster to other clusters
If you are managing secrets from one of your managed clusters, you "own" that secret and Akuity will
not modify any of those secret values. In order to allow the secret to sync to other clusters,
you'll need to add one or more of the annotations described below:
| Annotation | Description | Example Value |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| `akuity.io/managed-secret-allowed-cluster-selector` | A set-based label selector that determines which clusters the secret is allowed to be synced to. | `my-label in (cluster2)` |
| `akuity.io/managed-secret-allowed-clusters` | A comma-separated list of cluster names that the secret is allowed to be synced to. The reserved string `ALL` can be used to allow syncing to all clusters. | `cluster2,cluster3` |
As an example, this is what the same Argo CD repo credentials secret would look like when created
in a managed cluster and synced to a specific set of other clusters:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: argoproj-https-creds
namespace: akuity
labels:
argocd.argoproj.io/secret-type: repo-creds
# This label is required to enable syncing of this secret
akuity.io/secret-sync: "true"
# This label could be used to select this secret for syncing
team: my-team
annotations:
# Assumes you have a cluster with the label my-label=cluster2
akuity.io/managed-secret-allowed-cluster-selector: my-label in (cluster2)
stringData:
url: https://github.com/argoproj
type: helm
password: my-password
username: my-username
```
---
## RBAC
Role-Based Access Control (RBAC) allows you to define fine-grained access policies for your Argo CD instance. All RBAC settings can be located by navigating to Argo CD → _your instance_ → Settings → RBAC.
For detailed information about RBAC concepts and policy syntax, see the [Argo CD RBAC documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/rbac/).
## Default Role
The Default Role setting specifies the role that all authenticated users receive by default. This role determines the minimum level of access for anyone who logs into your Argo CD instance.
Argo CD provides two built-in roles:
- `role:readonly` - Read-only access to all resources
- `role:admin` - Unrestricted access to all resources
## OIDC Scopes
OIDC Scopes control which OIDC scopes to examine during RBAC enforcement (in addition to the `sub` scope). By default, the `groups` scope is used.
This setting is useful when you want to use additional claims from your identity provider for RBAC decisions, such as `email` or custom scopes.
To add additional scopes:
1. Click + Add Scope.
1. Enter the scope name.
1. Click Save.
## Logs Access RBAC
When enabled, Logs Access RBAC allows you to manage who can view application pod logs in the Argo CD UI independently from general application access. This provides more granular control over sensitive log data.
To enable Logs Access RBAC:
1. Toggle the Enabled switch to ON.
1. Click Save.
Once enabled, you can use the `logs` resource in your RBAC policies to control access. For example:
```
p, role:developer, logs, get, default/*, allow
```
This policy allows users with the `developer` role to view logs for all applications in the `default` project.
## Policy
The Policy section allows you to define RBAC policies that control access to Argo CD resources.
To add or modify policies:
1. Edit the policy in the Definition text area.
1. Click Save.
You can create multiple policy tabs by clicking the + button next to the Main tab to organize your policies.
---
## System Accounts
All system account settings can be located by navigating to Argo CD → _your instance_ → Settings → System Accounts.
## Anonymous user
Toggling the Anonymous User switch to ON permits anonymous access to the Argo CD UI.
:::info
Anonymous users receive the default permissions specified under Argo CD → _your instance_ → Settings → RBAC → Default Role. For read-only access, you should set this default policy to `role:readonly`.
:::
## Admin account
Toggling the Admin Account switch to ON creates a system account with the username `admin`.
To specify a password for the `admin` user:
1. Click Set Password. Then either:
* Specify a custom password and click Submit or
* Click Regenerate password to generate a strong password. The password will not be displayed. Click Copy to copy the new password to your clipboard.
:::note
The Argo CD Admin Account feature is different from the Akuity Platform Admin user role. Please refer to Argo CD documentation for more information about the Admin Account feature, or refer to the Organizations page in the Akuity Platform documentation for more information about the Akuity Platform Admin user role.
:::
## Account management
In addition to the `admin` user, the Akuity Platform allows you to create additional system accounts with configurable capabilities:
1. Click Add Account.
1. Type a username in the blank Name field.
1. Select appropriate permissions in the Capabilities field.
1. Click Add.
Repeat these steps to add additional system accounts.
To set a password for any system user:
1. Click the corresponding Set password button. Then either:
* Specify a custom password and click Submit or
* Click Regenerate password to generate a strong password. The password will not be displayed. Click Copy to copy the new password to your clipboard.
## Account capabilities
* login: Permits the user to log in using the Argo CD UI.
* apiKey: Permits the user to generate authentication tokens for API access. This is useful for CI/CD pipelines or other automated processes that need to interact with the Argo CD API.
---
## External Access
All external access settings can be located by navigating to Argo CD → _your instance_ → Settings → External Access.
## Custom Domain
### Akuity Subdomain
By default, each Argo CD instance's UI will be accessible at `.cd.akuity.cloud`, however, the Akuity Platform does permit you to set a custom domain prefix for each Argo CD Instance.
To customize this:
1. Change the value of the Custom Domain field.
1. Click Save.
### Fully Qualified Domain Name
If you have a custom domain that you would like to use, you can set up a CNAME record to point to the Akuity Platform's domain.
To do this:
1. Create a CNAME record in your DNS provider that points to `.cd.akuity.cloud`.
1. Change the value of the Domain field to your custom domain.
1. Click Save.
## IP Allow List
By default, each Argo CD instance is accessible by clients with any IP address, however, this can be narrowed to a specific list of IP addresses or CIDR ranges.
To customize this:
1. Under IP Allow List, click + Add New and complete the IP Address and Description (optional) fields.
* Repeat this step as necessary.
1. Click Save.
To restore access from any IP address, simply remove all entries from the list.
:::note Coming Soon
We will soon allow you to populate the IP Allow List with known IPs from CI providers such as GitHub Actions. This will allow you to restrict access to the Argo CD UI to the IPs of your providers without the need to create dozens or hundreds of entries manually.
:::
## Private Connectivity
Organizations with AWS PrivateLink enabled can take the Argo CD instance off the public internet entirely by switching Private Connectivity to Private. This requires a connected AWS account and is mutually exclusive with the Fully Qualified Domain Name setting.
See [Private Connectivity (AWS PrivateLink)](/akuity-portal/security/private-link) for the full setup guide.
---
## Argo CD SSO Configuration
The Akuity Platform allows you to configure a single SSO provider for Argo CD, such as GitHub, SAML, or any other supported providers, ensuring secure user access to your Argo CD instance. This guide provides a step-by-step approach to setting up Single Sign-On (SSO) for Argo CD using the Akuity Platform.
:::info
Argo CD SSO is available in all Professional and Enterprise plans. If you would like to have an SSO configured specifically for your Organization, it is recommended to use the [Akuity Platform SSO](../../../../02-akuity-portal/02-organizations/50-sso.mdx).
:::
## Configuring SSO
1. In your Argo CD Instance, go to Settings.
2. In the left panel, search for Security & Access and go to SSO Configuration.

3. Click on Add new connector and select your desired `Type`.

:::note
If you don't see your desired connector type in the configuration, it is recommended to use the YAML Editor for advanced configurations.
:::
**SAML**
4. Register a New SAML Application:
- In your SAML Identity Provider (IdP) portal (e.g., Okta, Microsoft Entra ID, or Auth0), create a new SAML application.
- Provide a name (e.g., "Argo CD") and configure the Single Sign-On URL (or ACS URL) to point to the `/api/dex/callback` endpoint of your Argo CD URL (e.g., https://argocd.example.com/api/dex/callback).
- After creating the application, download the SAML metadata file from your IdP. This metadata file will contain necessary information like the `Entity ID`, `SSO URL`, and the `public certificate` needed for SAML authentication.
5. Store your *SSO URL* and *Public Certificate* in a secure location since you'll need both in the next steps.
6. Paste your *SSO URL* and *Publc Certificate* (not Base64 encoded) in the connector along with the *username attribute* and *email attribute*, and click Add
7. Finally, click Save in the top-right corner.

**Google**
4. Set Up the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent):
- Go to the [OAuth Consent Screen](https://console.cloud.google.com/apis/credentials/consent) in the Google Cloud Console. If you haven't configured it yet, select *Internal* or *External* and click *Create*.
- Provide a name for your login app, a user support email, and add *Authorized domains* (e.g., example.com to allow all users with *@example.com* to log in).
- Optionally, add an app logo and other information for a customized login experience.
- Save and proceed to the *Scopes* section to add `.../auth/userinfo.profile` and `openid` scopes. Review and finalize your setup.
5. Store your *Client ID* and *Client Secret* in a secure location since you'll need both in the next steps.
6. Paste your *Client ID* and *Client Secret* in the connector and click on Add
7. Finally, click on Save in the top right corner.

**GitHub**
4. In GitHub, register a new application. Go to Settings > Developer Settings and create a new GitHub App. The callback address for the GitHub App should be the `/api/dex/callback` endpoint of your Argo CD URL (eg. https://argocd.eg.com/api/dex/callback)
5. Store your *Client ID* and *Client Secret* in a secure location since you'll need both in the next steps.
6. Paste your *Client ID* and *Client Secret* in the connector and click on Add
7. Finally, click on Save in the top right corner.

:::note
Once your connectors have been added and saved, you can also use the YAML Editor to perform advanced configurations.

:::
8. In order to validate, open a new browser and enter your ArgoCD Instance URL: `https://`.

9. Click on SSO LOGIN and log in to your Argo CD instance.
Congratulations! You've successfully set up the Argo CD SSO configuration using Akuity Platform.
---
## Akuity Agent Default Settings
The Akuity Agent is a component installed into a managed cluster allowing it to be managed by an Argo CD instance on the Akuity Platform. Every cluster agent which is installed into Kubernetes clusters will have a corresponding cluster entry in Argo CD and will be available as an Argo CD Application destination.
## Default Settings
To apply the settings globally go to Argo CD → _your instance_ → Settings → Agent Default Settings.
:::note
Modifications made here will be applied globally. Additional clusters added to your instance will inherit these settings by default, unless specified via [`Akuity Platform Declarative management`](/akuity-portal/automation/declarative-management).
:::
## Applying Changes
When the Agent Default Settings are updated and Save is clicked, the changes will apply only to newly added clusters. To update both existing and future clusters, select Save and Update All Clusters.
|Setting | Enabled by Default |
|--------------------------------------------------------------------------------------------------------------|--------------------|
|[`Auto Apply Changes`](/argocd/managing-instances/clusters/agent-advanced-settings#auto-update) | Yes |
|[`State Replication`](/argocd/managing-instances/clusters/agent-advanced-settings#state-replication) | No |
|[`Redis Tunneling`](/argocd/managing-instances/clusters/agent-advanced-settings#redis-tunneling) | No |
|[`Private Connectivity`](/argocd/managing-instances/clusters/agent-advanced-settings#private-connectivity) | No (Public) |
|[`Akuity Customer Image Registry`](/argocd/managing-instances/clusters/agent-advanced-settings#akuity-custom-image-registry) | No |
|[`Argoproj Customer Image Registry`](/argocd/managing-instances/clusters/agent-advanced-settings#argoproj-custom-image-registry) | No |
|[`Kustomization`](/argocd/managing-instances/clusters/agent-advanced-settings#kustomization) | No |
|[`Custom CA Bundle`](/argocd/managing-instances/clusters/agent-advanced-settings#custom-ca-bundle) | No |
---
## Akuity Agent Resource Customization
Resource Customization feature allows you to configure how ArgoCD interacts with, monitors, and manages your Kubernetes resources to suit your specific needs.
Providing the Group/Kind of the resource, you can customize the following:
1. [Resource Health](https://argo-cd.readthedocs.io/en/stable/operator-manual/health/)
2. [Resource Actions](https://argo-cd.readthedocs.io/en/stable/operator-manual/resource_actions/)
3. [Ignore Differences/Ignore Resource Updates](https://argo-cd.readthedocs.io/en/stable/user-guide/diffing/)
4. [Kubernetes Known Type Fields](https://argo-cd.readthedocs.io/en/stable/user-guide/diffing/#known-kubernetes-types-in-crds-resource-limits-volume-mounts-etc)
Refer to the corresponding OSS documentation for more information on these features.
## Enable Resource Customization
To enable Resource Customization, follow these steps:
1. Go to Argo CD → _your instance_ → Settings → Resource Customizations.
2. Click on Add Customization to open modal, where you can configure your customization.

3. Fill in the applicable fields for the customization:
- **Group/Kind**: The API group and kind of the resource you want to customize.
- **Health Check** (optional): The health check configuration for the resource.
- **Actions** (optional): The resource actions configuration for the resource.
- **Ignore Differences** (optional): The ignore differences configuration for the resource.
- **Ignore Resource Updates** (optional): The ignore resource updates configuration for the resource. This configuration can be disabled so that it doesn't effect anything by a switch "Enable Ignore Resource Updates" below the customizations table.
- **Known Type Fields** (optional): The known Kubernetes types configuration for the resource.

4. Click Add to confirm your configuration.
5. Click Save to save your resource customization settings.
## Modifying Resource Customization
You can edit and delete your resource customizations by using table action buttons and saving settings.

## Cron Job

If you would like to create a job from a CronJob, in the ArgoCD UI, you can enable this feature in the Resource Customizations settings.
:::danger
Enabling/Disabling this feature will require manually re-applying the cluster manifests for all connected clusters once confirmed.
:::
Follow these steps to enable job creation from CronJobs:
1. Go to Argo CD → _your instance_ → Settings → Resource Customizations.
2. Toggle the `Enable Job creation from CronJobs` toggle.

3. Confirm toggling the setting in the confirmation modal.
This setting allows you to create a job from the CronJobs in the ArgoCD UI.
It adds the following rules to the akuity-agent ClusterRole in your cluster:
```yaml
- apiGroups:
- batch
resources:
- jobs
verbs:
- create
```
---
## Reconciliation Settings
Reconciliation settings allow you to tune how Argo CD processes application reconciliation. These settings can help prevent resource exhaustion and improve performance in large-scale deployments. All reconciliation settings can be located by navigating to Argo CD → _your instance_ → Settings → Reconciliation Settings.
For more details on high availability and rate limiting, see the [Argo CD High Availability documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/).
## Bucket Rate Limiting
Bucket rate limiting uses a simple bucket-based approach to prevent resource spikes when many applications need reconciliation simultaneously.
To enable bucket rate limiting:
1. Toggle the Enabled switch to ON.
1. Configure the following settings:
- **Bucket Size**: The number of items that can be queued in a single burst (default: 500)
- **Bucket QPS**: The number of items that can be queued per second (default: 50)
1. Click Save.
## Item Rate Limiting
Item rate limiting manages how frequently individual applications can be requeued using exponential backoff. This helps prevent sync loops and controller resource exhaustion.
To enable item rate limiting:
1. Toggle the Enabled switch to ON.
1. Configure the following settings:
- **Failure Cooldown**: The reset period in milliseconds. Backoff resets if this duration elapses without requeuing (default: 10000ms)
- **Backoff Factor**: The multiplier for exponential backoff increases (default: 1.5)
- **Base Delay**: The initial backoff value in milliseconds (default: 1ms)
- **Max Delay**: The maximum backoff ceiling in milliseconds (default: 1000ms)
1. Click Save.
## Resources
The Resources section allows you to control which Kubernetes resources Argo CD monitors and reconciles.
### Inclusions
By default, all resource groups/kinds are included. The Inclusions setting allows you to customize the list of included groups/kinds. If specified, only these resources will be monitored.
### Exclusions
Configuration to completely ignore entire classes of resource groups/kinds (optional). Excluding high-volume resources improves performance and memory usage, and reduces load and bandwidth to the Kubernetes API server.
These are globs, so a `*` will match all values. If you omit groups/kinds/clusters, they will match all groups/kinds/clusters.
:::note
`events.k8s.io` and `metrics.k8s.io` are excluded by default.
:::
Example exclusion configuration:
```yaml
- apiGroups:
- '*.crossplane.io'
kinds:
- ProviderConfigUsage
```
## Compare Options
The Compare Options section allows you to configure how Argo CD compares resources during reconciliation. This is specified in YAML format.
Available options include:
- **ignoreAggregatedRoles**: If set to `true`, differences caused by aggregated roles in RBAC resources are ignored
- **ignoreResourceStatusField**: Disables status field diffing in specified resource types. Options:
- `crd` - CustomResourceDefinitions (default)
- `all` - All resources
- `none` - Disabled
Example configuration:
```yaml
ignoreAggregatedRoles: true
ignoreResourceStatusField: crd
```
---
## Deep Links
Deep links enable quick navigation from the Argo CD UI to external systems like Splunk, Datadog, or other monitoring and logging tools. All deep link settings can be located by navigating to Argo CD → _your instance_ → Settings → Deep Links.
For detailed information about deep link configuration and URL templates, see the [Argo CD Deep Links documentation](https://argo-cd.readthedocs.io/en/stable/operator-manual/deep_links/).
## Link Types
Argo CD supports three types of deep links, each appearing in different locations within the UI:
### Application Links
Application links appear in the application summary tab. These links have access to `application` and `cluster` data in their URL templates.
### Project Links
Project links appear in the project tab. These links have access to `project` data in their URL templates.
### Resource Links
Resource links appear in individual resource summaries (pods, deployments, services, etc.). These links can reference `resource`, `application`, `cluster`, and `project` data in their URL templates.
## Adding a Deep Link
To add a deep link:
1. Click + Add Deep Link under the appropriate section (Application Links, Project Links, or Resource Links).
1. Enter a **Title** for the link (this is displayed in the UI).
1. Enter the **URL** template for the link.
1. Click Save.
## Presets
The Akuity Platform provides preset configurations for common integrations. Click the + Datadog button and select your Datadog region to quickly add pre-configured deep links:
- US1 - East
- US3 - West
- US5 - Central
- EU1 - Europe
- AP1 - Japan
- US1-FED (FedRamp)
---
## Global Projects
Global projects allow you to define project-level restrictions (source repositories, destination clusters/namespaces, and cluster resource allow/deny lists) that are automatically inherited by other projects in your Argo CD instance. Any project matching the label selector of a global project will have those restrictions applied on top of its own configuration.
For more details on how global projects work, see the [Argo CD Global Projects documentation](https://argo-cd.readthedocs.io/en/stable/user-guide/projects/#global-projects).
## Configuring Global Projects
Global project settings are configured using a YAML editor in the Akuity Platform UI.

1. Navigate to Argo CD → _your instance_ → Settings → Global Projects.
2. Enter your global project configuration in the YAML editor. The value is a list of entries, each specifying a `projectName` (an existing Argo CD project) and a `labelSelector` that determines which projects inherit its restrictions.
```yaml
- projectName: my-global-project
labelSelector:
matchExpressions:
- key: environment
operator: In
values:
- production
```
3. Click Save to apply the configuration.
Any project whose labels match the `labelSelector` will inherit the source repo restrictions, destination restrictions, and cluster resource allow/deny lists defined on `my-global-project`.
---
## Crossplane Extension

If you are managing your Crossplane resources using Argo CD then you can leverage this built-in Crossplane extension in Akuity Argo CD instance.
This extension will help Argo CD track Crossplane resources. It will update the health and sync status. On top of that, you will able to see those details directly inside Argo CD UI.
This extension will ask you to provide your Crossplane Custom Resource Definition group name glob pattern and that is all you need to configure it.
## Enable Crossplane Extension
- Navigate to your Argo CD instance settings in Akuity Platform. Argo CD → _your instance_ → Settings → Extensions.
- Click on Install in Crossplane extension. It will open configuration modal which you can edit at any point.
- There will be a default CRD group names glob pattern. You can add your custom Crossplane CompositeResourceDefinition group name as well.
> Note: The glob pattern will be used in Argo CD UI and Argo CD resource customization config, make sure it is in format that is detected in both places. For example if group name is `.example.com` then use `*.example.*`
- Click Ok.
---
## ApplicationSet Extension
Argo CD [ApplicationSets](https://argo-cd.readthedocs.io/en/stable/user-guide/application-set/) are a powerful tool for automating the creation and management of Argo CD Applications across multiple clusters and environments. ApplicationSets do this by templating Application manifests, which enables GitOps at scale.
However, managing ApplicationSets, which is traditionally done via YAML manifests and command-line interfaces, often becomes cumbersome – especially during troubleshooting. Figuring out why expected Applications weren't generated requires manually checking of status fields, digging through controller logs, and inspecting Kubernetes events. There is no way to do this through the core Argo CD UI, making the process even more difficult.
The ApplicationSets extension provides users with ease-of-use and an intuitive interface for ApplicationSet management. Key capabilities including:
- **Full CRUD Management**: Create, view, edit, and delete ApplicationSets.
- **Status Visualization**: Easily view the aggregated sync and health status of generated Applications.
- **Live Previews**: Instantly preview the applications an ApplicationSet will generate or modify before saving changes.
## Enable ApplicationSet Extension
- Navigate to your Argo CD instance settings in Akuity Platform. Argo CD → _your instance_ → Settings → Extensions.
- Click on Install in ApplicationSet extension, and click Confirm to confirm the installation.

## Manage ApplicationSets in the Argo CD UI
The new ApplicationSet management capabilities include a dedicated ApplicationSets section on the Argo CD navigation in the Akuity Platform. From the UI, you can perform full CRUD (Create, Read, Update, Delete) operations just like you would for regular Applications. This brings ApplicationSet management into the same intuitive workflow you already use for your Argo CD applications.
### Create & Preview ApplicationSets in the UI
You can create ApplicationSets by navigating to the ApplicationSets section, and click + CREATE.

Then define your ApplicationSet in the Manifest editor:

Before committing, click SAVE AND PREVIEW to see exactly which Applications your current definition will generate. This immediate feedback loop helps catch errors in generators or templates early, ensuring you deploy what you intend.

### View Generated Application Status
Once your ApplicationSet is created, understanding the state of the applications it manages is simple. Select the ApplicationSet and go to the LIVE STATUS tab. This provides a consolidated view, showing the aggregated sync and health status of all generated applications.

### Modify, Preview, and Apply Changes in the UI
If you want to modify the ApplicationSet, go to the EDIT AND PREVIEW tab. Here you can modify the manifest directly. For instance, let's change the `spec.template.spec.source.path` from `guestbook` to `kustomize-guestbook`, remove `dev` cluster and add `stg` cluster:

After editing, click the SAVE AND PREVIEW sub-tab within EDIT AND PREVIEW. It instantly refreshes, showing the diff of applications that will be generated based on your modified manifest. This lets you confirm the change (like the updated path) has the desired effect before you apply it. Once confident, click APPLY to save the changes. The preview updates instantly, showing the 'path' change for the generated Applications before applying.

---
## Settings
---
## Creating Addons
Cluster addons can be created in two ways:
1. Marketplace wizard
2. Manually creating the repository
Before creating cluster addons, ensure that you have installed the [addons extension](./index.mdx#addons-extension) and connected the addons Git repository.
## Step 1: Install Addons Extension
To use the cluster addons you must install cluster addons extension on your Argo CD instance. To do so:
1. Navigate to your Argo CD instance settings and enter Extensions section.
2. Click the Install button on Cluster Addons tile. You will see a modal, where you can add users and group roles that have access to the addons extension inside Argo CD.

3. After configuring and clicking OK button the extension will be installed.
## Step 2: Add Addons Repository
The [addons repository](./index.mdx#addon-repository) contains the addons for the cluster. There are two ways to add an addons repository:
### Option 1: Connect Existing Addons Repo
If you already have a repository added to Argo CD that you want to use for cluster addons:
1. Go to your ArgoCD instance settings on Akuity Platform and enter Addons section. You can also access this page from the addons list in ArgoCD extension.
2. Click the Connect Addons Repo button.

3. In the modal that opens, select the repository from the list of existing Argo CD repositories and enter the branch, then click Connect.
:::important
The repository credentials must have **write access** to the repository for features like marketplace operations, manifest source updates, and deletions to work properly.
:::
### Option 2: Add New Addons Repo
If you want to create a new repository from scratch:
1. Go to your ArgoCD instance settings on Akuity Platform and enter Addons section. You can also access this page from the addons list in ArgoCD extension.
2. Click the Add Addons Repo button.

3. In the modal that opens, you'll see two tabs:
- **Form**: Use the form interface to configure the repository
- **JSON Editor**: Use JSON format for advanced configuration
4. In the Form tab, configure the repository connection:
- **Connection Method**: Select your preferred connection method from the dropdown (e.g., HTTPS, SSH, etc.)
- **Repository URL**: Enter the Git repository URL
- **Credentials**: Provide authentication details based on your connection method:
- For HTTPS: Username and password/token
- For SSH: SSH private key
- **Additional Settings**: Configure any other required parameters specific to your repository
5. Click Add to create the repository. The corresponding repository will be automatically added to Argo CD and connected as a cluster addon repository.
## Step 3: Create Addons
Once the [addons repository](./index.mdx#addon-repository) is connected, you can create cluster addons using the marketplace wizard or manually.
### Marketplace
The Cluster Addons Marketplace is a curated catalog of ready-to-deploy applications for Kubernetes clusters. With just a few clicks, users can deploy multiple addons to all their configured clusters with no complex setup required. From monitoring to security and developer tools, the marketplace streamlines deployments and boosts efficiency.
To create a cluster addon using the marketplace wizard, follow these steps:
1. Ensure that the [Cluster Addons Extension is installed](#step-1-install-addons-extension) and [addons repository is connected](#step-2-add-addons-repository).
2. Go to your deployed Argo CD instance and enter Cluster Addons section.
3. Click Explore Addon Marketplace button.

4. View the list of available addons. Choose the addon you wish to add, click the Add button, and then click Next.

4. In the Edit packages details step, review the marketplace dependencies that have been added:
- **Marketplace dependencies**: Change the version of the added dependencies.
- **Custom dependencies**: Add custom dependencies if required (provide Name, Version, and Repository URL).
Click Next.
5. In the Choose repository and add metadata step, provide:
- **Repository**: Choose the Git repository and branch where you want to add the addon.
- **Helm chart metadata**: Enter the Name, Version, and Description.
- **Additional overrides**: Add any [overrides](./index.mdx#overrides) if needed (for example, cluster or environment overrides).
Click Finish.
6. The addon is created in the selected repository.

#### Reinstalling Marketplace Addons
If an addon is deleted from the Git repository, you can reinstall it to update the addon in the cluster. You can also delete marketplace addons directly from the platform interface.
:::note
When deleting a marketplace addon from the platform, the action will delete the addon marketplace installation data (which can be used for addon reinstallation) and also delete Git repository data related to this addon name.
:::
Follow these steps:
1. Go to the Addons tab in your ArgoCD instance and look for the addon you wish to reinstall. These addons will be marked with a Uninstalled status.
2. Find the addon you wish to reinstall and click the Reinstall button.
3. You will see a confirmation modal that allows to also change the version of reinstalled dependencies. Click Reinstall again to confirm.

### Manually Creating Addons
:::info INFO
Cluster Addons supports two types of manifest generation tools: **Helm charts** and **Kustomize** overlays. Choose the option that best suits your deployment requirements.
:::
To manually create cluster addons, follow these steps:
1. Ensure that the [addons repository](./index.mdx#addon-repository) is connected.
2. Organize your repository with the following directory structure:
```
├── addons
│ ├──
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ ├──
│ │ ├── kustomization.yaml
│ │ ├── .yaml
│ │ ├── .yaml
├── clusters
│ ├──
│ │ ├──
│ │ │ ├── values.yaml
│ │ ├──
│ │ │ ├── kustomization.yaml
├── envs
│ ├──
│ │ ├──
│ │ │ ├── values.yaml
│ │ ├──
│ │ │ ├── kustomization.yaml
```
- **addons**: Contains the addons that can be installed in the cluster.
- **clusters**: Contains cluster-specific [overrides](./index.mdx#overrides) for the addons.
- **envs**: Contains environment-specific [overrides](./index.mdx#overrides) for the addons.
3. Once the repository is configured with the required addons, they will be available in the Cluster Addons section of your deployed ArgoCD instance.
In the next section, we will see how to install the addons in the cluster.
---
## Deploying Addons
Once you have created the addons, you can enable (deploy) them in your cluster. Before deploying, you must first configure the addon.
## Step 1: Configure Addon
To configure an addon, follow these steps:
1. In your deployed ArgoCD instance go to Cluster Addons section, and click on the addon you wish to configure.

2. In the addon details view, click the Config button.

3. Configure the addon options:
1. **Template Name**: The templated name of the addon.
2. **Template Namespace**: The templated namespace where the addon will be deployed.
3. **Template Project**: The templated project where the addon will be deployed.
:::note Template Syntax
You can use the following allowed template expressions to dynamically configure your addon:
- **Addon Fields:**
- `{{ .addon.name }}` — The name of the addon.
- `{{ .addon.type }}` — The type of the addon (e.g., "helm", "kustomize").
- **Cluster Fields:**
- `{{ .cluster.name }}` — The cluster's name.
- `{{ .cluster.namespace }}` — The cluster's namespace.
- `{{ .cluster.labels }}` — The cluster's labels (use `{{ .cluster.labels.key }}` to access specific labels).
- `{{ .cluster.annotations }}` — The cluster's annotations:
- Use `{{ .cluster.annotations.key }}` to access specific annotations
- Use `{{ .cluster.annotations["example.com/xyz"] }}` for keys with dots/slashes
- **Note**: Array values cannot be accessed by index. The entire array must be set as a value.
:::
4. **Creation Options**: Configure the creation details for the addon.
5. **Auto Sync Options**:
- **Auto Sync**: Enable automatic synchronization of the addon.
- **Auto Heal**: Enable automatic healing of the addon.
- **Prune Resources**: Enable automatic pruning of resources.
6. **Sync Options**:
- **Skip Schema Validation**: Skip schema validation.
- **Auto-Create Namespace**: Automatically create the namespace if it does not exist.
- **Prune Last**: Prune the last remaining resources.
- **Apply Out of Sync Only**: Apply changes only when the addon is out of sync.
- **Respect Ignore Differences**: Respect the ignore differences configuration.
- **Server-Side Apply**: Use Kubernetes Server-Side Apply.
- **Replace**: Replace existing resources during sync.
7. **Prune Propagation Policy**: Set the prune propagation policy.
8. **Deployment Options**: Configure the addon deployment details based on its type:
- **Helm Options**:
- **Source Values**: Specify YAML paths to extract specific values from your Helm values file. These paths define which configuration values will be managed by the addon system. For example:
```
# Example YAML paths to extract specific values:
image.tag
replicaCount
ingress.host
resources.limits.memory
```
The system will extract these values from your values.yaml file and allow you to override them per cluster or environment through Manifest Source updates.
- **Release Name Template**: Define the release name template for Helm releases. This is useful for distinguishing between the same addon deployed to different clusters:
```
# Examples:
{{ .addon.name }}-{{ .cluster.name }}
{{ .cluster.name }}-{{ .addon.type }}
{{ .cluster.annotations["example.com/xyz"] }}-{{ .addon.name }} # For keys with dots/slashes
```
- **Kustomize Options**:
- **Name Prefix Template**: Define the name prefix template for Kustomize resources. This helps avoid naming conflicts across clusters:
```
# Examples:
{{ .cluster.name }}-{{ .addon.name }}
{{ .addon.name }}-{{ .cluster.labels.environment }}
```
- **Name Suffix Template**: Define the name suffix template for Kustomize resources:
```
# Examples:
{{ .addon.name }}-{{ .cluster.name }}
{{ .addon.name }}-{{ .cluster.labels.region }}
```
9. **Filters**: Control which clusters receive the addon:
- **All Clusters**: Deploy the addon to all connected clusters.
- **Selected Clusters**: Deploy the addon to selected clusters based on name and label filters.
4. Click Save to store the configuration.

## Step 2: Enable/Deploy Addon
After configuring the addon, enable (deploy) it in your cluster by following these steps:
1. In the Cluster Addons extension, select the addon you wish to enable.

2. In the addon details view, click the Enable button. Confirm the action by clicking Enable in the confirmation dialog.

3. Navigate to the Summary tab for your addon. Here, you can view the current sync status. If auto-sync is not enabled, click the Sync button to synchronize the addon with your cluster.

4. The addon will now be deployed in your cluster.
:::note Enable Kustomize
To use Kustomize for incorporating Helm charts in your addons, enable Kustomize in your ArgoCD instance settings as follows:
1. Open your instance settings and click on the Manifest Generation tab.
2. In the Kustomize section, enable the Enabled option and add the following build options:
```
--enable-helm --helm-kube-version=1.30
```
3. Click Save to apply the settings.

:::
## Cluster Customization
You can patch the application spec of an addon to make cluster-specific changes. To patch the application spec, follow these steps:
1. In the Cluster Addons extension on your deployed Argo CD instance, select the addon you wish to patch.
2. Go to the Cluster Customization tab.
3. Click on the New Customization button to add a new patch.

4. Select the target cluster, enter the patch details, and click Add to apply the patch.

## Update Manifest Source
You can update the [manifest source](./index.mdx#manifest-source) for an addon to implement environment or cluster-specific changes. This is where you can override the base configuration defined in the **Deployment Options** for specific clusters or environments.
:::note Deployment Options
The **Source Values** (YAML paths) configured in Deployment Options define which configuration values from your Helm values file will be managed by the addon system. The Manifest Source updates allow you to override these specific values for different clusters or environments, providing fine-grained control over your addon deployments.
:::
### Helm Addon Manifest Source Updates
For Helm addons, you can update:
1. **Values Override**: Override specific values that were defined as YAML paths in the Source Values configuration. The system will update your values.yaml file with these overrides.
2. **Chart Dependencies**: Update chart dependency versions.

### Kustomize Addon Manifest Source Updates
For Kustomize addons, you can update:
1. **Images**: Update container image configurations including name, new name, tag, and digest.
2. **Helm Charts**: Update Helm chart dependencies used by Kustomize.

### How to Update Manifest Source
To update the manifest source, follow these steps:
1. Go to Cluster Addons section on your deployed Argo CD instance.
2. Select the addon you want to update and enter its details.
3. Navigate to the Manifest Source tab.
4. Click on the Settings icon next to the manifest source you wish to update.

4. Update the configuration based on your addon type:
- **For Helm**: Update values and chart dependencies
- **For Kustomize**: Update images and Helm chart dependencies
5. Click Update to apply the changes.

In this way, you can deploy and manage addons in your cluster using Argo CD. In the next section, we will cover how to delete addons from the cluster.
---
## Deleting Addons
You can delete installed addons from your cluster either individually or all at once. There are two ways to delete addons:
1. **UI-based deletion** - Delete addons directly from the [Addons Extension](./index.mdx#addons-extension)
2. **Manual deletion** - Delete addons manually from your Git repository
## Delete a Single Addon
### Option 1: UI-based Deletion
To delete a single addon using the [Addons Extension](./index.mdx#addons-extension) interface:
1. Go to the Cluster Addons section in your deployed ArgoCD instance.
2. Click on the specific addon you want to delete.
3. In the addon details view, click the three-dot menu (⋮) in the top right corner.
4. Select Delete from the dropdown menu.

5. Confirm the deletion when prompted.
The addon will be automatically removed from your Git repository and uninstalled from the cluster.
### Option 2: Manual Deletion
To delete a single addon manually:
1. Delete the addon from your Git repository.
2. Go to the Cluster Addons section in your deployed Argo CD instance. The addon should no longer be listed.
:::note Note
It may take a while to sync addon deletion from your repository to our data. You may speed this up by using Refresh button in Argo CD instance addon settings.
:::
## Delete All Addons
To delete all addons from a repository at once, follow these steps:
1. Go to the Argo CD instance settings and enter Addons section.
2. Click on the Delete button next to the repository you want to remove.

3. All addons from the repository will be deleted from your cluster.
:::note Note
Be aware that an addon may still appear if its child applications are stuck in a deletion state. This can occur due to an inactive cluster or issues with resource deletion. In such cases, ensure that the target clusters are live and resolve any deletion issues. Alternatively, you can enable the non-cascade deletion option in the addon configuration to unblock the deletion; however, related resources might continue to be deployed on the clusters.
:::
---
## Cluster Addons
_Streamlined Multi-Cluster Application Management_
Cluster Addons is a comprehensive deployment orchestration feature that enables operators to define, version-control, and propagate standardized application manifests across multiple Kubernetes clusters. This GitOps-native solution maintains deployment manifests in git as the single source of truth while providing advanced filtering capabilities for target cluster selection, streamlining the entire process of managing and bootstrapping clusters effortlessly.
This product makes it easier to manage your Kubernetes cluster add-ons with an easy-to-use interface, which saves time and effort when bootstrapping a new cluster and keeping existing cluster add-ons up to date.
Key Capabilities:
- **Centralized Addon Repository**: Maintain a curated library of deployment templates for commonly used applications with version control and change history
- **Flexible Deployment Patterns**: Target specific clusters using rich filtering expressions based on labels, names and other metadata
- **Customization Layers**: Apply environment/cluster specific overrides while preserving the core application manifest definition
- **Addon Marketplace Integration**: Discover and implement pre-configured solutions from the community or trusted vendors
- **GitOps Workflow**: Leverage existing Git infrastructure for change tracking, approvals, and audit compliance
- **Declarative Configuration**: Define both the addon content and its target scope through simple YAML definitions
- **Automated Provisioning**: Seamlessly bootstrap new clusters with essential applications upon registration to the platform, ensuring immediate operational readiness.
- **Supports Multiple Manifest Generation Tools**: Configure deployments using either Helm charts or Kustomize overlays, according to your preference.
## How Cluster Addons Differs from ApplicationSet
While both tools can manage multiple applications across clusters, the Akuity Cluster Addons provides significant advantages for cluster add-on management. Unlike ApplicationSet, which requires manual YAML configuration and offers basic templating capabilities, Cluster Addons provides a UI-driven interface with structured repository organization, multi-level customization overrides (environment, cluster, and application-specific), comprehensive health monitoring and sync tracking. Cluster Addons is specifically designed for cluster infrastructure and operational tools, offering simplified workflows that reduce configuration complexity while providing advanced operational insights that ApplicationSet lacks.
## Glossary
- **Addon** : A reusable application template that can be deployed to multiple clusters. Addons are defined in a Git repository and can be customized for different environments.
- **Addons Extension**: An Argo CD UI
extension which provides access to the Cluster Addons feature.
- **Addon Repository**: A Git repository
that contains the definitions and configurations for one or more addons. This
repository serves as the source of truth for addon deployments.
- **Addon Application**: The ArgoCD application that represents the addon in the cluster. It is created based on the addon definition and is responsible for managing the deployment of the addon.
- **Addon Marketplace**: A curated collection of pre-configured addons that can be easily deployed to clusters. The marketplace provides a user-friendly interface for discovering and implementing addons.
- **Addon Configuration**: The settings and parameters that define how an addon is deployed, including the target clusters, deployment options, and any customizations.
- **Addon Filters**: Criteria used to determine which clusters an addon should be deployed to. Filters can be based on labels or names.
- **Manifest Source**: The source of the
deployment manifests for an addon, which can be updated to implement
environment or cluster-specific changes.
- **Addon Dependencies**: Other applications or components that an addon relies on for proper functionality. Dependencies can be specified in the addon configuration.
- **Overrides**: Custom configurations applied
to an addon deployment to modify its behavior or settings. Overrides can be
used to tailor the addon for specific environments or clusters.
- **Cluster Customization**: The
process of applying specific configurations or patches to an addon deployment
for a particular cluster. This allows for tailored deployments while
maintaining a common base definition.
---
## Features
## Server Side Pagination
Server-side pagination significantly enhances the performance of the Argo CD frontend and extends its scalability to support tens of
thousands of applications. For more details, check out the blog post:
[Argo CD Ultimate Scalability](https://akuity.io/blog/argo-cd-ultimate-scalability).
This feature is enabled by default in Akuity Argo CD and does not require additional configuration.
## Argo CD Application Resource Filtering
The Argo CD Application Resource Filtering feature enables the application of fine-grained filters to Kubernetes resources retrieved
from the configured Git or Helm repository. The feature is useful to exclude specific resources from the application sync process
without making changes in the deployment repository.
The feature introduced new field `customizations` in the `source` section of the Application CRD.
The field allows to exclude or include resources based on their group, kind, name or namespace.
```yaml
spec:
source:
# new section that allows to customize the delivered set of resources
customizations:
# exclude allows to exclude some resources based on their group, kind, name or namespace
# by default nothing is excluded
exclude:
# the example below excludes all resources from the 'apps' group
- group: 'apps'
kind: '*'
# include allows to include only some resources based on their group, kind, name or namespace
# by default everything is included
include:
# the example below includes only resources from the 'RDS' kind
- group: '*'
kind: 'RDS'
name: '*'
namespace: '*'
```
The following example demonstrates how to exclude all `Deployment` resources from the application sync process:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
customization:
exclude:
- kind: Deployment
path: guestbook
repoURL: https://github.com/argoproj/argocd-example-apps
targetRevision: HEAD
```
## Application Set Applications Filtering
The ApplicationSet Applications Filtering feature allows you to apply additional filters to the list of applications generated by
an [ApplicationSet](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/). The functionality is useful in case when
filtering logic is too complex and cannot be implemented at the ApplicationSet
[generators](https://argo-cd.readthedocs.io/en/stable/operator-manual/applicationset/Generators/) level.
The feature introduced new field `filter` in the `spec` section of the ApplicationSet CRD:
```yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook-app-set
spec:
generators: ...
template: ...
# a new section that allows to filter out generated applications
filter:
expressions:
# simple filter by name
- app.metadata.name == "us-west-1-guestbook"
# filter by managed resource: filter out applications that don't have any resources
- len(appInfo.GetManagedResources()) > 0
# optional: skip applications that cause filter evaluation errors
skipOnFailure: false
```
The `filter` allows defining a list of expressions that are evaluated against each generated application.
The expressions are powered by [expr-lang](https://expr-lang.org/) libarary. The following variables are available in the expressions:
* `app` - represents the generated application.
* `appInfo.GetManagedResources()` - function that returns a list of Kubernetes resources managed by the generated Application.
---
## Akuity Argo CD
Akuity Argo CD is a tailored version of Argo CD, maintained by Akuity, and enhanced with advanced features and improved stability. You can switch an existing Argo CD instance to the Akuity version via the [General](../30-settings/01-general.md) tab on the settings page in the Akuity Portal. To make the switch, select a version marked with the `-ak` postfix.

## Argo CD CLI
In addition to the standard Argo CD CLI, Akuity provides its own version designed specifically for the Akuity version of Argo CD, which supports several [features](20-features.md) unique to the Akuity Platform and unavailable in upstream Argo CD. All images provided via the Argo CD UI will be based on the latest patched version for each minor release.
:::note
The first download listed will always be the open-source (OSS) version of the CLI.
:::
To download:
1. Navigate to the Argo CD UI → Documentation.
1. Then choose your preferred OS/Arch.

---
## Managing Argo CD Instances
---
## Create an Kargo Instance
## Account Setup
:::info
For access to the Akuity Platform please [create an Akuity user account](https://hubs.li/Q02l2XGR0). After completing the registration process, activate your account using the link sent to your email.
:::
After registering and activating your account, if this is your first time using the platform, you must also create an organization:
1. Click the create or join link.
2. Click + New organization in the upper right hand corner of the dashboard.
3. Name your organization following the rules listed below the Organization Name field.
## Create an Kargo Instance
1. Navigate to Kargo.
2. Click + Create in the upper right hand corner of the dashboard.
3. Name your instance following the rules listed below the Instance Name field.
4. (Optionally) Choose the Kargo version you want to use.
5. Click Create.
It will take several seconds to create your new Kargo instance (Progressing status next to your new instance's name), so please be patient.
Continue on to the [next section](./20-connect-kargo-agent.mdx) to learn about connecting your new Kargo instance to an agent.
---
## Connect a Kargo Agent
After your new Kargo instance is created successfully (Healthy status next to your new instance's name):
1. Navigate to Kargo → _your instance_ → Agents.
1. Click + Register an agent to add a Kargo Agent.
1. Input your Agent Name.
1. **Choose agent hosting option**: Kargo agents may be hosted and run on the Akuity Platform control-plane, or they can be self-hosted and installed into an on-premises cluster behind corporate firewalls.
**Select the self-hosted agent option** if Kargo needs to run Kubernetes Jobs as part of testing/verification, or if Kargo needs to interface with private, self-hosted services including:
- private Git servers
- internally accessible metric providers (e.g. self-hosted Prometheus)
- self-managed Argo CD
**Otherwise**, if using public git providers (GitHub, GitLab), public metric providers (DataDog, CloudWatch, NewRelic), and Akuity Platform-managed Argo CD, the agent can be hosted/managed by the Akuity Platform.
:::caution
AnalysisTemplates/AnalysisRuns that use Kubernetes Jobs will never complete if the agent is Akuity Platform-managed. You must use a self-hosted agent if your verifications require Kubernetes Jobs.
:::
1. (Optionally) Kargo can interface with Argo CD instances to sync applications, reflect application health, and verify successful sync operations during promotion. To connect your agent to an Argo CD instance managed by Akuity Platform, select the name of the instance in the _Akuity Managed Argo CD_ option. If this agent is connecting to a self-hosted Argo CD, leave this unselected and install the agent into the cluster where Argo CD is running.
1. (Optionally) You can choose to set your agent to be the default agent by setting _Set as Default Shard_. It is by default set to true for the first agent you connect but you can override it by setting a different agent as default later.
:::tip
To assign specific Stages to this agent (or any other agent), use the `spec.shard` field in your Stage manifests. See [Shards and Agents](../03-managing-instances/20-agents/30-shards-and-agents.md) for detailed information on using shards to control which agent reconciles your Stages.
:::
1. Click Connect.
1. If you opted for _Self-hosted Kargo Agent_ then you would need to click on the _Install_ option shown beside the newly created agent in the table. This will display the _Install Akuity Agent_ popup. Click Copy to Clipboard
:::caution
Before pasting the next command, make sure you're connected to the correct cluster.
:::
Paste the copied command into your terminal and run it to apply the agent manifest.
Alternatively, you can download the agent manifest and apply it manually inside your cluster.
:::caution
When uninstalling the self-hosted agent, remove it from the AKP Kargo agent list, then run the provided cleanup command in your cluster to ensure all resources are properly removed. Avoid deleting the namespace directly, as this may cause resources to remain stuck in the terminating phase.
:::
After installing the agent into your Kargo Agent, you should see the agent listed in the Akuity dashboard with a green heart icon next to the agent name.
If you chose to let Akuity manage the agent then you can skip the above steps.
Now that your Kargo instance is connected to a Kargo Agent, move on to the [next section](./30-enable-admin-user.mdx) to learn about enabling remote access to your instance.
---
## Enable the Kargo `admin` Account
:::note
Kargo instances you create inside the Akuity Platform do not enable the `admin` user by default.
:::
To enable the `admin` user on an Kargo instance:
1. Navigate to Kargo → _your instance_ → Settings → System Accounts.
1. Enable the Admin Account switch.
1. Specify a custom password and click Save
Now that the `admin` user is enabled, move on to the [next section](./40-access-kargo-instance.mdx) to learn about accessing your Kargo instance.
---
## Accessing Kargo
:::info
If you have not already enabled the `admin` user for your instance, follow [these instructions](./30-enable-admin-user.mdx).
:::
:::info
You can find the instance URL for Kargo by visiting Kargo → _your instance_. It is found in the upper left hand corner of the screen, to the right of the instance name and health status.

:::
## Access the Kargo Dashboard
1. Click on the _instance-id_.kargo.akuity.cloud.
2. Log in with the username `admin` and the password set (or generated) while [enabling the `admin` user](./30-enable-admin-user.mdx).
## Access Kargo using the `kargo` CLI
1. Install the `kargo` CLI:
**Linux or WSL**
```
arch=$(uname -m)
[ "$arch" = "x86_64" ] && arch=amd64
curl -L -o kargo https://github.com/akuity/kargo/releases/latest/download/kargo-$(uname -s | tr '[:upper:]' '[:lower:]')-${arch}
chmod +x kargo
```
:::note
You will also need to move `kargo` onto your `PATH`.
:::
**Windows w/ Powershell**
```
Invoke-WebRequest -URI https://github.com/akuity/kargo/releases/latest/download/kargo-windows-amd64.exe -OutFile kargo.exe
```
:::note
You will also need to move `kargo.exe` onto your `PATH`.
:::
1. Log in by using the following command and following the prompts:
```
kargo login \
--admin \
--password
```
At this point, you're ready to use your Akuity-managed Kargo instance as normal.
---
## Getting Started(01-getting-started)
---
## DORA Metrics
The DORA Metrics section inside the Akuity Platform Dashboard provides insights into the performance of your software delivery process. DORA (DevOps Research and Assessment) metrics are a set of key performance indicators that help organizations measure their software delivery capabilities.
## Accessing DORA Metrics
To access the DORA Metrics section, navigate to the Akuity Platform Dashboard and select the desired Kargo instance. From there, you can find the Metrics section, which displays various metrics related to your software delivery performance.

## Key DORA Metrics
The DORA Metrics section includes the following key metrics:
- **Deployment Frequency**: Measures how often an organization successfully releases to selected stage(s) in your environment. Higher deployment frequency indicates a more agile and responsive development process.
- **Lead Time for Changes**: Measures the amount of time it takes a freightline to get into selected stage(s). Shorter lead times indicate a more efficient development process.
- **Change Failure Rate**: Measures the percentage of deployments causing a failure in selected stage(s). Lower change failure rates indicate a more stable and reliable deployment process.
- **Mean Time to Recovery (MTTR)**: Measures how long it takes an organization to recover from a failure in selected stage(s). Shorter MTTR indicates a more resilient and responsive incident management process.
## Filters
You can filter the DORA Metrics by combining various parameters. The available filters include:
- **Stage**: Select the stage(s) you want to analyze (e.g., Development, Staging, Production).
- **Project**: Choose specific projects to focus on.
- **Initiator**: Filter by the user who initiated the promotion.
- **Interval**: Select the time range for the metrics (e.g., Day or Week).
By utilizing these filters, you can gain deeper insights into your software delivery performance and identify areas for improvement.
## Events
The DORA Metrics section also provides a list of events related to promotions and changes in your selected stage(s). This includes information about successful promotions, failed promotions, and recovery actions taken. Monitoring these events can help you understand the context behind the metrics and identify patterns or trends in your software delivery process.

Filters will be applied to the events list as well, allowing you to focus on specific projects, initiators, and time intervals.
---
## Akuity Platform Dashboard(10-dashboard)
The [Akuity Platform dashboard](https://akuity.cloud) is where you provision, and manage all aspects of your Argo CD & Kargo instances.
---
## Advanced Settings(20-agents)
---
## General
### Auto Update
- Toggle Auto Apply Changes off to prevent the agent from automatically upgrading its components.
:::note[Manual Updates to the Akuity Agent]
With auto upgrades disabled, users must apply the agent updates manually. To accomplish this, go to the Clusters menu for the Kargo instance and click Install Agent on the desired cluster, then run the provided command with the `kubectl` context set for the corresponding cluster.
:::
### Private Connectivity
- The Private Connectivity setting controls how the agent connects to the Akuity Platform. Public connects over the public internet, while Private connects through an AWS interface endpoint in your VPC using AWS PrivateLink. See [Private Connectivity (AWS PrivateLink)](/akuity-portal/security/private-link) for the full setup guide.
:::note
Private requires a connected AWS account with an available PrivateLink connection. Akuity-managed agents always use public connectivity.
:::
### Agent Size
:::note
Agent size configuration is only available for self-hosted Kargo agents.
:::
- In the Agent Size section, choose the size of your Akuity Agent. This selection only impacts the resources allocated to the Akuity Agent within your cluster and does not impact your billing in any way.
| Agent Size | Controller Memory | Controller CPU |
|------------|-------------------|----------------|
| Small | 0.5GB | 0.25CPU |
| Medium | 1GB | 0.50CPU |
| Large | 2GB | 1CPU |
| Auto | Auto | Auto |
#### Kargo Controller Autoscaling (Auto)
:::caution
The **Auto** size for Kargo agents is an experimental, alpha-quality feature.
:::
When you set an agent's size to **Auto**, the Akuity Agent continuously right-sizes the Kargo controller running in that cluster.
If a pod is OOMKilled, the agent detects it immediately and scales up both memory and CPU resources.
CPU and memory scale up when average usage exceeds **80%** of the current allocation, and scale down when it drops below **30%**, preventing flapping.
## Manifests Customization
### Akuity Custom Image Registry
- Enter where to pull the agent image from using the Akuity Custom Image Registry field. The default registry is [`quay.io/akuity`](https://quay.io/repository/akuity/agent?tab=tags).
### Argoproj Custom Image Registry
- Enter where to pull the Argo CD images from using the Argoproj Custom Image Registry field. The default registry is [`quay.io/argoproj`](https://quay.io/repository/argoproj/argocd?tab=tags).
### Kargo Custom Image Registry
- Enter where to pull the Kargo images from using the Kargo Custom Image Registry field. The default registry is [`quay.io/akuity`](https://quay.io/repository/akuity/kargo?tab=tags).
### Custom CA Bundle
- Use the Custom CA Bundle field to provide a PEM bundle of one or more CA certificates that the agent workloads should trust in addition to the well-known public CAs. This is typically needed when the agent runs behind a TLS-intercepting proxy (for example, Zscaler) or connects to Git repositories and registries that use certificates issued by a private CA.
When a bundle is set, every agent workload combines it with the default trust store and mounts the result at `/etc/ssl/certs/ca-certificates.crt`, so all components — including `git` used during promotions — trust the additional CAs. Updating or clearing the bundle restarts the agent workloads automatically.
:::note
- A single certificate or a bundle of several certificates is accepted. All certificates must be valid (unexpired) PEM-encoded `CERTIFICATE` blocks.
- New agents inherit the bundle configured in [`Agent Default Settings`](/kargo/managing-instances/settings/advanced/agent-default-settings), unless a bundle is provided when registering the agent.
- Akuity-managed Kargo agents use internal service endpoints and do not support a custom CA bundle.
:::
### Kustomization
- The Akuity Platform supports customizing the Akuity Agent manifests using a `Kustomization`.
---
## Credential Rotation(20-agents)
The agent in each managed cluster contains several components which require credentials from the Akuity Platform. You can easily rotate credentials for those from the Akuity Platform.
You can rotate the credentials one at a time.
- To rotate the credentials of an individual agent, go to _your instance_ → agents tab → click on the three-dot button under Action column → Click on Rotate Credentials → Click on Confirm.

This will trigger an update to the agent(s) in the background.
> NOTE: If the agent has Auto Upgrade disabled, you must re-apply the manifest.
---
## Shards and Agents
Kargo uses a sharding mechanism to distribute Stage reconciliation across multiple agents. Each agent has a name that serves as its shard identifier. Stages without a shard assignment are reconciled by the default shard agent.
## When to Use Shards
Assign Stages to specific shards when:
- **Verification requires in-cluster resources**: Stages with `AnalysisTemplates` that require Kubernetes Jobs must run on a self-hosted agent in the target cluster.
- **Network isolation**: Stages need to access private services (private Git servers, self-hosted Prometheus, internal APIs) only accessible from specific clusters.
- **Multi-cluster deployments**: Multiple agents across different clusters require Stages to be reconciled by agents in the correct cluster.
- **Resource distribution**: Distribute the load of Stage reconciliation across multiple agents.
## Assigning Stages to Shards
To assign a Stage to a specific agent shard, set the `spec.shard` field in your Stage manifest to the name of the agent:
```yaml
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: production
namespace: my-project
spec:
shard: prod-selfhosted
requestedFreight:
- origin:
kind: Warehouse
name: my-warehouse
verification:
analysisTemplates:
- name: health-check
kind: ClusterAnalysisTemplate
```
:::important
The `spec.shard` field is the source of truth for shard assignment. Kargo's webhook automatically syncs the `kargo.akuity.io/shard` label from this field. Do not set the label directly in your YAML files, as it will be automatically managed by Kargo.
:::
## Default Shard
If a Stage does not specify a `spec.shard` field, it will be reconciled by the agent configured as the default shard. The first agent you connect to a Kargo instance is automatically set as the default shard. You can change the default shard later in the Akuity Platform dashboard.
## Example Configuration
In a typical setup, most Stages run on the default shard (Akuity Platform-managed agent), while Stages with verification run on a self-hosted agent:
```yaml
# Stage without verification - uses default shard
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: dev
namespace: my-project
spec:
# No shard specified - uses default shard
requestedFreight:
- origin:
kind: Warehouse
name: my-warehouse
---
# Stage with verification - uses self-hosted shard
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
name: staging
namespace: my-project
spec:
shard: prod-selfhosted
requestedFreight:
- origin:
kind: Warehouse
name: my-warehouse
verification:
analysisTemplates:
- name: integration-tests
kind: ClusterAnalysisTemplate
```
## Verifying Shard Assignment
After applying a Stage with `spec.shard` set, verify the shard assignment using one of the following methods:
1. **Using the Kargo CLI**:
```bash
kargo get stages --project
```
The output will show the shard column:
```text
NAME SHARD CURRENT FREIGHT HEALTH PHASE
dev abc123 Healthy Steady
staging prod-selfhosted def456 Healthy Steady
```
2. **In the Kargo UI**: Navigate to your project and view the Stage details. The shard information is displayed in the Stage metadata.
3. **Using kubectl**: The `kargo.akuity.io/shard` label is automatically set by Kargo's webhook:
```bash
kubectl get stage -n -o json | jq -r '.metadata.labels."kargo.akuity.io/shard"'
```
---
## Maintenance Mode(20-agents)
Maintenance Mode allows you to temporarily exclude managed agents from health monitoring and alerting when performing planned maintenance activities. This feature helps prevent false alerts during scheduled maintenance windows while ensuring monitoring is automatically restored after the maintenance period. You maintain full control to disable maintenance mode at any time. The Kargo applications continue to work and promote normally.
## Enabling Maintenance Mode
To enable maintenance mode for a managed agent:
1. Navigate to your Kargo instance → Agents tab.
2. Find the agent you want to put into maintenance mode.
3. Under the Actions column, click on the three-dot button.
4. Locate the Enable Maintenance Mode section.

5. Enter the expiration day and time for maintenance mode. This is the date and time when maintenance mode will automatically expire and monitoring will be restored.
6. Click Save to apply the changes.

Once enabled, the agent will be excluded from health monitoring and alerting. The 🔧 icon indicates that the agent is in maintenance mode.

## Disabling Maintenance Mode
Maintenance mode can be disabled in the following ways:
### Automatic Expiration
Maintenance mode will be automatically disabled after the expiration time that you set to ensure monitoring is restored. If maintenance activities require more time, you will need to manually re-enable maintenance mode.
### Manual Disabling
To manually disable maintenance mode before the expiration time:
1. Navigate to the agent actions as described above.
2. Locate the Disable Maintenance Mode section.
3. Click Disable to apply the changes.

---
## Regenerate Manifests(20-agents)
The **Regenerate Manifests** feature allows you to bump the agent generation, which triggers the agent to re-apply all manifests in the managed agent. This is useful when you need to force a refresh of the agent configuration or recover from inconsistent states.
You can regenerate manifests for a single managed agent or multiple at once.
- To regenerate manifests for multiple agents, go to _your instance_ → Agents tab → click refresh icon above the agents table. Either select All Agents or Selected Agents and click on Regenerate.

- To regenerate manifests for an individual agent, go to _your instance_ → Agents tab → click on the three-dot button under Action column → Click on Regenerate Manifests → Click on Confirm.

---
## General Settings(30-settings)
## Change Version
The version of a managed Kargo instance can be upgraded (or downgraded) easily using the Akuity Platform.
1. Navigate to Kargo → _your instance_ → Settings → General.
1. Under Instance, select your desired version.
1. Click Save.
Once saved, the Akuity Platform will automatically update the instance. After the operation is complete, the instance will show a healthy status in the dashboard, indicating success.
:::caution
Changing the version of the instance will trigger an update of the Akuity Agent on all connected clusters. The operation is carried out by a temporary job executed in the agent's namespace.
Automatic updates to the Akuity Agent can be disabled by default for all clusters on an instance and per cluster. See Disable Auto Upgrade in [Agent Advanced Settings](../20-agents/10-agent-advanced-settings.md).
:::
:::note
A similar job is used when modifying cluster options such as Agent size, Labels or Annotations, to automatically update the agent configuration in the connected clusters.
:::
## Global Namespace Settings
The global namespaces are a list of Kargo Project namespaces that house credentials/service accounts made available to all Projects. This is useful for centrally managing shared service accounts which have access to all projects or shared credentials (such as read-only container image registry credentials) that would be used in multiple projects.
## Default Shard Agent
The Default Shard Agent is a feature that allows you to designate a specific Akuity Agent to handle shard operations for your Kargo instance. The default agent will reconcile all Kargo Stages that are not assigned to a specific shard.
## Instance Termination Protection
Instance termination protection prevents a Kargo instance from being accidentally deleted. When enabled, any attempt to delete the instance will be blocked until the protection is explicitly disabled.
To enable termination protection:
1. Navigate to Kargo → _your instance_ → Settings → General.
2. Toggle the Enable Termination Protection switch.
3. Optionally, enter a message in the Instance Protection Notes field. This message is displayed to anyone who attempts to delete the instance, and can be used to explain why the instance is protected or who to contact for more information.
4. Click Save.

---
## SSO
The Akuity Platform allows you to configure a single SSO provider for Kargo, such as Dex, OIDC, or any other supported providers, ensuring secure user access to your Kargo instance.
The Akuity Platform supports the following SSO providers:
- [Dex](https://dexidp.io/)
- OpenID Connect (OIDC)
:::info
For more detailed information on Kargo SSO, please refer to the [documentation of OSS Kargo](https://docs.kargo.io/operator-guide/security/openid-connect).
:::
Below are the steps to configure SSO for Kargo using Dex and Okta as an **example**.
## Configuring SSO
1. In your Kargo Instance, go to Settings.
2. In the left panel, search for Access and go to OIDC Config.

3. Click on the Enabled toggle to enable OIDC and choose your desired `Type`.

## Okta
### Working SAML Configuration with Okta
Below is an example Dex configuration for Okta:
```yaml
connectors:
- type: saml
id: okta
name: OKTA
config:
ssoURL: https://yourorganization.oktapreview.com/app/yourorganizationsandbox_appname/sso/saml
redirectURI: https://.kargo.akuity.cloud/dex/callback
usernameAttr: name
emailAttr: email
groupsAttr: groups
caData:
```
Reference: [https://dexidp.io/docs/connectors/saml/](https://dexidp.io/docs/connectors/saml/)
### Steps to configure Okta for SSO with SAML:
1. In your Okta Admin Dashboard, Go to Applications -> Applications -> Create App Integration

2. Select SAML 2.0 and click Next

3. Give your application a name and click Next

4. In Configure SAML section, enter the following details:
- Single sign on URL: `https://.kargo.akuity.cloud/dex/callback`
- Audience URI (SP Entity ID): `https://.kargo.akuity.cloud/dex/callback`
- In the Attributes Statements section add :
| Name | Name format | Value |
|-------------|-------------|----------------|
| email | Unspecified | user.email |
| name | Unspecified | user.fullName |
- In the Group Attribute Statements section add the following, (you can modify the group regex according to your needs) :
| Name | Name format | Filter |
|-------------|-------------|----------------------|
| groups | Unspecified | Matches regex : `.*` |
- Click Next and Finish
5. Go to the Application details page, select Sign On tab and then find and click the View SAML setup instructions button on the right side.

6. Copy the Identity Provider Single Sign-On URL and use it for ssoURL: in the Dex config.

7. Download the Certificate and base64 encode it, then apply it to your Dex config.

---
## External Access(20-security-and-access)
All external access settings can be located by navigating to Kargo → _your instance_ → Settings → External Access.
## Custom Domain
### Akuity Subdomain
By default, each Kargo instance's UI will be accessible at `.kargo.akuity.cloud`, however, the Akuity Platform does permit you to set a custom domain prefix for each Kargo Instance.
To customize this:
1. Change the value of the Akuity Subdomain field.
2. Click Save.

### Fully Qualified Domain Name
If you have a custom domain that you would like to use, you can set up a CNAME record to point to the Akuity Platform's domain.
To do this:
1. Create a CNAME record in your DNS provider that points to `.kargo.akuity.cloud`.
2. Change the value of the Fully Qualified Domain Name field to your custom domain.
3. Click Save.
## IP Allow List
By default, each Kargo instance is accessible by clients with any IP address, however, this can be narrowed to a specific list of IP addresses or CIDR ranges.
To customize this:
1. Under IP Allow List, click + Add New and complete the IP Address and Description (optional) fields.
* Repeat this step as necessary.
2. Click Save.

To restore access from any IP address, simply remove all entries from the list.
## Private Connectivity
Organizations with AWS PrivateLink enabled can take the Kargo instance off the public internet entirely by switching Private Connectivity to Private. This requires a connected AWS account and is mutually exclusive with the Fully Qualified Domain Name setting.
See [Private Connectivity (AWS PrivateLink)](/akuity-portal/security/private-link) for the full setup guide.
---
## Kargo Secrets
The Akuity Platform provides a way to synchronize secrets from your managed clusters to the
Akuity-hosted Kargo instance. This capability is built in to the platform and requires no additional
configuration to enable in your clusters.
:::note
This feature requires Agent version 0.5.75 or greater.
:::
## Syncing Secrets to the Kargo Control Plane
In order to sync secrets to the control plane, you will need to have a Self-Hosted Kargo agent
installed in your cluster. This can be done when registering an agent in the the "Agents" tab of the
Kargo instance.
### Selecting which Secrets to Sync
For security, secrets will not synced unless explicitly allowed by a control plane administrator.
This can be done in the "Secrets" settings of the instance as shown below:

Allowed secrets are configured by creating a Secret Source. A Secret Source has two fields, one of
which must always be set:
1. **Cluster Selector**: A label selector for the clusters you wish to sync secrets from. The labels
for the cluster are specified when connecting a cluster to the Akuity Platform. If this field is
left empty, then the Label Selector will match secrets from all clusters.
2. **Secret Selector**: A [set-based label
selector](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#set-based-requirement)
for the secrets you wish to sync. If this field is left empty, then the Label Selector will match
all secrets for all matching clusters
:::tip
You can use both Cluster and Label selectors to select specific secrets from specific clusters for
more fine grained control
:::
### Creating Secrets
:::warning
If you create a secret syncing selector _after_ creating a secret in your Kubernetes cluster, the
secret will not sync until Kubernetes resyncs or you reapply the secret. This is due to the
limitation of the Kubernetes API, which only informs when a secret is updated/created.
:::
To sync secrets from your managed clusters to the Kargo control plane, you need to create a secret
in your managed cluster with the appropriate label. The Akuity agent will automatically detect these
secrets and sync them to the Kargo control plane.
You can create the secret in the Agent namespace within a managed cluster (`akuity` by default). In
order to sync the secret, it must have two labels set. This first is a `kargo.akuity.io/secret-sync`
label with a value of an existing Kargo project name or one of the cluster secrets namespaces
(`kargo-cluster-secrets` in \<= 1.8 or `kargo-shared-resources` and `kargo-system-resources` in \>=
1.9). If the project does not exist, the secret will fail to sync. The second label is the
[`kargo.akuity.io/cred-type`
label](https://docs.kargo.io/operator-guide/security/managing-credentials#repository-credentials-as-secret-resources)
which needs to be a value of `git`, `helm`, `image`, or `generic`, depending on the type of secret
you are creating. If either of these labels are missing, the secret will be ignored and will not
sync.
If you used a label selector when creating the Secret Source, make sure that the secret also has the
appropriate labels to match the selector.
Here is an example secret that can be used to sync a generic credential:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: webhook-credentials
namespace: akuity
labels:
# These labels are required to enable syncing of this secret
kargo.akuity.io/secret-sync: "kargo-demo"
kargo.akuity.io/cred-type: "generic"
stringData:
password: my-password
username: my-username
```
:::note
Because secrets are synced all from the Agent namespace, make sure to choose unique names for your
secrets to avoid name collisions.
:::
### Updating Secrets
Any changes to the secret will be automatically synced to the Kargo control plane. You can also
change the project that the secret is synced to by updating the `kargo.akuity.io/secret-sync` label
to a different project name. This will delete it from the old project and create it in the new
project.
### Secret Ownership
It is possible to have multiple clusters syncing secrets to the Kargo control plane. Please note
that it is up to you as the user to make sure you use unique secret names when syncing to the same
projects. If two clusters are attempting to sync a secret named `webhook-credentials` to the same
project, the _first create wins_. The second secret will fail to sync with an error in the agent
logs indicating that the secret already exists and isn't owned by the agent's cluster.
---
## Akuity Agent Default Settings(30-advanced)
The Akuity Agent is a component installed into a managed cluster allowing it to be managed by a Kargo instance on the Akuity Platform. Every cluster agent which is installed into Kubernetes clusters will have a corresponding cluster entry in Kargo and will be available as a Kargo Application destination.
## Default Settings
To apply the settings globally go to Kargo → _your instance_ → Settings → Agent Default Settings.
:::note
Modifications made here will be applied globally. Additional clusters added to your instance will inherit these settings by default, unless specified via [`Akuity Platform Declarative management`](/akuity-portal/automation/declarative-management).
:::
## Applying Changes
When the Agent Default Settings are updated and Save is clicked, the changes will apply only to newly added clusters. To update both existing and future clusters, select Update All Agents.
|Setting | Enabled by Default |
|--------------------------------------------------------------------------------------------------------------|--------------------|
|[`Auto Apply Changes`](/kargo/managing-instances/agents/agent-advanced-settings#auto-update) | Yes |
|[`Private Connectivity`](/kargo/managing-instances/agents/agent-advanced-settings#private-connectivity) | No (Public) |
|[`Akuity Custom Image Registry`](/kargo/managing-instances/agents/agent-advanced-settings#akuity-custom-image-registry) | No |
|[`Argoproj Custom Image Registry`](/kargo/managing-instances/agents/agent-advanced-settings#argoproj-custom-image-registry) | No |
|[`Kargo Custom Image Registry`](/kargo/managing-instances/agents/agent-advanced-settings#kargo-custom-image-registry) | No |
|[`Kustomization`](/kargo/managing-instances/agents/agent-advanced-settings#kustomization) | No |
|[`Custom CA Bundle`](/kargo/managing-instances/agents/agent-advanced-settings#custom-ca-bundle) | No |
---
## Credentials
Akuity Platform supports configuring system-wide metric provider credentials that are used by Argo Rollouts for progressive delivery and canary deployments.
## Supported Metric Providers
The following metric providers can be configured with credentials in the Akuity Platform:
### DataDog
DataDog integration allows Argo Rollouts to query metrics from your DataDog monitoring infrastructure during canary analysis.
**Configuration Fields:**
- **Address**: The DataDog API endpoint URL (typically `https://api.datadoghq.com/` or your region-specific endpoint)
- **API Key**: Your DataDog API key used for authentication
- **Application Key**: Your DataDog application key for additional API access
### New Relic
New Relic integration enables Argo Rollouts to fetch metrics and insights from your New Relic monitoring platform.
**Configuration Fields:**
- **Personal API Key**: Your New Relic personal API key for authentication
- **Account ID**: Your New Relic account ID
- **Region**: Your New Relic region (US or EU)
- **Base URL (REST)**: New Relic REST API endpoint (e.g., `https://api.newrelic.com`)
- **Base URL (Nerdgraph)**: New Relic Nerdgraph API endpoint (e.g., `https://api.newrelic.com/graphql`)
### InfluxDB
InfluxDB integration allows Argo Rollouts to query time-series data from your InfluxDB instance.
**Configuration Fields:**
- **Address**: The InfluxDB server URL and port (e.g., `https://influxdb.example.com:8086`)
- **Auth Token**: Authentication token for accessing InfluxDB
- **Organization**: Your InfluxDB organization name
## Configuration
To configure metric provider credentials:
1. Navigate to your Kargo instance in the Akuity Platform
2. Go to the Settings tab
3. Click on Credentials
4. Select the metric provider you want to configure & Enable it

5. Enter the required credentials and configuration values
6. Save the configuration

---
## Argo CD UI in Kargo
The Argo CD UI in Kargo is a built-in extension for Kargo Enterprise on the Akuity Platform. It lets you view Argo CD application details — sync status, health, resource trees, and more — directly inside the Kargo dashboard, without switching to a separate Argo CD window.
When a Kargo stage is connected to an Argo CD shard managed by Akuity, an Argo CD button appears on that stage node in your project view. Clicking it opens an embedded Argo CD UI page within Kargo.
:::caution
This feature requires both your Argo CD instance **and** your Kargo instance to be managed by the Akuity Platform. Self-hosted Argo CD or self-hosted Kargo installations are not supported.
:::
## How to access the Argo CD UI
No configuration is needed to use the embedded Argo CD UI. The Argo CD button appears automatically on any stage that is interacting with an Argo CD shard.
1. In the Kargo dashboard, navigate to Projects and open your project.
1. In the pipeline view, locate the stage that is connected to an Argo CD application. If the stage is interacting with an Argo CD shard, an Argo CD button is visible on the stage node.

1. Click Argo CD. You are taken to an Argo CD UI page embedded inside the Kargo dashboard.

The embedded view shows the Argo CD application associated with that stage, including:
* Application sync status and health
* Live resource tree (Deployments, ReplicaSets, Pods, Services, and more)
* Sync history and operation details
* Resource manifests and events
:::tip
To open the full Argo CD dashboard for that application, click Open in Argo CD UI in the top-right corner of the embedded view.
:::
## Read-only access
By default, the embedded Argo CD UI is **read-only**. You can view all application details, but write operations — such as syncing an application, deleting a resource, or triggering a rollback — will return a permission error.
This is by design. When IDP Groups Mapping is not enabled, the proxy uses a pre-configured service account token with read-only access to Argo CD. No user identity or group information is forwarded.
To perform write operations from within the Kargo dashboard, enable [IDP Groups Mapping](#enabling-write-access-idp-groups-mapping).
## Enabling write access: IDP Groups Mapping
The IDP Groups Mapping setting enables write operations in the embedded Argo CD UI for users whose IDP group memberships grant them the necessary permissions in Argo CD RBAC.
When IDP Groups Mapping is enabled, the user's IDP group memberships are passed through to Argo CD on every request. Argo CD then evaluates those groups against its own RBAC policies to determine what the user is allowed to do.
**Argo CD RBAC is the single source of truth for write permissions.** Enabling this setting does not grant any user blanket write access — it makes group-based authorization flow through to Argo CD, where your existing RBAC rules take effect.
:::caution
IDP Groups Mapping requires that the group names from Kargo's identity provider **match the groups referenced in Argo CD's RBAC policies**. If the group names differ between the two systems, Argo CD may not recognize the user's groups, leading to unexpected permission denials.
:::
### Enabling IDP Groups Mapping
In the Akuity Platform, navigate to Kargo → _your instance_ → Settings.
1. In the left panel, select the Argo CD UI tab.

1. Enable the IDP Groups Mapping toggle.

1. Click Save.
Once saved, any user whose IDP groups are mapped to a write-enabled role in Argo CD RBAC will be able to perform sync, delete, and other write operations from the Kargo dashboard.
:::note
Users whose IDP groups are not granted write access in Argo CD RBAC will continue to see the read-only view even after this setting is enabled. The setting does not bypass Argo CD RBAC — it makes group-based authorization possible.
:::
## Frequently asked questions
**Does enabling IDP Groups Mapping give all users write access?**
No. Enabling the setting makes group-based authorization possible, but actual permissions are determined by Argo CD RBAC. A user must belong to an IDP group that is explicitly granted write access in Argo CD's RBAC configuration.
**Why do I see a permission error when I try to sync?**
Either IDP Groups Mapping is not enabled, or your IDP groups are not mapped to a write-enabled role in Argo CD RBAC. Check the setting in Kargo → _your instance_ → Settings → Argo CD UI, and verify your Argo CD RBAC configuration.
**Is the embedded view fully equivalent to the Argo CD UI?**
No. The embedded view covers the most commonly used features: application details, resource trees, sync status, and history. It is not fully feature-equivalent to the standalone Argo CD UI. For operations not available in the embedded view, click Open in Argo CD UI to go directly to the full Argo CD dashboard.
**Do I need to configure anything in Argo CD to use this feature?**
No additional Argo CD configuration is required for read-only access. For write access via IDP Groups Mapping, ensure your Argo CD RBAC policies include the relevant IDP group names and grant them the necessary permissions.
**Will this work if I use self-hosted Kargo or self-hosted Argo CD?**
No. The embedded Argo CD UI is available only when both Kargo and Argo CD are managed by the Akuity Platform.
---
## Enable Akuity Intelligence
The Akuity Intelligence feature is enabled in the Argo CD instances settings. Once enabled, the functionality is available to the end users through the Argo CD and Kargo UI extensions.
## Enable Akuity Intelligence at the Argo CD instance level
The Akuity Platform administrator can enable the feature in Settings → Intelligence:

By default, the functionality is enabled for all Kubernetes clusters managed by Argo CD instances. Administrators can choose to enable the feature only for a subset of clusters.
## Manage Argo CD extension
The Akuity Intelligence functionality is available to end users in the Argo CD UI through an extension, which is enabled by default. Administrators can manage the extension in the Argo CD instance settings under Settings → Extensions, where they can install or uninstall it as needed:

By default, the extension is available for all users. Optionally, administrators can specify which subset of users has access to the functionality in the extension settings. To specify users click the gear button and provide Argo CD user names or OIDC groups:

After that, Argo CD user will see Intelligence (Beta) on the sidebar and floating button and on the Akuity-managed Argo CD instance UI:

## Manage Kargo extension
The Akuity Intelligence functionality is available to end users in the Kargo UI through an extension, which is enabled by default. Administrators can manage the extension in the Kargo instance settings under Settings → Extensions, where they can install or uninstall it as needed:

By default extension is available for all users. Optionally, administrators can specify which subset of users has access to the functionality in the extension settings. To specify users click the gear button and provide Kargo user names or OIDC groups:

After that, user will see Intelligence on the sidebar and floating button, and on the Kargo instance UI as well:

## Akuity Intelligence Usage
Administrators can monitor Akuity Intelligence usage in Intelligence, click the Usage tab, which provides a breakdown of usage grouped by the Argo CD and Kargo instances within the current organization.

The usage metrics includes **Instance**, **Cluster**, **API Resource**, **Object**, **Node**, **Pod**, **Container** and **AI Token**.
---
## Bring Your Own Models / Keys
Akuity Intelligence introduces the Bring Your Own Key (BYOK) capability, enabling customers to integrate their own API keys or preferred model providers. Any provider offering an OpenAI-compatible or Anthropic-compatible API is supported, including public cloud model services as well as self-hosted open-source models.
## Benefits of BYOK
- **Flexible cost management:** Customers can use their own API keys to control AI usage and associated costs, without relying on Akuity-based billing.
- **Enhanced data privacy and compliance:** Organizations with strict privacy or regulatory requirements can route all AI traffic to private or on-premises deployments.
- **Freedom to use the latest models:** Customers can access any newly released or alternative models—beyond Akuity’s default catalog—simply by adding their provider keys.
:::warning
If you use a custom model instead of an Akuity fine-tuned models, the model's performance and capabilities may not be optimal.
:::
## Supported Model Providers
Akuity Intelligence currently supports the following providers:
- OpenAI
- Anthropic
- OpenRouter
- Bedrock
- Gemini - Google AI Studio
- Any self-hosted model exposing an OpenAI-compatible or Anthropic-compatible API
## Setup
### Getting Started with BYOK
To start using the BYOK (Bring Your Own Key) feature:
1. Navigate to Intelligence, click Settings in the top right corner, from the left-hand menu, select the Models tab, click Add.

2. Select Provider, currently we support OpenAI, Anthropic and OpenRouter. If you are using self-hosted model with OpenAI/Anthropic compatible API, choose OpenAI/Anthropic provider.
3. The **Prefix ID** helps distinguish models with the same name from different providers (for example, both OpenAI and OpenRouter may offer a model named GPT-5.1).
4. If you are using self-hosted model, change the **API Base URL** to your model endpoint.
5. Select models from the model dropdown list. By default, only the latest **GPT** and **Claude** series models are listed. If the model you want is not in the list, you can manually enter the model ID.

Save your custom model configuration. You can switch the Akuity Intelligence model to your newly configured model using the model dropdown at the top.
---
## Overview Dashboard
The Overview dashboard is the central landing page for understanding the health and status of your entire Kubernetes environment. It provides a high-level, at-a-glance summary of all clusters connected to your Argo CD instance, including resources that are not managed by Argo CD. The dashboard consolidates key metrics into two main categories: resource inventory and incident insights:
* **Resource Inventory**
* **Clusters and Nodes**: The total number of connected Kubernetes clusters and the nodes running within them.
* **API Resources and Objects**: A total number of all API resources and Kubernetes objects in all clusters connected to your Argo CD instance.
* **Pods, Containers and Images**: A summary of the workloads currently running.
* **Incident and Issue Insights**
* **Incidents**: The number of active incidents that Intelligence is currently tracking or resolving.
* **CVE Images**: A count of running container images with known security vulnerabilities (CVEs).
* **Stuck-in-Deletion Resources**: Resources that are stuck in a terminating state and may require manual intervention.
* **Deprecated APIs**: A warning for any Kubernetes APIs in use that are deprecated and will be removed in a future version.

Each card on the overview dashboard is clickable, and will redirect you to a separate dashboard with deeper insight.
---
## Explorer Dashboard
This is a multi-cluster Kubernetes dashboard that allows you to browse through the resources of all clusters connected to the Akuity Platform, even those not managed by Argo CD, without the restriction of viewing one application at a time.

The Cluster, Namespace, Kind dropdowns, as well as the Spotlight Search button on the right top allow you to quickly find specific resources based on your needs. When you find the resource that you are looking for, click the entry to gather more information:

Each tab provides specific insights into the resource's behavior and status:
* **Event Timeline:** Provides a time series view of events related to the selected resource, helping to understand its lifecycle and correlation with other events.
* **Manifest:** Displays the YAML definition of the resource, allowing inspection of its configuration.
* **Logs:** Aggregates live logs from all containers within the resource, providing real-time insights into application behavior.
* **Events:** Lists all Kubernetes events associated with the resource (e.g., creation, updates, errors), offering a detailed audit trail.
* **Audit Logs:** Provides a record of all actions performed on the resource, including who initiated the action and when, crucial for security and compliance.
## Tree View
The Tree View enables you to see all of the services and how they relate to each other. It provides a real-time dependency graph of your Kubernetes resources and visualizes the complex relationships between them.
It displays each object—such as a Deployment, Service, or Pod—as an interactive card, with lines connecting them to show how they are managed and related. This allows you to instantly understand your application's architecture and trace dependencies.
You can easily navigate your environment using the filters at the top to narrow the view by cluster, namespace, resource kind, or health status.

## Event Timeline View
Click the Namespace button in the top-right corner to open the detailed timeline view. The Namespace Event Timeline provides a powerful, correlated view of all activities and health changes for the resources within a specific namespace. This feature is designed to simplify root cause analysis by visualizing the sequence of events over time.

The timeline consolidates and displays a wide range of events in a single, chronological view, including:
* **Resource Health Changes**: Tracks the health status of individual resources like Deployments, showing transitions between states such as Healthy, Progressing, and Degraded.
* **Spec Changes**: Pinpoints the exact moment a resource's specification was modified.
* **Audit Logs**: Displays audit trail events related to resource changes.
* **Sync Operations**: Shows when Argo CD sync operations were initiated.
* **Kargo Promotions**: Marks when promotions between Kargo stages occurred.
* **Node Events**: Correlates cluster-level node events with application behavior.
---
## Deprecated APIs Dashboard
The Deprecated APIs Dashboard provides a list of deprecated Kubernetes APIs and important details:
* **API Version & Kind**: The full name of the deprecated API and its resource kind.
* **Kubernetes Version**: The current version of the cluster where the API was found.
* **Deprecated In**: The Kubernetes version in which the API was officially marked as deprecated.
* **Unavailable In**: The future Kubernetes version in which the API will no longer be available.
* **Migrate To**: The recommended new API version that you should migrate your resources to.
* **Resource Count**: The number of live resources currently using this deprecated API. A count greater than zero indicates that action is required.

This dashboard provides the insights to let teams know where and how to prioritize the proper migration. There are 4 different severities:
* **Critical**: already deprecated in current kubernetes version and resource count > 0
* **High**: already deprecated in current kubernetes version and resource count is 0
* **Medium**: will be deprecated in next kubernetes minor version and resource count > 0
* **Info**: will be deprecated in next kubernetes minor version and resource count is 0
## Understanding the Resource Count
The **Resource Count** is based on the API version Kubernetes uses to _store_ each resource in etcd, not the `apiVersion` written in your Git manifests or displayed in Argo CD. These can differ.
Kubernetes APIs, including those defined by [Custom Resource Definitions (CRDs)](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definition-versioning/), can be served under several versions at the same time, but every object is persisted under a single _storage version_, usually the newest, non-deprecated one. When you apply a resource using a deprecated `apiVersion`, Kubernetes converts it to the storage version before saving it. Argo CD, by contrast, treats the `apiVersion` in your Git manifest as the source of truth and displays that.
Because of this, a resource can show a deprecated `apiVersion` in Argo CD while still contributing **zero** to the Resource Count: the live object is actually stored under a newer version. This is expected behavior. A Resource Count of zero means no live objects are stored under the deprecated API, so no migration is required for it.
:::note
To check the storage version of a CRD, run:
```shell
kubectl get crd -o jsonpath='{.spec.versions[?(@.storage==true)].name}'
```
If the storage version is already a non-deprecated version, a deprecated `apiVersion` in your manifests is harmless. Kubernetes never persists an object under it.
:::
---
## Stuck-in-Deletion Resources Dashboard
The Stuck-in-Deletion Dashboard provides visibility into Kubernetes resources across multiple clusters that are unable to complete the deletion process. It aggregates and surfaces resources stuck in the terminating state, helping platform and operations teams quickly identify problem areas that may block workloads, consume cluster resources, or cause cascading issues.

You can view more details about why it is stuck in deletion by clicking the entry, the finalizers will be highlighted:

---
## Containers Dashboard

The Containers Dashboard displays a comprehensive overview of containers running across your connected Kubernetes clusters. It provides insights into their status, resource utilization, and other critical metrics, enabling you to monitor and manage your containerized applications effectively. You can drill down into individual containers to view more detailed information and identify potential issues:

---
## Images Dashboard
The Images Dashboard provides a detailed view of container images across your connected Kubernetes clusters. It offers insights into image usage, vulnerabilities, and other critical information, helping you manage and secure your container images effectively. You can also explore individual images for more in-depth analysis and identify potential security risks or optimization opportunities.

## CVE Scanning
CVE Scanning within Akuity Intelligence is optional and it is disabled by default. To enable CVE scanning, navigate to Settings → Intelligence in your Argo CD instance. From there, locate the CVE Scanning option and toggle it on or off as needed:

Once CVE scanning is enabled, you can view the results on the Images dashboard. This dashboard provides a detailed view of container images across your connected Kubernetes clusters, including identified vulnerabilities. You can explore individual images for more in-depth analysis of security risks.

### CVE Found in Application Detail
You can also access CVE scanning results directly from the Application Detail page. When CVE scanning is enabled, the Akuity Intelligence section in the top-right corner of the Application Detail page displays a CVEs Found button, showing the total number of CVEs detected across all images in the application. Clicking this button navigates you to the Images Dashboard, filtered by the selected application, for a detailed view of the vulnerabilities.

---
## Infrastructure Dashboard
The Infrastructure Dashboard provides a comprehensive overview of your Kubernetes cluster resources, offering multiple views to analyze utilization and capacity.
## Node View
This view provides a high-level look at the nodes in your cluster, visualizing their resource utilization (e.g., CPU Utilization) to help you quickly assess node health. Each node is color-coded to represent its current consumption level:
* **Green**: Indicates low resource utilization.
* **Yellow/Orange**: Represents moderate resource utilization.
* **Red**: Signals high resource utilization, indicating the node is under heavy load and may require investigation.

Clicking on a cluster provides a comprehensive overview of its status, displaying:
* **CPU and Memory:** Current usage and requests relative to allocatable capacity.
* **Pods:** Total and running pod counts.
* **Nodes:** A list of all nodes, including their current status and age.

## Pod View
The Pod view presents a visual grid of all pods, enabling you to:
* **Visualize Pods:** Pods appear as hexagonal tiles, with colors indicating resource usage.
* **View Details:** Hover over a pod to see its name, namespace, and CPU/memory consumption.
* **Filter and Search:** Utilize dropdowns to filter by metrics (e.g., CPU Usage) or search for specific pods.

## Namespace View
The Namespace view offers two ways to analyze resource consumption per namespace:
* **Treemap:** This visualizes namespaces as rectangles, with their size corresponding to their resource usage (e.g., Memory Usage).

* **Bar Chart:** This displays metrics such as Memory Usage/Request percentages for each namespace.

## Argo CD Applications View
The Argo CD Applications view provides a comprehensive overview of all Argo CD applications in your cluster, enabling you to view the applications and their status.
* **Visialize Health Status:** Quickly view the health status of all applications and easily identify degraded or missing applications.
* **Visualize Sync Status:** Quickly view the sync status of all applications and easily identify applications that are out of sync.

---
## Insights Dashboards
---
## Deployment Advisor
Users can initiate free-flow conversations with the Deployment Advisor to triage issues by selecting a Kargo project, Argo CD applications, or Kubernetes namespaces as contexts. This allows for direct interaction with the Deployment Advisor to troubleshoot and gain insights into specific resources.

The Deployment Advisor will attempt to answer user questions by calling necessary functions such as getting the application tree, retrieving logs, or searching up-to-date documentation, etc.

## Tasks
Akuity Agent can perform periodic, automated tasks on behalf of DevOps engineers. **Tasks** are the first‑class way to define, run, and track those automations inside the platform.
### Overview
A **Task** represents a recurring automation executed by the Akuity Agent. It allows you to define a job description in natural language and set a schedule for it to run.
Key features:
- **Natural Language Schedule**: Define schedules using plain English (e.g., "daily at 2am", "every Monday at 9am") or standard cron expressions like "0 2 * * *".
- **Automated Execution**: The agent automatically runs the task at the specified times.
- **History & Reporting**: Every execution is recorded, providing a clear history of what was checked and any actions taken.
### Create a Task
You can create a Task directly from the Akuity Platform UI.
1. Navigate to the **Intelligence** section.
2. Select **Tasks**.
3. Click **Create**.
4. Enter the required fields:
- **Title**: The name of the task.
- **Schedule**: Define the schedule using natural language or cron expressions.
- **Status**: Set the status to **Active** or **Suspended**.
- **Contexts**: Select the contexts that the task will focus on.
- **Description**: Provide the task description.
> **Note:** Being specific in your task description helps the agent perform the task more accurately.

### Manage Tasks
Once created, you can view and manage all your tasks from the Tasks page.
- **Execution**: See the schedule, last execution time, next execution time, and total runs.
- **Latest Report**: View a summary of the most recent execution.
- **History**: Click on a timestamp to view its detailed reports from previous runs.
You can edit or delete existing tasks as needed. Also, you can open the task in the normal conversation to see more details.

If [Slack integration](#slack-integration) is configured, you will also receive task execution reports directly in your Slack channel.

### Example Tasks
We have established some example tasks in this [GitHub repository](https://github.com/akuity/akuity-intelligence-examples). You may directly import them into your own instance via the **Import** button.
> **Note:** After importing, the task will not start by default. You need to set the status to **Active** and add the corresponding **Contexts**.

## Slack Integration
You can pipe Deployment Advisor updates into Slack by sharing the same Slack integration setup used by the On-Call Agent. Follow the configuration steps in [Slack Integration](20-on-call-agent.md#slack-integration) to connect Argo CD notifications with Slack before sharing conversations from the Deployment Advisor. Additionally, [task executions](#manage-tasks) can also send messages to Slack.
---
## On-Call Agent
The On-Call Agent automates troubleshooting and remediation for your degraded Argo CD applications and Kubernetes namespaces by executing predefined runbooks. An incident is an investigation of a namespace or app in a degraded state. Incidents are either kicked off automatically by the On-Call Agent upon a detected degraded state or manually when a user converts a conversation to an incident. Once the incident is created, the On-Call Agent will begin troubleshooting and triage. An incident follows the same pattern as a conversation with the Deployment Advisor with a couple of key differences:
* There is a status associated with the incidents, resolved / active
* Incidents are associated with a particular resource (E.g., an Argo CD application or a Kubernetes Namespace)
Incidents are either kicked off automatically by the On-Call Agent upon a detected degraded state or manually when a user converts a conversation to an incident.
## Enable Incident Auto-Creation
From the Intelligence settings page, you can configure the conditions under which an incident is automatically created when your Argo CD applications or Kubernetes resources enter a degraded state.

Resource Degradation Triggers allow you to automatically create incidents when your Argo CD applications or Kubernetes resources enter a degraded state.

To create a trigger:
* Click Add New under the Resource Degradation Triggers section.
* Fill in the following fields in the "New Trigger" dialog:
* **Argo CD Applications**: Select which specific Argo CD applications to monitor.
* **K8S Namespaces**: Select which Kubernetes namespaces to monitor.
* **Clusters**: Choose the cluster(s) this trigger will apply to.
* **Trigger After**: Specify a delay (e.g., 5m, 15m, 1h30m) before creating an incident. This prevents alerts for brief, transient issues.
## Webhook triggers
Webhook triggers let you create incidents from alerts sent by external monitoring systems such as Prometheus Alertmanager, Grafana, Datadog, or any tool that can send an HTTP POST request. When the Akuity Platform receives a webhook, it extracts incident metadata from the JSON payload using JSONPath expressions you define and creates an incident for the On-Call Agent to investigate.
### Configure a webhook trigger
From the Intelligence settings page, under the Webhook Triggers section:

1. Click Add New.
1. In the New Webhook Config dialog, fill in the following fields:
* **Name** (required): A unique identifier for this webhook configuration (e.g., `alert-manager`).
* **Description**: A JSONPath expression that maps to the incident summary from the webhook payload (e.g., `{.body.alerts[0].annotations.description}`).
* **Cluster**: A JSONPath expression that maps to the cluster name. This can reference query parameters as well (e.g., `{.query.clusterName}`).
* **K8s Namespace**: A JSONPath expression that maps to the Kubernetes namespace (e.g., `{.body.alerts[0].labels.namespace}`).
* **Argo CD Application Name**: A JSONPath expression that maps to the Argo CD application name.
* **Argo CD Application Namespace**: A JSONPath expression that maps to the Argo CD application namespace. If an application name is provided but the namespace is omitted, it defaults to `argocd`.

1. Click OK to save the configuration.
1. Click Save in the top-right corner to apply the changes.
After saving, the dashboard displays a generated webhook URL next to each configuration. Copy this URL and configure it in your alerting system as the target endpoint.
### Webhook URL format
Each webhook trigger produces a URL in the following format:
```
https:///api/v1/orgs//ai/incidents?webhook_name=&instance_id=
```
* `organization_id`: Your Akuity organization ID.
* `webhook_name`: The name you assigned to the webhook configuration.
* `instance_id`: The Argo CD instance ID associated with this trigger.
The endpoint accepts a `POST` request. The request body must be a valid JSON payload. The Akuity Platform evaluates the JSONPath expressions you configured against the payload to extract incident metadata.
### Authentication
:::warning
All webhook requests must be authenticated. Unauthenticated requests will be rejected.
:::
The webhook endpoint uses HTTP Basic Authentication. Set the username to your **API Key ID** and the password to your **API Key Secret**. The API key must have the **Organization Owner** role, or a [custom role](../../02-akuity-portal/02-organizations/40-custom-roles.md) with **Akuity Intelligence** create permission.
To create an API key, see [API Keys](../../02-akuity-portal/02-organizations/20-api-keys.mdx).
### JSONPath expressions
Field mappings use Kubernetes-style JSONPath syntax. The expressions are evaluated against a root object that contains two keys:
* `body`: The parsed JSON body of the incoming webhook request.
* `query`: A map of query parameters from the request URL.
For example, if Prometheus Alertmanager sends a payload like:
```json
{
"alerts": [
{
"labels": {
"namespace": "production",
"alertname": "HighMemoryUsage"
},
"annotations": {
"description": "Pod memory usage exceeds 90%"
}
}
]
}
```
You could use the following JSONPath expressions:
| Field | JSONPath expression |
| ------------- | ------------------------------------------- |
| Description | `{.body.alerts[0].annotations.description}` |
| K8s Namespace | `{.body.alerts[0].labels.namespace}` |
| Cluster | `{.query.clusterName}` |
In this example, the cluster name is passed as a query parameter. Your alerting system would send the webhook to:
```
https:///api/v1/orgs//ai/incidents?webhook_name=alert-manager&instance_id=&clusterName=my-cluster
```
:::tip
If a JSONPath expression matches multiple values, they are joined with commas. If a field's JSONPath is left empty, the corresponding incident field is left blank.
:::
### Example: Prometheus Alertmanager
To integrate with Prometheus Alertmanager, add a webhook receiver to your Alertmanager configuration:
```yaml
receivers:
- name: akuity-intelligence
webhook_configs:
- url: "https:///api/v1/orgs//ai/incidents?webhook_name=alert-manager&instance_id=&clusterName=my-cluster"
send_resolved: true
http_config:
basic_auth:
username:
password:
```
Then configure the corresponding webhook trigger in the Akuity Platform with the following field mappings:
| Field | JSONPath expression |
| ------------------------ | ------------------------------------------- |
| Description | `{.body.alerts[0].annotations.description}` |
| K8s Namespace | `{.body.alerts[0].labels.namespace}` |
| Cluster | `{.query.clusterName}` |
| Argo CD Application Name | `{.body.alerts[0].labels.app}` |
When Alertmanager fires an alert, the Akuity Platform creates an incident and the On-Call Agent begins troubleshooting using any applicable runbooks.
## Create Runbooks
Runbooks, at a high level, are the instruction sets that the On-Call Agent uses when responding to an active incident or scenario. These runbooks are written and stored in markdown formatting making them easy to read between both humans and Intelligence.
There is no preset schema or format that you need to follow for a runbook, the On-Call Agent will interpret whatever you have written and assess it for actions when a corresponding incident occurs.
For example, you may have an incident in which an application has hit the memory limit and entered into an out of memory (OOM) state. Based on the runbooks you have in the environment, the On-Call Agent can perform the following:
* Identify what runbook is most applicable to the caused incident
* Report status and custom pieces to a Slack channel
* Suggest a change and wait for approval from a user
Example:
```markdown
## General
- First, do the initial triage and collect the basic information to understand the incident.
- Next, send a slack notification with the link to the conversation to channel “on-call” with basic detail.
- Next, work on the incident according to the runbook. Don't take any action automatically, ask for approval.
- If the app is stable, check 30 seconds later again, then you can close the incident automatically. Please do slack all the details in concise messages.
- If you stack send a slack message again and mention that you need help.
- Please ensure you send slack message with the link to the conversation, so engineer can work with you together if needed.
## Out of memory
**Symptoms**: Pod unexpectedly dies with `OOMKilled` status.
**Root cause**: The pod is consuming more memory than the available memory.
**Solution**:
* Temporary increase the memory limit of the pod automatically
* Increase the memory limit with the 50 Mb increment until the pod is stable.
```
Users can manage their runbooks under the Runbooks tab of Incidents dashboard.

## GitOps-Managed Runbooks
In addition to creating runbooks manually in the UI, you can connect Git repositories and let Akuity pull runbooks directly from your version-controlled markdown files. This lets you manage runbooks with the same Git workflows you use for everything else — pull requests, reviews, and history included.
### Connect a Git Repository
1. Navigate to Intelligence → Incidents → Runbooks.
2. Click the Import dropdown and select Connect Git repo.
3. In the Connect Git Repositories dialog, add one or more repository URLs.
- **Repository URL** (required): the HTTPS URL of your Git repository.
- **Revision** (optional): a branch, tag, or commit SHA. Defaults to the repository's default branch.
- **Path glob** (optional): a glob pattern to filter which files are fetched. Defaults to `**/*.md`, which picks up all markdown files.
4. Click Save. Akuity will begin syncing runbooks from the repository periodically.
:::tip
The [akuity-intelligence-examples](https://github.com/akuity/akuity-intelligence-examples) repository contains a curated set of ready-to-use runbooks. Click **Add** next to the suggestion in the dialog to connect it instantly.
:::
### Runbook File Format
Any `*.md` file in the connected repository is a candidate runbook. Add a YAML front matter block at the top of the file to configure its name, targeting, and notifications. Files without front matter are still imported — they just won't be auto-triggered by the On-Call Agent.
```markdown
---
name: OOM Runbook
applied_to.clusters: production, staging
applied_to.argocd_applications: my-app-*
applied_to.k8s_namespaces: default
applied_to.degraded_for: 5m
slack_channel_names: on-call, alerts
---
## Out of Memory
**Symptoms**: Pod unexpectedly dies with `OOMKilled` status.
**Solution**: Temporarily increase the memory limit by 50 MB increments until the pod stabilizes. Notify the on-call channel with a link to this incident.
```
Supported front matter fields:
| Field | Description |
|---|---|
| `name` | Display name for the runbook. Defaults to the file path. |
| `applied_to.clusters` | Comma-separated cluster name patterns. Use `*` to match all clusters. |
| `applied_to.argocd_applications` | Comma-separated Argo CD application name patterns. Supports wildcards, e.g. `my-app-*`. |
| `applied_to.k8s_namespaces` | Comma-separated Kubernetes namespace patterns. Supports wildcards. |
| `applied_to.degraded_for` | Minimum duration a resource must be degraded before this runbook triggers, e.g. `5m`, `1h`. |
| `slack_channel_names` | Comma-separated Slack channel names to notify when this runbook runs. |
### Configuring Targeting for GitOps Runbooks
GitOps runbooks pick up their `applied_to` targeting from the YAML front matter inside each file. If you need to configure or override targeting without editing the source file — for example, when the repository is owned by another team, or when you want environment-specific targeting — you can set overrides directly in the Akuity UI or via Terraform.
Overrides are stored per-runbook-name inside the repository configuration and take precedence over any `applied_to` values in the file's front matter.
#### From the UI
1. In the Runbooks sidebar, select a runbook that was imported from a Git repository.
2. In the detail pane, click Edit Targeting.
3. Configure the **Argo CD Applications**, **K8S Namespaces**, and **Clusters** fields exactly as you would for a manual runbook.
4. Click Save. The override is stored immediately; the On-Call Agent will use it on the next incident without waiting for a repository sync.
:::note
The runbook content itself remains read-only — only the targeting is overridden. To change the content, edit the source file in your repository.
:::
#### Via Terraform
Use the `applied_for` map inside a `runbook_repos` block. Each key is a runbook name (derived from the file name after stripping the extension); the value is a target selector:
```hcl
resource "akp_instance" "example" {
argocd = {
spec = {
instance_spec = {
kube_vision_config = {
ai_config = {
runbook_repos = [
{
repo_url = "https://github.com/my-org/runbooks"
revision = "main"
applied_for = {
"oom-kill" = {
argocd_applications = ["guestbook-*"]
clusters = ["prod-cluster"]
}
"restart-pod" = {
k8s_namespaces = ["default", "staging"]
clusters = ["*"]
}
}
}
]
}
}
}
}
}
}
```
### Sync Status
Each connected repository shows a status indicator in the runbooks sidebar:
- **Green** — the repository was synced successfully. Hover to see the last sync time.
- **Yellow** — the last sync attempt failed. Hover to see the error message.
- **Spinning** — the repository is waiting for its first sync.
Click a repository row to open the Connect Git Repositories dialog and manage its configuration.
### Permissions
For private repositories, make sure the Argo CD instance has credentials configured for the repository URL under Settings → Repositories. Akuity uses the same repository credentials as Argo CD when fetching runbook files.
GitOps-managed runbook **content** is read-only in the UI — edit it in your repository and it will be updated on the next sync. Targeting (`applied_to`) can be overridden per-runbook directly from the UI without touching the source file. See [Configuring Targeting for GitOps Runbooks](#configuring-targeting-for-gitops-runbooks) below.
## Apply Runbooks to your Resources
After creating a runbook, you must apply it to your Argo CD applications or Kubernetes namespaces. When a linked resource becomes degraded, the On-Call Agent will automatically execute the steps defined in the runbook to resolve the incident.
There are two ways to apply a runbook to your Argo CD applications or Kubernetes namespaces:
* From the Runbook Settings UI. You can directly configure which resources a runbook applies to from the runbook editor.
* Navigate to Intelligence (Beta) in the left-hand sidebar.
* Select the Runbooks tab.
* Click + Create to make a new runbook, or select an existing runbook and click Edit.
* In the Applied To section, specify the Argo CD Apps, K8S Namespaces, or Clusters that this runbook should monitor.
* In the example, the runbook named oom is applied to the Argo CD Application `guestbook-prod-oom`.
* Using Kubernetes Annotations. You can also apply a runbook by adding an annotation directly to the manifest of your Argo CD Application or Kubernetes Namespace.
* Add the annotation `akuity.io/runbooks: ""` to the resource's metadata.
* For the example shown, you would add the following annotation to the guestbook-prod-oom Application resource: `akuity.io/runbooks: "oom"`
## Example Runbooks
We have established some example runbooks in the [akuity-intelligence-examples](https://github.com/akuity/akuity-intelligence-examples) GitHub repository. There are two ways to use them:
- **One-time import**: Click the Import dropdown and select Import examples to copy the runbooks into your instance. You can then edit them freely in the UI.
- **GitOps sync**: Click the Import dropdown and select Connect Git repo, then add `https://github.com/akuity/akuity-intelligence-examples`. Runbooks will stay in sync with the repository automatically.

> **Note:** After importing, the runbook will not be enabled by default. You need to add the corresponding **Applied To** configuration to enable the runbook.
## Managing Incidents
When an Argo CD application or Kubernetes namespace becomes degraded, the On-Call Agent will automatically create an incident. You can view and manage these incidents from the Incidents dashboard. The Incidents tab will display a list of all incidents. You can filter this list by Status (e.g., Unresolved, All), Application, or Namespace.

Click on an incident from the list to view its details. This view provides a live, step-by-step account of the troubleshooting process:
* **Summary**: A high-level overview of the issue, including the affected application and the runbook being used.
* **Root Cause**: An analysis of the likely cause of the incident (e.g., an OOMKilled event due to memory limits).
* **Live Troubleshooting Log**: A timeline showing every action taken by the intelligence agent, from initial detection ("Incident Occurred") to diagnostic steps like fetching the application tree and inspecting Kubernetes resources.
The On-Call Agent will attempt to resolve the incident automatically using the applied runbook.
* If the incident is successfully resolved, its status will be updated to Resolved.
* If the issue persists, the incident will remain Unresolved. You can then take manual action:
* **Mark as Resolved**: If you have fixed the issue outside of the system, you can manually close the incident.
* **Open in Akuity Intelligence**: Click this button to open the incident in the chat interface. Here, you can work directly with the On-Call Agent, provide more instructions, or ask it to "resolve it" to continue the troubleshooting process interactively.
## Slack Integration
Akuity Intelligence can notify Slack about incidents and, if you enable the full Slack Integration, keep conversations in sync. Use the configuration level that matches what you need:
* Send incident updates to Slack using Argo CD notifications, this is **single directional** conversation sync. it sends alerts to Slack from Akuity Intelligence.
* Add **bi-directional** conversation sync, Share to Slack, and thread-first workflows. This layer builds on the alerting setup and requires [additional Slack app permissions](#additional-setup-for-slack-integration).
### Configure the Slack Service

Both experiences rely on an Argo CD Slack service. Create or update it under Settings → Notifications → Services:
1. Click Add New → Slack (or edit an existing service).
2. Provide a **Name** (e.g., `slack-main`).
3. Enter your Slack **Bot Token** (`xoxb-…`). This is required for incident notifications.
4. (Slack Integration only) Enter your **App-Level Token** (`xapp-…`) so Socket Mode can power live conversation sync.
5. Optionally set a posting **Username** and **Icon**.
6. Save the service.
> If you rotate either token later, update the Slack service to avoid delivery failures.
### Link Slack to Akuity Intelligence

After the Slack service exists, connect it to Intelligence so incident updates flow to Slack:
* Click on the Integrations tab.
* In the Notifications section, locate the Slack option.
* Click the dropdown menu and select the Slack service you configured in the previous step.
* Click Save in the top-right corner to apply the changes.
With this in place, the On-Call Agent posts new and ongoing incident activity to the channels configured for that Slack service.
### Additional Setup for Slack Integration
If you plan to collaborate directly from Slack threads, configure your Slack app with the permissions and subscriptions below. These steps unlock Share to Slack, bi-directional chat, and conversation sync without changing how the On-Call Agent posts incident alerts.
#### Generate an App-Level Token
App-level tokens let Akuity connect to Slack platform features such as Socket Mode.
1. Navigate to Settings → Basic Information → App-Level Tokens.
2. Click Generate an app-level token.
3. Add the scopes: `connections:write`, `authorizations:read`, and `app_configurations:write`.
#### Enable Socket Mode
Socket Mode keeps Slack traffic behind WebSockets so you do not need to expose a public endpoint.
1. Open Settings → Socket Mode.
2. Turn on Connect using Socket Mode.
#### Configure Event Subscriptions
Event subscriptions allow Akuity to receive messages and mentions from the channels you monitor.
1. Go to Features → Event Subscriptions.
2. Enable Events.
3. Under Subscribe to Bot Events, add: `app_mention`, `message.channels`, `message.groups`, `message.im`, and `message.mpim`.
#### Configure OAuth & Permissions
Bot token scopes define what your Slack app can read and write when syncing conversations.
1. Open Features → OAuth & Permissions.
2. Under Scopes, add: `app_mentions:read`, `channels:history`, `channels:read`, `chat:write`, `groups:history`, `groups:read`, `im:history`, `mpim:history`, `users:read`, and `users:read.email`.
#### Allowlist Slack Channels for Share to Slack
1. Return to the target Argo CD instance and open Settings → Intelligence → Integrations.
2. With your Slack service selected, find Slack Channels.
3. List the channels (without `#`) that should appear in the Share to Slack dialog. This acts as an allowlist.
4. Save the settings and invite the Slack app (bot user) to each listed channel so first posts succeed.

When these optional steps are complete, the Slack Integration experience—thread sync, share-to-Slack workflows, and responding to incidents inside Slack—is available alongside the standard On-Call Agent notifications.
### Using Slack Integration
Once configuration is complete, you can share conversations to Slack, collaborate inside threads, and review synced incidents without leaving Slack.
#### Sharing Conversations to Slack
After services and channels are configured, conversation owners can use the Share to Slack action in the AI Conversation UI:
1. Open a conversation and click Share to Slack. The modal lists the allowlisted channels you configured earlier.
2. Pick a destination. If the conversation is already shared, the modal shows the existing permalink and an Unshare option.
3. Confirm Share. The backend will make the conversation public if it was private, capture the title, generate a permalink, and post to the selected Slack channel with both pieces of context.
Re-sharing to the same channel refreshes the thread and permalink. Unsharing clears the stored Slack metadata and returns the conversation to private visibility.
#### Interacting in Slack
* **Outbound (AKP → Slack)**: New messages in the AI conversation automatically post to the Slack thread.
* **Inbound (Slack → AKP)**: When a human replies in the linked Slack thread or mentions the bot, the message syncs back to the AKP conversation.
#### Automatic Incident Synchronization
Akuity Intelligence can detect incidents (for example, degraded applications) and notify your team via Slack. The automation is driven by the runbooks attached to your resources.
##### Interacting with Incidents in Slack
1. **View Details**: Incident messages include a summary, ID (for example, `INC-123`), and a link back to the AKP console.
2. **Reply in Thread**: Collaborate directly in the Slack thread.
3. **AI Response**: The AI monitors the thread and responds to questions or commands (for example, “Get the logs for the test-service pod”).
4. **Two-Way Sync**: Every message in the Slack thread is mirrored in the incident conversation inside the AKP console.
:::note
The AI only posts to channels you explicitly allow in **Slack Channel Configuration**. Ensure your runbook references one of those channels.
:::
#### Troubleshooting
If Slack synchronization is not working as expected, verify the following:
1. **Permissions**: Confirm the Slack app includes the `channels:read`, `chat:write`, and `groups:read` scopes.
2. **Tokens**: In Settings → Notifications, ensure both Slack tokens are valid.
3. **Channel Membership**: Invite the Slack app (bot) to the target channel (`/invite @YourApp`).
4. **Socket Mode**: When using Socket Mode, confirm the app-level token is configured and Socket Mode is enabled.
5. **Runbook Instructions**: For incident sync, make sure your runbook tells the AI to post to Slack and names the correct channel.
6. **Service not listed**: Verify the Slack service you created under **Notifications** starts with `service.slack.` and save the Intelligence settings again.
7. **Share fails immediately**: The bot may lack access to the channel or tokens may be stale. Reinvite the bot, rotate the secrets, and click **Save** in Notifications.
8. **Slack replies do not sync**: Check platform logs for socket pool warnings. If the instance was unregistered, confirm both bot and app tokens resolve correctly from the secret.
## Interacting in Git
Akuity Intelligence can read from and write to the Git repositories backing your Argo CD applications. It uses the Git credentials already configured for each application's repository in Argo CD — no additional credential setup is required.
### Reading Git Content
You can ask the On-Call Agent to inspect repository content as part of troubleshooting or investigation. For example:
* Retrieve the current value of a field in a manifest
* Compare configuration between environments
* Understand how manifests are structured or generated (plain YAML, Helm, Kustomize)
### Making Git Changes
The On-Call Agent can make changes directly to the application repository. You can instruct it to commit to an existing branch or to create a new branch for review.
**Committing directly to the main branch** is appropriate for immediate fixes where no review cycle is needed. For example:
> *"Update the memory limit for the payment service to 512Mi and commit to main."*
**Creating a new branch** keeps the change isolated and ready for a Pull Request. The agent will suggest a meaningful branch name, commit the change, and prepare a Pull Request with a descriptive title and summary. For example:
> *"Create a PR that updates the image tag for the frontend deployment to v3.1.1."*
Akuity Intelligence will scan the repository, determine how manifests are generated, locate the correct file, and apply the change — whether the application uses plain YAML, Helm values files, or Kustomize overlays. You do not need to specify which file to modify.
### Customizing Git Behavior
You can define preferences for how the On-Call Agent interacts with Git by describing them in a runbook. For example, you can specify:
* Whether changes should go to a new branch or directly to main
* Preferred branch naming conventions
* Required PR labels or reviewers
* Whether to require human approval before pushing any change
:::note
Git write operations use the same repository credentials configured in Argo CD for the application. Ensure those credentials have write access to the repository if you intend to use the On-Call Agent for Git changes.
:::
---
## Promotion Advisor
The Promotion Advisor helps you make safer and more informed deployment decisions by automatically analyzing the changes between application versions before a promotion. When you promote a `Freight` to a stage, the Promotion Advisor provides a detailed risk assessment, a summary of changes, and actionable recommendations.
In the Kargo UI, initiate a promotion for one stage to a `Freight`. In the `Promote` dialog that appears, click on the AI Promotion Advisor tab.

By reviewing the Promotion Advisor's report, you can confidently decide whether to proceed with the promotion, armed with a clear understanding of the changes and their potential impact.
## Slack Integration
The Promotion Advisor can also send notifications to Slack. For more details on configuring and using Slack integration, please refer to the [Slack Integration](./20-on-call-agent.md#slack-integration) section in the On-Call Agent documentation.
---
## Akuity Agents
---
## Akuity Intelligence Capabilities
Akuity Intelligence can interact with Argo CD, Kargo, Kubernetes, and many third-party systems through tools. You can request the use of these tools in conversations with AI agents. These tools can also be used in runbooks. The following are all the tools available in Akuity Intelligence:
* **** - Request or re-engage a multi-step execution plan for the current goal. Call this before other diagnostic or action tools when the current request will need three or more total tool calls across parallel or sequential execution, including audits, investigations, comparisons, and multi-part follow-ups. The runtime invokes the planner model and forces step-by-step execution. Do not use for direct answers, simple status checks, requests needing at most two tool calls, active scheduled tasks, or requests already executing inside an active plan step.
* **Cancel task** - Cancel a previously scheduled follow-up task by its ID. Use this when new evidence makes the planned follow-up unnecessary.
* **Create Git Repository Issue** - Creates a new issue in a Git repository.
* **Create Git Repository Pull Request** - Create a pull request for a Git repository.
* **Delete Kubernetes resource** - Deletes the specified Kubernetes resource.
* **Disable Argo CD app auto-sync** - Disables the auto-sync feature of the Argo CD application.
* **Edit Slack message** - Updates existing message with a new text.
* **Get Argo CD app project** - Returns the JSON serialized project the Argo CD application belongs to.
* **Get Argo CD application** - Retrieves Argo CD application information.
* **Get Argo CD application events** - Returns the Argo CD K8S Events and Akuity Timeline Events for a given application.
## Parameters
- since (string, ISO8601): Start of the time window. Use a narrow window (e.g. 1 hour around the incident) and paginate by advancing since/until to avoid overwhelming responses.
- until (string, ISO8601): End of the time window.
- severity (string enum): Minimum severity filter. Use "warning" or "critical" to skip informational node churn and focus on meaningful signals. Only use "info" when you need full detail for a narrow time window.
- "info": returns all events (informational and above)
- "warning": returns only warning and critical events — use this as the default for troubleshooting
- "critical": returns only critical events
- includes (string): Case-insensitive substring filter. When set, only K8S events whose Reason contains this string and timeline events whose message contains this string are returned. Use this to narrow results to events relevant to the incident (e.g. "OOMKill", "BackOff", "redis"). When the incident cause is known, always set this to avoid retrieving unrelated noise.
## Usage guidance
Start with a 1-hour window around the incident using severity="warning". Paginate by sliding the since/until window if needed. Widen to severity="info" only when you need full context for a specific narrow window. When you know the incident cause, set includes to filter to relevant events only.
* **Get Argo CD application tree** - Retrieves Argo CD application resource tree.
* **Get Argo CD instance settings** - Returns the settings of the Argo CD instance.
* **Get Argo CD instance version info** - Returns the version information of the Argo CD instance and configured tools.
* **Get Argo CD managed resource diff** - Returns the difference between the current state and the desired state of a resource managed by an Argo CD application.
* **Get Git Repository Issue Comments** - Returns a paginated list of comments for a specific issue in a Git repository.
* **Get Git Repository Issue Details** - Returns details of a single issue in a Git repository.
* **Get Kargo project** -
Retrieves detailed information about a specific Kargo project including its metadata,
status, and statistics about warehouses and stages.
* **Get Kargo project tree** - Retrieves the hierarchical structure of Kargo resources in a project
* **Get Kargo promotion** -
Retrieves detailed information about a specific Kargo Promotion including
its status, freight details, and progress information.
* **Get Kargo stage** -
Retrieves detailed information about a specific Kargo Stage including its spec
with requested freight configuration and promotion rules.
* **Get Kargo warehouse** -
Retrieves detailed information about a specific Kargo Warehouse including
its configuration for watching artifact sources.
* **Get Kubernetes Namespace resources tree** - Fetches the resource tree of a specified Kubernetes Namespace
* **Get Kubernetes resource** - Retrieves JSON serialized kubernetes resource.
* **Get Kubernetes version** - Returns K8S and akuity agent version.
* **Get Kubernetes workload logs** - Fetch logs from a Kubernetes workloads.
* **Get Runbooks** - Retrieves runbook details by their names. Returns complete runbook content with General, Symptoms, Root cause, and Solution sections.
* **Get Slack channels** - Returns list of channels where messages can be sent.
* **Get conversation link** - Returns Markdown hyperlinks for the current conversation (open-conversation link plus deep-links to the related Argo CD application / namespace view). Use ONLY when a user asks for the link directly in chat. Do NOT use this to put links into Slack messages: Slack messages automatically get conversation and resource buttons attached to the thread root, so pasting links there would duplicate them.
* **Get current time** - Return the current server time in RFC3339 format. Use this to compute absolute timestamps when reasoning about scheduled follow-ups.
* **Get detailed code changes for specific files from the commits** - Get actual code patches for specific files that AI has identified as important for analysis
* **Get incidents** - Retrieves JSON-serialized incidents for the given context. If the user is asking for a specific time range, the current time is 2026-08-14T21:21:47Z.
* **Get incidents count** - Retrieves total number of incidents for the given context. If the user is asking for a specific time range, the current time is 2026-08-14T21:21:47Z.
* **Get overview of the commits stats and changed files** - Get detailed code changes and file list for specific git commits (from freight commits or image OCI annotations)
* **Get overview of the promotion changes** - Gather all promotion changes including git commits, images (with git info from OCI annotations), charts, and metadata for AI analysis
* **Get release notes for GitHub releases** - Get release notes for GitHub releases between semantic versions (v1.0.0, v1.2.3) or git commits. Supports image version detection and automatic semantic version range analysis for comprehensive release notes.
* **List Argo CD applications** - Retrieves a list of Argo CD applications.
* **List Container Resources** - Get list of container resources managed by given instance, cluster or namespace
* **List Deprecated APIs** - Get list of k8s deprecated apis managed by given instance or cluster
* **List Git Repository Branches** - Returns a paginated list of branches in the git repository, with optional filtering by branch name.
* **List Git Repository Files** - Returns list of files (optionally with content) in the git repository.
* **List Git Repository Issues** - Returns a paginated list of issues for a Git repository. Supports filtering by state (open/closed/all), labels, assignee, and text search.
* **List Images** - Get list images managed by given instance or cluster
* **List K8s resources** - Get list of k8s resources managed by given instance, cluster or namespace
* **List Kargo freight** -
Queries for Freight in a Kargo project. Freight represents a collection
of artifacts (container images, Helm charts, Git commits) that can be
promoted through stages. Returns a flat list of freight. Every parameter
must be supplied; pass an empty stage and an empty origins array to query
freight for all stages.
* **List Kargo promotions** -
Retrieves a list of Promotions in a Kargo project. Promotions represent
the movement of Freight from one Stage to another. Every parameter must
be supplied; pass an empty stage to list every promotion in the project.
* **List Kargo stages** -
Retrieves a list of all Stages in a Kargo project. Stages represent environments
in the delivery pipeline and define how freight is promoted through them.
A stage's health check pins its Argo CD app to the stage's last promoted revision,
so when stages share one git branch, promoting a later stage can flip earlier stages
to Unhealthy ("does not match the desired revision") while the app itself is Synced
and Healthy; the stage heals on its next promotion. Check the health output before
treating that condition as a failure.
* **List Kargo warehouses** -
Retrieves a list of all Warehouses in a Kargo project. Warehouses watch for
new artifacts (container images, Helm charts, Git commits) and produce Freight.
* **List Stuck In Deletion Resources** - Get list of k8s resources stuck in deletion managed by given instance, cluster or namespace
* **Patch Kubernetes resource** - Applies provided json serialized strategic merged patch to the given resource.
* **Post Git Repository Issue Comment** - Posts a comment on an existing issue in a Git repository.
* **Promote freight to stage** - Promotes specified freight to the target Kargo stage
* **Refresh Kargo warehouse** -
Triggers a refresh of a specific Kargo Warehouse to check for new artifacts.
This forces the warehouse to scan its configured sources (Git repositories,
container registries, Helm repositories) for new artifacts and produce new Freight.
* **Resolve Incident** - Marks incident resolved with the given resolution description.
* **Run refresh action on application** - The function refreshs the application.
* **Run rollback action on application** - The function rollbacks the application.
* **Run sync action on application** - The function syncs the application.
* **Schedule task** - Schedule a future follow-up turn for this conversation after a delay (seconds), then STOP this turn — no further tool calls or reads are executed until the delay elapses and the conversation resumes.
Prefer this after Argo CD mutations (patch, sync, refresh, scale), when waiting for rollout/Healthy status; do not immediately treat Progressing during pod restarts as failure. Also use for any LLM-managed delayed check-back: sync windows, Slack thread rechecks, periodic reinvestigation, or scheduled-task workflows.
On resume, read fresh state and decide the next step. Allowed seconds: 10-1800; description should name the target and condition.
* **Search Documentation** - Search the documentation for relevant information. Always include the conversation context to help refine the search.
* **Sends a Slack message** - Sends a slack message.
* **Store Runbook** - Stores a runbook to the ArgoCD instance configuration, the runbook will be used to automate the handling of future incidents
* **Update Git Repository Files** - Commit files to the git repository. It creates a commit with the provided commit message. If the file doesn't exist, it will be created.
* **Update Incident Root Cause** - Updates incident root cause.
* **Update Incident Summary** - Updates incident summary.
* **Update promotion analysis summary** - Updates promotion analysis with summary, risk level, and completion status.
* **Verify Kubernetes resource patch** - Verifies if the provided json serialized strategic merged patch is valid.
## Tool Policies
Tool Policies provide a critical security layer that gives you fine-grained control over the actions Akuity Intelligence can perform. By default, Akuity Intelligence is pre-configured with policies that allow the Akuity Agents to operate with reasonable independence, while still requiring human approval for sensitive or potentially risky actions. As an example the Akuity Agents are permitted to perform read-only actions, modify resources, and delete pods. The policies page allows you to customize this behavior, enabling you to define specific rules for when and how the Akuity Agents can execute function calls.
To configure tool policies:
* Navigate to Intelligence, click Settings in the top right corner.
* From the left-hand menu, select the Tool Policies tab.
* The Tool Policies section allows you to view, create, and manage your policies.
## Creating a Policy for User Approval
A policy is composed of a Target (the action being taken), the Contexts (where the action applies), and an Action (the required approval level).
To configure a rule that requires user approval for a specific operation, follow these steps:
* Click Add to create a new policy row.
* Define the Target of the operation you want to control:
* Name: The name of the function the AI is attempting to call. You can use * as a wildcard to apply the policy to any function.
* Arguments: A specific condition to match against the function's arguments. This allows for highly specific rules. For example, the expression `args.resourceID.kind == 'Deployment'` targets any action where the resource being acted upon is a Kubernetes Deployment.
* Define the Contexts to limit the policy's scope. You can restrict the rule to specific:
* Clusters
* K8s Namespaces
* Argo CD Applications
* Kargo Projects
* Runbooks
* Set the final Action to Approve or Require Approval based on your needs.
For instance, with the following example, whenever the On-Call Agent attempts to execute a function that performs a write operation(e.g., update a Deployment), it will pause and explicitly ask for user confirmation before proceeding, ensuring a human is always in the loop for critical operations.


## Multiple Tool Policies
You can configure multiple policies. The Akuity Platform evaluates them in order, with the last matching policy taking precedence.
For example, you could set a policy requiring approval for all tools, along with another that auto-approves the ArgoCD application refresh action. In this case, all tools would require approval except the refresh action.


---
## Custom MCP Servers
This feature lets organizations extend Akuity Intelligence by connecting customer-provided MCP servers to the existing tool-calling framework. With context-aware parameter mapping, the integration expands Akuity Intelligence from a Kubernetes/Argo CD specialist into a comprehensive DevOps automation assistant capable of cross-platform incident response and notification management.
Before adding a Custom MCP Server, make sure you have:
* A running MCP server reachable from the Akuity Platform.
* Valid credentials (such as a bearer token, API key, or basic auth) authorized to call the server.
## Add Custom MCP Server

From the Intelligence → MCP Servers page, click Add Custom Server and fill in the following fields:
* **Name** (required): A unique display name for this MCP server.
* **Server URL** (required): The endpoint of the MCP server (for example, `https://mcp.example.com/mcp`).
* **Transport Type** (required): The protocol used to communicate with the MCP server. Supported transports:
* **Streamable HTTP** — recommended for new deployments.
* **SSE** — for legacy MCP servers using Server-Sent Events.
* **Credentials**: The authentication used when calling the server. Choose the method supported by your MCP server (for example, bearer token, API key header, or basic auth). Credentials are stored securely and are never exposed in the UI after they are saved.
* **Tools**: The discovered tools are used when configuring `Context Mappings` so parameters can be bound to the right tool inputs. Ensure the MCP headers (transport, URL, and credentials) are correct before triggering tool discovery; otherwise the request will fail and no tools will be returned.

* **Scope**: Binds the MCP server to the **Argo CD Instance** or **Kargo Instance** you select. The server's tools are exposed to Akuity Intelligence only when it operates within the selected instance.
* **Context Mappings**:
Context mappings let you bind an MCP server to specific contexts and pre-fill server parameters from the selected context.
To configure a context mapping:
1. In the Context Mappings section, click Add Context Mapping.
2. Choose the context type **Argo CD Application**, **Argo CD Instance**, **Argo CD Cluster**, **Kargo Project**, or **Kubernetes Namespace**.
3. Map the relevant context fields to the server parameters.
4. Save the mapping.
Once all fields are filled in and any context mappings are configured, click Save to register the server. Akuity Intelligence will connect to the server and attempt to discover its tools.
## Manage Custom MCP Server
The MCP Servers page lists every registered Custom MCP Server alongside its connection status, scope, and available actions. Use this page to enable or disable servers, inspect discovered tools, and review configuration.
### Enable or disable a server

Use the Enable switch in the server row to control whether Akuity Intelligence can call the server's tools. Disabling a server keeps its configuration intact but removes its tools from the available tool list until it is re-enabled.
### Inspect discovered tools

Click the Tools icon in the server row to open the tool list. For each tool, the panel displays:
* The tool name and description reported by the MCP server.
* The input parameter schema, including parameter names, types, and whether each parameter is required.
* Any context mappings that pre-fill parameter values from the active resource.
## Use Custom MCP Server

Once a Custom MCP Server is installed and enabled, its tools are available to Akuity Intelligence alongside the built-in tools. Follow these steps to use a Custom MCP Server:
1. Confirm the server shows a `Connected` status on the MCP Servers page. If it is not connected, Akuity Intelligence cannot call its tools.
2. Open a chat with Akuity Intelligence from the Floating Button or from the context of a specific resource (Argo CD Application, Kargo Project, or Kubernetes Namespace). Make sure the resource has been configured in the server's `Context Mappings` so Akuity Intelligence can resolve the right parameters.
3. Ask Akuity Intelligence to perform a task that maps to one of the server's tools (for example, "open an incident in PagerDuty for this application" or "post a deployment summary to Slack"). Akuity Intelligence selects the appropriate tool, applies the configured context mappings to pre-fill parameters, and calls the MCP server.
4. Review the response to confirm the tool call succeeded.
---
## MCP Servers
---
## Akuity Intelligence
Akuity Intelligence provides real-time visibility, AI-powered troubleshooting, and auto-remediation for your Kubernetes environment. Key capabilities include:
* **Real-time Insights and Dashboards**: Gain unparalleled visibility into your applications and infrastructure with built-in, multi-cluster dashboards. These provide a consolidated, real-time view of metrics, logs, and event streams, enabling teams to quickly understand system health and identify issues early.
* **Akuity Agents**: Leverage a powerful Akuity Agents to automate troubleshooting and remediation. The Akuity Agents analyze operational data to pinpoint the root cause of failures and can automatically execute predefined runbooks to resolve incidents, significantly reducing manual intervention and improving application resilience. The Akuity Agents include the Deployment Advisor, the On-Call Agent, and the Promotion Advisor.
---
## Getting Started(07-self-hosted)
This documentation is designed to help you get started with the Akuity Self Hosted Platform. This is
a comprehensive guide that will walk you through the process of setting up and using the Akuity
Platform on your own infrastructure. If you have any questions or need help, please reach out to
your designated support contact or in your communication channel (Slack, Teams, etc.)
## Prerequisites
Before starting, you will need two key pieces of information:
- Your Akuity Platform license key
- A key for the Akuity Platform OCI registry
### Logging into the registry
```console
# This will prompt you for your registry key
helm registry login us-docker.pkg.dev -u _json_key_base64
```
## Infrastructure Requirements
The Akuity Platform is designed to run on a dedicated Kubernetes cluster. Generally speaking, any
cluster, no matter where it is hosted, you will need the following infrastructure available in
addition to the Kubernetes cluster:
- A postgres database accessible from the Kubernetes cluster
- Kubernetes network policy engine (e.g. Calico, Cilium, etc.)
- A network-level load balancer to route traffic to the platform
- DNS configured to point traffic to the load balancer
- An OIDC identity provider for authentication (e.g. Google, Okta, etc.)
- A wildcard TLS certificate for the domain you are using for the platform (or the ability to
generate one on the fly using cert-manager)
- SMTP (optional)
- A cluster autoscaler (optional)
The next sections cover more information on each of these requirements. Where applicable, you can
select for more specific for many of the commonly used cloud providers.
If you have any other questions, please reach out to Akuity support.
### Network Security
Akuity Platform deploys `NetworkPolicy` resources in order to ensure ingress and egress connectivity
to Pods are allowed on an as-needed basis, and to disallow cross-namespace communication between
tenants. For this to work, a Kubernetes network policy engine must be installed to enforce these
policies.
**AWS**
Akuity recommends using the [AWS VPC-CNI](https://docs.aws.amazon.com/eks/latest/userguide/cni-network-policy.html)
for a policy engine. As an alternative, [Calico](https://projectcalico.docs.tigera.io/) can
also be used with the AWS VPC-CNI.
#### Calico Installation
If you choose to use Calico, follow the [installation instructions](https://docs.tigera.io/calico/latest/argo-cd/getting-started/kubernetes/managed-public-cloud/eks)
provided by Tigera for EKS.
**GCP**
A GKE cluster will need to have the network policy engine enabled. This can be done even if
the cluster was already created. See the [GCP docs](https://cloud.google.com/kubernetes-engine/docs/how-to/network-policy)
for more information.
**Azure**
Akuity recommends [Calico](https://projectcalico.docs.tigera.io/) for network policies in Azure.
#### Calico Installation
**Note:** Calico should be enabled during cluster creation.
You can follow the Microsoft documentation [here](https://learn.microsoft.com/en-us/azure/aks/use-network-policies#create-an-aks-cluster-and-enable-network-policy)
for enabling Calico during cluster creation.
**On-Prem**
Akuity recommends [Calico](https://projectcalico.docs.tigera.io/) for network policies in an
On-Prem cluster, but any Kubernetes network policy engine that is compatible with your
Kubernetes cluster should work.
### Kubernetes Auto-Scaling
As Argo CD instances are created, and as more clusters connect to Akuity Platform, additional
capacity is needed in the host control-plane cluster. Akuity Platform has no direct dependency on a
specific autoscaler, but deploys HPA resources to automatically scale based on cpu/memory load. A
Kubernetes cluster autoscaler allows for automatically adding compute capacity to the cluster.
There are two popular solutions for autoscaling, in addition to vendor-specific solutions:
1. [Cluster Autoscaler](https://github.com/kubernetes/autoscaler)
2. [Karpenter (AWS and Azure only)](https://karpenter.sh/)
**AWS**
If running on EKS, Akuity recommends Karpenter as it allows better flexibility for right-sizing
the EC2 sizes according to the capacity. The following EC2 instance types (Nitro-based to
support prefix delegation) are recommended:
- t3.large
- t3.xlarge
- t3a.large
- t3a.xlarge
- t3a.2xlarge
- m5.large
- m5.xlarge
- m5a.large
- m5a.xlarge
- c5.large
- c5.xlarge
- r6a.large
**GCP**
GKE clusters can use the [Cluster Autoscaler](https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-autoscaler)
to automatically scale the cluster based on resource usage.
It is also possible to use [Cluster Autoscaler](https://github.com/kubernetes/autoscaler)
**Azure**
Akuity recommends using [Cluster Autoscaler](https://github.com/kubernetes/autoscaler)
**On-Prem**
For on-prem clusters, Akuity recommends using one of the open source solutions mentioned above.
#### Kubernetes Nodes
If auto-scaling is not used, then we recommend having a minimum of 3 nodes with a minimum of 2
vCPUs and 8GB RAM for each node. This number is highly variable and dependent on the number of
applications, number of control planes managed by AKP, etc. This is something which you
will need to keep a close eye on and tune accordingly depending on your workload.
### PostgreSQL Database
Akuity Platform requires a PostgreSQL database to store its data. The database can be self-hosted or
be a managed service provided by your cloud provider. The database must be accessible from the
Kubernetes cluster where the Akuity Platform is installed and securing the connection to the
database is left to the user. No matter which option you choose, the database must be configured
with the following requirements:
- Engine: PostgreSQL
- Version: 14.6+
Regardless of your cloud provider, the appropriate instance class/size is highly variable and depends on a number of factors:
- Number of Argo CD instances
- Number of total clusters across instances
- Number of applications across instances
**AWS**
If using an Amazon-managed database, Akuity recommends using Amazon Aurora.
#### Requirements
- Engine: Amazon Aurora PostgreSQL-Compatible Edition
- Version: 14.6, 14.7, 14.8
- Default parameter groups: aurora-postgresql14
- [Enforce TLS](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Security.html#AuroraPostgreSQL.Security.SSL.Requiring) ([certificates](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL.html)) with `“rds.force_ssl” = “1”`
#### Recommended
- Encryption enabled
- Aurora Replica or Reader node in a different AZ for the purposes of high-availability failover and to provide read-only instances.
#### DB Instance Class:
The following are examples of configurations that have been tested:
| Limits | DB Instance Class |
| :---- | :---- |
| 10 instances, 10 clusters, 100 applications | db.t4g.medium (2 vCPU, 4 GiB RAM) |
| 5 instances, 1000 Clusters, 5000 Applications | db.r6g.xlarge (4 vCPU, 32 GiB RAM) |
:::note
The Aurora Serverless v2 instance class is not recommended due to cost
inefficiencies. Akuity Platform’s database load characteristics are constant / not bursty,
so as a result Aurora Serverless v2 costs much more to support the same or fewer number of
Argo CD instances, clusters, and applications.
:::
#### Networking
Akuity recommends the following:
- [Private subnets](https://aws.github.io/aws-eks-best-practices/networking/subnets/#using-private-and-public-subnets)
for both the Kubernetes workloads and database VPC.
- While it is possible/supported for the RDS database to be provisioned in the same VPC as
the EKS VPC, you may consider RDS database in its own VPC, and connected via [Transit Gateway](https://aws.amazon.com/transit-gateway/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc).
The benefit of this separation allows for the EKS cluster to be more easily replaced, which
is possible since Akuity Platform only runs stateless workloads.
**GCP**
If using a Google-managed database, Akuity recommends using Cloud SQL.
#### Requirements:
- Engine: Cloud SQL PostgreSQL
- Version: 14
#### Recommended:
- Replica or Reader node in a different AZ for the purposes of high-availability failover
and to provide read-only instances.
#### DB Instance Class:
The following are examples of configurations that have been tested:
| Limits | DB Instance Size |
| :---- | :---- |
| 10 instances, 10 clusters, 100 applications | 2 vCPU, 4 GiB RAM |
| 5 instances, 1000 Clusters, 5000 Applications | 4 vCPU, 32 GiB RAM |
**Azure**
If using an Azure-managed database, Akuity recommends using Azure Database for PostgreSQL.
#### Requirements:
- Engine: Azure Database for PostgreSQL Flexible Server
- Version: 14
The extensions need to be [allowlisted](https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions#how-to-use-postgresql-extensions)
in the database before starting.
#### Recommended:
- Replica or Reader node in a different AZ for the purposes of high-availability failover and to provide read-only instances.
#### DB Instance Class:
The following are examples of configurations that have been tested:
| Limits | DB Instance Class |
| :---- | :---- |
| 10 instances, 10 clusters, 100 applications | Standard\_D2ds\_v5 (2 vCPU, 8 GiB RAM) |
| 5 instances, 1000 Clusters, 5000 Applications | Standard\_D8ds\_v5 (8 vCPU, 32 GiB RAM) |
**On-Prem**
If self-hosting the database, Akuity recommends using a PostgreSQL database that meets the requirements above in addition to the following
#### Recommended:
- Encryption enabled
- Replica or Reader node in a different AZ/datacenter/rack for the purposes of high-availability
failover and to provide read-only instances.
#### DB Instance Size:
The following are examples of configurations that have been tested:
| Limits | DB Instance Class |
| :---- | :---- |
| 10 instances, 10 clusters, 100 applications | 2 vCPU, 4 GiB RAM |
| 5 instances, 1000 Clusters, 5000 Applications | 4 vCPU, 32 GiB RAM |
#### Non-Superuser Permissions
If your database user is not running as a superuser or equivalent (e.g., `rds_superuser` on RDS), you will need to grant
additional permissions. The user must have the `CREATEROLE` privilege and ability to create schemas, as well as being
allowed to `GRANT` connect privileges to other users.
Substitute `admin_user` for the actual role you intend to use. The example below assumes the installation of all the database
objects to the `akuity` schema; the Akuity Platform default is `public` for legacy reasons but new installations should
install the Akuity Platform to a schema other than `public`.
```sql
-- CREATEROLE is a requirement since we need to create a user per instance.
CREATE USER admin_user WITH PASSWORD '' CREATEROLE;
-- We need this to be able to perform database migrations.
GRANT CREATE ON DATABASE TO admin_user;
-- The admin user also needs to be able to GRANT CONNECT to the provisoned instance user, so the provisioned user can actually connect to the database.
GRANT CONNECT ON DATABASE TO admin_user WITH GRANT OPTION;
GRANT USAGE ON SCHEMA akuity TO admin_user;
GRANT CREATE ON SCHEMA akuity TO admin_user;
GRANT ALL ON ALL TABLES IN SCHEMA akuity TO admin_user;
GRANT ALL ON ALL SEQUENCES IN SCHEMA akuity TO admin_user;
GRANT ALL ON ALL FUNCTIONS IN SCHEMA akuity TO admin_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA akuity GRANT ALL ON TABLES TO admin_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA akuity GRANT ALL ON SEQUENCES TO admin_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA akuity GRANT ALL ON FUNCTIONS TO admin_user;
```
### Load Balancing and Ingress
The Akuity Platform installation bundles [Traefik Ingress
Controller](https://github.com/traefik/traefik) as part of its installation. Upgrades of Traefik and
CRDs will be handled as part of upgrades of Akuity Platform.
**AWS**
Akuity Platform assumes the presence of [AWS Load Balancer Controller](https://github.com/kubernetes-sigs/aws-load-balancer-controller)
and will provision a Kubernetes Service with NLB specific annotations needed by the platform. e.g.:
```yaml
apiVersion: v1
kind: Service
metadata:
name: traefik
namespace: traefik-external
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
service.beta.kubernetes.io/aws-load-balancer-target-group-attributes: preserve_client_ip.enabled=true
service.beta.kubernetes.io/aws-load-balancer-type: external
```
An NLB is used (as opposed to ALB) for the cloud load balancer since:
- Traffic to the Akuity Platform is a mix of protocols (HTTP, TCP, gRPC)
- Routing decisions are configured at Ingress level, not at the Load Balancer
**GCP**
The Akuity Platform will provision a Kubernetes LoadBalancer Service (which will create a GCP
Network Load Balancer). GCP Load Balancer specific annotations can be added to this service
to achieve desired configurations.
**Azure**
Akuity Platform will provision a Kubernetes LoadBalancer Service (which will create an Azure
Load Balancer). Azure Load Balancer specific annotations can be added to this service to achieve
desired configurations such as making the load balancer [internal only](https://learn.microsoft.com/en-us/azure/aks/internal-lb).
**On-Prem**
If using an on-prem cluster, that cluster will need to be able to create a LoadBalancer Service
that an external load balancer can route traffic to.
### TLS
The default behavior of Akuity Platform requires a public certificate and private key of a wildcard
TLS certificate. TLS is needed to terminate inside cluster at Ingress/Traefik – not at the NLB. This
is due to the fact that, by default, Akuity Platform leverages features of Traefik which require
passthrough behavior to Ingress (e.g. IP allowlist, websocket support, HTTP2/gRPC).
:::note
For advanced use cases where you need to bring your own ingress controller or have a hard
requirement on terminating TLS at the load balancer, it is possible to disable TLS termination. See
the [Bring Your Own Ingress](./10-bring-your-own-ingress.md) document for more information.
:::
The wildcard certificate given to Akuity Platform must be valid for the following domains (replace
`akuity.example.com` with your own domain):
* `akuity.example.com`
* `*.cd.akuity.example.com`
* `*.cdsvcs.akuity.example.com`
* `*.kargo.akuity.example.com`
* `*.kargosvcs.akuity.example.com`
Akuity Platform does not have any requirements on how the certificate is provisioned. TLS
certificates can be obtained in different ways. Some options include:
1. Purchased from a traditional certificate providers (e.g. Verisign, DigiCert)
2. Free, time-limited (90 day) certificates from Let’s Encrypt
If the TLS Secret is managed separately and not supplied to the Helm chart (e.g. generated by
cert-manager, deployed via External Secret) the resulting secret should be named
`akuity-platform-tls` in the `traefik-external` namespace. Akuity Platform will assume the presence
of this Secret so that it can be referenced by Traefik ingress.
#### Cert-Manager (optional)
If you are using cert-manager to manage your TLS certificates, the following example shows how to do
so with a Let's Encrypt issuer. These instructions can be adapted for other issuers as well.
```yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- dns01:
route53:
region: us-east-1
selector:
dnsZones:
- akuity.example.com
- cd.akuity.example.com
- cdsvcs.akuity.example.com
- kargo.akuity.example.com
- kargosvcs.akuity.example.com
```
```yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: akuity.example.com
namespace: akuity-platform
spec:
dnsNames:
- akuity.example.com
- '*.cd.akuity.example.com'
- '*.cdsvcs.akuity.example.com'
- '*.kargo.akuity.example.com'
- '*.kargosvcs.example.com'
issuerRef:
name: letsencrypt-prod
# This secret name is important, as it is the name that Akuity Platform expects
secretName: akuity-platform-tls
```
### DNS
Akuity Platform requires DNS to be configured for the domain you are using for the platform. When the platform creates resources:
Argo CD instances will be provisioned with human-friendly and reconfigurable DNS names like:
- `myargocd-1.cd.akuity.example.com`
- `myargocd-2.cd.akuity.example.com`
Agent components will connect to static, ID specific DNS names like:
- `x8ax38dmb1d81h-cplane.cdsvcs.akuity.example.com`
- `x8ax38dmb1d81h-cache.cdsvcs.akuity.example.com`
Configuring DNS is platform specific and instructions are specified below.
:::tip
To automate the creation of these records, [External
DNS](https://github.com/kubernetes-sigs/external-dns) can be used to automatically create the
records by adding additional annotations to the NLB Service object.
```yaml
apiVersion: v1
kind: Service
metadata:
name: traefik
namespace: traefik-external
annotations:
external-dns.alpha.kubernetes.io/alias: "true"
external-dns.alpha.kubernetes.io/hostname: |
'*.cd.akuity.example.com.,*.cdsvcs.akuity.example.com.'
```
:::
**AWS**
Akuity Platform requires a Route53 Hosted Zone (e.g. `akuity.example.com`) with the following records pointing to the NLB hostname/IP:
| Record Name | Type | Value/Route traffic to |
| :---- | :---- | :---- |
| `akuity.example.com` | A | ALIAS to NLB |
| `*.cd.akuity.example.com` | A | ALIAS to NLB |
| `*.cdsvcs.akuity.example.com` | A | ALIAS to NLB |
| `*.kargo.akuity.example.com` | A | ALIAS to NLB |
| `*.kargosvcs.akuity.example.com` | A | ALIAS to NLB |
**GCP**
Akuity Platform requires a Cloud DNS Hosted Zone (e.g. `akuity.example.com`) with the following records pointing to the NLB hostname/IP:
| Record Name | Type | Value/Route traffic to |
| :---- | :---- | :---- |
| `akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cd.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cdsvcs.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargo.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargosvcs.akuity.example.com` | A | Traefik Load Balancer Service |
**Azure**
Akuity Platform requires a DNS Zone (e.g. `akuity.example.com`) with the following records pointing to the load balancer hostname/IP:
| Record Name | Type | Value/Route traffic to |
| :---- | :---- | :---- |
| `akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cd.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cdsvcs.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargo.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargosvcs.akuity.example.com` | A | Traefik Load Balancer Service |
**On-Prem**
Akuity Platform requires a DNS Zone (e.g. `akuity.example.com`) with the following records pointing to the load balancer hostname/IP:
| Record Name | Type | Value/Route traffic to |
| :---- | :---- | :---- |
| `akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cd.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.cdsvcs.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargo.akuity.example.com` | A | Traefik Load Balancer Service |
| `*.kargosvcs.akuity.example.com` | A | Traefik Load Balancer Service |
### OIDC Identity Provider
Akuity Platform requires login via an OIDC-compliant identity provider (IdP) using OAuth 2.0 login
flow. Akuity Platform can be configured to integrate directly with an OIDC provider, or through
[Dex](https://dexidp.io/) as an intermediary.
Dex is bundled as an ***optional*** component of the helm chart. You may wish to enable Dex for the
following reasons:
- Dex supports local, static users/passwords with dummy email addresses. This is useful for getting
started, reducing upfront requirements, and for testing purposes.
- If obtaining a client application from your organization’s IdP is a difficult process or not
possible, Dex can be used as an IdP to other services you may have more access to, such as GitHub.
- If you are using Azure AD and you wish to limit Akuity Platform authentication through Azure AD
groups. Dex is able to perform translation of Azure AD groups to OIDC claims, and limit logins to
particular groups (without any configuration on the IdP side).
### SMTP
SMTP is used to send emails notifying users that they have been invited to an organization. It is
optional. If not configured users will not be notified about a pending invite but can still navigate
to their account page to accept an invite.
## Installation
For longer term management and updates, we recommend using Argo CD to manage the platform. However,
there is a chicken and egg problem as you need to do the initial installation and creation of the
manifests before they can be managed by Argo CD. To assist with this we have a scaffolding for
bootstrapping your installation. To use it, run the following command in a directory where you want
to keep the manifest files:
```console
curl -fsSL -o quickstart.zip https://dl.akuity.io/self-hosted/quickstart.zip && unzip quickstart.zip && rm quickstart.zip
# Feel free to rename the directory if you want before continuing
cd quickstart
helm pull oci://us-docker.pkg.dev/akuity/akp-sh/charts/akuity-platform --untar --untardir charts
```
This directory contains a `values.yaml` file with some of the most common configuration items
available for you to customize. You will need to edit this file and fill out the details specific to
your installation.
If you need to make additional customizations that are not supported by the chart, you can use the
`kustomization.yaml` file to make those last-mile modifications.
Once you have configured your values and customizations, use the following command to deploy the
Akuity Platform:
```console
kustomize build --enable-helm | kubectl apply -f -
```
Once you have run this command, the Akuity Platform will be installed in your cluster. You can also
commit the manifests to your Git repository and use Argo CD to manage the platform going forward.
## Changelogs
You can find the changelogs for the Self Hosted Platform in the
[changelog](../06-changelog/30-selfhosted/index.mdx) section of the documentation.
---
## Bring Your Own Ingress
The Akuity Platform requires the use of several features provided by the
[Traefik](https://doc.traefik.io/traefik/) ingress controller. As such, it is installed and managed
as part of the self-hosted platform. For most installations, you can use this Ingress alongside your
current ingress or on its own. However, some use cases require you to use your own ingress
controller for compliance or other reasons such as controlling TLS termination. This document
describes how bring your own ingress controller to the Self Hosted Akuity Platform.
This document assumes familiarity with Kubernetes networking and Ingress resources.
## Bringing your own ingress
To bring your own ingress controller, you'll need to disable TLS termination in the chart. Doing
this will setup the Traefik ingress controller to use an internal `ClusterIP` address rather than a
public `LoadBalancer`. It also means your ingress controller will need to handle TLS termination for
your connections. Once the Helm chart is installed, you need to create several Ingress resources
that route to the Traefik `Service` inside the cluster. This service is found in the
`traefik-external` namespace once the self-hosted platform is installed. There is 1 address and 4
wildcard addresses that need to be routed to the Traefik ingress controller. The fully qualified
address is for the Self Hosted Platform UI. This is also set as part of installing the chart and
will likely be something like `akuity.mycompany.com`
The wildcard addresses by default will be based off of the top level domain you set above. So, using
`akuity.mycompany.com` as an example, the wildcard addresses will be:
- `*.cdsvcs.akuity.mycompany.com`
- `*.cd.akuity.mycompany.com`
- `*.kargo.akuity.mycompany.com` (if using the Kargo feature)
- `*.kargosvcs.akuity.mycompany.com` (if using the Kargo feature)
:::info
If you are using other domain names or subdomains, you will need to adjust the wildcard addresses to
match those addresses instead. For example, if you wanted your ArgoCD instances available on the
`.argocd.mycompany.com` domain for each team, you would need to setup an ingress that
routes `*.argocd.mycompany.com` to the `traefik` service in the `traefik-external` namespace.
:::
What you end up with is something that should look like this:
```mermaid
graph LR
subgraph "User's Ingress Namespace"
userIng1["Ingress: akuity.mycompany.com"]
userIng2["Ingress: *.cdsvcs.akuity.mycompany.com"]
userIng3["Ingress: *.cd.akuity.mycompany.com"]
userIng4["Ingress: *.kargo.akuity.mycompany.com"]
userIng5["Ingress: *.kargosvcs.akuity.mycompany.com"]
end
subgraph "traefik-external Namespace"
traefikSvc["Service:\ntraefik:80"]
traefikPod["Traefik Ingress Controller"]
end
subgraph "Akuity managed namespaces"
akuityUI["Akuity Platform"]
akuityCdSvc["Akuity Agent Services"]
akuityKargoSvc["Akuity Kargo Services"]
end
userIng1 --> traefikSvc
userIng2 --> traefikSvc
userIng3 --> traefikSvc
userIng4 --> traefikSvc
userIng5 --> traefikSvc
traefikSvc --> traefikPod
traefikPod --> akuityUI
traefikPod --> akuityCdSvc
traefikPod --> akuityKargoSvc
classDef ingress fill:#f9f,stroke:#333,stroke-width:2px,color:#000;
classDef service fill:#bbf,stroke:#333,stroke-width:2px,color:#000;
classDef controller fill:#bfb,stroke:#333,stroke-width:2px,color:#000;
classDef platform fill:#fbb,stroke:#333,stroke-width:2px,color:#000;
class userIng1,userIng2,userIng3,userIng4,userIng5 ingress;
class traefikSvc service;
class traefikPod controller;
class akuityUI,akuityCdSvc,akuityKargoSvc platform;
```
## Example using Nginx Ingress
As there are many ingress controllers and configurations, it is impossible to provide a complete
example for all use cases. However, the following example shows how to use the Nginx ingress
controller with the Self Hosted Akuity Platform and should be adaptable to your ingress controller
of choice. This example uses the same "akuity.mycompany.com" domain as above. It also assumes you
have the Nginx ingress controller installed and running with an ingress class name of `nginx`.
:::info
For ease of use, the following example creates the Ingresses in the `traefik-external` namespace.
You can create them in any namespace, but you'll need to configure your ingress controller and/or
network policies to allow cross-namespace routing
:::
```yaml
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: akuity-external-main
namespace: traefik-external
spec:
ingressClassName: nginx
rules:
- host: "akuity.mycompany.com"
http:
paths:
- backend:
service:
name: traefik
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: akuity-external-cdsvcs
namespace: traefik-external
annotations:
# Recommended but not required annotations as the agent tunnel has a long-running connection
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
ingressClassName: nginx
rules:
- host: "*.cdsvcs.akuity.mycompany.com"
http:
paths:
- backend:
service:
name: traefik
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: akuity-external-cd
namespace: traefik-external
spec:
ingressClassName: nginx
rules:
- host: "*.cd.akuity.mycompany.com"
http:
paths:
- backend:
service:
name: traefik
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: akuity-external-kargo
namespace: traefik-external
spec:
ingressClassName: nginx
rules:
- host: "*.kargo.akuity.mycompany.com"
http:
paths:
- backend:
service:
name: traefik
port:
number: 80
path: /
pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: akuity-external-kargosvcs
namespace: traefik-external
spec:
ingressClassName: nginx
rules:
- host: "*.kargosvcs.akuity.mycompany.com"
http:
paths:
- backend:
service:
name: traefik
port:
number: 80
path: /
pathType: Prefix
```
## Caveats
When you disable TLS termination and bring your own ingress, by default all ArgoCD clusters will be
created with the Redis tunneling feature enabled. This is due to the difficulty (and sometimes
impossibility) of passing through a TLS connection in a double ingress scenario or with some load
balancers that handle TLS termination. In practice, you will not see any difference from a normal
Redis connection that routes through your ingress as it will instead route through the tunnel
connection established by the Akuity agent.
You can disable redis tunneling on Clusters you create, but be aware that this is not recommended
practice and must be self-supported rather than supported by Akuity.
---
## Multi-Region
Multi-region functionality in the Akuity Platform enables the distribution of Argo CD instances across clusters in different regions and/or cloud providers, allowing you to select where each Argo CD instance is created. This is done using the sharding feature of the Akuity Platform.
:::danger
Multi-regional deployment of the Akuity Platform is an advanced function. Review this page in its entirety and ensure that you understand the requirements and limitations of this feature before proceeding.
Contact support before proceeding if anything is unclear.
:::
## Considerations and Limitations
- Multi-regional deployment of the Akuity Platform does not constitute a backup or high-availability solution.
- Argo CD instances cannot be moved to another region after creation.
- Region names cannot not be modified once Argo CD instances are deployed to it.
- Region assignments to Organizations require manual database changes.
- Argo CD URLs will use a unique regional subdomain.
## Requirements
- A working Akuity Platform installation in your primary region.
- At least 1 organization created in the Akuity Platform.
- At least 1 additional Kubernetes cluster.
- At least 1 database instance per additional Kubernetes cluster.
- Network connectivity to the database instance in your primary region from all non-primary regions.
- A DNS zone for each region matching the region's name.
- A wildcard SSL certificate for each region with SANs matching the region's name.
## Enable Multi-Region
### Helm Values
The Helm values used for your **non-primary** region/s will typically match your primary region. The only exception is your **non-primary** region/s should have `.platformController.shard` set to the name desired for that region (ex. `us-west`).
:::info
The Helm value set for `.platformController.shard` is incorporated into the FQDN for instances in that region. For example, instances assigned to a shard named `us-west` would use an FQDN like \.cd.**us-west**.mydomain.com. Instances assigned to a shard named `us-central` would use an FQDN like \.cd.**us-central**.mydomain.com. Instances not assigned to a shard will use the usual FQDN form of \.cd.mydomain.com.
You will need to ensure that the SANs for the SSL certificate deployed in a region match the FQDNs that will be used in that region.
:::
### Kustomizations
#### Adjusting Database Configurations of Non-Primary Shards
Each **non-primary** region/shard will need it's own database in addition to being able to access the database configured in the primary region. The K3S database connection strings for each shard will need to be overridden to make the shard connect to its own database. To make this change using Kustomize, use the following patches:
```
patches:
- target:
kind: Secret
name: akuity-platform
patch: |-
- op: replace
path: /data/K3S_DB_CONNECTION
value:
- op: replace
path: /data/K3S_RO_DB_CONNECTION
value:
```
:::note
Replace `` with a base64'd database connection string for that region/shard.
Example:
```
echo -n 'host=db.us-west.mydomain.com port=5432 sslmode=require dbname=postgres user=myuser password=mypassword' | base64
```
:::
#### (Optional) Using a Custom Shard Name in the Primary Region
To assign a unique shard name to your **primary region**, you can apply the follow Kustomize patch:
```
patches:
- target:
kind: Deployment
name: platform-controller
patch: |-
- op: add
path: /spec/template/spec/containers/0/args/-
value: --shard=
```
:::danger
If the primary region is configured using a unique shard name, instances created in an organization without any assigned shards will be undeployable. Note that the primary region can still be used alongside other shards without specifying a unique shard name.
:::
### Assigning Shards to Organizations
In order to assign an Argo CD instance to a region, that region's shard must first be assigned to an organization in the Akuity Platform.
To assign shards to an organization, you must update the database in the **primary region** and explicitly specify which shards each organization is allowed to deploy to.
1. Connect to the database.
```
psql "host=db.us-west.mydomain.com port=5432 sslmode=require dbname=postgres user=myuser password=mypassword"
```
1. Update the organization with the shards you wish to assign
```
UPDATE organization SET feature_gates='{"shards":["",""]}' WHERE name='';
```
:::info
The JSON list of shard names should be expanded to contain the names of all desired shards to be made available to an organization.
:::
:::info
The primary region can be made an option in the Region dropdown even if a unique shard name has not been specified. If a unique name has not been specified for the primary region, this can be done by setting one of the shard names in the `shards` list of the SQL query above as empty (`""`). The primary region will then become an option during instance creation with the region name `us0`.
:::
### Creating an Instance
Once sharding has been enabled for an organization, you will see a new Region dropdown with a list of the shard names you assigned to the organization in the previous step.

:::note
If you are missing this dropdown, verify that you assigned **at least** 2 shards to the organization in the previous section.
:::
#### Validation
To verify your instance has been or is being created in the selected region:
1. Change your `kubectl` context to the region/shard you assigned your instance to.
1. Run `kubectl get ns`.
1. A new `argocd-` namespace should appear.
---
## Images List
If you are running a self-hosted version of the Akuity Platform, you might want to re-tag the images to use a different registry. The following images are used by the Self-Hosted Akuity Platform. This list is not exhaustive and may change over time.
:::tip
Akuity publishes [OpenVEX](https://openvex.dev/) vulnerability assessments and signed attestations for the public images below (the agent, Argo CD, and Kargo). See [Verifying Images](../02-akuity-portal/01-security/30-verifying-images.md) to apply them during scanning or verify them with cosign.
:::
## Component Versions
Some images are tagged based on the component version, irrespective of the Akuity Platform version. The following images depend on the component version:
- `quay.io/argoproj/argocd:`: Repository used for OSS ArgoCD images, the tag required would match the version of OSS ArgoCD you are using. Example: `quay.io/argoproj/argocd:v2.14.9`.
- `quay.io/akuity/argocd:`: Repository used for the Enterprise ArgoCD images, the tag required would match the version of Enterprise ArgoCD you are using. Example: `quay.io/akuity/argocd:v2.14.9-ak.53`
- `quay.io/argoprojlabs/argocd-image-updater:`: Repository for ArgoCD Image Updater images. The tag must match the version of ArgoCD Image Updater you are using, which can be configured in the Image Updater section of your AKP ArgoCD Instance Settings. Example: `quay.io/argoprojlabs/argocd-image-updater:v0.14.0`
- `ghcr.io/akuity/kargo:`: Repository used for the Kargo images, the tag required would match the version of Kargo you are using. Example: `ghcr.io/akuity/kargo:v1.4.0`
- `quay.io/akuity/agent:`: Repository used for the Agent images, the tag required would match the version of the Agent you are using. Example: `quay.io/akuity/agent:0.5.57`
- `us-docker.pkg.dev/akuity/akp-sh/agent-server:latest`: Repository used for the Agent Server images.
In addition to the above images, the images listed in the next section are dependent on the Akuity Platform version you are using.
## Image List
### v0.32.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.25.1-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.3.8-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- quay.io/argoproj/argo-rollouts:v1.9.0
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.96
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.31.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.25.1-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.3.8-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.95
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.31.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.25.1-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.3.8-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.94
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.31.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.25.1-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.3.8-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.94
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.30.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.25.1-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.3.8-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.90
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.29.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.80
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.29.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.8-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.82
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.28.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.80
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.28.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.80
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.28.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- quay.io/argoproj/argo-rollouts:v1.8.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.80
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.27.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.75
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.26.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.11-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.72
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.26.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.2.6-alpine
- quay.io/akuity/rancher/k3s:v1.33.5-k3s1
- quay.io/akuity/redis:7.2.10-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.71
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.25.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.2.10-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.64
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.24.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.61
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.23.3
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.59
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.23.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.59
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.23.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.59
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.23.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.59
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.22.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.58
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.22.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/edoburu/pgbouncer:v1.24.0-p0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.32.3-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.58
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.22.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.57
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.5
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.57
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.4
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.56
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.3
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.55
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.2
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.54
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.54
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.21.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/pgbouncer:v1.24.0-p0
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.54
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.20.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.54
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.20.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.30.8-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/argoproj/argo-rollouts:v1.7.2
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.53
- us-docker.pkg.dev/akuity/docker-io/curlimages/curl:8.11.1
### v0.19.1
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.30.5-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/akuityio/argo-rollouts:v1.6.5-ak.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.49
### v0.19.0
- ghcr.io/dexidp/dex:v2.37.0
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/ghcr.io/appscode-images/pgpool2:4.5.3
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.30.5-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/akuityio/argo-rollouts:v1.6.5-ak.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.49
### v0.18.0
- ghcr.io/dexidp/dex:v2.37.0
- pgpool/pgpool:4.3.1
- quay.io/akuity/busybox:1.36.0
- quay.io/akuity/dexidp/dex:v2.38.0
- quay.io/akuity/haproxy:3.0.5-alpine
- quay.io/akuity/rancher/k3s:v1.28.14-k3s1
- quay.io/akuity/redis:7.0.14-alpine
- quay.io/akuityio/argo-rollouts:v1.6.5-ak.3
- us-docker.pkg.dev/akuity/akp-sh/agent-server:0.5.47
---
## Helm Values Reference
This page contains the reference for all the Helm values options available in the Self Hosted Akuity Platform.
## Parameters
### License Key
| Name | Description | Value |
| ------------ | ----------- | ----- |
| `licenseKey` | | `""` |
### Image Parameters
| Name | Description | Value |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `image.repository` | Image repository of the Akuity Platform | `us-docker.pkg.dev/akuity/akp-sh/akuity-platform` |
| `image.tag` | Overrides the image tag (default is the chart version) | `""` |
| `image.secret.enabled` | Reference the 'akuity-pullsecrets' image pull secret from platform workloads. Disable when images are pulled without a secret (e.g. node IRSA for ECR). | `true` |
| `image.secret.create` | Creates the 'akuity-pullsecrets' secret. Set to false when the secret is provided externally (e.g. via External Secrets Operator). | `true` |
| `image.username` | Username to the Akuity Platform container registry | `_json_key_base64` |
| `image.password` | Password to the Akuity Platform container registry | `""` |
| `image.argocd.host` | Overrides the Argo CD image host | `""` |
| `image.argocd.repo` | Overrides the Argo CD image repository | `""` |
| `image.agentServer.host` | Overrides the agent server image host. If not set, the host | `nil` |
### Portal Parameters
| Name | Description | Value |
| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- |
| `portal.url` | Public URL to portal (e.g. `https://akuity.example.com`) | `""` |
| `portal.imagePullPolicy` | Portal server image pull policy | `Always` |
| `portal.debug` | Enable debug logging on the portal server. Only enable in production for debugging purposes. | `false` |
| `portal.maxEmailInvitationsPerBatch` | Maximum number of invitation emails which can be sent in one go | `5` |
| `portal.autoscaling.enabled` | Enables horizontal pod autoscaling for the portal server | `true` |
| `portal.autoscaling.minReplicas` | Sets the minimum number of replicas | `3` |
| `portal.autoscaling.maxReplicas` | Sets the maximum number of replicas | `10` |
| `portal.autoscaling.targetCPUUtilizationPercentage` | Sets the target CPU utilization percentage | `80` |
| `portal.autoscaling.targetMemoryUtilizationPercentage` | Sets the target memory utilization percentage | `80` |
| `portal.seed.organization.name` | Creates an organization with a given name | `nil` |
| `portal.seed.organization.owner` | Creates an owner for the given organization with the given e-mail address. | `nil` |
| `portal.seed.organization.apiKey.create` | If set to true, generates an api key for the given organization. | `nil` |
| `portal.seed.organization.apiKey.description` | Sets the description for the API Key. | `nil` |
| `portal.seed.organization.apiKey.role` | Can be set to organization/owner (default), organization/admin or organization/member | `nil` |
| `portal.seed.organization.apiKey.expiryIn` | A valid interval string (e.g 1d, 2w, 6h) or 0 (default) for no expiry. | `nil` |
| `portal.seed.organization.apiKey.outputFormat` | Can be set to wide (default) or json | `nil` |
| `portal.seed.organization.apiKey.recreate` | Recreate the key if it already exists (default: false) | `nil` |
| `portal.resources` | Resources limits and requests for the portal server containers | `{}` |
| `portal.tolerations` | Tolerations for the portal-server pod | `[]` |
| `portal.serviceAccount.annotations` | Annotations for the portal-server service account | `{}` |
| `portal.env` | Additional environment variables added to the portal server | `{}` |
| `portal.env.OTEL_SDK_DISABLED` | Disables the OpenTelemetry SDK. Defaults to `"true"` (no traces exported). Set to `"false"` and configure the standard `OTEL_TRACES_EXPORTER` / `OTEL_EXPORTER_OTLP_*` variables to export traces to an OTLP collector. | `true` |
| `portal.env.OTEL_SERVICE_NAME` | Sets the OpenTelemetry `service.name` resource attribute reported on this component's traces. | `portal-server` |
| `portal.env.MIN_ORGANIZATION_NAME_LENGTH` | The minimum length of an organization name that is allowed on the platform, minimum value is `2`, defaults to `4` if undefined | `nil` |
| `portal.env.MIN_CLUSTER_NAME_LENGTH` | The minimum length of a cluster name that is allowed on the platform, minimum value is `2`, defaults to `3` if undefined | `nil` |
| `portal.env.MIN_INSTANCE_NAME_LENGTH` | The minimum length of an Argo CD instance name that is allowed on the platform, minimum value is `2`, defaults to `3` if undefined | `nil` |
| `portal.topologySpreadConstraints` | Sets topology spread constraints for the portal server deployment | `nil` |
### Platform controller Parameters
| Name | Description | Value |
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `platformController.imagePullPolicy` | Platform controller image pull policy | `Always` |
| `platformController.debug` | Enable debug logging on the platform controller. Only enable in production for debugging purposes. | `false` |
| `platformController.domainSuffix` | Platform controller domain suffix to use (defaults to hostname of `.portal.url`) | `""` |
| `platformController.instanceSubDomains` | Enables using nested subdomains for managed argocd/kargo instances | `true` |
| `platformController.overrideDefaultDomains` | Enables setting subdomains for k3s, agent server etc. or setting the FQDN as a suffix for those services. | `false` |
| `platformController.userProvidedArgoCDVersions` | Enables setting extra Argo CD _patch_ versions. This is useful if an Argo CD version has been released (e.g a critical bugfix or a CVE) that is not present in the current version of the Akuity Platform. | `[]` |
| `platformController.tolerations` | Tolerations for the platform controller pod | `[]` |
| `platformController.serviceAccount.annotations` | Annotations for the platform controller service account | `{}` |
### Resources limits and requests for the platform controller containers
| Name | Description | Value |
| ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| `platformController.env` | Adds additional environment variables to the platform controller configmap | `{}` |
| `platformController.env.OTEL_SDK_DISABLED` | Disables the OpenTelemetry SDK. Defaults to `"true"` (no traces exported). Set to `"false"` and configure the standard `OTEL_TRACES_EXPORTER` / `OTEL_EXPORTER_OTLP_*` variables to export traces to an OTLP collector. | `true` |
| `platformController.env.OTEL_SERVICE_NAME` | Sets the OpenTelemetry `service.name` resource attribute reported on this component's traces. | `platform-controller` |
| `platformController.env.ARGOCD_APP_RESYNC_INTERVAL_SECONDS` | Argo CD Application resync interval in seconds (if `0` or undefined then Argo CD built-in default is used) | `nil` |
| `platformController.env.AGENT_STATUS_UPDATE_INTERVAL_SECONDS` | Agent status update interval in seconds (if `0` or undefined then Agent built-in default is used) | `nil` |
| `platformController.env.SHARED_K3S_DB_CONNECTION_AUTH` | Set to `true` for all tenants to use database.user and database.password credentials rather than a personal credentials for each tenant. This might be needed when connecting to the database through RDS Proxy which has a limit of 200 users | `nil` |
| `platformController.commonAgentCert` | common agent cert provides the shared certificate for both *.cdsvcs.akuity.example.com as well as *.kargosvcs.akuity.example.com domains used by agents | `""` |
| `platformController.argocdAgentCert` | argocd agent cert provides the certificate for only *.cdsvcs.akuity.example.com used by argocd agents | `""` |
| `platformController.kargoAgentCert` | kargo agent cert provides the certificate for only *.kargosvcs.akuity.example.com domains used by kargo agents | `""` |
### Notification controller Parameters
| Name | Description | Value |
| --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------- |
| `notificationController.enabled` | Enabled the notification controller | `false` |
| `notificationController.imagePullPolicy` | Notification controller image pull policy | `Always` |
| `notificationController.debug` | Enable debug logging on the notification controller. Only enable in production for debugging purposes. | `false` |
| `notificationController.tolerations` | Tolerations for the notification controller pod | `[]` |
| `notificationController.serviceAccount.annotations` | Annotations for the notification controller service account | `{}` |
| `notificationController.resources` | Resources limits and requests for the notification controller containers | `{}` |
| `notificationController.env` | Adds additional environment variables to the notification controller configmap | `{}` |
| `notificationController.env.OTEL_SDK_DISABLED` | Disables the OpenTelemetry SDK. Defaults to `"true"` (no traces exported). Set to `"false"` and configure the standard `OTEL_TRACES_EXPORTER` / `OTEL_EXPORTER_OTLP_*` variables to export traces to an OTLP collector. | `true` |
| `notificationController.env.OTEL_SERVICE_NAME` | Sets the OpenTelemetry `service.name` resource attribute reported on this component's traces. | `notification-controller` |
| `addonController.enabled` | Enabled the addon controller | `true` |
| `addonController.imagePullPolicy` | Notification controller image pull policy | `Always` |
| `addonController.debug` | Enable debug logging on the addon controller. Only enable in production for debugging purposes. | `false` |
| `addonController.tolerations` | Tolerations for the addon controller pod | `[]` |
| `addonController.serviceAccount.annotations` | Annotations for the addon controller service account | `{}` |
| `addonController.resources` | Resources limits and requests for the addon controller containers | `{}` |
| `addonController.env` | Adds additional environment variables to the addon controller configmap | `{}` |
| `addonController.env.OTEL_SDK_DISABLED` | Disables the OpenTelemetry SDK. Defaults to `"true"` (no traces exported). Set to `"false"` and configure the standard `OTEL_TRACES_EXPORTER` / `OTEL_EXPORTER_OTLP_*` variables to export traces to an OTLP collector. | `true` |
| `addonController.env.OTEL_SERVICE_NAME` | Sets the OpenTelemetry `service.name` resource attribute reported on this component's traces. | `addon-controller` |
### Secret Parameters
| Name | Description | Value |
| --------------- | ------------------------------------ | ------ |
| `secret.create` | Creates the 'akuity-platform' Secret | `true` |
### TLS Parameters
TLS configuration for ingress. These details are used for configuring Traefik with the proper certificates.
| Name | Description | Value |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------ |
| `tls.terminationEnabled` | Enable TLS for the Akuity Platform. TLS can be disabled to allow for SSL termination to be handled by a load balancer or other proxy/ingress before it reaches the Akuity Platform | `true` |
| `tls.secret.create` | Creates the 'akuity-platform-tls' Secret used as the Traefik default certificate. Set to false if creating the secret in another way (e.g. cert-manager) | `true` |
| `tls.crt` | TLS certificate. Can be valid for multiple domains (e.g. https://akuity.example.com, https://\*.cd.akuity.example.com, https://\*.cdsvcs.akuity.example.com) | `""` |
| `tls.key` | TLS private key | `""` |
| `tls.additionalCertificates` | List of additional TLS certificates to serve in the form of Kubernetes Secrets. This may be necessary if different certificates are used for different domains (e.g. https://akuity.example.com, https://\*.cd.akuity.example.com, https://\*.cdsvcs.akuity.example.com) | `[]` |
### Database Parameters
| Name | Description | Value |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
| `database.host` | Database hostname | `""` |
| `database.port` | Database port | `5432` |
| `database.user` | Database username | `""` |
| `database.password` | Database password | `""` |
| `database.dbname` | Database name | `postgres` |
| `database.schemaname` | Schema name | `public` |
| `database.createSchema` | create schema automatically | `false` |
| `database.dataKey` | 256-bit base64 encoded encryption key used for envelope encryption of sensitive data columns. A random key can be generated with the following command: `openssl rand -base64 32`. NOTE: loss of this key will result in permanent and irrevocable data loss! | `""` |
| `database.readOnlyHost` | Database read-only hostname. Used for connection load balancing of read requests to read-only database replicas. If omitted, will default to the write hostname. | `""` |
| `database.sslmode` | Database SSL mode | `require` |
### Password Policy Parameters
Password complexity policy applied to all platform-generated passwords (tenant Postgres users,
Redis instance passwords, and agent passwords). Each field is optional — leave it unset to keep
the platform default (a 21-character mixed-case alphanumeric password including special
characters). These overrides exist primarily for self-hosted deployments whose database engine
(e.g. GCP Cloud SQL with `password_validation_policy`) enforces a stricter or different policy
than the platform default.
| Name | Description | Value |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----- |
| `passwordPolicy.length` | Length of generated passwords. Leave unset (or 0) to use the platform default of 21 characters. Must be at least as large as the number of enabled character classes. | `nil` |
| `passwordPolicy.useSpecialChars` | Whether to include non-alphanumeric characters in generated passwords. Set to `false` if the target database rejects passwords containing special characters; set to `true` if the database requires at least one special character. Leave unset to use the platform default (`true`). | `nil` |
| `passwordPolicy.useNumbers` | Whether to include digits in generated passwords. Leave unset to use the platform default (`true`). | `nil` |
| `passwordPolicy.useUppercase` | Whether to include uppercase letters in generated passwords. Leave unset to use the platform default (`true`). | `nil` |
| `passwordPolicy.useLowercase` | Whether to include lowercase letters in generated passwords. Leave unset to use the platform default (`true`). | `nil` |
### SSO Parameters
Single Sign-On configuration. Either OIDC or auth0 must be configured.
| Name | Description | Value |
| ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- |
| `sso.oidc.enabled` | Enable OIDC authentication | `true` |
| `sso.oidc.issuer` | OIDC issuer URL. This value is ignored if dex is enabled and served as a subpath | `""` |
| `sso.oidc.clientID` | OIDC client ID. If dex is enabled, value will be used as Dex's client ID | `""` |
| `sso.oidc.clientSecret` | OIDC client secret. If dex is enabled, value will be used as Dex's client secret | `""` |
| `sso.oidc.scopes` | OIDC scopes to request (default: openid,profile,email,offline_access) | `openid,profile,email,offline_access` |
| `sso.oidc.logoutURL` | OIDC logout url | `""` |
| `sso.oidc.insecureSkipTLSVerify` | Skip TLS verification of the OIDC provider. This will be needed if dex is served as a subpath, and TLS is not yet configured. | `false` |
| `sso.auth0.enabled` | Enable Auth0 configuration | `false` |
| `sso.auth0.domain` | Auth0 domain (e.g. example.us.auth0.com) | `""` |
| `sso.auth0.audience` | Auth0 Audience of the token | `""` |
| `sso.auth0.clientID` | Auth0 client id for portal service | `nil` |
| `sso.auth0.cliClientID` | Auth0 client id for CLI | `nil` |
| `sso.dex.enabled` | Install dex | `false` |
| `sso.dex.image.repository` | Image repository for Dex | `ghcr.io/dexidp/dex` |
| `sso.dex.image.tag` | Overrides the Dex image tag | `v2.35.3` |
| `sso.dex.image.secret.create` | Creates the 'dex-pullsecrets' secret | `false` |
| `sso.dex.image.username` | Username for the Dex container registry | `""` |
| `sso.dex.image.password` | Password for the Dex container registry | `""` |
| `sso.dex.tolerations` | Tolerations for the Dex pod | `[]` |
| `sso.dex.imagePullSecrets` | Image pull secrets for Dex | `[]` |
| `sso.dex.serviceAccount.annotations` | Annotations for the Dex service account | `{}` |
| `sso.dex.secret.create` | Creates the 'dex' Secret whose data values will be mounted as environment variables to the Dex Deployment | `true` |
| `sso.dex.secret.data` | Secret data keys and plain-text values to set in the 'dex' Secret. These will be environment variables to dex so they can be referenced in the dex/config.yaml | `{}` |
| `sso.dex.resources` | Resources limits and requests for the Dex containers | `{}` |
| `sso.dex.issuerSubPath` | Serve dex as a subpath of the portal URL (e.g. https://akuity.example.com/dex) | `true` |
| `sso.dex.ingress.enabled` | Enable ingress to dex | `false` |
| `sso.dex.ingress.host` | Host value to dex ingress | `""` |
| `sso.dex.config` | Additional dex/config.yaml configuration. See https://dexidp.io/docs/ for dex documentation. Configuration can reference environment variables in the 'dex' Secret (e.g. $MICROSOFT_CLIENT_SECRET) | `{}` |
| `sso.roleFromGroups` | Contains the SSO groups that will be automatically assigned roles | `nil` |
| `sso.roleFromGroups.member` | Comma separated list of SSO groups that will be assigned the 'member' role | `""` |
| `sso.roleFromGroups.admin` | Comma separated list of SSO groups that will be assigned the 'admin' role | `""` |
| `sso.roleFromGroups.owner` | Comma separated list of SSO groups that will be assigned the 'owner' role | `""` |
| `sso.roleTeamFromGroups` | Contains the slice of SSO groups with org and team mapping | `nil` |
| `sso.roleTeamFromGroups.oidcGroup` | SSO group name | `nil` |
| `sso.roleTeamFromGroups.orgRole` | org role(`member` or `owner`) | `nil` |
| `sso.roleTeamFromGroups.teams` | slice of teams to be assigned | `nil` |
| `sso.roleTeamFromGroups.teams.name` | name of the team | `nil` |
### Traefik Parameters
Traefik is a required component of the Akuity Platform.
The Akuity Platform expects a `traefik-external` ingress class to be present and is installed with Traefik in this section.
| Name | Description | Value |
| ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| `traefik.enabled` | Install Traefik | `true` |
| `traefik.service.annotations` | Annotations for the Traefik service. CAUTION: This has the potential to override annotations set by `aws.enabled` or `compatibility.ipv6`! | `{}` |
| `traefik.service.loadBalancerClass` | Allows for setting the load balancer class. By default this is empty. NOTE: once set, this cannot be changed without destroying and recreating the service | `nil` |
| `traefik.tolerations` | Tolerations for the Traefik pod | `[]` |
| `traefik.imagePullSecrets` | Extra/optional image pull secrets for Traefik | `[]` |
| `traefik.serviceAccount.annotations` | Annotations for the Traefik service account | `{}` |
| `traefik.image.repository` | Image repository for Traefik | `public.ecr.aws/docker/library/traefik` |
| `traefik.image.tag` | Overrides the Traefik image tag | `v3.3.6` |
| `traefik.image.secret.create` | Creates the 'traefik-pullsecrets' secret | `false` |
| `traefik.image.username` | Username for the Traefik container registry | `""` |
| `traefik.image.password` | Password for the Traefik container registry | `""` |
| `traefik.crd.enabled` | Install Traefik CRDs | `true` |
| `traefik.websecureRedirect` | Redirect 80 to 443. Only set this to false for testing purposes | `true` |
| `traefik.forceLoadBalancer` | Forces the traefik service to be of type LoadBalancer. By default, if tls.terminationEnabled is true, the service will be of type LoadBalancer. If tls.terminationEnabled is false, the service will be of type ClusterIP. This allows you to override the default behavior and force the service to be of type LoadBalancer. | `false` |
| `traefik.autoscaling.enabled` | Enables horizontal pod autoscaling for Traefik | `true` |
| `traefik.autoscaling.minReplicas` | Sets the minimum number of replicas | `3` |
| `traefik.autoscaling.maxReplicas` | Sets the maximum number of replicas | `20` |
| `traefik.autoscaling.targetCPUUtilizationPercentage` | Sets the target CPU utilization percentage | `80` |
| `traefik.autoscaling.targetMemoryUtilizationPercentage` | Sets the target memory utilization percentage | `80` |
| `traefik.replicas` | If autoscaling is not enabled, the number of replicas for the Traefik deployment | `1` |
| `traefik.resources` | Resources limits and requests for the Traefik containers | `{}` |
| `traefik.topologySpreadConstraints` | Sets topology spread constraints for the Traefik deployment | `nil` |
### Other Parameters
| Name | Description | Value |
| ----------------------------- | ---------------------------------------------------- | ------- |
| `agent.insecureSkipTLSVerify` | Skip TLS verification from agents to Akuity Platform | `false` |
| `aws.enabled` | Add AWS specific annotations to resources | `true` |
### Kargo Instance Parameters
| Name | Description | Value |
| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `kargoInstanceValues.k3s.etcd_compaction_interval` | Interval at which the kube-apiserver triggers Kine compaction. Lower values compact more frequently but increase database load. Only adjust after investigating database performance, instance resource limits, and workload. | `5m` |
| `kargoInstanceValues.k3s.kine_compact_timeout` | Maximum time allowed for a single compaction transaction. Only adjust after investigating database performance, instance resource limits, and workload. | `5s` |
| `kargoInstanceValues.k3s.kine_compact_batch_size` | Number of revisions to compact per batch. Smaller batches reduce per-transaction load but may take more cycles to catch up. Only adjust after investigating database performance, instance resource limits, and workload. | `1000` |
### Argo CD Instance Parameters
| Name | Description | Value |
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| `instanceValues.k3s.etcd_compaction_interval` | Interval at which the kube-apiserver triggers Kine compaction. Lower values compact more frequently but increase database load. Only adjust after investigating database performance, instance resource limits, and workload. | `5m` |
| `instanceValues.k3s.kine_compact_timeout` | Maximum time allowed for a single compaction transaction. Only adjust after investigating database performance, instance resource limits, and workload. | `5s` |
| `instanceValues.k3s.kine_compact_batch_size` | Number of revisions to compact per batch. Smaller batches reduce per-transaction load but may take more cycles to catch up. Only adjust after investigating database performance, instance resource limits, and workload. | `1000` |
| `instanceValues.kustomization` | Kustomizations to be applied to Argo CD instances | `nil` |
| `instanceValues.k3s_proxy` | k3s proxy parameters | `nil` |
| `instanceValues.pgpool` | pgpool parameters | `nil` |
| `smtp.host` | SMTP host | `""` |
| `smtp.port` | SMTP port | `587` |
| `smtp.user` | SMTP username | `""` |
| `smtp.password` | SMTP password | `""` |
| `liquibase.image.repository` | Image repository for Liquibase | `quay.io/akuity/liquibase` |
| `liquibase.image.tag` | Overrides the Liquibase image tag | `4.32` |
| `liquibase.image.secret.create` | Creates the 'liquibase-pullsecrets' secret | `false` |
| `liquibase.image.username` | Username for the Liquibase container registry | `""` |
| `liquibase.image.password` | Password for the Liquibase container registry | `""` |
### Dragonflydb
Dragonflydb Operator is used to deploy and manage Dragonfly instances, this should only be enabled for experimental purposes.
| Name | Description | Value |
| ---------------------------- | ------------------------------------------------------------------------------ | ------- |
| `dragonflydb.enabled` | Installs the Dragonfly operator. | `false` |
| `dragonflydb.replicas` | The number of replicas for the Dragonfly deployment | `2` |
| `dragonflydb.resources` | Resources limits and requests for the Dragonfly operator containers | `{}` |
| `dragonflydb.serviceMonitor` | When set true then use a ServiceMonitor to configure scraping for the operator | `false` |
### Instance Upgrader Parameters
Instance Upgrader is a job that upgrades managed instances during Akuity Platform upgrade.
| Name | Description | Value |
| -------------------------- | --------------------------------- | ------ |
| `instanceUpgrader.enabled` | Enables the instance upgrader job | `true` |
### Compatibility
Specify which compatibility modes will be required
| Name | Description | Value |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
| `compatibility.openshift` | Enables Openshift compatibility. This option will modify platform install manifests, Argo CD instance manifests, and Kargo instance manifests to support running on Openshift. | `false` |
| `compatibility.sidecarContainers` | enables use of the Kubernetes sidecar containers feature in the platform workloads | `true` |
| `compatibility.ipv6Only` | Enables IPv6 only compatibility | `false` |
### Callhome Parameters
Callhome periodically uploads a telemetry bundle to Akuity for usage tracking.
| Name | Description | Value |
| -------------------------- | ---------------------------------------------------- | --------------------------------------- |
| `callhome.enabled` | Enable the callhome CronJob | `true` |
| `callhome.schedule` | Cron schedule (default: weekly on Sunday at 2am UTC) | `0 2 * * 0` |
| `callhome.uploadUrl` | Akuity callhome upload endpoint | `https://telemetry-us.akuity.io/upload` |
| `callhome.imagePullPolicy` | Image pull policy | `IfNotPresent` |
| `callhome.resources` | Resource requests/limits | `{}` |
### Log Cleanup Parameters
Log Cleaner is a cron job that cleans up old logs stored from the database. These logs can be from different tasks like kargo analysis jobs etc.
| Name | Description | Value |
| ---------------------------- | ---------------------------------------------------------------------------------------------- | ----------- |
| `logCleaner.enabled` | Enables the log cleaner job | `false` |
| `logCleaner.dryRun` | Enables dry run mode for the log cleaner job, when enabled the entries aren't deleted | `false` |
| `logCleaner.debug` | Enable debug logging on the log cleaner job. Only enable in production for debugging purposes. | `false` |
| `logCleaner.imagePullPolicy` | image pull policy for the log cleaner | `Always` |
| `logCleaner.schedule` | Cron schedule for the log cleaner job | `0 0 * * *` |
| `logCleaner.resources` | Resources limits and requests for the log cleaner job | `{}` |
### Event Cleaner Parameters
Event Cleaner is a cron job that batch-deletes events older than a configurable retention window from the portal database.
| Name | Description | Value |
| ------------------------------ | ------------------------------------------------------------------------------------------------ | ----------- |
| `eventCleaner.enabled` | Enables the event cleaner job | `true` |
| `eventCleaner.dryRun` | Enables dry run mode for the event cleaner job, when enabled the entries aren't deleted | `false` |
| `eventCleaner.debug` | Enable debug logging on the event cleaner job. Only enable in production for debugging purposes. | `false` |
| `eventCleaner.imagePullPolicy` | image pull policy for the event cleaner | `Always` |
| `eventCleaner.schedule` | Cron schedule for the event cleaner job | `0 0 * * *` |
| `eventCleaner.batchSize` | Number of rows to delete per batch | `10000` |
| `eventCleaner.retentionDays` | Delete events older than this many days | `90` |
| `eventCleaner.resources` | Resources limits and requests for the event cleaner job | `{}` |
### Akuity Intelligence Parameters
Akuity Intelligence is an optional component that provides advanced insights and recommendations for your Kubernetes clusters.
| Name | Description | Value |
| -------------------------------------- | -------------------------------------------------------------------------------- | ----- |
| `intelligence.openAI.baseURL` | base URL for OpenAI API compatible endpoints (default https://api.openai.com/v1) | `""` |
| `intelligence.openAI.mainModel` | main model used by AI Agent (e.g. gpt-4.1) | `""` |
| `intelligence.openAI.searchModel` | model with search capabilities (e.g. gpt-4o-mini-search-preview) | `""` |
| `intelligence.openAI.lightweightModel` | lightweight model for non-critical tasks (e.g. gpt-4.1-nano) | `""` |
| `intelligence.openAI.apiKey` | OpenAI API key for Akuity Intelligence features | `""` |
| `intelligence.anthropic.apiKey` | Anthropic API key for Akuity Intelligence features | `""` |
| `intelligence.gemini.apiKey` | Gemini API key (Google AI Studio) for Akuity Intelligence features | `""` |
### LiteLLM Parameters
LiteLLM is a proxy server for LLM providers.
| Name | Description | Value |
| ------------------------------------------------------- | -------------------------------------------------- | ------------------------ |
| `litellm.image.repository` | Image repository for LiteLLM | `quay.io/akuity/litellm` |
| `litellm.image.tag` | LiteLLM image tag | `v1.90.0` |
| `litellm.autoscaling.enabled` | Enables horizontal pod autoscaling for LiteLLM | `true` |
| `litellm.autoscaling.minReplicas` | Sets the minimum number of replicas | `2` |
| `litellm.autoscaling.maxReplicas` | Sets the maximum number of replicas | `3` |
| `litellm.autoscaling.targetCPUUtilizationPercentage` | Sets the target CPU utilization percentage | `80` |
| `litellm.autoscaling.targetMemoryUtilizationPercentage` | Sets the target memory utilization percentage | `80` |
| `litellm.replicas` | If autoscaling is disabled, the number of replicas | `1` |
### Monitoring Parameters
Monitoring integration with the Prometheus Operator and Grafana.
When enabled, the chart deploys ServiceMonitors and PodMonitors for
scraping, a PrometheusRule with bundled alerts, a Grafana dashboard
ConfigMap, and a Grafana PostgreSQL datasource Secret used by the
dashboard's portal-DB-backed panels. Disabled by default. See the
Monitoring guide at https://docs.akuity.io/self-hosted/monitoring for
the full setup, verification, and operations reference.
| Name | Description | Value |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------- |
| `monitoring.enabled` | Enable monitoring integration (ServiceMonitors, PodMonitors, PrometheusRule, Grafana dashboard, Grafana datasource) | `false` |
| `monitoring.serviceMonitors.enabled` | Deploy ServiceMonitors for platform components | `true` |
| `monitoring.serviceMonitors.interval` | Prometheus scrape interval | `60s` |
| `monitoring.serviceMonitors.scrapeTimeout` | Prometheus scrape timeout (if empty, Prometheus uses the global scrape timeout) | `""` |
| `monitoring.serviceMonitors.additionalLabels.release` | Label that satisfies kube-prometheus-stack's default `serviceMonitorSelector` so Prometheus discovers these ServiceMonitors out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed. | `kube-prometheus-stack` |
| `monitoring.serviceMonitors.annotations` | Annotations on ServiceMonitor resources | `{}` |
| `monitoring.serviceMonitors.namespace` | Namespace to deploy ServiceMonitors into (defaults to release namespace) | `""` |
| `monitoring.serviceMonitors.relabelings` | Prometheus relabel configs applied before scraping | `[]` |
| `monitoring.serviceMonitors.metricRelabelings` | Prometheus relabel configs applied to scraped samples before ingestion | `[]` |
| `monitoring.serviceMonitors.honorLabels` | When true, preserves the metric's labels when they collide with the target's labels | `false` |
| `monitoring.podMonitors.enabled` | Deploy PodMonitors that scrape repo-server-delegate and repo-server-proxy metrics from instance namespaces. These only produce data when an instance uses the Repo Server Delegate feature; leaving them enabled when no instance uses it is safe and has no cost. | `true` |
| `monitoring.podMonitors.interval` | Prometheus scrape interval | `60s` |
| `monitoring.podMonitors.scrapeTimeout` | Prometheus scrape timeout (if empty, Prometheus uses the global scrape timeout) | `""` |
| `monitoring.podMonitors.additionalLabels.release` | Label that satisfies kube-prometheus-stack's default `podMonitorSelector` so Prometheus discovers these PodMonitors out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed. | `kube-prometheus-stack` |
| `monitoring.podMonitors.annotations` | Annotations on PodMonitor resources | `{}` |
| `monitoring.podMonitors.namespace` | Namespace to deploy PodMonitors into (defaults to release namespace) | `""` |
| `monitoring.podMonitors.relabelings` | Prometheus relabel configs applied before scraping | `[]` |
| `monitoring.podMonitors.metricRelabelings` | Prometheus relabel configs applied to scraped samples before ingestion | `[]` |
| `monitoring.podMonitors.honorLabels` | When true, preserves the metric's labels when they collide with the target's labels | `false` |
| `monitoring.prometheusRules.enabled` | Deploy PrometheusRule alert definitions | `true` |
| `monitoring.prometheusRules.additionalLabels.release` | Label that satisfies kube-prometheus-stack's default `ruleSelector` so Prometheus loads these alert rules out of the box. Set to your kube-prometheus-stack Helm release name if it differs. You can add more labels to this map as needed. | `kube-prometheus-stack` |
| `monitoring.prometheusRules.annotations` | Annotations on the PrometheusRule resource | `{}` |
| `monitoring.prometheusRules.namespace` | Namespace to deploy the PrometheusRule into (defaults to release namespace) | `""` |
| `monitoring.prometheusRules.additionalRules` | Additional user-defined Prometheus alerting or recording rules appended to the bundled rule groups. Entries follow the standard PrometheusRule rule schema (`alert`, `expr`, `for`, `labels`, `annotations`, or `record` + `expr`). | `[]` |
| `monitoring.grafanaDashboard.enabled` | Deploy the Akuity Platform Grafana dashboard as a ConfigMap | `true` |
| `monitoring.grafanaDashboard.namespace` | Namespace to deploy the dashboard ConfigMap into (defaults to release namespace) | `""` |
| `monitoring.grafanaDashboard.additionalLabels` | Additional labels on the dashboard ConfigMap | `{}` |
| `monitoring.grafanaDashboard.label` | Label key that the Grafana sidecar watches to discover dashboard ConfigMaps. Must match the Grafana sidecar's configured `dashboards.label`. | `grafana_dashboard` |
| `monitoring.grafanaDashboard.labelValue` | Value for the Grafana sidecar discovery label. Must match the Grafana sidecar's configured `dashboards.labelValue` (empty string matches any value). | `1` |
| `monitoring.grafanaDashboard.annotations` | Annotations on the dashboard ConfigMap | `{}` |
| `monitoring.grafanaDashboard.folder` | Grafana folder to place the dashboard in. Applied via the `grafana_folder` annotation on the dashboard ConfigMap; the Grafana dashboard sidecar must be configured with `folderAnnotation: grafana_folder` for this to take effect. Leave empty to use the sidecar's default folder. | `""` |
| `monitoring.grafanaDatasource.enabled` | Provision a Grafana PostgreSQL datasource for portal DB-backed panels | `true` |
| `monitoring.grafanaDatasource.namespace` | Namespace to deploy the datasource Secret into (defaults to grafanaDashboard.namespace or release namespace) | `""` |
| `monitoring.grafanaDatasource.additionalLabels` | Additional labels on the datasource Secret | `{}` |
| `monitoring.grafanaDatasource.label` | Label key that the Grafana datasource sidecar watches to discover datasource Secrets. Must match the Grafana sidecar's configured `datasources.label`. | `grafana_datasource` |
| `monitoring.grafanaDatasource.labelValue` | Value for the Grafana datasource sidecar discovery label. Must match the Grafana sidecar's configured `datasources.labelValue` (empty string matches any value). | `1` |
| `monitoring.grafanaDatasource.annotations` | Annotations on the datasource Secret | `{}` |
| `monitoring.grafanaDatasource.datasourceName` | Grafana datasource name shown in the Grafana UI. When empty, defaults to the Helm release name followed by ` Portal DB` (for example, `akuity Portal DB`). Dashboard panels look up the datasource by UID, not by name, so changing this does not break the bundled dashboard. | `""` |
| `monitoring.grafanaDatasource.datasourceUID` | Grafana datasource UID referenced by dashboard panels. When empty, defaults to the Helm release name followed by `-portal-db` (for example, `akuity-portal-db`). If overridden, update the dashboard's datasource UIDs to match or panels will not load data. | `""` |
| `monitoring.grafanaDatasource.postgresVersion` | PostgreSQL server version encoded as an integer (1300 = PostgreSQL 13, 1400 = PostgreSQL 14, 1500 = PostgreSQL 15, etc.). Must match the actual Postgres version backing the portal database so Grafana uses the correct query dialect. | `1300` |
| `monitoring.grafanaDatasource.timescaledb` | Enable TimescaleDB support in the Grafana datasource. Set to `true` only if the portal database is running on TimescaleDB. | `false` |
| `monitoring.alerts.platformController.goroutinesThreshold` | Goroutine count threshold for the platform controller | `1000` |
| `monitoring.alerts.platformController.threadsThreshold` | Thread count threshold for the platform controller | `50` |
| `monitoring.alerts.platformController.memoryBytesThreshold` | Allocated memory threshold (bytes) for the platform controller (~200 MiB) | `209715200` |
| `monitoring.alerts.platformController.heapObjectsThreshold` | Heap object count threshold for the platform controller | `1536000` |
| `monitoring.alerts.platformController.fileDescriptorsThreshold` | File descriptor count threshold for the platform controller | `300` |
| `monitoring.alerts.portalServer.goroutinesThreshold` | Goroutine count threshold for the portal server | `500` |
| `monitoring.alerts.portalServer.threadsThreshold` | Thread count threshold for the portal server | `50` |
| `monitoring.alerts.portalServer.memoryBytesThreshold` | Allocated memory threshold (bytes) for the portal server (~350 MiB) | `367001600` |
| `monitoring.alerts.portalServer.heapObjectsThreshold` | Heap object count threshold for the portal server | `1638400` |
| `monitoring.alerts.portalServer.fileDescriptorsThreshold` | File descriptor count threshold for the portal server | `150` |
| `monitoring.alerts.portalServer.transmittedBytesThreshold` | Transmitted bytes threshold (bytes per 10m) for the portal server (~1.5 GiB) | `1610612736` |
| `monitoring.alerts.portalServer.slowResponseAvgSeconds` | Average response time threshold (integer seconds) for the slow response alert | `1` |
| `monitoring.alerts.portalServer.slowResponseP90Seconds` | P90 response time threshold (integer seconds) for the slow response alert | `2` |
| `monitoring.alerts.argoCD.enabled` | Enable Argo CD instance and heartbeat alerts (disable if not using Argo CD) | `true` |
| `monitoring.alerts.argoCD.disconnectedWarningRatio` | Fraction of disconnected Argo CD clusters that triggers a warning (0-1) | `0.5` |
| `monitoring.alerts.argoCD.disconnectedCriticalRatio` | Fraction of disconnected Argo CD clusters that triggers a critical alert (0-1) | `0.8` |
| `monitoring.alerts.argoCD.unhealthyWarningRatio` | Fraction of connected but unhealthy Argo CD clusters that triggers a warning (0-1) | `0.5` |
| `monitoring.alerts.argoCD.unhealthyCriticalRatio` | Fraction of connected but unhealthy Argo CD clusters that triggers a critical alert (0-1) | `0.8` |
| `monitoring.alerts.kargo.enabled` | Enable Kargo instance and heartbeat alerts (disable if not using Kargo) | `true` |
| `monitoring.alerts.kargo.disconnectedWarningRatio` | Fraction of disconnected Kargo agents that triggers a warning (0-1) | `0.6` |
| `monitoring.alerts.kargo.disconnectedCriticalRatio` | Fraction of disconnected Kargo agents that triggers a critical alert (0-1) | `0.8` |
| `monitoring.alerts.kargo.unhealthyWarningRatio` | Fraction of connected but unhealthy Kargo agents that triggers a warning (0-1) | `0.5` |
| `monitoring.alerts.kargo.unhealthyCriticalRatio` | Fraction of connected but unhealthy Kargo agents that triggers a critical alert (0-1) | `0.8` |
| `monitoring.alerts.reconciliation.slowReconcileP90Seconds` | Slow reconciliation loop p90 threshold (integer seconds; fractional values are rounded) | `2` |
| `monitoring.alerts.reconciliation.slowEnqueueP90Seconds` | Slow enqueue loop p90 threshold (integer seconds; fractional values are rounded) | `1` |
| `monitoring.alerts.addonController.slowReconcileP90Seconds` | Slow addon controller reconciliation loop p90 threshold (integer seconds; fractional values are rounded) | `5` |
| `monitoring.alerts.addonController.slowEnqueueP90Seconds` | Slow addon controller enqueue loop p90 threshold (integer seconds; fractional values are rounded) | `1` |
| `monitoring.alerts.notificationController.slowReconcileP90Seconds` | Slow notification controller reconciliation loop p90 threshold (integer seconds; fractional values are rounded) | `1` |
| `monitoring.alerts.notificationController.slowEnqueueP90Seconds` | Slow notification controller enqueue loop p90 threshold (integer seconds; fractional values are rounded) | `1` |
| `monitoring.alerts.notificationController.deliveryFailureRateThreshold` | Fraction of failed notification deliveries that triggers a warning (0-1, excludes web delivery method, requires >10 notifications) | `0.2` |
| `monitoring.alerts.notificationController.pendingRateThreshold` | Fraction of pending notification deliveries that triggers a warning (0-1, excludes web delivery method, requires >10 notifications) | `0.8` |
---
## Database Operations
The Akuity Platform uses [K3S](https://k3s.io/) as a lightweight Kubernetes control plane for each
Argo CD and Kargo instance. K3S stores its data in PostgreSQL via
[Kine](https://github.com/k3s-io/kine), which translates etcd API calls into SQL operations.
**A healthy, well-provisioned database is the most important factor in K3S stability.**
Every Kubernetes write operation (create, update, delete) inserts a row into the database. A
background compaction process periodically removes old rows to keep the table from growing
indefinitely. When the database cannot keep up, compaction falls behind, the table bloats,
and the Argo CD or Kargo instance can become unstable.
Self-hosted operators are responsible for database sizing, performance monitoring, and
capacity planning. This page covers what to watch, how to interpret signs of trouble, and
how to remediate issues.
## Database Health and Sizing
A well-provisioned database prevents the majority of K3S stability issues. Monitor your
database as you would any production workload:
- **CPU**: Sustained saturation slows all query processing, including compaction.
- **Memory**: Insufficient buffer pool causes excessive disk reads and slows queries.
- **I/O**: Compaction is write-heavy. IOPS limits directly throttle how fast it can run.
- **Connections**: An exhausted connection pool causes compaction transactions to queue or fail.
- **Storage**: A database that runs out of storage will cause K3S to fail. Monitor headroom
and set alerts well before limits are reached.
For sizing guidance, see [PostgreSQL Database](./01-getting-started.mdx#postgresql-database)
in the Getting Started guide. If you are consistently seeing K3S or compaction issues and
suspect the database is undersized, scaling up CPU, memory, or IOPS is the right first step
before investigating anything else.
## Monitoring
The platform controller exposes two Prometheus metrics on the `/metrics` endpoint (port 9500)
that can help diagnose compaction issues when K3S is behaving unexpectedly:
| Metric | Labels | Description |
|--------|--------|-------------|
| `kine_lag_ratio` | `instance_id`, `instance_type` | Compaction lag as a multiple of the retention window |
| `kine_actual_lag` | `instance_id`, `instance_type` | Raw revision count that compaction is behind |
These metrics are **diagnostic tools**, not primary health indicators. An elevated
`kine_lag_ratio` is a symptom, not a root cause. In most cases it reflects an underlying
database constraint. Use these metrics to understand *why* something is wrong after your
database metrics have already flagged a problem, not as the first signal to alert on.
### Understanding `kine_lag_ratio`
The lag ratio expresses how far behind compaction is, normalized across instance sizes:
```
target_rev = current_rev - 1000 (min_retain)
actual_lag = target_rev - compact_rev
lag_ratio = actual_lag / 1000
```
What constitutes a concerning value depends entirely on your environment. A stable ratio on a
well-provisioned database with ample headroom may require no action at all. The same ratio
trending upward on a database that is already constrained is a different situation. Always
interpret it alongside your database metrics, not in isolation.
## Alerting
**Alert on your database first.** Storage headroom, CPU utilization, I/O saturation, and
connection pool exhaustion are the signals that indicate real risk.
The Kine metrics can be useful as supporting context if you are already investigating K3S
instability, but setting up aggressive alerts on `kine_lag_ratio` in isolation is likely to
generate noise without actionable signal. A lag ratio that is elevated but stable on a
healthy database generally does not require intervention.
## Troubleshooting K3S or Compaction Issues
If K3S is behaving unexpectedly or you are seeing signs of compaction falling behind, work
through the following in order. The database is almost always the root cause.
### 1. Check Database Health
Start here before anything else. Check:
- **CPU**: Is the database CPU saturated?
- **Memory**: Is the database swapping or running low on buffer pool?
- **I/O**: Are disk IOPS maxed out?
- **Connections**: Is the connection pool exhausted?
- **Storage**: How much headroom remains?
If any of these are constrained, address them before proceeding.
### 2. Review Instance Load
If the database is healthy but issues persist:
- How many applications does the instance manage?
- What is the sync frequency? Aggressive sync intervals generate more writes.
- Are there runaway controllers or reconciliation loops?
### 3. Check K3S Compaction Logs
Check K3S logs for `compact failed` messages. These indicate whether compaction transactions
are timing out, hitting lock contention, or failing due to connection issues, and help
distinguish between a database bottleneck and a compaction configuration issue. If you are
seeing frequent failures and are unsure how to interpret them, [contact Akuity Support](https://support.akuity.io).
### 4. Tune Compaction Settings
Only after confirming the database is healthy and instance load is reasonable, consider
adjusting the `k3s` compaction parameters in the
[Argo CD Instance Parameters](./31-helm-values-reference.md#argo-cd-instance-parameters) or
[Kargo Instance Parameters](./31-helm-values-reference.md#kargo-instance-parameters) sections of
the Helm Values Reference.
If you are unsure which settings to adjust or want guidance based on your specific environment,
[contact Akuity Support](https://support.akuity.io) before making changes.
:::caution
These settings compensate for environmental constraints. They do not fix underlying database
performance problems. Adjusting them on a database that is already under heavy load can make
things worse.
:::
### 5. Emergency Manual Compaction
If compaction is critically behind and the instance is impaired, contact
[Akuity Support](https://support.akuity.io) for assistance. This operation requires instance
downtime and should only be performed after the underlying database issue has been identified
and addressed.
## Further Reading
- [Kine project](https://github.com/k3s-io/kine), the SQL backend for K3S
- [Helm Values Reference](./31-helm-values-reference.md), full list of configurable parameters
- [Argo CD Instance Parameters](./31-helm-values-reference.md#argo-cd-instance-parameters)
- [Kargo Instance Parameters](./31-helm-values-reference.md#kargo-instance-parameters)
---
## Setup
## Prerequisites
- [Prometheus Operator](https://github.com/prometheus-operator/prometheus-operator)
or [kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)
installed in the cluster (provides the `ServiceMonitor` and `PrometheusRule` CRDs)
- Grafana with the
[sidecar](https://github.com/grafana-community/helm-charts/tree/main/charts/grafana#sidecar-for-dashboards)
enabled for dashboards and datasources
- The Grafana datasource sidecar must watch Secrets (or ConfigMaps) labeled with
`grafana_datasource`
The built-in Grafana resources are designed for the common Kubernetes pattern
used by `kube-prometheus-stack` and the Grafana Helm chart: Grafana runs in the
cluster and discovers dashboards and datasources via labeled ConfigMaps and
Secrets. If you use external Grafana, Grafana Cloud, or Grafana Operator, keep
the Prometheus resources enabled but plan to manage the dashboard and datasource
through your existing Grafana workflow instead of relying on sidecar discovery.
## Enabling Monitoring
Set `monitoring.enabled` to `true` in your Helm values:
```yaml
monitoring:
enabled: true
```
All sub-resources (ServiceMonitors, PrometheusRules, Grafana dashboard, Grafana
datasource) are enabled by default once the top-level flag is set. You can
selectively disable any of them:
```yaml
monitoring:
enabled: true
serviceMonitors:
enabled: true # ServiceMonitors for Prometheus scraping
prometheusRules:
enabled: true # Built-in alert rules
grafanaDashboard:
enabled: true # Grafana dashboard ConfigMap
grafanaDatasource:
enabled: true # Grafana PostgreSQL datasource Secret
```
If you only use Kargo or Argo CD, disable alerts for the one you are not
using to avoid false-positive alerts:
```yaml
monitoring:
enabled: true
alerts:
kargo:
enabled: false # disable if not using Kargo
```
If your Grafana deployment does not use sidecar discovery, disable the
chart-managed Grafana resources and import or provision them separately:
```yaml
monitoring:
enabled: true
grafanaDashboard:
enabled: false
grafanaDatasource:
enabled: false
```
For the full list of `monitoring.*` parameters with defaults and descriptions,
see the
[Monitoring Parameters](../31-helm-values-reference.md#monitoring-parameters)
section of the Helm values reference. That page is auto-generated from the
chart's
[`values.yaml`](https://github.com/akuityio/akuity-platform/tree/main/charts/akuity-platform),
which also documents every option inline.
### Prometheus Selector Labels {#prometheus-selector-labels}
Many Prometheus Operator installations use label selectors to filter which
ServiceMonitors, PodMonitors, and PrometheusRules to discover. The chart
defaults `additionalLabels` to `release: kube-prometheus-stack` on all three
resource types, which matches the default selector used by
[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack).
If your kube-prometheus-stack Helm release has a different name, override the
label to match:
```yaml
monitoring:
enabled: true
serviceMonitors:
additionalLabels:
release: my-prometheus # change to match your Helm release name
podMonitors:
additionalLabels:
release: my-prometheus
prometheusRules:
additionalLabels:
release: my-prometheus
```
:::tip
If your ServiceMonitors or PodMonitors are being created but Prometheus is not
scraping them, a label mismatch is almost always the cause. Check your
Prometheus custom resource for `serviceMonitorSelector`, `podMonitorSelector`,
and `ruleSelector` to see what labels are required.
:::
### Shared Monitoring Namespace
If your Prometheus, Grafana, and Alertmanager run in a dedicated `monitoring`
namespace, you can place all monitoring resources there instead of the Akuity
Platform release namespace. This keeps everything co-located and avoids
broadening Grafana sidecar permissions:
```yaml
monitoring:
enabled: true
serviceMonitors:
namespace: monitoring
podMonitors:
namespace: monitoring
prometheusRules:
namespace: monitoring
grafanaDashboard:
namespace: monitoring
grafanaDatasource:
namespace: monitoring
```
The `release: kube-prometheus-stack` label is included by default, so no
`additionalLabels` override is needed unless your Helm release name differs
(see [Prometheus Selector Labels](#prometheus-selector-labels)).
:::tip
This is a common approach for
[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)
installations because it keeps dashboards, rules, and scrape configuration
alongside the monitoring stack. If your Grafana sidecar is scoped to specific
namespaces instead of `ALL`, it also avoids extra cross-namespace configuration.
:::
### Grafana Datasource Provisioning
By default, the chart provisions a Grafana PostgreSQL datasource Secret for the
dashboard panels that query the portal database directly. The provisioned
datasource:
- Uses `database.readOnlyHost` when set, otherwise `database.host`
- Uses `database.port`, `database.dbname`, `database.user`, `database.password`,
and `database.sslmode`
- Is created in `monitoring.grafanaDatasource.namespace`, defaulting to
`monitoring.grafanaDashboard.namespace` and then the Helm release namespace
If you already manage a Grafana datasource outside the chart, disable the
built-in one:
```yaml
monitoring:
enabled: true
grafanaDatasource:
enabled: false
```
If you use a non-default schema or need custom datasource options beyond the
chart defaults, manage the datasource separately in Grafana and keep
`monitoring.grafanaDatasource.enabled: false`.
This is also the recommended approach if you use external Grafana, Grafana
Cloud, or Grafana Operator instead of a sidecar-based in-cluster Grafana
deployment.
### Grafana Dashboard Folder
To organize the dashboard into a specific Grafana folder, set
`monitoring.grafanaDashboard.folder`. The chart writes a `grafana_folder`
annotation on the dashboard ConfigMap, which the Grafana sidecar uses to
place the dashboard in the named folder.
:::note
This requires your Grafana installation to have
`sidecar.dashboards.folderAnnotation` set to `grafana_folder`. The upstream
Grafana Helm chart does **not** set this by default. If you use
[kube-prometheus-stack](https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack)
or the standalone
[Grafana chart](https://github.com/grafana/helm-charts/tree/main/charts/grafana),
add the following to your Grafana values:
```yaml
sidecar:
dashboards:
folderAnnotation: grafana_folder
```
Without this, the annotation is ignored and the dashboard lands in the
General folder.
:::
```yaml
monitoring:
enabled: true
grafanaDashboard:
folder: "Akuity Platform"
```
## Verifying Your Setup {#verifying-your-setup}
After enabling monitoring and deploying, verify each component is working.
Monitoring resource names are prefixed with the Helm release name (e.g.,
`-platform-controller`). The examples below assume the default release
name `akuity-platform`.
### 1. Check monitoring resources are created
All chart-managed monitoring resources carry the label
`app.kubernetes.io/part-of: akuity-platform`, so you can list them in one
command:
```bash
kubectl get servicemonitor,podmonitor,prometheusrule,configmap,secret \
-l app.kubernetes.io/part-of=akuity-platform -n
```
You should see ServiceMonitors for each enabled platform component (e.g.
`-platform-controller`, `-portal-server`), PodMonitors for
repo-server-delegate and repo-server-proxy, a PrometheusRule, a Grafana
dashboard ConfigMap, and a Grafana datasource Secret.
### 2. Verify Prometheus is scraping targets
Open the Prometheus UI (typically at `http://:9090`) and
navigate to **Status > Targets**. Look for targets matching the Akuity Platform
ServiceMonitors and PodMonitors. All targets should show a `UP` state.
ServiceMonitor targets appear as `serviceMonitor//` and
PodMonitor targets appear as `podMonitor//`. The PodMonitor
targets (`-repo-server-proxy`, `-repo-server-delegate`) may
show zero active targets if no Argo CD instances are using the Repo Server
Delegate feature: this is expected.
New targets may briefly appear as `UNKNOWN` immediately after the monitoring
resources are created. This is expected until the first scrape completes.
With the default `monitoring.serviceMonitors.interval: 60s`, allow up to one
minute before treating this as a failure.
If targets are missing, check that your ServiceMonitors and PodMonitors have
the correct `additionalLabels` to match your Prometheus selectors (see
[Prometheus Selector Labels](#prometheus-selector-labels) above).
### 3. Verify alerts are loaded
```bash
kubectl get prometheusrule -n
```
You should see `akuity-platform-rules` (or `-rules` if you used a
custom release name). To verify Prometheus has loaded the rules, navigate to
**Status > Rules** in the Prometheus UI and search for `Akuity`.
### 4. Find the Grafana dashboard
Open Grafana and search for "Akuity Platform" in the dashboard search. If the
dashboard is not appearing, verify:
- The Grafana sidecar is enabled and configured to watch ConfigMaps with the
`grafana_dashboard` label
- The dashboard ConfigMap is in a namespace the sidecar watches (see
[Shared Monitoring Namespace](#shared-monitoring-namespace) for the
recommended setup)
If you intentionally disabled `monitoring.grafanaDashboard.enabled`, import
the bundled dashboard JSON into Grafana using your normal workflow instead.
### 5. Verify the Grafana datasource exists
Open Grafana and navigate to **Connections > Data sources**. You should see a
PostgreSQL datasource named ` Portal DB` unless you overrode
`monitoring.grafanaDatasource.datasourceName`.
If it is missing, verify:
- The Grafana datasource sidecar is enabled
- The sidecar watches Secrets labeled with `grafana_datasource`
- The datasource Secret is in a namespace the sidecar watches
If you intentionally disabled `monitoring.grafanaDatasource.enabled`, provision
an equivalent PostgreSQL datasource in Grafana yourself and ensure its UID
matches the one referenced by the dashboard, or update the dashboard to point
at your datasource.
## Scraped Components
### ServiceMonitors
ServiceMonitors are created for each platform component that exposes a metrics
endpoint. Components gated by an `enabled` flag only get a ServiceMonitor when
that component is also enabled.
| Component | Metrics Port | Condition |
|-----------|-------------|-----------|
| platform-controller | 9500 | Always |
| portal-server | 9501 | Always |
| notification-controller | 9505 | Only when `notificationController.enabled: true` |
| addon-controller | 9506 | Only when `addonController.enabled: true` |
### PodMonitors
PodMonitors scrape metrics from pods in Argo CD instance namespaces
(`argocd-*`). Unlike ServiceMonitors, they use `namespaceSelector.any: true`
to discover pods across all namespaces.
| PodMonitor | Selector | Port | Notes |
|------------|----------|------|-------|
| repo-server-delegate | `akuity.io/repo-server-delegate` label exists | `metrics` | Only produces targets when instances use the [Repo Server Delegate](../../03-argocd/02-managing-instances/30-settings/10-features/10-manifest-generation.md#repo-server-delegate) feature |
| repo-server-proxy | `akuity.io/repo-server-proxy: "true"` | `akuity-metrics` | Drops the high-cardinality `repo_server_proxy_method_duration_seconds_bucket` metric via metricRelabeling to control storage costs |
Both PodMonitors are enabled by default when `monitoring.podMonitors.enabled`
is `true`. It is safe to leave them enabled even when no instances use the
Repo Server Delegate feature: the PodMonitors simply match zero pods.
## Grafana Dashboard
The bundled Grafana dashboard provides visibility into:
- **Argo CD Instances**: health distribution, reconciliation status, instance counts, tables of unhealthy/unreconciled instances
- **Argo CD Clusters**: connection status, reconciliation, health breakdown
- **Kargo Instances**: health, reconciliation, instance counts
- **Kargo Agents**: connection status, reconciliation, health breakdown
- **Control Plane Operations**: controller workqueue depth and duration, OOM-killed containers, database connection pool stats, persistent volume usage, CPU throttling
- **Argo CD Repo Server Delegate (Optional)**: reverse-proxy latency, request rate, and pending requests for instances using the Repo Server Delegate feature
The dashboard includes configurable template variables:
- **DS_PROMETHEUS**: Prometheus datasource for metrics panels (health gauges,
time series, alert-derived stats)
- **DS_PORTAL_DB**: PostgreSQL datasource for table panels that query the
portal database directly (instance lists, cluster details, org breakdowns).
The chart provisions this datasource by default through
`monitoring.grafanaDatasource.*`. If you disable that datasource or manage
your own, those panels will fail until `DS_PORTAL_DB` resolves to a working
PostgreSQL datasource.
- **namespace**: filters metrics to the selected Kubernetes namespace
- **ThrottlingRatio**: threshold used by the CPU-throttled containers panel
The **Argo CD Repo Server Delegate (Optional)** row may be empty. It only shows
data when both of the following are true:
- the Argo CD instance is configured to use
[`repoServerDelegate`](../../03-argocd/02-managing-instances/30-settings/10-features/10-manifest-generation.md#repo-server-delegate)
in either `controlPlane` or `managedCluster` mode
- instance-level Prometheus metrics are enabled on the platform controller
(for self-hosted installs this is typically done by setting
`platformController.env.ENABLE_INSTANCE_PROMETHEUS_MONITORING: "true"`)
The bundled chart includes PodMonitors (`monitoring.podMonitors.enabled`)
that scrape repo-server-delegate and repo-server-proxy metrics across
instance namespaces (`argocd-*`). If an instance uses the default
"all managed clusters" manifest generation layout, this row will remain
empty because there is no delegated repo server reverse-proxy traffic to
display.
---
## Alert Reference
The bundled PrometheusRule includes alerts organized by component. Alerts that
reference configurable thresholds can be tuned through `monitoring.alerts.*`
Helm values (see
[Monitoring Parameters](../31-helm-values-reference.md#monitoring-parameters)
in the Helm values reference).
Every alert includes a `runbook_url` annotation that links directly to the
relevant section below. When an alert fires, the runbook link is available in
Alertmanager, PagerDuty, Slack, and other notification integrations.
## Platform Controller - Hardware {#platform-controller-hardware}
These alerts fire when the platform controller process exceeds resource
thresholds, which may indicate a memory leak, excessive concurrency, or
resource exhaustion.
Each fires at warning severity when the named resource exceeds its
`monitoring.alerts.platformController.*Threshold` for 1h:
- `AkuityPlatformControllerTooManyGoroutines`
- `AkuityPlatformControllerTooManyThreads`
- `AkuityPlatformControllerHighMemory`
- `AkuityPlatformControllerTooManyHeapObjects`
- `AkuityPlatformControllerTooManyFileDescriptors`
:::tip
The file descriptor alerts use the `container_file_descriptors` metric from
cAdvisor/kubelet. This metric may not be available on all Kubernetes providers.
If the metric is absent, these alerts will simply remain inactive: they will
not cause errors.
:::
**Remediation:**
- Check platform controller logs for goroutine leaks or unexpected activity
- Review recent configuration changes that may have increased load
- Consider increasing resource limits on the platform controller deployment
- Restart the platform controller pod if values remain elevated after the
underlying cause is resolved
## Platform Controller - Argo CD Instances {#platform-controller-argo-cd-instances}
These alerts monitor the health and reconciliation status of managed Argo CD
instances.
Critical unless noted:
- `AkuityUnhealthyArgoInstances`
- `AkuityUnreconciledArgoInstances`
- `AkuityDegradedArgoInstances`
- `AkuityArgoInstanceEventsSyncFailed`
- `AkuityUnreconciledArgoClusters`
- `AkuityDegradedArgoClusters`
- `AkuityHighDisconnectedArgoClusters` (warning) / `AkuityHighDisconnectedArgoClustersCritical`
- `AkuityHighUnhealthyArgoClusters` (warning) / `AkuityHighUnhealthyArgoClustersCritical`
The disconnected and unhealthy ratio thresholds are configurable via
`monitoring.alerts.argoCD.disconnectedWarningRatio`,
`monitoring.alerts.argoCD.disconnectedCriticalRatio`,
`monitoring.alerts.argoCD.unhealthyWarningRatio`, and
`monitoring.alerts.argoCD.unhealthyCriticalRatio`. Small fleets where a single
disconnected cluster represents a large percentage may want to raise the warning
threshold.
**Remediation:**
- Check the platform controller logs for reconciliation errors
- Verify the database is healthy and accessible (see [Database Operations](../35-database-operations.md))
- For disconnected clusters, verify network connectivity between the agent
and the platform
- For degraded instances, check the Argo CD instance namespace for pod
status and events
- Review recent changes to instance configuration
## Platform Controller - Kargo Instances {#platform-controller-kargo-instances}
These alerts monitor Kargo instances and agents using the same pattern as the
Argo CD alerts above, with two intentional differences:
- **Unhealthy timeout is 30m** (vs 40m for Argo CD). Kargo's reconciliation
loop is faster, so a 30-minute window gives the same margin with less lag.
- **Disconnected agent warning threshold is 60%** (vs 50% for Argo CD
clusters). Kargo agents have a higher expected transient-disconnection rate
during warehouse syncs, so the warning fires at a higher ratio to reduce
noise.
Critical unless noted:
- `AkuityUnhealthyKargoInstances`
- `AkuityUnreconciledKargoInstances`
- `AkuityDegradedKargoInstances`
- `AkuityKargoInstanceEventsSyncFailed`
- `AkuityUnreconciledKargoAgents`
- `AkuityDegradedKargoAgents`
- `AkuityHighDisconnectedKargoAgents` (warning) / `AkuityHighDisconnectedKargoAgentsCritical`
- `AkuityHighUnhealthyKargoAgents` (warning) / `AkuityHighUnhealthyKargoAgentsCritical`
The ratio thresholds are configurable via
`monitoring.alerts.kargo.disconnectedWarningRatio`,
`monitoring.alerts.kargo.disconnectedCriticalRatio`,
`monitoring.alerts.kargo.unhealthyWarningRatio`, and
`monitoring.alerts.kargo.unhealthyCriticalRatio`.
**Remediation:** Same approach as Argo CD instance alerts above. Check platform
controller logs, database health, and network connectivity.
## Platform Controller - Reconciler {#platform-controller-reconciler}
These alerts detect operational issues with the platform controller's internal
reconciliation loops.
- `AkuityMetricsCollectorRefreshErrors` (critical)
- `AkuitySlowMetricsCollectorRefresh` (warning)
- `AkuityPlatformControllerReconcilerErrors` (warning)
- `AkuityMissingDBMetricsCollectorHeartbeat` (critical)
- `AkuitySlowReconciliationLoop` (warning): configurable at `monitoring.alerts.reconciliation.slowReconcileP90Seconds`
- `AkuitySlowEnqueueLoop` (warning): configurable at `monitoring.alerts.reconciliation.slowEnqueueP90Seconds`
- `AkuityMissing*Heartbeat`: 12 critical heartbeat alerts, one per reconciliation loop
**Remediation:**
- **Missing heartbeat** alerts typically indicate the platform controller is not
running or has crashed. Check pod status and logs.
- **Slow reconciliation** may indicate database performance issues or high load.
Check database metrics and connection pool health (see
[Database Operations](../35-database-operations.md)).
- **Metrics collector errors** suggest the platform controller cannot query the
database for status metrics. Verify database connectivity.
## Portal Server - Hardware {#portal-server-hardware}
Each fires at warning severity when the named resource exceeds its
`monitoring.alerts.portalServer.*Threshold`:
- `AkuityPortalServerTooManyGoroutines`
- `AkuityPortalServerTooManyThreads`
- `AkuityPortalServerHighMemory`
- `AkuityPortalServerTooManyHeapObjects`
- `AkuityPortalServerTooManyFileDescriptors`
- `AkuityPortalServerTooManyTransmittedBytes`
**Remediation:** Same approach as platform controller hardware alerts. The
portal server handles API traffic, so elevated values may correlate with high
request volume. The transmitted bytes alert detects runaway network egress,
which may indicate a streaming loop or unexpectedly large API responses.
## Portal Server - Application {#portal-server-application}
- `AkuityPortalServerErrors` (critical): any HTTP 5xx from the portal API.
- `AkuityPortalServerSlowResponses` (warning): average response time above `monitoring.alerts.portalServer.slowResponseAvgSeconds`.
- `AkuityPortalServerSlowResponsesP90` (warning): p90 response time above `monitoring.alerts.portalServer.slowResponseP90Seconds`.
The response time thresholds are configurable via
`monitoring.alerts.portalServer.slowResponseAvgSeconds` and
`monitoring.alerts.portalServer.slowResponseP90Seconds`. Self-hosted
installations on slower hardware or with higher-latency database connections may
want to raise these thresholds.
**Remediation:**
- Check portal server logs for error details
- Review database query performance
- Check for upstream service degradation (SSO provider, etc.)
- Review recent deployments for regressions
## Addon Controller {#addon-controller}
Only deployed when `addonController.enabled: true`.
- `AkuityAddonControllerErrors` (warning)
- `AkuitySlowAddonControllerReconciliation` (warning): configurable at `monitoring.alerts.addonController.slowReconcileP90Seconds`
- `AkuitySlowAddonControllerEnqueue` (warning): configurable at `monitoring.alerts.addonController.slowEnqueueP90Seconds`
- `AkuityMissingAddonController*Heartbeat`: 3 critical heartbeat alerts
**Remediation:**
- Check addon controller logs for error details
- Verify the addon controller pod is running and not crash-looping
- Review recent changes to addon definitions or cluster addon configurations
- For heartbeat alerts, restart the addon controller pod if it appears stuck
## Notification Controller {#notification-controller}
Only deployed when `notificationController.enabled: true`.
- `AkuityNotificationControllerErrors` (warning)
- `AkuitySlowNotificationControllerReconciliation` (warning): configurable at `monitoring.alerts.notificationController.slowReconcileP90Seconds`
- `AkuitySlowNotificationControllerEnqueue` (warning): configurable at `monitoring.alerts.notificationController.slowEnqueueP90Seconds`
- `AkuityMissingNotificationController*Heartbeat`: 3 critical heartbeat alerts
- `AkuityHighNotificationDeliveryFailureRate` (warning): configurable at `monitoring.alerts.notificationController.deliveryFailureRateThreshold`
- `AkuityHighNotificationPendingRate` (warning): configurable at `monitoring.alerts.notificationController.pendingRateThreshold`
The delivery failure and pending rate thresholds are configurable via
`monitoring.alerts.notificationController.deliveryFailureRateThreshold` and
`monitoring.alerts.notificationController.pendingRateThreshold`. Both alerts
exclude the `web` delivery method and require at least 10 notifications in the
window to avoid noisy alerts on low-volume deployments.
**Remediation:**
- Check notification controller logs for error details
- Verify SMTP configuration if using email delivery
- Review notification target availability (webhooks, Slack, etc.)
---
## Operations
## Alertmanager Routing {#alertmanager-routing}
All bundled alerts use names prefixed with `Akuity`, making it straightforward
to route them in Alertmanager. Below are example configurations for common
notification targets.
### Slack
```yaml
# alertmanager.yaml
route:
routes:
- matchers:
- alertname=~"Akuity.*"
receiver: akuity-slack
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receivers:
- name: akuity-slack
slack_configs:
- channel: '#akuity-platform-alerts'
send_resolved: true
title: '{{ .GroupLabels.alertname }}'
text: >-
{{ range .Alerts }}
*{{ .Annotations.summary }}*
{{ .Annotations.description }}
Runbook: {{ .Annotations.runbook_url }}
{{ end }}
```
### PagerDuty
```yaml
route:
routes:
- matchers:
- alertname=~"Akuity.*"
- severity=~"critical|warning"
receiver: akuity-pagerduty
receivers:
- name: akuity-pagerduty
pagerduty_configs:
- routing_key: ''
description: '{{ .GroupLabels.alertname }}: {{ (index .Alerts 0).Annotations.summary }}'
links:
- href: '{{ (index .Alerts 0).Annotations.runbook_url }}'
text: 'Runbook'
```
### Severity-based routing
To page on critical alerts and send warnings to a lower-priority channel:
```yaml
route:
routes:
- matchers:
- alertname=~"Akuity.*"
- severity="critical"
receiver: akuity-pagerduty
- matchers:
- alertname=~"Akuity.*"
- severity="warning"
receiver: akuity-slack
```
## Tuning Alert Thresholds {#tuning-alert-thresholds}
The bundled alert thresholds are designed for typical production deployments.
Depending on your scale and workload patterns, you may want to adjust them.
### When to tune
- **Small deployments** (fewer than 10 Argo CD instances): Hardware thresholds
like goroutine count and memory usage may be set higher than your platform
controller will ever reach under normal conditions. This is fine: alerts
simply won't fire. No action is needed unless you want tighter bounds for your
environment.
- **Small fleets** (fewer than ~10 clusters or agents): The ratio-based
disconnected/unhealthy alerts (`monitoring.alerts.argoCD.*`,
`monitoring.alerts.kargo.*`) can be noisy when a single disconnected cluster
represents a large fraction of the fleet. Consider raising the warning ratio.
- **Large deployments** (hundreds of instances or clusters): Reconciliation loop
thresholds (`slowReconcileP90Seconds`, `slowEnqueueP90Seconds`) may need to
be relaxed, as larger instance counts naturally increase reconciliation time.
- **Resource-constrained environments**: If you run the platform controller or
portal server with tight memory limits, consider lowering the memory threshold
to alert before OOM kills occur.
- **Higher-latency infrastructure**: If the portal server connects to a remote
database or runs on slower hardware, consider raising
`monitoring.alerts.portalServer.slowResponseAvgSeconds` and
`slowResponseP90Seconds`.
### How to tune
Override any threshold through the `monitoring.alerts.*` values. See the
[Monitoring Parameters](../31-helm-values-reference.md#monitoring-parameters)
section of the Helm values reference for the full list, defaults, and
descriptions.
:::tip
After adjusting thresholds, verify the updated values in the Prometheus UI
under **Status > Rules**. Search for the alert name to confirm the new
threshold is active.
:::
## Disabling Monitoring {#disabling-monitoring}
Monitoring resources can be safely removed by setting `monitoring.enabled` back
to `false` and re-applying the chart:
```yaml
monitoring:
enabled: false
```
This cleanly removes all monitoring resources (ServiceMonitors, PrometheusRule,
Grafana dashboard ConfigMap, and Grafana datasource Secret) regardless of which
namespace they were deployed to. The platform components themselves are
unaffected: disabling monitoring does not restart or modify any running pods.
Prometheus will stop scraping the targets once the ServiceMonitors are deleted,
and Grafana's sidecar will remove the dashboard and datasource on its next
reconciliation cycle.
You can also selectively disable individual monitoring sub-resources without
turning off monitoring entirely. For example, to keep Prometheus scraping and
alerts but remove the Grafana integration:
```yaml
monitoring:
enabled: true
grafanaDashboard:
enabled: false
grafanaDatasource:
enabled: false
```
## Grafana Datasource and External Secrets {#grafana-datasource-external-secrets}
The auto-provisioned Grafana datasource reads database credentials from the
same `database.*` Helm values that the platform components use (`database.host`,
`database.user`, `database.password`, etc.). For most deployments this works out
of the box with no additional configuration because the platform already
requires these values to connect to PostgreSQL.
### External secrets management
If you manage database credentials through an external secrets solution
(e.g., [External Secrets Operator](https://external-secrets.io/),
[OpenBao](https://openbao.org/), or cloud-native IAM authentication),
the `database.password` value may not be set in your Helm values. In this case,
disable the auto-provisioned datasource and manage it through your existing
secrets workflow:
```yaml
monitoring:
enabled: true
grafanaDatasource:
enabled: false
```
Then provision an equivalent PostgreSQL datasource in Grafana with matching
credentials. To ensure the bundled dashboard panels work, either:
- Set the datasource UID to match `-portal-db` (e.g.,
`akuity-platform-portal-db`), or
- Update the `DS_PORTAL_DB` template variable in the dashboard to point at your
datasource after import
### Non-default database schema
If your installation uses a custom `database.schemaname` (anything other than
`public`), the auto-provisioned Grafana datasource will connect successfully but
dashboard SQL panels that reference unqualified table names (e.g. `organization`,
`argo_cd_instance`) may fail because the Grafana PostgreSQL plugin does not
support setting `search_path` through its provisioning configuration.
To work around this, set `search_path` on the PostgreSQL role that Grafana
uses to connect:
```sql
ALTER ROLE