Secret Controller ... Secret Operator

Comme ces temps-ci, je fais pas mal d’operator k8s, j’ai décidé de refaire un de mes controllers en operator

Petit rappel de ce qu’est un operator/controller

Encore 1 !

Aujourd’hui il y a déjà des secrets operators qui font le taff. Beaucoup d’entre eux synchronisent une source de vérités (AWS Secrets Manager, Vault..) et les secrets K8s. De mon point de vue, quand le secret source est modifié, ce n’est pas trivial (va et viens entre l’operator et la source de vérité, qui peut être plus au moins long)

Je préfère avoir un namespace “source de vérité” afin d’avoir une base sur laquelle je puisse m’appuyer, pour pas cher (kubectl get secret), lors des modifications des secrets sources.

Et j’ai envie de faire de l’Elixir avec [bonny][https://github.com/coryodaniel/bonny]

1, 2 …

A chaque mission je mets en place mon secret controller pour avoir des “secret cluster-wide”. C’est à dire avoir des secrets tagués mandatory et les copier dans tous les namespaces (comme des certificats ou des creds de registry)

Quelques soucis:

  • Je n’ai pas facilement la liste de tous mes mandatories secrets en une commande
  • Il y a des cas où je n’ai pas envie de les avoir partout
  • Je ne peux pas rajouter, à chaud, des secrets sans redémarrer mon controller

Pour pallier à tout ça, j’ai décidé de faire une CRD :

  • cluster-wide, c’est à dire que les CR ne sont pas un namespace.
  • avec des Additional printer columns, namespace origine et namespace cible
  • qui permet de ne pas redémarer mon application pour ajouter/modifier/supprimer des secrets

Comment ça se passe ?

Un dessin !

Pour chaque deploy, on a un SecretRef avec:

  • nom du secret, secretName
  • namespace origine, originNamespace
  • namespace cible, targetNamespace
apiVersion: secret-operator.example.com/v1
kind: SecretRef
metadata:
  name: test
spec:
  originNamespace: secret
  targetNamespace: default
  secretName: mysecret2

1- L’operator détecte la CR

2- Il récupère le secret source

3- Il crée le secret dans le namespace cible

Et les customs colonnes ?

kubectl get secretrefs

Sur ce ~