Argo CD with HashiCorp Vault or OpenBao

Deliver Vault or OpenBao secrets to Argo CD-managed workloads through an in-cluster operator, so Git and the Argo CD cache never hold secret values. Learn the setup, mapping, testing and failure points.

On this page

Argo CD with Vault or OpenBao: what the integration does

The supported pattern is to run either Vault Secrets Operator or External Secrets Operator on the destination cluster, so that Argo CD deploys only references to secrets and never their values. This replaces argocd-vault-plugin, which renders secret values into manifests inside the repo-server before Argo CD applies them. Under this pattern, an ExternalSecret or VaultStaticSecret resource lives in Git, the operator on the cluster reads the value from Vault or OpenBao and writes a Kubernetes Secret, and the workload consumes that Secret as it normally would. The secret value never passes through Git, the repo-server or Argo CD's Redis cache.

The trust split follows from that design. Git holds declarations of what a workload needs and where it lives in the store. Argo CD holds permission to apply those declarations to the cluster, and the Argo CD security documentation notes that the repo-server runs Helm and Kustomize on repository content, so the team should control which repositories are trusted. The cluster operator holds the credential that reads from the secret store. Your review should confirm that no Argo CD Application, plugin or Helm value passes a secret value in plaintext, and that the operator's service account, not Argo CD's, is the only identity allowed to read the store path.

Vault and OpenBao follow the same pattern and differ mainly in the authentication method the operator uses from the cluster. Both expose a Kubernetes auth method, so the decision you need to make is which role and bound service account each operator uses, not which product to deploy. Confirm with your secret store team how each operator authenticates, whether the Vault or OpenBao version you run matches the operator's documented support, and which Argo CD version you run, since the 3.0 upgrade notes changed how RBAC and repository configuration behave. Keep JWT-based Argo CD API access and TLS between components as the baseline for everything else in the chain.

What you need before connecting Argo CD to Vault or OpenBao

Five items need to be settled before any secret reaches a workload. Each one either blocks the integration outright or changes which operator, auth method and license terms you end up with, so confirm them together with the platform owners.

A supported Argo CD release

Confirm that your Argo CD version is one of the three most recent minor lines, since only those receive patch releases. Older lines stop getting fixes, so a secrets integration built on them inherits any unpatched defects. Check the current patch list on the releases page before you pin a version, and plan the upgrade path first if you are behind. Note the 3.0 change that moved repository definitions into Kubernetes Secrets, because it affects how credentials are wired alongside the secrets flow.

A reachable Vault or OpenBao endpoint with TLS

The operator on each destination cluster must reach the Vault or OpenBao API over HTTPS, so network paths, DNS and firewall rules from every cluster need to be mapped before rollout. Decide who owns the certificate chain and how the CA bundle is distributed to clusters, including any air-gapped segment. Argo CD itself uses TLS between its components, and the secrets path should meet the same standard rather than rely on plaintext inside the cluster network.

The chosen operator on destination clusters

Pick Vault Secrets Operator or External Secrets Operator and install it on each destination cluster, not on the Argo CD control plane. The topic material does not give operator version numbers or a compatibility matrix against specific Vault or OpenBao releases. Confirm supported version pairings with the operator vendor before you pin versions, and record the result in your change records so the pairing is traceable.

Kubernetes or JWT/OIDC auth enabled

Enable an auth method in Vault or OpenBao that lets each cluster's workloads authenticate without static tokens. Kubernetes auth lets the operator present its service account token, and JWT/OIDC auth suits clusters that already federate identity. Map each cluster to a role with the narrowest policy it needs, and confirm the exact configuration against the auth method documentation for your product version, since role names and claim settings differ between the two.

Vault edition and license status

Decide whether you run Vault Community Edition, licensed Vault Enterprise, or HCP Vault Dedicated, and confirm your license status in writing. Vault Enterprise features such as performance replication, namespaces and HSM support need a license applied to the cluster. Community Vault moved to the Business Source License in later releases, so legal review should confirm the terms for your use. If you need an MPL-2.0 option, OpenBao is a fork under that license, but its migration guide was tested only against Vault 1.14.1 Community Edition, so validate the path before choosing it.

How to configure Vault Secrets Operator or External Secrets Operator with Argo CD

This sequence connects a cluster to Vault or OpenBao with a scoped identity, installs the operator through Argo CD, and lets Argo CD sync only secret references while the cluster fetches the values.

  1. Enable Kubernetes auth and scoped policies

    The Vault or OpenBao administrator enables the Kubernetes auth method for each destination cluster and writes one read-only policy per environment, granting access only to that environment's secret paths (for example, a KV v2 mount with a prefix such as kv/data/payments/staging/*). Configure the auth method with the cluster's API address and the token review material the server needs, following the current documentation for your version. Confirm this step by logging in with a test service account token and checking that the token carries only the intended policy. Confirm the exact configuration keys with your Vault or OpenBao version, since the supplied facts do not specify them.

  2. Create the Kubernetes auth role for the operator

    Create a role that binds the operator's service account and namespace on the destination cluster to the environment policy, and set a short token TTL so that leaked tokens expire quickly. Keep one role per environment rather than one shared role for all clusters, so a compromised staging identity cannot read production paths. Verify the role by requesting a login with the operator's service account token from inside the cluster; a successful response with the expected policy list confirms the binding. If the login fails, check the audience, the bound namespace and the service account name before changing policies.

  3. Install the operator through Argo CD

    Add Vault Secrets Operator or External Secrets Operator as an Argo CD Application that points to the chart or manifests you have reviewed and pinned, and let Argo CD install it into its own namespace on the destination cluster. Keep the operator's CRDs under the same Application so that resource health is tracked from the start. Confirm the installation when the Application shows Synced and Healthy and the operator's controller pod is running, and confirm the CRDs exist with kubectl get crd. Check the vendor's release notes for the supported Kubernetes versions before pinning.

  4. Define the connection and authentication resources

    Create a VaultConnection and a VaultAuth resource for Vault Secrets Operator, or a SecretStore or ClusterSecretStore with the Vault provider and Kubernetes auth block for External Secrets Operator. Point the connection at the Vault or OpenBao address over TLS, trust the internal CA through a referenced secret or bundle, and reference the role created earlier. Keep these resources in the operator's namespace or a platform namespace owned by the platform team, not in application namespaces. Verify the connection by checking that the resource reports a ready or valid status and that the operator log shows a successful authentication.

  5. Map secret paths per environment

    Decide the path layout once and keep it identical across environments, for example <mount>/<environment>/<application>/<secret>, with the environment segment changing only the value. Store the environment in a Git-managed overlay or values file so that each cluster's Argo CD Application points at the correct path prefix. Confirm the mapping against the policy written in the first step, so that each environment can read only its own prefix. Ask your Vault or OpenBao administrators to confirm the naming convention before any application depends on it, because renaming paths later means changing references in every overlay.

  6. Create VaultStaticSecret or ExternalSecret references

    Commit VaultStaticSecret resources (Vault Secrets Operator) or ExternalSecret resources (External Secrets Operator) that name the path, the key and the target Kubernetes Secret, with the refresh interval set to a value your rotation policy requires. These manifests contain no secret values, only references, so they are safe to keep in Git. Let the operator create the destination Secret in the application namespace, and reference that Secret from the workload as usual. Verify the result by checking that the ExternalSecret or VaultStaticSecret reports a synced condition and that the target Secret exists with the expected keys, without printing the values in logs or terminal output.

  7. Let Argo CD sync only the references

    Add the reference manifests to the application's Git path so Argo CD deploys them like any other resource, and make sure the Application does not render secret values from Vault or OpenBao through a plugin. Confirm that the Argo CD application shows Synced and Healthy once the operator reports the Secret as ready, and that the Application's resource tree shows the references and the generated Secret. Rotation then happens in Vault or OpenBao, and the operator's refresh picks up new values without a Git change. Test one rotation in a non-production environment and confirm the workload reads the new value on its next restart or reload, as your application supports.

How the operator authenticates from the cluster

The trust anchor for this design is the cluster identity, not a token stored in Git or in a Kubernetes Secret. The operator's ServiceAccount presents its projected token to Vault or OpenBao, and the configured auth method exchanges that identity for a short-lived client token that carries only the policies bound to that role. The Vault Secrets Operator and the External Secrets Operator both work this way, so the first design decision is which auth method each operator will use, and which Kubernetes namespace and ServiceAccount pairs are allowed to log in under each role. Keep those bindings narrow: one role per environment or per application group, with the policy limited to the paths that environment reads.

The Kubernetes auth method suits this pattern because the server verifies the service account token against the cluster's API, so no secret ID or password has to be created and placed somewhere in the deployment. The JWT/OIDC method is the alternative when the cluster issues tokens that Vault or OpenBao can validate against a trusted issuer, and it fits clusters where you prefer issuer-based trust over reviewer credentials. AppRole, which the OpenBao auth methods documentation recommends for servers, depends on a RoleID and a SecretID. Those are credentials that must be delivered and rotated, so if you use AppRole for the operator, the SecretID itself becomes a secret to protect, and it should never be committed to Git as part of the Argo CD application. Userpass, which the same guidance recommends for developer machines, is not a fit for in-cluster automation.

Before you commit to a method, confirm which auth methods your chosen edition exposes in the target environment. Vault Community Edition and OpenBao publish their own method lists, and the Vault Enterprise documentation covers the licensed feature set, so check the method list against the running server with a vault auth list or equivalent bao command rather than relying on a diagram. Also confirm the Kubernetes API address and CA bundle the server will use to verify tokens, and test the login from a pod in each target namespace before any application depends on it. A failed or overly broad login at this stage is far cheaper to correct than a secret that has already been copied into a cluster or cache.

Mapping Vault paths, policies and Kubernetes objects per environment

This table traces each element that connects a Vault secret to an Argo CD Application, from the KV path to the Kubernetes Secret the workload reads. Read it row by row for one environment, then repeat for each cluster, and check that the same element lines up across all of them.

ElementWhat to defineWhat to confirm or check
Vault mount and KV pathOne KV mount or path prefix per environment, such as a dev, staging and production path, so no environment can read another's valuesConfirm the KV engine version and that each environment path has its own policy boundary
Vault policy per workloadOne read-only policy per workload or service account, granting access only to that workload's pathConfirm no policy grants list or read on the parent path of other environments
Kubernetes auth role per clusterOne Vault Kubernetes auth role per cluster, bound to a specific service account and namespace and mapped to that cluster's policiesConfirm the role is not bound to a wildcard namespace or to the default service account
Operator custom resourceA VaultStaticSecret or VaultDynamicSecret (Vault Secrets Operator), or an ExternalSecret with a SecretStore (External Secrets Operator), per workloadConfirm the operator version and the CRD API version supported by your cluster and the chosen operator
Target Kubernetes Secret name and namespaceThe name the operator writes and the namespace the pod reads, kept identical across clusters so manifests stay the sameConfirm the destination namespace exists and that the workload references the secret by the same name in every environment
Argo CD Application consuming itThe Application that deploys the workload and its CRs, with the sync wave ordering the operator resource before the DeploymentConfirm the Application points to the environment's path and that the CR does not contain secret values
Rotation source of truthVault is the only place values change; the operator refresh interval and rotation procedure are documented per pathConfirm who may write each KV path and that rotation does not require a Git commit
Project boundary for namespacesThe Argo CD AppProject lists allowed destination clusters and namespaces, limiting which namespaces can receive the synced secretConfirm the project's destinations and resource whitelists, so a team cannot create a Secret in another team's namespace

Security controls for the Vault or OpenBao integration

The Vault or OpenBao integration moves secret access into the cluster and out of Git and Argo CD's cache, so the controls sit at three points: the secret store's policies, the operator's identity and permissions, and the Argo CD installation that deploys everything around them. Each control below can be checked in your own environment before go-live.

Least-privilege policies per path

Give each operator role a Vault or OpenBao policy that reads only the paths for its own application and environment, such as one read-only path for a production payments service, and nothing above it. Avoid wildcard grants on the KV mount and check the policy with the store's capability test before the first sync. Confirm which KV version your mount uses, because the policy paths differ between versions. Review policies whenever a team adds an application.

Short token TTLs and rotation

Configure the Kubernetes auth role so issued tokens expire quickly and are renewed by the operator rather than long-lived. Set the lease and renewal behavior in the store, then test what happens when a token expires during a sync. Confirm the refresh interval on each ExternalSecret or VaultStaticSecret so that rotated values reach the cluster without manual steps. Document who rotates the root and unseal material, and how often.

Operator service account and generated Secret access

The operator's service account can create and update Kubernetes Secrets in the namespaces it manages, so it is effectively a privileged identity. Scope it with namespace-level RoleBindings instead of a cluster-wide role, and deny reads of generated Secrets to users and to Argo CD's own service accounts unless a workload needs them. Verify with a permission check as each relevant subject before you rely on the boundary.

TLS between operator and the secret store

Require HTTPS on the Vault or OpenBao listener and configure the operator with the correct CA bundle so it verifies the server certificate instead of skipping verification. Plan certificate renewal for the store and the operator's trust chain, since a missed renewal stops every sync at once. Confirm that the store is not reachable over plain HTTP from other namespaces. Your security team should review the cipher and certificate settings against your internal standard.

Argo CD admin user disabled

The built-in admin account should be used only for first setup. Once SSO or local users exist, set admin.enabled to false in the argocd-cm ConfigMap so no static password can change Applications that read these secrets. Keep a documented break-glass procedure that does not rely on a shared password. Check the setting after every upgrade, since it lives in configuration Argo CD may be managing itself.

Repo-server exposure to untrusted repositories

The repo-server runs Helm and Kustomize on repository content, so a repository you do not control can influence what the render step reads. Restrict which repositories Argo CD can use, and keep Vault paths and secret references out of charts that teams outside your platform group can edit. Confirm the repo-server cannot read files outside the repository it is rendering. Treat plugin-based injection as a separate risk to review before adopting it.

Verify the operator's own logs

Argo CD redacts cluster, Git and OAuth2 credentials from its API responses and logs, but that redaction does not cover the Vault Secrets Operator or External Secrets Operator. Check whether their controller logs print secret values, token material or full error payloads at your chosen log level. Set log levels deliberately, restrict who can read controller pod logs, and test with a dummy secret before production use.

How secret rotation works when Vault or OpenBao changes a value

How often does a changed Vault secret reach a Kubernetes Secret?

A new Vault value reaches the cluster at the next refresh of the operator that owns the Kubernetes Secret. The interval is set in the operator resource: refreshInterval on an ExternalSecret for External Secrets Operator, and the refresh setting on a VaultStaticSecret for Vault Secrets Operator. Each refresh reads the source, compares it with the Secret it already holds, and rewrites the Secret only when the data differs. Shorter intervals increase read load on Vault or OpenBao and on the auth backend, so set them per secret class. Dynamic secrets follow a different path, covered below. Check the field names against the CRD versions you install, because they change between releases. Confirm in the operator status that the last sync succeeded before you rely on a rotation.

Does Argo CD redeploy workloads when a synced secret changes?

Argo CD does not redeploy workloads when a synced Secret changes. It compares manifests rendered from Git with the live state, and a Secret written by an operator is not part of Git, so the application can stay Synced while pods run with old values. Plan the restart explicitly. Common patterns are a reloader controller that watches Secrets and rolls the Deployments that reference them, or an annotation on the pod template that changes when the secret version changes. The annotation approach needs a value that changes with the secret, and you must confirm how your chosen operator exposes that value. Keep the restart trigger out of Git-rendered values where it would cause a diff loop on every sync. Test the full chain once in a non-production cluster.

How do workloads pick up a rotated secret value?

Environment variables are fixed when a container starts, so a process that reads them keeps the old value until it restarts. Secrets mounted as volumes are refreshed by the kubelet, so files update without a restart, but the application must reopen or reread them. Many applications read configuration once at startup, which makes a mount update invisible to them. Choose the pattern per workload: mounted files with a file watcher or reload endpoint, or environment variables combined with a rolling restart. Confirm for each application whether it rereads its credential file or caches it, and whether a database connection pool keeps old credentials alive after the file changes. Document the choice in the workload's chart so reviewers know how a rotation reaches the process.

How do dynamic secrets and leases differ from static KV values?

Static KV values change only when someone writes a new version, so rotation is a write followed by a sync. Dynamic secrets are generated on request: Vault or OpenBao issues a database user or cloud credential with a lease, and revokes it when the lease ends. Leases have a time-to-live and can be renewed up to a maximum, so the consumer or the operator must renew before expiry or request a new credential. Revocation removes access at the source, which is a stronger control than a long-lived password, but a failed renewal can also cut off a running workload. Ask which secret types your operator supports for dynamic credentials, how it handles renewal failures, and whether the application can accept a new username without a restart. The OpenBao overview describes the lease model.

How do I rotate Vault auth roles or tokens without a Git change?

Rotate Vault or OpenBao auth material on the secret store side and leave the Git manifests unchanged. With Kubernetes auth, the cluster's service account tokens are the credential, and the Vault role binds a service account and namespace to policies. Changing a policy or role does not change any Argo CD manifest. When the review JWT or cluster CA that Vault uses to validate tokens changes, update the auth configuration in Vault directly and verify it with a test login. With AppRole, rotate the secret_id and deliver it to the cluster through a secret that the operator or your pipeline writes, not one committed to Git. Record each change in an audit trail and confirm the operator's next refresh logs in successfully. Edit role names in Git only when the workload's identity actually changes.

Who owns secret rotation between the Vault team and platform team?

Ownership splits across three groups, and the split should be written down before rotation runs. The security or secrets team owns values, Vault policies and dynamic engine settings. The platform team owns operator configuration, refresh intervals, cluster auth roles and the restart mechanism. Application teams own how their code reads the value and whether it reloads. Recurring work includes reviewing refresh settings, checking operator health and testing a rotation after each Vault, operator or Argo CD upgrade. Cost follows the number of secret paths, environments, auth methods and dynamic engines in scope, plus the application changes needed for reload. Ask any partner for a written responsibility matrix and runbook, and for a clear split between one-time build work and ongoing support.

What breaks during secret rotation and how do I test it?

Most rotation failures show up in operator status, Vault audit logs or in pods that never restart. Typical failures include an expired or revoked token, a Vault policy that no longer allows the read path, an unreachable Vault during refresh, a dynamic lease that failed to renew, and workloads still running on the old value. Operators generally keep the last good Secret when a refresh fails, so the cluster keeps running on stale data, which makes alerts on sync status essential. Test in a staging cluster: change a test value, observe when the Secret updates, confirm the pod restarts or reloads, and verify the application uses the new value. Then test failure by revoking the test token and confirming the alert fires. Repeat both tests after each Vault, operator or Argo CD upgrade.

Can DeployOpen set up secret rotation for our Vault or OpenBao?

DeployOpen can plan and implement the rotation chain as part of a fixed-scope engagement covering operator configuration, auth roles, refresh and restart design, test cases and a runbook. Scope, deliverables and timelines are agreed in writing before work starts. Scope depends on how many secret paths and environments are involved, which secret engines need dynamic credentials, how many applications need reload changes, and whether high availability or disaster recovery of the secret store is included. Ongoing testing and upgrades can be covered by a retainer. DeployOpen prepares systems and evidence for compliance assessments but does not issue audit reports or certifications. To get a quote, prepare a written list of secrets, workloads, environments and auth methods.

Common Vault and OpenBao integration failures and fixes

This table lists the failures teams most often hit when Vault or OpenBao secrets reach Argo CD workloads through an operator, with the likely cause and the fix for each. Read each row as a checklist to run before assuming the operator itself is broken, and start with the status conditions on the ExternalSecret or VaultStaticSecret.

FailureLikely causeFix
Application shows Degraded because the ExternalSecret or VaultStaticSecret has no synced SecretThe operator could not read the source path, the auth step failed, or the resource references a store that does not exist in that namespaceCheck the resource status and operator logs in the destination cluster, confirm the store or connection name, then force a refresh and confirm the target Secret appears
Vault returns permission deniedThe policy path does not match the environment, for example a staging workload reads a production path or the KV v2 data path is missing the data segmentCompare the configured path with the policy grant for that role, and scope one policy per environment so a dev role cannot read prod paths
Authentication fails because the operator service account is not bound to the auth roleThe Kubernetes auth role names a different service account or namespace than the one the operator runs under, or the role's audience or token settings do not matchBind the role to the exact service account name and namespace, verify the token review settings for the cluster, and test the login from the operator pod before retrying sync
TLS certificate trust failure when the operator calls Vault or OpenBaoThe CA bundle used by the operator does not include the issuing authority for the server certificate, often after an internal CA rotation or with a private PKISupply the correct CA bundle to the operator's configuration, confirm the server certificate chain, and avoid disabling verification as a workaround
Self-heal reverts manual edits to generated SecretsArgo CD compares live state with Git and the operator owns the Secret, so a manual change is treated as drift and overwritten on syncChange the value in Vault or OpenBao, not in the cluster, and let the operator refresh the Secret; if a field must be ignored, scope that exception deliberately in the Application
Access to resources changes after an Argo CD upgradeArgo CD 2.14 to 3.0 changed RBAC so update and delete apply only to the application itself, logs access needs an explicit permission, and resource tracking defaults to annotationsReview the upgrade notes before moving versions, then re-test the roles that read or change ExternalSecret and Secret resources in a non-production cluster

Questions buyers ask before connecting Vault or OpenBao to Argo CD

Should we pick HashiCorp Vault or OpenBao for Argo CD workloads?

Pick the product whose license, support model and feature set match your organization's rules, because both expose the same basic pattern to Argo CD. HashiCorp announced on August 10, 2023 that future releases would move from MPL-2.0 to the Business Source License 1.1, and the Vault LICENSE names IBM as licensor and bars competitive hosted or embedded offerings. IBM completed its acquisition of HashiCorp on February 27, 2025. OpenBao is a community fork under MPL-2.0 managed under the Linux Foundation's OpenSSF. Ask your legal and procurement teams which license terms are acceptable, then confirm the Vault and OpenBao versions you plan to run against the Vault LICENSE file and the OpenBao migration documentation.

Does connecting Vault to Argo CD require Vault Enterprise?

No. The integration pattern works with Vault Community Edition binaries and with OpenBao, and the Enterprise decision depends on the features your environment needs. HashiCorp's Vault Enterprise documentation lists features such as performance and disaster recovery replication, HSM support, namespaces, seal wrapping, FIPS compliance and Sentinel policy as code as features that need a license applied to the cluster. Argo CD does not need any of them to read secrets through an operator. Decide based on your recovery objectives, audit requirements and regional footprint, and ask any vendor to confirm in writing which features each option includes.

What drives the effort of a Vault or OpenBao integration with Argo CD?

The main effort drivers are the number of clusters, the number of environments per cluster, the count and shape of secret paths, and the authentication methods you must support. Each cluster usually needs its own Kubernetes auth configuration or JWT trust, and each environment needs a separate path and policy so that a staging workload cannot read production values. Rotation rules, the number of operators you deploy, and whether you need dynamic database credentials all add work. A written scope should list each cluster, environment, namespace group and auth method so the effort can be estimated from named items.

What must our team provide before an integration starts?

You must provide administrative access to the Vault or OpenBao cluster for policy and auth method configuration, cluster administrator access to install and configure the operators, and ownership of the Git repositories that hold the ExternalSecret or VaultStaticSecret references. Security should approve the secret path layout, the policy model and the rotation schedule before build starts. Platform engineering should confirm the Argo CD version, its SSO setup and the namespaces that will receive secrets. Name one owner for each of these items in the written scope, because gaps in access are the most common cause of delayed handover.

Can our own team build this integration without a partner?

Yes, a capable platform team can build it, provided it has people who know Kubernetes RBAC, Vault or OpenBao policies, and Argo CD sync behavior. The work is mostly configuration, but mistakes in policy scope or auth bindings can expose secrets across environments, so review and testing matter more than the install itself. A partner adds value when the team lacks one of these skills, needs a fixed delivery date, or wants an independent review of the policies and rotation design. Decide by listing the skills in your team and checking them against the scope you write.

What should we ask for in a written scope for this work?

Ask the provider to name the secrets engine and auth method for each environment, the operator chosen for each cluster and why, and the exact secret path layout with an example for each environment. The scope should state how cluster authentication works, how tokens or roles are renewed, how rotation is tested without a production outage, and how Argo CD health is checked when a secret refresh fails. Require a list of deliverables such as policies, Kubernetes manifests, runbooks and a verification checklist, plus the acceptance tests and the people responsible for each sign-off. Fixed-scope agreements of this kind are agreed in writing before work starts.

What risks should we check before connecting Vault or OpenBao to Argo CD?

Check whether any secret still reaches Git, the Argo CD Redis cache or the repo-server through a plugin, because those paths are the ones the operator-based approach is meant to remove. Confirm that the Vault or OpenBao auth role for each cluster is limited to the namespaces and service accounts it needs, and that the Argo CD SSO and RBAC settings prevent unauthorized users from changing the secret references. Also confirm the Argo CD version is supported, since only the three most recent minor versions receive patch releases according to the Argo CD release process.

How to test the integration before cutover

Verify the integration in a non-production cluster before any workload depends on it, and treat each check as a pass or fail condition with a named owner. Start with access boundaries: create a test policy in Vault or OpenBao that lets the Kubernetes auth role for the staging environment read only its own secret path, then confirm that the same service account is denied when it requests a production path. Repeat the check from a production-scoped role against staging paths. A cross-environment read that succeeds is a blocking defect, not a tuning item. Confirm the same denial in the Vault audit log, because the audit trail is the evidence a reviewer will ask for.

Next, test rotation end to end. Change a value at the source path, wait for the sync or refresh interval configured in the Vault Secrets Operator or External Secrets Operator resource, and confirm the new value reaches the Kubernetes Secret and the workload picks it up, either through a restart or a reload your application supports. Then confirm the failure path: revoke the test role's access or point the resource at a missing path, and check that the operator reports a failed condition and that Argo CD shows the dependent resource as degraded rather than healthy. A silent stale secret is the failure this design is meant to prevent, so verify it deliberately.

Finally, search for leaked values. Grep the Git repository, the rendered manifests produced by Argo CD, and the Argo CD Redis cache for a canary secret you placed in the test path. The canary should appear nowhere except the destination cluster's Secret object and the application's memory. Run this search for the period when argocd-vault-plugin is still active, because the migration should run in parallel with the new operators rather than as a single cutover. Keep the old plugin path for one environment at a time, compare the rendered outputs, and retire it only after the canary check passes for every environment. Confirm each step against your own Vault or OpenBao version and the operator versions you plan to run.

How DeployOpen scopes and delivers Argo CD secrets integrations

DeployOpen is a Chainscore Labs company that plans, implements, hardens, documents and supports self-hosted open-source platforms inside your own infrastructure. For Argo CD with HashiCorp Vault or OpenBao, we start from a written scope, build the cluster-side secret delivery in your environment, and hand over the configuration, runbooks and tests your team needs to operate it.

How we scope

  • Confirm which Vault or OpenBao deployment, edition and license model the secrets will come from, and who owns it
  • Map Kubernetes clusters, namespaces and Argo CD projects that will consume secrets, with one secret path per environment
  • Agree in writing the Vault authentication method per cluster, the operator choice, rotation rules and out-of-scope items

How we build

  • Configure cluster authentication for Vault or OpenBao from each destination cluster rather than from Git or the Argo CD cache
  • Deploy and configure Vault Secrets Operator or External Secrets Operator, and retire argocd-vault-plugin usage where it exists
  • Test secret sync, refresh and rotation in a non-production cluster before any production cutover, and record the results

How we hand over

  • Document the secret path layout, policy and role definitions, and the Argo CD application structure that references them
  • Provide runbooks for rotation, failed sync, revoked tokens and Vault or OpenBao unavailability, tested with your team
  • Walk your operators through the handover so they can change paths, roles and refresh settings without outside help

How we support

  • Offer ongoing support, upgrades and continuous testing as a retainer, with the scope agreed in writing
  • Review operator and Vault or OpenBao version changes before upgrades, including Argo CD release notes that affect them
  • Get a quote from the written scope, since DeployOpen does not publish a price list for this work

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.