- Deployment model: On-premises
- Configuration reference: Qodo Helm chart
7.21.0, bundled module0.20.0-qodo.1, and theexternal-secrets.io/v1API. - Live validation: ESO
0.16.2on GKE, including Google Cloud Secret Manager synchronization and source-version refresh.
ExternalSecret resources so the target names
match Qodo’s fixed Secret references.
Choose the integration path
The AWS CSI provider and ESO are different integrations. This page’s manifests
apply to ESO. For more information, see Sync as Kubernetes Secret.
Before you begin
Have your platform team install an ESO release compatible with your Kubernetes version and the API used below. A standard Helm installation includes the core controller, admission webhook, certificate controller, and CRDs. If you supply webhook certificates through another approved mechanism, verify that certificate management and webhook TLS are ready. The Qodo chart does not install ESO or its CRDs. For more information, see ESO getting started. Prepare:- A ready ESO core controller and webhook, with the
ExternalSecretandSecretStoreCRDs serving the API used below. A shared store also requires theClusterSecretStoreCRD. - The target namespace, Kubernetes context, pinned Qodo chart, and existing customer values.
- Your provider, source secret identifiers, and an approved cloud identity.
- Access from ESO to the provider and identity endpoints required by your authentication method.
- ESO permission to reconcile Kubernetes Secrets in the target namespace, plus permission to request service account tokens if the selected authentication method uses a referenced service account.
qodo. Replace it consistently if your
installation uses another namespace. Create that namespace through your
normal cluster management process before continuing.
external-secrets. Replace them with your existing installation’s names.
If using the chart’s certificate controller, check it too:
Ready before Qodo starts.
Match the manifests to your installed CRDs. The module chart’s optional
externalSecrets template defaults to the older API unless
externalSecrets.v1StableApi is enabled, and prefixes its target names with
the component fullname. That template is not a replacement for checking the
fixed target names below.
1. Connect your secret manager
Choose your provider’s setup page. Each creates a namespacedSecretStore
named qodo-secrets and grants its identity access to your source secrets.
Use one provider configuration for that store name in a namespace.
AWS Secrets Manager
Configure IRSA or EKS Pod Identity.
Google Cloud Secret Manager
Configure GKE Workload Identity.
Azure Key Vault
Configure Microsoft Entra Workload ID.
ClusterSecretStore. In that case, set
secretStoreRef.kind: ClusterSecretStore and its approved name in every
ExternalSecret below. A namespaced SecretStore must share the
ExternalSecret’s namespace. Source access is determined by the store’s
identity, so restrict both cloud permissions and who can reference the store.
2. Map the customer-managed credentials
Start with the Secrets your deployment already expects you to create:
Use the exact names and keys from your release and provider profile. Creating
a Bedrock Secret alone does not configure model routing. Replicated-delivered
image credentials also have a different ownership path; do not replace them
with a new
qodo-pull Secret without following your delivery instructions.
For an external PostgreSQL deployment, use a source Secret named
qodo-database whose JSON value contains property POSTGRES_PASSWORD. Follow
your provider page to create it using the existing database password. Keep
credential values in your approved secret
management process, not in Helm values, Git, or terminal command arguments.
Save this as qodo-database-external-secret.yaml:
qodo-database-external-secret.yaml
Orphan keeps the target Secret independent of the ExternalSecret’s
garbage-collection lifecycle. Retain keeps it if the provider secret is
removed. These settings do not prevent ESO from overwriting data during
reconciliation, and they do not protect against explicit deletion or GitOps
pruning. Before adopting an existing Secret, preserve its current bytes and
make sure no other controller writes it. For more information, see ESO lifecycle and ownership.
For a direct Helm installation, merge the following into your existing
customer values. Retain your database host, username, and TLS settings. The
database Secret above belongs to your external database setup; direct Helm
continues generating and reusing Qodo’s internal credentials:
external-secrets-values.yaml
qodo-db-admin because some component references do not
follow a renamed global.externalDatabase.existingSecret. The full external
credential mode for Argo CD is described separately below.
Example: Bedrock and separate embeddings credentials
Example: Bedrock and separate embeddings credentials
Use these resources only if your gateway values already reference the two
target Secrets. The source values are JSON objects with the matching
properties. Save this as
qodo-provider-external-secrets.yaml and replace
the source paths if your naming differs.qodo-provider-external-secrets.yaml
Example: direct-registry image-pull credentials
Example: direct-registry image-pull credentials
Save this as
qodo-pull-external-secret.yaml. In your secret manager,
qodo-image-pull contains a JSON property named dockerconfigjson. Its
value must be the complete Docker configuration JSON as a string, not a
base64-encoded Kubernetes data value. ESO performs the Kubernetes
encoding.qodo-pull-external-secret.yaml
3. Reconcile Secrets before deploying Qodo
Apply the database example after updating the store and source path:POSTGRES_PASSWORD is
present. Apply and wait for each other Secret required by your provider
profile in the same way. For the pull Secret, also check its type:
Manage Qodo’s internal credentials separately
The previous examples leave internal credentials under direct Helm’s existing generation and reuse behavior. Moving these credentials to ESO is an ownership migration, not an additional provider Secret:
The spelling
JWT_ENCRIPTION_KEY is part of the existing contract. Preserve
it. The Platform bearer is derived from its raw key, its JSON allowlist must
contain that bearer, and the TOML credential must match it. The database
Secret from the previous section is also required. Preserve the
runtime-written qodo-zitadel-generated Secret on existing installations.
For Argo CD, the packaged values-argocd.yaml selects
global.generatedSecrets.render: false and must be the last values layer.
Pre-provision the full inventory before the first sync. For an existing
installation, back up and import the existing bytes, transfer ownership
without deleting live Secrets, and retain credentials against pruning.
Do not add the Argo CD values layer to a direct Helm installation just to
externalize a provider credential.
Follow the release’s full Argo CD setup or handoff procedure, including its
Application tracking, retention, ordered migration, and recovery steps. For
more information, see Deploy Qodo using Helm.
From the extracted release, run its credential preflight:
--require-zitadel-generated. The preflight
checks required keys and related credential consistency without printing
their values. It does not establish that the database, broker, or model
provider accepts the credentials. Use the release’s application checks too.
Validation scope
Live development-cluster tests verified cloud Secret synchronization, JSON property extraction, source-version refresh, missing-property failure and recovery, and target retention. Isolated marker consumers also verified that environment variables andsubPath mounts keep the old value until rollout.
The tests left the shared Qodo release and application credentials unchanged.
AWS and Azure authentication examples have configuration/schema validation;
their cloud identity flows still require a live check in your environment.
A successful marker test does not verify database password rotation, sign-in,
or a complete Qodo code review. Include those in application acceptance.
Verify rotation and recovery
After the first sync, verify Pod startup, database access, sign-in, and an actual code review using the configured model provider. ESO updating a Kubernetes Secret does not refresh environment variables orsubPath mounts in running Pods. For more information, see Define container environment variables using Secret data
and Using Secrets as files from a Pod.
Qodo’s revision rollout mechanism does not
automatically restart consumers when an external Secret changes. Your
rotation process must coordinate the upstream credential change, ESO
synchronization, and the rollout of every affected consumer.
For example, after rotating a provider credential consumed by qodo-litellm,
first confirm ESO reports a refresh after the source change and that the
target Secret was updated. Compare the refresh timestamp and the target’s
resource version with your pre-rotation observations, without printing its
data:
Ready condition alone can describe the old value. After
confirming synchronization, restart the consumer:
Troubleshoot synchronization
Use
kubectl describe secretstore and kubectl describe externalsecret for
status and events. Avoid commands that print or decode Secret values into a
terminal transcript.
Next steps
- Deploy Qodo using Helm: Complete the release-specific installation or ownership handoff.
- Autoscale Qodo with KEDA: Connect workload scaling while retaining your credential ownership model.
- Monitor Qodo with Prometheus and Grafana: Observe application behavior after deployment and rotation.