Je viens de tomber sur une petit pépite pour la gestion des secrets Kubernetes. Actuellement je gère mes secrets de la pire des manières qu’il soit : je créer mes secrets avec kubectl create secret
.
C’est sympa 2 secondes mais pour rendre ça plus pratique ça serait cool de pouvoir récupérer des secrets de l’extérieur du cluster, par exemple d’un magasin de secrets comme AWS Secrets Manager (que j’utilise) ou HashiCorp Vault.
J’ai alors découvert (tardivement je vous l’accorde) Kubernetes External Secrets de l’équipe GoDaddy. Exactement ce qu’il me fallait !
Le principe est simple : un controller de secret écoute dans le cluster les demandes de secrets, va les récupérer sur les sources externes (AWS Secrets Manager ou Vault par exemple) et créer pour vous les objets Kubernetes secrets
.

- Un objet (via une CRD)
externalsecrets
est ajouté dans le cluster - Le controller récupère cet
externalsecrets
via l’API Kubernetes - Le controller utilise l’objet
externalsecrets
pour récupérer les données du secret depuis l’extérieur - Le controller ajoute un objet
secret
avec les données récupérées - Les
pods
peuvent accéder à ce secret
Exemple d’utilisation
J’ai fait une petite vidéo rapide pour vous montrer en live l’utilisation. J’ai pas fait un gros truc mais c’était histoire de montrer en réel. Les commandes utilisées pour cette vidéo sont juste ci-dessous et la vidéo est en haut de cet article.
On installe la chart Helm :
helm repo add external-secrets https://godaddy.github.io/kubernetes-external-secrets/
helm install external-secrets/kubernetes-external-secrets
On créer nos 2 secrets sur le Secrets Manager d’AWS, un secret de type texte et un autre de type texte sécurisé :
aws ssm put-parameter --name "/scw-bcn-production-1/hello" --type "String" --value "Hello World"
aws ssm put-parameter --name "/scw-bcn-production-1/hello-secure" --type "SecureString" --value "Hello World Secure"
On créé ensuite nos 2 externalsecrets
:
apiVersion: kubernetes-client.io/v1
kind: ExternalSecret
metadata:
name: hello-world
spec:
backendType: systemManager
data:
- key: /scw-bcn-production-1/hello
name: password
---
apiVersion: kubernetes-client.io/v1
kind: ExternalSecret
metadata:
name: hello-world-secure
spec:
backendType: systemManager
data:
- key: /scw-bcn-production-1/hello-secure
name: password
Et si vous avez bien installé votre controller, 2 secrets
Kubernetes devrait poper dans le namespace actuel, comme ici avec hello-world
et hello-world-secure
:
kubectl get secrets
NAME TYPE DATA AGE
aws-credentials Opaque 2 6d22h
default-token-bftq4 kubernetes.io/service-account-token 3 6d22h
external-secrets-kubernetes-external-secrets-token-pwhc9 kubernetes.io/service-account-token 3 4h18m
hello-world Opaque 1 16m
hello-world-secure Opaque 1 16m
sh.helm.release.v1.external-secrets.v1 helm.sh/release.v1 1 4h18m
Les secrets sont maintenant utilisables par vos pods.
En tout cas je vous invite à aller voir le repo GitHub pour tester, je trouve ça vraiment classe et ça peut simplifier pas mal de chose dans la gestion de secrets.
Je ferais peut-être d’autres vidéos ou articles sur l’installation de tout ça.
Bon week-end !