|
@@ -690,9 +690,110 @@
|
|
|
<h1>ClusterSecretStore</h1>
|
|
<h1>ClusterSecretStore</h1>
|
|
|
|
|
|
|
|
<p><img alt="ClusterSecretStore" src="../pictures/diagrams-high-level-cluster-detail.png" /></p>
|
|
<p><img alt="ClusterSecretStore" src="../pictures/diagrams-high-level-cluster-detail.png" /></p>
|
|
|
-<p>The <code>ClusterSecretStore</code> is a cluster scoped SecretStore that can be used by all
|
|
|
|
|
-<code>ExternalSecrets</code> from all namespaces unless you pin down its usage by using
|
|
|
|
|
-RBAC or Admission Control.</p>
|
|
|
|
|
|
|
+<p>The <code>ClusterSecretStore</code> is a cluster scoped SecretStore that can be referenced by all
|
|
|
|
|
+<code>ExternalSecrets</code> from all namespaces. Use it to offer a central gateway to your secret backend.</p>
|
|
|
|
|
+<div class="highlight"><pre><span></span><code><span class="nt">apiVersion</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">external-secrets.io/v1alpha1</span>
|
|
|
|
|
+<span class="nt">kind</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">SecretStore</span>
|
|
|
|
|
+<span class="nt">metadata</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">example</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">example-ns</span>
|
|
|
|
|
+<span class="nt">spec</span><span class="p">:</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># Used to select the correct ESO controller (think: ingress.ingressClassName)</span>
|
|
|
|
|
+ <span class="c1"># The ESO controller is instantiated with a specific controller name</span>
|
|
|
|
|
+ <span class="c1"># and filters ES based on this property</span>
|
|
|
|
|
+ <span class="c1"># Optional</span>
|
|
|
|
|
+ <span class="nt">controller</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">dev</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># provider field contains the configuration to access the provider</span>
|
|
|
|
|
+ <span class="c1"># which contains the secret exactly one provider must be configured.</span>
|
|
|
|
|
+ <span class="nt">provider</span><span class="p">:</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># (1): AWS Secrets Manager</span>
|
|
|
|
|
+ <span class="c1"># aws configures this store to sync secrets using AWS Secret Manager provider</span>
|
|
|
|
|
+ <span class="nt">aws</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">service</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">SecretsManager</span>
|
|
|
|
|
+ <span class="c1"># Role is a Role ARN which the SecretManager provider will assume</span>
|
|
|
|
|
+ <span class="nt">role</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">iam-role</span>
|
|
|
|
|
+ <span class="c1"># AWS Region to be used for the provider</span>
|
|
|
|
|
+ <span class="nt">region</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">eu-central-1</span>
|
|
|
|
|
+ <span class="c1"># Auth defines the information necessary to authenticate against AWS by</span>
|
|
|
|
|
+ <span class="c1"># getting the accessKeyID and secretAccessKey from an already created Kubernetes Secret</span>
|
|
|
|
|
+ <span class="nt">auth</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">secretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">accessKeyID</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">awssm-secret</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">access-key</span>
|
|
|
|
|
+ <span class="nt">secretAccessKey</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">awssm-secret</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">secret-access-key</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="nt">vault</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">server</span><span class="p">:</span> <span class="s">"https://vault.acme.org"</span>
|
|
|
|
|
+ <span class="c1"># Path is the mount path of the Vault KV backend endpoint</span>
|
|
|
|
|
+ <span class="nt">path</span><span class="p">:</span> <span class="s">"secret"</span>
|
|
|
|
|
+ <span class="c1"># Version is the Vault KV secret engine version.</span>
|
|
|
|
|
+ <span class="c1"># This can be either "v1" or "v2", defaults to "v2"</span>
|
|
|
|
|
+ <span class="nt">version</span><span class="p">:</span> <span class="s">"v2"</span>
|
|
|
|
|
+ <span class="c1"># vault enterprise namespace: https://www.vaultproject.io/docs/enterprise/namespaces</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="s">"a-team"</span>
|
|
|
|
|
+ <span class="nt">caBundle</span><span class="p">:</span> <span class="s">"..."</span>
|
|
|
|
|
+ <span class="nt">auth</span><span class="p">:</span>
|
|
|
|
|
+ <span class="c1"># static token: https://www.vaultproject.io/docs/auth/token</span>
|
|
|
|
|
+ <span class="nt">tokenSecretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="s">"my-secret"</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="s">"secret-admin"</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="s">"vault-token"</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># AppRole auth: https://www.vaultproject.io/docs/auth/approle</span>
|
|
|
|
|
+ <span class="nt">appRole</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">path</span><span class="p">:</span> <span class="s">"approle"</span>
|
|
|
|
|
+ <span class="nt">roleId</span><span class="p">:</span> <span class="s">"db02de05-fa39-4855-059b-67221c5c2f63"</span>
|
|
|
|
|
+ <span class="nt">secretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="s">"my-secret"</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="s">"secret-admin"</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="s">"vault-token"</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># Kubernetes auth: https://www.vaultproject.io/docs/auth/kubernetes</span>
|
|
|
|
|
+ <span class="nt">kubernetes</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">mountPath</span><span class="p">:</span> <span class="s">"kubernetes"</span>
|
|
|
|
|
+ <span class="nt">role</span><span class="p">:</span> <span class="s">"demo"</span>
|
|
|
|
|
+ <span class="c1"># Optional service account reference</span>
|
|
|
|
|
+ <span class="nt">serviceAccountRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="s">"my-sa"</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="s">"secret-admin"</span>
|
|
|
|
|
+ <span class="c1"># Optional secret field containing a Kubernetes ServiceAccount JWT</span>
|
|
|
|
|
+ <span class="c1"># used for authenticating with Vault</span>
|
|
|
|
|
+ <span class="nt">secretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="s">"my-secret"</span>
|
|
|
|
|
+ <span class="nt">namespace</span><span class="p">:</span> <span class="s">"secret-admin"</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="s">"vault"</span>
|
|
|
|
|
+
|
|
|
|
|
+ <span class="c1"># (2): GCP Secret Manager</span>
|
|
|
|
|
+ <span class="nt">gcpsm</span><span class="p">:</span>
|
|
|
|
|
+ <span class="c1"># Auth defines the information necessary to authenticate against GCP by getting</span>
|
|
|
|
|
+ <span class="c1"># the credentials from an already created Kubernetes Secret.</span>
|
|
|
|
|
+ <span class="nt">auth</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">secretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">secretAccessKeySecretRef</span><span class="p">:</span>
|
|
|
|
|
+ <span class="nt">name</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">gcpsm-secret</span>
|
|
|
|
|
+ <span class="nt">key</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">secret-access-credentials</span>
|
|
|
|
|
+ <span class="nt">projectID</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">myproject</span>
|
|
|
|
|
+ <span class="c1"># (TODO): add more provider examples here</span>
|
|
|
|
|
+
|
|
|
|
|
+<span class="nt">status</span><span class="p">:</span>
|
|
|
|
|
+ <span class="c1"># Standard condition schema</span>
|
|
|
|
|
+ <span class="nt">conditions</span><span class="p">:</span>
|
|
|
|
|
+ <span class="c1"># SecretStore ready condition indicates the given store is in ready</span>
|
|
|
|
|
+ <span class="c1"># state and able to referenced by ExternalSecrets</span>
|
|
|
|
|
+ <span class="c1"># If the `status` of this condition is `False`, ExternalSecret controllers</span>
|
|
|
|
|
+ <span class="c1"># should prevent attempts to fetch secrets</span>
|
|
|
|
|
+ <span class="p p-Indicator">-</span> <span class="nt">type</span><span class="p">:</span> <span class="l l-Scalar l-Scalar-Plain">Ready</span>
|
|
|
|
|
+ <span class="nt">status</span><span class="p">:</span> <span class="s">"False"</span>
|
|
|
|
|
+ <span class="nt">reason</span><span class="p">:</span> <span class="s">"ConfigError"</span>
|
|
|
|
|
+ <span class="nt">message</span><span class="p">:</span> <span class="s">"SecretStore</span><span class="nv"> </span><span class="s">validation</span><span class="nv"> </span><span class="s">failed"</span>
|
|
|
|
|
+ <span class="nt">lastTransitionTime</span><span class="p">:</span> <span class="s">"2019-08-12T12:33:02Z"</span>
|
|
|
|
|
+</code></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|