Configure
In this part, you will
- Create a secret in Vault
- Configure Kubernetes Authentication
- Create a policy and a service account. You will then create a role that binds the policy with the service account so that pods have the necessary get and describe permissions to access the secret
Step 1: Create Secret¶
When Vault is run in development mode, a KV secret engine is enabled at the path /secret.
- Start an interactive shell session on the vault-0 pod
kubectl exec -it vault-0 -- /bin/sh
-
Commands issued at this prompt are executed on the vault-0 container
-
Create a secret at the path secret/db-pass with a password
vault kv put secret/db-pass password="db-secret-password"
- Verify that the secret is readable at the path secret/db-pass
vault kv get secret/db-pass
Step 2: Configure Kubernetes Authentication¶
Vault provides a Kubernetes authentication method that enables clients to authenticate with a Kubernetes Service Account Token. The Kubernetes resources that access the secret and create the volume authenticate through this method through a role.
- Enable the Kubernetes authentication method
vault auth enable kubernetes
- Configure the Kubernetes authentication method with the Kubernetes API address. It will automatically use the Vault pod's own service account token. The environment variable KUBERNETES_PORT_443_TCP_ADDR references the internal network address of the Kubernetes host
vault write auth/kubernetes/config \
kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"
Step 3: Create a policy, role and service account¶
- Create a policy named "internal-app". This will be used to give the "webapp-sa" service account permission to read the kv secret created earlier
vault policy write internal-app - <<EOF
path "secret/data/db-pass" {
capabilities = ["read"]
}
EOF
- Create a Kubernetes authentication role named "database" that binds this policy with a Kubernetes service account named webapp-sa
vault write auth/kubernetes/role/database \
bound_service_account_names=webapp-sa \
bound_service_account_namespaces=web-app \
policies=internal-app \
ttl=20m
The role connects the Kubernetes service account "webapp-sa" in the namespace "web-app" with the Vault policy "internal-app".
Exit the vault-0 pod.
exit
- Create a namespace where the test pod will be deployed (e.g. web-app), create a service account named "webapp-sa" in that namespace
kubectl create serviceaccount webapp-sa -n web-app
Next Steps¶
You are now ready to move on to the next part of the recipe where you will create a workload and access the secrets.