Architecture en profondeur
Audience: Contributeur
Cette page parcourt le code au niveau des packages. Pour la vue d'ensemble au niveau opérateur (composants, flux de données, frontières de confiance), voir operators/architecture.
Architecture des packages
| Package | Rôle |
|---|---|
pkg/injector |
Serveur webhook et logique d'admission. Modifie les PodSpecs : ajoute des variables d'env (mode classique) ou des chaînes placeholder (mode NRI). Appelle CanIGetRoles uniquement en mode legacy. |
pkg/nri |
Plugin NRI. S'enregistre auprès de containerd au démarrage. Intercepte les événements CreateContainer et substitue les variables d'env placeholder par les vrais identifiants récupérés depuis le cache par nœud. |
pkg/renewer |
Renewer périodique. Itère les entrées du mount KV et renouvelle les tokens et leases avant leur expiration. Ne révoque pas (c'est le rôle du revoker). |
pkg/revoker |
Revoker par observation des pods. Surveille les événements DELETE sur les pods portant le label de l'injector et révoque leur token Vault et leur lease. Effectue également un balayage de sécurité toutes les 5 minutes pour rattraper les pods manqués par la surveillance. |
pkg/vault |
Wrapper client Vault. Gère tous les appels API Vault : lectures/écritures KV, émission d'identifiants de base de données, renouvellement/révocation de tokens et leases, connexion projected-SA via JWT TokenRequest. |
pkg/k8s |
Initialisation du client Kubernetes, analyse des annotations, requêtes de tokens ServiceAccount. |
pkg/k8smutator |
Logique de mutation webhook extraite de pkg/injector. Contient la logique par admission et est testable unitairement indépendamment avec cfg.NRI.Enabled activé ou non. |
pkg/leadership |
Élection de leader via les objets Lease Kubernetes. Le renewer et le revoker fonctionnent en multi-réplique ; seul le leader effectue le travail actif. |
pkg/healthcheck |
Handlers HTTP /healthz et /readyz. |
pkg/metrics |
Registre Prometheus et toutes les définitions de métriques vdbi_*. |
pkg/config |
Analyse et validation du fichier de configuration (YAML → struct). Partagé par les trois binaires. |
pkg/placeholder |
Génération et analyse des chaînes placeholder (format __VDBI_PH_<64hex>___). |
pkg/controller |
Logique de point d'entrée des binaires de haut niveau ; assemble la configuration, les métriques, la santé et le composant spécifique au mode. |
pkg/logger |
Wrapper Logrus avec des conventions de champs cohérentes. |
pkg/sentry |
Initialisation du rapporteur d'erreurs Sentry. |
Flux clés
1. Admission (webhook → injector)
kube-apiserver
│ POST /mutate (AdmissionReview)
▼
pkg/injector (HTTPS :8443)
│ analyse des annotations
│ vérification du label pod : vault-db-injector=true
│
├─ Mode NRI (useProjectedSA=true, nri.enabled=true)
│ émet un TokenRequest pour le SA du pod (pkg/k8s)
│ connexion à Vault avec JWT (pkg/vault)
│ récupère les identifiants DB depuis database/creds/<role>
│ écrit une entrée KV (uuid → token/lease IDs)
│ remplace les valeurs d'env par des chaînes placeholder
│ retourne le PodSpec modifié
│
└─ Mode legacy
connexion avec le token SA de l'injector
création d'un token orphan pour le pod
récupération des identifiants DB
écriture de l'entrée KV
injection des identifiants en clair dans les variables d'env
retourne le PodSpec modifié
2. Substitution NRI (locale au nœud, à la création du conteneur)
containerd
│ CreateContainer(containerConfig)
▼
pkg/nri (plugin NRI, DaemonSet)
│ recherche de __VDBI_PH_<hex>___ dans les variables d'env
│
│ cache hit ?
│ ├─ oui → substitue le placeholder → retourne la config ajustée
│ └─ non → lit l'entrée KV (pkg/vault)
│ met en cache dans /run/<release>/nri/cache.json
│ substitue le placeholder → retourne la config ajustée
│
└─ en cas d'échec : retourne une erreur → containerd abandonne CreateContainer
(le pod reste en ContainerCreating, métrique incrémentée)
3. Révocation (revoker)
kube-apiserver
│ WATCH pods (label : vault-db-injector=true)
│
▼ événement DELETE
pkg/revoker
│ lit l'entrée KV pour l'UUID du pod (pkg/vault)
│ révoque le lease Vault (pkg/vault)
│ révoque le token orphan (pkg/vault)
│ supprime l'entrée KV (pkg/vault)
│ émet vdbi_revoke_token_count_success / _error
│
└─ balayage de sécurité (toutes les 5 min)
liste les entrées KV
pour chacune : vérifie que le pod tourne toujours (pkg/k8s)
sinon → révoque + supprime
Ajouter une nouvelle métrique
- Définir la métrique dans
pkg/metrics/metrics.goavec le préfixevdbi_. - L'enregistrer dans
init()dans le même fichier. - L'incrémenter/observer dans le package concerné.
- L'ajouter à
docs/reference/metrics.mddans la catégorie appropriée.