Sync with Namespace Isolation of Controller
Isolate Akv2k8s Controller to a specific namespace.
Note: The Installation guide and prerequisites are required to complete this tutorial.
Note: This guide requres helm controller version >=1.3
Sometimes its necessary to isolate a Akv2k8s controller to single namespace. This is handy if you need multiple controllers isolated into different namespaces in a kubernetes cluster. This could be the case if the namespaces and keyvaults is owned by different teams/departments etc. where a singel service principal or managed identity can't have access to all of the keyvaults. Hence, custom authentication for a controller to allow fetching of AKV secrets/cert/signing-keys per namespace is desired.
Before we start
In this tutorial we want to isolate a single controller to only sync secrets into the akv2k8s namespace. To do this we need to update the helm installation with the watchAllNamespaces option set to false, which makes the controller not watch for AzureKeyVaultSecret resources outside the namespace.
$ helm upgrade --install akv2k8s spv-charts/akv2k8s \
--namespace akv2k8s --set watchAllNamespaces=falseIn order to show how this works in practice, we will create two AzureKeyVaultSecret, one in the akv2k8s namespace, and another in the akv-test namespace. We expect that the controller only syncs the secret in the akv2k8s namespace.
Example secrets
We start by creating a definition for the Azure Key Vault secrets in a file with name akvs-secret-sync.yaml:
# Secret we want to sync:
apiVersion: spv.no/v2beta1
kind: AzureKeyVaultSecret
metadata:
name: desired-secret
namespace: akv2k8s
spec:
vault:
name: akv2k8s-test # name of key vault
object:
name: my-secret # name of the akv object
type: secret # akv object type
output:
secret:
name: my-secret-from-akv # kubernetes secret name
dataKey: secret-value # key to store object value in kubernetes secret
---
# Secret we don't want to sync:
apiVersion: spv.no/v2beta1
kind: AzureKeyVaultSecret
metadata:
name: undesired-secret
namespace: akv-test
spec:
vault:
name: akv2k8s-test # name of key vault
object:
name: my-other-secret # name of the akv object
type: secret # akv object type
output:
secret:
name: my-other-secret-from-akv # kubernetes secret name
dataKey: secret-value # key to store object value in kubernetes secretNOTE: Observe that the first
AzureKeyVaultSecretis given to the same namespace as the controller (i.e theakv2k8snamespace), while the other is given to theakv-testnamespace.
Apply to Kubernetes:
$ kubectl apply -f akvs-secret-sync.yaml
azurekeyvaultsecret.spv.no/desired-secret created
azurekeyvaultsecret.spv.no/undesired-secret createdList AzureKeyVaultSecrets:
$ kubectl get akvs --all-namespaces=true
NAMESPACE NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
akv-test undesired-secret akv2k8s-test-keyvault my-other-secret
akv2k8s desired-secret akv2k8s-test-keyvault my-secret my-secret-from-akv 2021-13-37T13:37:00ZObserve that only the secret within the same namespace as the controller gets synced.
Shortly after, a Kubernetes secret should exist:
$ kubectl -n akv2k8s get secret
NAME TYPE DATA AGE
my-secret-from-akv Opaque 1 1mCleanup
kubectl delete -f akvs-secret-sync.yaml