Deploy with Helm
With the infrastructure in place, install the confident-ai Helm chart using the Terraform outputs. The chart pulls its images from Confident AI’s registry and installs the app plus in-cluster ClickHouse. On Azure, set config.isAzureEnvironment: true and reach Blob storage through the connection string.
The recommended setup keeps app secrets in Azure Key Vault (synced by the External Secrets Operator) and runs Redis on Azure Managed Redis. Both are provisioned by the Terraform module. In-cluster Redis and a Kubernetes Secret are supported as a simpler alternative, see Simpler option.
Two things come from Confident AI with your Enterprise license:
- Image pull credentials: an AWS access key ID and secret that let the cluster pull the first-party images. The chart uses them to mint and refresh the pull secret automatically.
- License key (
CONFIDENT_LICENSE_KEY): the signed key that enables your plan’s features.
About OPENAI_API_KEY: it backs the built-in Confident AI evaluation provider, which runs on OpenAI. It is optional. Omit it and connect your own model provider or an LLM gateway per project from AI Connections in the app instead.
Put the secrets in Key Vault
Store each value as its own Key Vault secret. Key Vault names cannot contain _, so use -; the chart rewrites - back to _ on the way in (for example DATABASE-URL becomes DATABASE_URL). Include the storage connection string here too, since Key Vault owns the whole secret set:
This uses the vault Terraform created with confident_create_key_vault = true. If you did not enable it, either turn it on and re-apply, or use the simpler option.
Link ESO's identity with a federated credential
Terraform creates the managed identity for ESO but not the federated credential that lets it act as the external-secrets-sa Kubernetes account. AKS already has Workload Identity enabled, so you only add the link.
Resolve the cluster’s OIDC issuer and the ESO identity Terraform created:
Create the federated credential that binds the identity to the service account:
Set up ingress (for HTTPS)
Turn on the AKS application routing add-on, which runs a managed NGINX ingress controller:
The values file below uses className: webapprouting.kubernetes.io and exposes all four subdomains (app., api., evals., otel.). Add TLS with a Kubernetes secret or cert-manager that covers all four.
Only trying it out? Set ingress.enabled: false in the values file and reach the app with kubectl port-forward -n confident-ai svc/confident-frontend 3000:3000.
Write the values file
Save this as values.azure.yaml. Fill the bracketed values from your Terraform outputs and the credentials Confident AI gave you.
Simpler option: in-cluster Redis and a Kubernetes Secret
If you would rather not run Key Vault or managed Redis, the chart can hold secrets in a Kubernetes Secret and run Redis in the cluster. This is less production-hardened (secrets live in the cluster, Redis has no managed backups), but it removes the Key Vault, federated-credential, and ESO steps. Skip steps 2 through 4 above, and replace the secrets and redis blocks in the values file with:
Code executor key
The Azure Function sandbox is protected by a function key, which you read from the Azure portal after Terraform creates the Function. Add it as a secret so the app can call the sandbox:
- Key Vault (recommended):
az keyvault secret set --vault-name "$KV_NAME" --name CODE-EXECUTOR-AZURE-FUNCTION-KEY --value "<function key>" - Simpler option: add
CODE_EXECUTOR_AZURE_FUNCTION_KEY: "<function key>"tosecrets.data.
Back up ClickHouse (recommended)
For production, enable the nightly ClickHouse backup to Blob storage, authenticated with the storage connection string. Provision the backup container and see the Disaster Recovery page for the credential detail. Add this under your existing clickhouse: block and helm upgrade:
Troubleshooting
Updating and tearing down
- Change the app: edit
values.azure.yaml, thenhelm upgrade confident-ai oci://ghcr.io/confident-ai/charts/confident-ai --version 0.1.0 -n confident-ai -f values.azure.yaml. - Rotate a secret: write a new version to Key Vault. ESO re-syncs it, then restart the pods to pick up the change (they hold secrets as env vars until they restart):
kubectl rollout restart deployment -n confident-ai. - Change infrastructure: edit the Terraform config and
terraform apply. - Remove everything:
helm uninstall confident-ai -n confident-ai,helm uninstall external-secrets -n external-secrets, thenterraform destroy, thenaz group delete --name confident-prod-rg --yesif you want the Step 1 resources gone.