Skip to content

External Secrets Store (Optional)

Connect Kindo to your organization’s central secrets store to manage application passwords and API keys there. Kindo stores these secrets in your Kubernetes cluster by default; follow this page when you choose an external store.

Use an external store for values your organization chooses to manage centrally.

Kindo supplies values you leave out. Values added to the external store override the corresponding Kindo values.

Kindo installs and manages its own External Secrets Operator (ESO). If your cluster already runs ESO, it must serve external-secrets.io/v1 (ESO 0.17 or later); Kindo then uses it. This requirement applies to every backend, including kubernetes.

Create the authentication resources for the backend and auth mode you choose. The identity needs read access to the entries listed below. Reference the resources from the secretsStore block in install-contract.yaml.

Use the linked provider setup instructions for provider-specific steps.

BackendAuth modeYou create
AWS Secrets ManagerauthMode: irsaThe External Secrets Operator’s AWS identity
AWS Secrets ManagerauthMode: access-keyA Kubernetes Secret in kindo-system named by credentialsSecretName, with access-key-id and secret-access-key keys
Azure Key VaultauthMode: workload-identityA managed identity federated to the kindo-secret-store ServiceAccount in the kindo-system namespace; set clientId to its client ID
Azure Key VaultauthMode: service-principalA Kubernetes Secret in kindo-system named by credentialsSecretName, with client-id and client-secret keys
VaultauthMethod: kubernetesA Vault role bound to the kindo-secret-store ServiceAccount in the kindo-system namespace
VaultauthMethod: tokenA Kubernetes Secret in kindo-system named by tokenSecretName, with a token key holding the Vault token

An entry is a named group of keys and values in your external store. Create these entries:

  • api-env
  • credits-env
  • hatchet-env
  • integrations-reconciler-hatchet
  • litellm-env
  • mcp-env
  • mcp-platform-env
  • mcp-unified-env
  • nango-env
  • next-env
  • prisma-migrations-env
  • sandbox-env
  • task-worker-ts-env

You can leave application values out of these entries if you want Kindo to supply them. For AWS Secrets Manager and Azure Key Vault, create a secret whose value is the empty JSON object {}. For Vault, create a KV v2 secret with one placeholder key, such as KINDO_PLACEHOLDER=1; Vault requires at least one key.

You can store credentials that your organization already manages centrally. Add a shared value to every listed entry that consumes it. Use application database URLs and credentials in the external store. Keep bootstrap PostgreSQL administrator connections and the other required infrastructure bindings in environment-bindings.yaml.

ValueKeysStore entries
PostgreSQL: HatchetDATABASE_URLhatchet-env
PostgreSQL: LiteLLMDATABASE_URLlitellm-env
PostgreSQL: MainDATABASE_URLapi-env, credits-env, prisma-migrations-env, task-worker-ts-env
PostgreSQL: Main read connectionDATABASE_READ_URLapi-env
PostgreSQL: NangoNANGO_DATABASE_URLnango-env
PostgreSQL: OpenShellDATABASE_URLsandbox-env
RabbitMQ: APIRABBITMQ_URLapi-env
RabbitMQ: HatchetSERVER_TASKQUEUE_RABBITMQ_URLhatchet-env
RedisREDIS_URLapi-env, credits-env, task-worker-ts-env
S3 static credentialsAWS_ACCESS_KEY, AWS_SECRET_KEYapi-env, task-worker-ts-env
SMTP connectionSMTP_URLnango-env
SMTP credentialsSMTP_USER, SMTP_PASSWORDapi-env, task-worker-ts-env

Replace the existing secretsStore block in install-contract.yaml with the example for your backend. Each example shows one auth mode. Fill in its values, then run kindo config validate.

secretsStore:
backend: 'aws'
region: 'us-west-2'
authMode: 'irsa'

For access-key authentication, replace authMode with authMode: "access-key" and add credentialsSecretName: "<secret-name>". With IRSA, roleArn is optional when you need to assume a different role.

secretsStore:
backend: 'azurekv'
vaultUrl: 'https://your-vault.vault.azure.net'
tenantId: '00000000-0000-0000-0000-000000000000'
authMode: 'workload-identity'
clientId: '<managed-identity-client-id>'

For service-principal authentication, replace authMode and clientId with authMode: "service-principal" and credentialsSecretName: "<secret-name>".

secretsStore:
backend: 'vault'
address: 'https://vault.example.com:8200'
path: 'secret'
authMethod: 'kubernetes'
role: 'kindo'

For token authentication, replace authMethod and role with authMethod: "token" and tokenSecretName: "<secret-name>".

Prepare and check the required store entries before running kindo install --apply. A missing entry blocks its application.

Before applying an upgrade, run:

Terminal window
kindo upgrade --version <target> --plan

The plan checks whether the store is ready and reports any required key missing from both the store and Kindo’s supplied values. When the upgrade needs to install ESO, the plan reports that this check will run during --apply, after ESO and the store are installed. The upgrade stops before changing applications if the store check fails.

After installation, run kindo doctor to investigate application and store health. Continue when it reports no store or sync findings and the applications are healthy. Then complete Configure & Validate. See Operate for diagnosis and recovery commands.

  • kindo config override set, unset, edit, and apply refuse to run. Manage those values in your external store.
  • kindo config log-level set and unset refuse to run. See kindo config log-level to change the level.
  • kindo config helm-override works with an external store.

See Operate for applying configuration changes.

Move an existing install onto an external store

Section titled “Move an existing install onto an external store”
  1. Set up access and entries. Complete Set up access to your store and Create the entries.

  2. Update the install contract. Replace secretsStore in install-contract.yaml with the configuration for your backend. If the contract sets applications.ssoready: true, remove SSOReady first.

  3. Validate the configuration.

    Terminal window
    kindo config validate
  4. Review the upgrade plan. Use your currently installed version:

    Terminal window
    kindo upgrade --version <current-version> --plan
  5. Apply the upgrade.

    Terminal window
    kindo upgrade --version <current-version> --apply

    The upgrade installs ESO and the store, checks the store, and stops before changing applications if the check fails.

Update the appropriate entry. For example, after updating a value in api-env, run:

Terminal window
kindo config apply --only api

The command waits for the sync before restarting the API. If the sync times out, it warns and restarts anyway. Run kindo doctor, resolve the sync finding, and rerun kindo config apply --only api.

Remove the key from your external store to use Kindo’s value. After the change has synced, restart the affected application to pick it up.

For example, you can use kindo config apply --only api to wait for the sync and restart the API. If the command reports a sync timeout, resolve it and rerun the command.

Related: Operate and Upgrade.