Skip to main content
Version: main 🚧

External secrets

Limited vCluster Tenancy Configuration Support

This feature is only available for the following:

Running the control plane as a container and the following worker node types:
  • Host Nodes
Enterprise-Only Feature

This feature is an Enterprise feature. See our pricing plans or contact our sales team for more information.

Prerequisites​

External secrets version

By default, vCluster uses the same CRD version as the External Secrets Operator installed on your host cluster. The version field allows you to explicitly set which CRD version to use (e.g., v1beta1 or v1). Ensure your chosen version is supported by the External Secrets Operator on your host cluster.

External secrets integration

To enable the external secret integration, set the following fields:

integrations:
externalSecrets:
enabled: true
version: v1 # Optional. If not specified, uses the same CRD version as your host cluster's External Secrets Operator
sync:
toHost:
stores:
enabled: true
fromHost:
clusterStores:
enabled: true

This enables the integration and the sync for all CRDs:

  • ExternalSecret: namespaced, synced from virtual cluster into host cluster and then bi-directionally
  • SecretStore: namespaced, synced from virtual cluster into host cluster
  • ClusterSecretStore: cluster scoped, synced from host cluster into virtual cluster

Once the virtual cluster is up and running, you can create a SecretStore inside the virtual cluster. For this guide, you use the fake store type, which prefills data instead of connecting to a distant secret store.

API Version Compatibility

External Secrets Operator v0.16.2 is the last supporting v1beta1 API version. For v0.17.0+ versions, it provides exclusively v1.

apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
name: fake
spec:
provider:
fake:
data:
- key: "/foo/bar"
value: "HELLO1"
version: "v1"
- key: "/foo/bar"
value: "HELLO2"
version: "v2"
- key: "/foo/baz"
value: '{"john": "doe"}'
version: "v1"

Inside the virtual cluster, create the store with kubectl apply -f fake.yaml. This creates a corresponding store in the host cluster. You can then create an ExternalSecret in the virtual cluster, which references the SecretStore.

apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: example
spec:
refreshInterval: 1h
secretStoreRef:
name: fake
kind: SecretStore
target:
name: secret-to-be-created
data:
- secretKey: foo_bar
remoteRef:
key: /foo/bar
version: v1
dataFrom:
- extract:
key: /foo/baz
version: v1

After the ExternalSecret is created in the virtual cluster, the integration creates a corresponding resource inside the host cluster. The external secret operator running in the host creates the corresponding Kubernetes secret which the integration imports into the virtual cluster. Running kubectl get secrets in the virtual cluster includes the secret-to-be-created in its output.

Config Reference​

externalSecrets required object ​

ExternalSecrets reuses a host external secret operator and makes certain CRDs from it available inside the vCluster.

  • ExternalSecrets will be synced from the virtual cluster to the host cluster.
  • SecretStores will be synced from the virtual cluster to the host cluster and then bi-directionally.
  • ClusterSecretStores will be synced from the host cluster to the virtual cluster.

enabled required boolean false ​

Enabled defines whether the external secret integration is enabled or not

version required string ​

Version defines the version of the external secrets operator to use. If empty, the storage version will be used.

webhook required object ​

Webhook defines whether the host webhooks are reused or not

enabled required boolean false ​

Enabled defines if this option should be enabled.

sync required object ​

Sync defines the syncing behavior for the integration

toHost required object ​

ToHost defines what resources are synced from the virtual cluster to the host

externalSecrets required object ​

ExternalSecrets allows to configure if only a subset of ExternalSecrets matching a label selector should get synced from the virtual cluster to the host cluster.

selector required object ​
matchLabels required object {} ​
matchExpressions required object[] ​
key required string ​
operator required string ​
values required string[] ​
stores required object ​

Stores defines if secret stores should get synced from the virtual cluster to the host cluster and then bi-directionally.

selector required object ​
matchLabels required object {} ​
matchExpressions required object[] ​
key required string ​
operator required string ​
values required string[] ​
enabled required boolean false ​

Enabled defines if this option should be enabled.

fromHost required object ​

FromHost defines what resources are synced from the host cluster to the virtual cluster

clusterStores required object ​

ClusterStores defines if cluster secrets stores should get synced from the host cluster to the virtual cluster.

selector required object ​
matchLabels required object {} ​
matchExpressions required object[] ​
key required string ​
operator required string ​
values required string[] ​
enabled required boolean false ​

Enabled defines if this option should be enabled.