OpenShift Vault Secrets Store CSI: optional synced TLS trust ConfigMap for the provider, HashiCorp Vault CSI provider DaemonSet (hub or spoke), projected trust mount, and OpenShift SCC wiring. Per-application SecretProviderClass manifests use the vp-sscsi-spc library chart.
This chart is used by the Validated Patterns to configure cluster-wide Vault CSI support.
This chart owns cluster-wide Vault SSCSI infrastructure on OpenShift:
- Optional synced TLS trust
ConfigMapfor the provider (caProvider.syncProviderCaConfigMap) and named-template helpers (vaultTlsCaPemFromCluster,renderSyncCaConfigMap, and related). - Vault CSI provider DaemonSet and upstream CSI RBAC via the bundled HashiCorp
vaultHelm subchart (vaultvalues), whenocpSecretsStoreCsiVault.vaultCsiProvider.enabledis true (default). - Projected trust volume on the provider pods (
vault.csi.volumes/volumeMounts), defaulting to the sameConfigMapname ascaProvider.syncProviderCaConfigMap.configMapNameso the bundle this chart manages is mounted at/etc/pki/vault-ca. privilegedSCCRoleBindingfor the provider ServiceAccount on OpenShift whenvaultCsiProvider.openshiftPrivilegedSCCRoleBinding.enabledis true (default).
It does not run the Vault server by default (vault.server.enabled: false). Enable server-related values only when you intentionally colocate a server with this release.
Per-application SecretProviderClass objects stay in the vp-sscsi-spc library (per app, with applicationKey / ssCsiWorkloadAuth on Validated Patterns where used).
Install this chart as the single owner of provider trust material:
ocpSecretsStoreCsiVault:
clusterWide:
installDefaultManifests: trueSet installDefaultManifests: false when reusing only named templates.
Set ocpSecretsStoreCsiVault.vaultCsiProvider.enabled: false only if you want trust ConfigMap templates without installing the Vault CSI provider from this chart (unusual for new installs).
Trust ConfigMap is still cluster-local (CNO-injected bundle, PEM, or lookup modes as before). Vault CSI provider pods in this release read that material via vault.csi volume projection.
Where it runs
- Install on each cluster (hub and relevant spokes) that runs the Vault CSI provider for SSCSI workloads.
- Spokes without a local Vault server must set
vault.global.externalVaultAddrto the reachable hub Vault URL (for examplehttps://vault-vault.apps.<hubClusterDomain>, consistent with openshift-external-secretsClusterSecretStorewhenvault.externalAddressis empty). Derive this in clustergroup values so spokes do not hand-maintain a separate file.
Helm release namespace and the trust ConfigMap
- The synced trust
ConfigMapis created incaProvider.syncProviderCaConfigMap.targetNamespace(defaultvault). - With
vaultCsiProvider.enabled: true(default), the HashiCorpvaultsubchart deploys the CSI DaemonSet into the Helm release namespace. ProjectedConfigMapvolumes cannot reference another namespace, so install this Application intovault(or settargetNamespaceandvault.csi.volumes/ names together so theConfigMapand DaemonSet share one namespace). - Legacy layouts that applied only the
ConfigMapfrom a config namespace while the provider lived elsewhere should either move this Application tovaultor disablevaultCsiProviderhere and manage the provider separately.
Validated Patterns
- Hub and spoke: add
clusterGroup.applicationsand overrides; mergevault.global.externalVaultAddrfor spokes fromglobal.hubClusterDomain(or equivalent) in clustergroup.
Declare this chart under clusterGroup.applications in your pattern cluster values (for example values-hub.yaml). The clustergroup chart renders an Argo CD Application per entry.
1. Chart published in the pattern Helm repo (multi-source)
clusterGroup:
namespaces:
vault: {}
argoProjects:
- hub
applications:
openshift-sscsi-vault:
name: openshift-sscsi-vault-cluster
namespace: vault
argoProject: hub
chart: openshift-sscsi-vault
chartVersion: 0.2.*
extraValueFiles:
- $patternref/overrides/values-openshift-sscsi-vault-cluster.yaml
ignoreDifferences:
- group: ""
kind: ConfigMap
name: openshift-sscsi-vault-vault-tls-ca
namespace: vault
jsonPointers:
- /data
jqPathExpressions:
- .dataUse namespace: vault so the bundled CSI provider can project the trust ConfigMap rendered into vault. Adjust name, argoProject, and overrides to your pattern. The ignoreDifferences block matches the default CNO-injected trust ConfigMap when you use injectTrustedCabundle.
2. Chart in its own Git repository (multi-source)
clusterGroup:
applications:
openshift-sscsi-vault:
name: openshift-sscsi-vault-cluster
namespace: vault
argoProject: hub
repoURL: https://github.com/yourorg/openshift-sscsi-vault-chart.git
path: "."
chartVersion: main
extraValueFiles:
- $patternref/overrides/values-openshift-sscsi-vault-cluster.yamlEnsure vault (or your chosen release namespace) exists under clusterGroup.namespaces and the Argo AppProject is listed under clusterGroup.argoProjects.
openshift_sscsi_vault.syncProviderVaultCACertPath— single filesystem path for the CA PEM the SecretProviderClass should use (vaultCACertPath) when trust is mounted by this chart:mountDir/trustedCabundleDataKeyifinjectTrustedCabundleis true (CNO cluster/proxy bundle), elsemountDir/keyInConfigMap. Parent charts that render SPCs outside vp-sscsi-spc canincludethis helper so paths stay aligned withsyncProviderCaConfigMap.openshift_sscsi_vault.vaultTlsCaPemFromCluster— PEM for the synced bundle:syncProviderCaConfigMap.pemLiteralfirst (Argo CD /helm templatesafe), else optionaluseLookup: truecluster copy (ESO-style hub/spoke presets; hub ingressrouter-ca/router-ca-certsplus optionalkube-root-ca.crtconcat). DefaultuseLookup: falsebecause Argo renders manifests without a live API.openshift_sscsi_vault.syncVaultCsiTlsCaConfigMapYaml— ConfigMap manifest when sync is enabled,createConfigMapis true, and either PEM fromvaultTlsCaPemFromClusteris non-empty orsyncProviderCaConfigMap.injectTrustedCabundleis true (OpenShiftconfig.openshift.io/inject-trusted-cabundlelabel; CNO fillstrustedCabundleDataKey, defaultca-bundle.crt).openshift_sscsi_vault.renderSyncCaConfigMap— ConfigMap + trailing---when non-empty (convenience).
With vaultCsiProvider.enabled: true, this chart sets vault.csi.volumes / volumeMounts to project the default trust ConfigMap at /etc/pki/vault-ca. Override vault.csi if you use a different bundle name or proxy-only ConfigMap layout; keep names aligned with caProvider.syncProviderCaConfigMap.
The trust ConfigMap is created in caProvider.syncProviderCaConfigMap.targetNamespace. The CSI DaemonSet uses the Helm release namespace; for the default projected volume to work, those must match (see Helm release namespace and the trust ConfigMap above).
Argo CD (and plain helm template) runs client-side: helm lookup() does not see the cluster API. By default syncProviderCaConfigMap.enabled: true, createConfigMap: true, and injectTrustedCabundle: true: the chart renders a ConfigMap labeled config.openshift.io/inject-trusted-cabundle: "true" (empty data until the Cluster Network Operator fills trustedCabundleDataKey, default ca-bundle.crt). The ConfigMap includes argocd.argoproj.io/ignore-differences as a small YAML document with jsonPointers (/data) and jqPathExpressions (.data) so drift tooling ignores the CNO-managed trust bundle map. Disable with argocdIgnoreInjectedTrustedCabundleData: false. If your Argo / OpenShift GitOps build does not honor per-resource ignore rules, duplicate both entries under the Application spec.ignoreDifferences for that ConfigMap and use sync option RespectIgnoreDifferences=true. Mount only that key on the Vault CSI DaemonSet with a projected volume (configMap.items + optional: true) so the pod tolerates the key appearing after CNO injection. For the previous rhvp.cluster_utils flow (Ansible creates vault-tls-ca.pem), set injectTrustedCabundle: false, createConfigMap: false, and avoid duplicate applies for the same configMapName. Alternatively set pemLiteral or createConfigMap: true with useLookup: true for cluster-side Helm only.
- v0.0.2: Initial release
- v0.0.3: Provide default CAs to avoid skipping TLS verify
- v0.0.9: Normalize
vaultSkipTLSVerifyto"true"/"false"strings for HashiCorp vault-csi-provider (strconv.ParseBool) - v0.0.11: Handle injection of CA material
- v0.0.12: CA sync via optional
lookup(caProvider.syncProviderCaConfigMap),renderSyncCaConfigMap, hub ingress CA fallbacks; parent charts use includes only - v0.0.13: Argo-safe TLS CA -
pemLiteral,useLookup(default false),createConfigMap;vaultCACertPathwhen PEM is supplied or the ConfigMap is managed out-of-band - v0.0.14: Default
syncProviderCaConfigMap.enabled: true,createConfigMap: false, andvaultSkipTLSVerify: "false"so strict TLS targets the ConfigMap name/key that rhvp.cluster_utils provisions; setsyncProviderCaConfigMap.enabled: falseto fall back to hub/spokedefaultVaultCACertPathonly - v0.0.15:
injectTrustedCabundledefaults to true in chartvalues.yamland in named templates when the key is absent or non-boolean (CNO-injected trust bundle aligned with clusterProxy/trustedCA); setinjectTrustedCabundle: false(and typicallycreateConfigMap: false) for legacy rhvp.cluster_utilsvault-tls-ca.pem,pemLiteral, oruseLookupPEM paths - v0.0.16: CNO inject
ConfigMapdefaultsargocd.argoproj.io/ignore-differencesto/data/<trustedCabundleDataKey>(toggleargocdIgnoreInjectedTrustedCabundleData); optionalconfigMapAnnotations - v0.0.17:
argocd.argoproj.io/ignore-differencesnow embedsjsonPointersandjqPathExpressionsfor the injected data key (correct jq for keys likeca-bundle.crt) - v0.0.18: Default injected trust drift ignore now targets full
/data(jqPathExpressions: [.data]) to reduce persistent OutOfSync when injected keys vary - v0.1.0: Split responsibilities by scope: this chart now focuses on cluster-wide Vault CSI trust/config components only; app-level SecretProviderClass rendering moves to a dedicated SPC chart
- v0.2.0: Bundle HashiCorp
vaultsubchart for Vault CSI provider, default projected trust mount aligned with syncedConfigMap, OpenShiftprivilegedSCC RoleBinding; install release invaultnamespace by default so projection works
| Repository | Name | Version |
|---|---|---|
| https://helm.releases.hashicorp.com | vault | 0.32.0 |
| Key | Type | Default | Description |
|---|---|---|---|
| clusterGroup.applications | object | {} |
|
| global | object | {"clusterDomain":"foo.example.com","hubClusterDomain":"hub.example.com","localClusterDomain":""} |
Global values aligned with openshift-external-secrets chart patterns |
| ocpSecretsStoreCsiVault | object | see nested keys | Settings for cluster-wide Vault CSI support components |
| ocpSecretsStoreCsiVault.caProvider | object | {"clientCluster":{"defaultVaultCACertPath":"/etc/pki/vault-ca/hub-kube-root-ca.crt","key":"hub-kube-root-ca.crt","name":"hub-ca","namespace":"external-secrets","type":"Secret"},"enabled":true,"hostCluster":{"defaultVaultCACertPath":"/etc/pki/vault-ca/kube-root-ca.crt","key":"ca.crt","name":"kube-root-ca.crt","namespace":"external-secrets","type":"ConfigMap"},"syncProviderCaConfigMap":{"argocdIgnoreInjectedTrustedCabundleData":true,"configMapAnnotations":{},"configMapName":"openshift-sscsi-vault-vault-tls-ca","createConfigMap":true,"enabled":true,"ingressRouterCa":{"key":"ca-bundle.crt","name":"router-ca","namespace":"openshift-ingress"},"injectTrustedCabundle":true,"keyInConfigMap":"vault-tls-ca.pem","mountDir":"/etc/pki/vault-ca","pemLiteral":"","preset":"auto","targetNamespace":"vault","trustedCabundleDataKey":"ca-bundle.crt","useLookup":false}} |
Provider trust-bundle sourcing for Vault CSI. Supports CNO injected trust, inline PEM, or optional cluster lookup-based copy flows for hub/spoke patterns. Nested: syncProviderCaConfigMap, hostCluster, clientCluster. |
| ocpSecretsStoreCsiVault.caProvider.enabled | bool | true |
Enables CA source resolution helpers and optional synced ConfigMap rendering. |
| ocpSecretsStoreCsiVault.caProvider.hostCluster.defaultVaultCACertPath | string | "/etc/pki/vault-ca/kube-root-ca.crt" |
Default CA bundle path convention for hub-style deployments. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap | object | {"argocdIgnoreInjectedTrustedCabundleData":true,"configMapAnnotations":{},"configMapName":"openshift-sscsi-vault-vault-tls-ca","createConfigMap":true,"enabled":true,"ingressRouterCa":{"key":"ca-bundle.crt","name":"router-ca","namespace":"openshift-ingress"},"injectTrustedCabundle":true,"keyInConfigMap":"vault-tls-ca.pem","mountDir":"/etc/pki/vault-ca","pemLiteral":"","preset":"auto","targetNamespace":"vault","trustedCabundleDataKey":"ca-bundle.crt","useLookup":false} |
Controls generation of the provider-namespace ConfigMap used to mount trust material into Vault CSI provider pods. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.argocdIgnoreInjectedTrustedCabundleData | bool | true |
When injectTrustedCabundle and this chart renders the TLS ConfigMap: set argocd.argoproj.io/ignore-differences to a YAML snippet with jsonPointers /data and jqPathExpressions .data so Argo ignores CNO-managed bundle content. Honor depends on Argo / OpenShift GitOps version—duplicate under Application spec.ignoreDifferences if needed (see README). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.configMapAnnotations | object | {} |
Extra annotations merged onto the rendered sync TLS ConfigMap (overrides argocdIgnoreInjectedTrustedCabundleData annotation keys when the same key is set). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.configMapName | string | "openshift-sscsi-vault-vault-tls-ca" |
ConfigMap name; must match rhvp.cluster_utils vault_ss_csi_route_ca_configmap_name default (openshift-sscsi-vault-vault-tls-ca). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.createConfigMap | bool | true |
When true, Helm emits the ConfigMap (injection-labeled or PEM from pemLiteral/useLookup). When false, GitOps/Ansible must create configMapName. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.enabled | bool | true |
Enables synced trust ConfigMap behavior and template helpers. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.ingressRouterCa | object | {"key":"ca-bundle.crt","name":"router-ca","namespace":"openshift-ingress"} |
Router CA ConfigMap reference when preset resolves to ingress router CA (useLookup path). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.injectTrustedCabundle | bool | true |
When true with createConfigMap true (default), render a ConfigMap with label config.openshift.io/inject-trusted-cabundle: "true" and empty data so the Cluster Network Operator injects the cluster merged CA bundle. Mutually exclusive with rendered PEM content; set false to use PEM/lookup or an out-of-band ConfigMap. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.keyInConfigMap | string | "vault-tls-ca.pem" |
Key within the ConfigMap whose value is the PEM file; must match rhvp.cluster_utils vault_ss_csi_route_ca_configmap_key default (vault-tls-ca.pem). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.mountDir | string | "/etc/pki/vault-ca" |
Directory on the Vault CSI provider pod where the ConfigMap is mounted (must match HashiCorp Vault chart csi.volumeMounts). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.pemLiteral | string | "" |
Inline PEM (full bundle). GitOps-friendly: SOPS-encrypted values, Argo CD helm parameters, or a pattern override file. When set, used instead of cluster lookup for CM content when createConfigMap is true. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.preset | string | "auto" |
Preset for useLookup only: auto (hub vs spoke), ingressrouterca, esohubkuberootca, esospokehubca. |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.targetNamespace | string | "vault" |
Namespace for the synced ConfigMap when createConfigMap is true (Vault CSI provider namespace in typical patterns). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.trustedCabundleDataKey | string | "ca-bundle.crt" |
Data key populated by OpenShift after injection (see "Certificate injection using Operators" / custom PKI docs). |
| ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.useLookup | bool | false |
When true, use helm lookup() against the live API (hub ingress CA, ESO-style hub-ca, etc.). False by default because Argo CD client-side render has no API. |
| ocpSecretsStoreCsiVault.clusterWide.installDefaultManifests | bool | true |
When true, install cluster-wide manifests owned by this chart (currently the optional Vault CSI TLS CA sync ConfigMap). |
| ocpSecretsStoreCsiVault.vaultCsiProvider | object | {"enabled":true,"openshiftPrivilegedSCCRoleBinding":{"enabled":true}} |
HashiCorp Vault Helm subchart: deploys the Vault CSI provider DaemonSet and related RBAC when enabled. Disable if you only render trust ConfigMap templates from another release (not recommended for new installs). |
| ocpSecretsStoreCsiVault.vaultCsiProvider.openshiftPrivilegedSCCRoleBinding | object | {"enabled":true} |
When true with CSI enabled on OpenShift, grant the provider ServiceAccount the privileged SCC. |
| vault | object | see nested keys | HashiCorp vault subchart (https://github.com/hashicorp/vault-helm). Defaults: CSI provider only (no Vault server), OpenShift paths and UBI images. Keep csi.volumes ConfigMap name aligned with ocpSecretsStoreCsiVault.caProvider.syncProviderCaConfigMap.configMapName (Helm values do not cross-reference keys). Install this Helm release into the same namespace as that ConfigMap (default vault) so the projected volume can mount it. |
| vault.global.externalVaultAddr | string | "" |
Hub Vault API URL for CSI VAULT_ADDR when csi.agent.enabled is false (required on spokes unless you set it from the clustergroup layer). Example: https://vault-vault.apps.<hubClusterDomain>. |
Autogenerated from chart metadata using helm-docs v1.14.2