A Helm chart for automating the creation and management of HashiCorp Vault connections, authentication, and static secrets in Kubernetes clusters.
This Helm chart leverages the Vault Secrets Operator to automatically synchronize secrets from HashiCorp Vault into Kubernetes secrets. It supports multiple environments and clusters with environment-specific configurations.
The chart is automatically deployed via ArgoCD and manages secrets across staging, production, and blockchain clusters.
To add secrets for your application, you must modify the configuration in this repository:
- Navigate to the vault-secrets repository
- Choose the appropriate values file for your target cluster:
values-staging.yaml- For staging environmentvalues-production.yaml- For production environmentvalues-blockchain.yaml- For blockchain cluster
- Add your secret configuration under the
vault_secretssection (see examples below) - Create a merge request with your changes
- Once merged, ArgoCD will automatically deploy the changes and create your Kubernetes secrets
VSO/
├── Chart.yaml # Helm chart metadata
├── templates/
│ ├── vault_auths.yaml # Vault authentication configuration
│ ├── vault_connection.yaml # Vault connection settings
│ └── vault_static_secret.yaml # Static secret definitions
├── values-blockchain.yaml # Configuration for blockchain cluster
├── values-production.yaml # Configuration for production cluster
└── values-staging.yaml # Configuration for staging cluster
The chart includes three pre-configured values files for different environments:
| File | Purpose | Target Cluster |
|---|---|---|
values-blockchain.yaml |
Blockchain services | Blockchain Kubernetes cluster |
values-production.yaml |
Production workloads | Production Kubernetes cluster |
values-staging.yaml |
Development/testing | Staging Kubernetes cluster |
Each values file contains the following global configuration (
vault_address: https://<example-ip-address>:8200
vault_skip_tls_verify: true
vault_kubernetes_role_name: vault-secrets-operator-role
vault_kubernetes_mount_name: kubernetesUsers should ONLY modify the vault_secrets section to add new secret mappings.
vault_secrets:
- namespace: <kubernetes-namespace>
secrets:
- name: <kubernetes-secret-name>
mount: <vault-mount>
path: <vault-path>| Field | Description | Example | Required |
|---|---|---|---|
namespace |
Kubernetes namespace where the secret will be created | blockchain-admin-staging |
✅ Yes |
name |
Name of the Kubernetes secret to be created | vault-secret |
✅ Yes |
mount |
Vault mount path (KV v2 engine) | blockchain, platform |
✅ Yes |
path |
Path to the secret within the Vault mount | admin, shared |
✅ Yes |
vault_secrets:
- namespace: my-application-staging
secrets:
- name: app-credentials
mount: platform
path: my-app/credentials
- name: database-secret
mount: platform
path: my-app/databaseThis configuration will create two Kubernetes secrets in the my-application-staging namespace:
app-credentials→ synced fromplatform/my-app/credentialsin Vaultdatabase-secret→ synced fromplatform/my-app/databasein Vault
- ONLY modify the
vault_secretssection - Do not change global Vault connection or authentication settings - Consult DevOps team before using a new
mount- Mount paths are pre-configured and environment-specific - Use existing namespaces - Ensure the Kubernetes namespace exists before adding secrets
- Follow naming conventions - Use kebab-case for secret names (e.g.,
my-app-secret)
Common mount paths (consult DevOps team for complete list):
| Mount | Purpose |
|---|---|
blockchain |
Blockchain services secrets |
platform |
Platform and infrastructure secrets |
exchange |
Exchange-related secrets |
The secret path in Vault UI is constructed as: <mount>/data/<path>
Example:
- Configuration:
mount: blockchain,path: admin - Vault UI path:
blockchain/data/admin
The chart supports additional optional parameters for advanced use cases:
vault_secrets:
- namespace: my-namespace
refresh_after: 60s # How often to refresh from Vault (default: 30s)
type: kv-v2 # Vault secret engine type (default: kv-v2)
secrets:
- name: my-secret
mount: platform
path: my-app/config
destination:
create: true # Create secret if it doesn't exist (default: true)
overwrite: false # Overwrite existing secret (default: false)
type: Opaque # Kubernetes secret type (default: Opaque)
rollout_restart_targets: # Automatically restart deployments/statefulsets
- kind: Deployment
name: my-appBefore adding a secret configuration, ensure:
- The secret path exists in Vault UI at:
<mount>/data/<path> - The Kubernetes namespace already exists in the target cluster
- You have verified the correct mount path with the DevOps team
To verify your secret was created successfully:
# Check VaultStaticSecret resources
kubectl get vaultstaticsecret -n <your-namespace>
# Check Kubernetes secrets
kubectl get secrets -n <your-namespace>