ADR 006 â Architecture Kubernetes et dĂ©cisions Sprint 3
Contexte
Sprint 3 â DĂ©ploiement de FastAPI sur AWS EKS. DĂ©cisions d'architecture pour le routing, les secrets et le dĂ©ploiement.
DĂ©cision 1 â Ingress Controller vs Gateway API
Options évaluées
Option A â Ingress + AWS ALB Controller (retenu)
Avantages : - Standard Kubernetes depuis 2015, trÚs répandu en prod - Documentation abondante - Intégration native AWS (ALB + ACM SSL automatique) - Coût inclus dans l'ALB standard
Inconvénients : - Annotations vendor-specific (aws-specific) - Limité pour les cas trÚs avancés
Option B â Gateway API + AWS VPC Lattice (non retenu)
Avantages : - Nouveau standard Kubernetes (GA depuis 2023) - Portable entre clouds - Plus expressif (gRPC, TCP, multi-tenant) - Recommandé par Kubernetes SIG-Network
Inconvénients : - AWS VPC Lattice = coût supplémentaire - Plus complexe à configurer - 90% des entreprises utilisent encore Ingress
Décision : Ingress + ALB Controller
Raison : rapport complexité/valeur et contrainte budgétaire. Gateway API mentionné dans le README comme évolution future.
DĂ©cision 2 â Gestion des secrets
Option A â Kubernetes Secrets natifs (non retenu) Secrets stockĂ©s en base64 dans etcd, pas chiffrĂ©s, pas de rotation.
Option B â AWS Secrets Manager + External Secrets Operator (retenu)
AWS Secrets Manager
â External Secrets Operator (pull toutes les heures)
â Kubernetes Secret natif
â Pod FastAPI
Avantages : - Secrets chiffrés cÎté AWS - Rotation automatique possible - Audit trail via CloudTrail - Séparation des responsabilités
DĂ©cision 3 â Terraform persistent vs ephemeral
ProblÚme rencontré
La destruction quotidienne supprimait ECR et IAM user GitLab CI. Conséquence : credentials invalides, pipeline CI/CD plantée.
Solution adoptée
terraform/persistent/ â apply une seule fois, jamais destroy
âââ ECR repository (0.10$/GB/mois â 0$)
âââ IAM user gitlab-ci (0$/mois)
terraform/ephemeral/ â apply le matin, destroy le soir
âââ VPC + subnets
âââ NAT Gateway (0.045$/h)
âââ EKS cluster + nodes (0.10$/h)
âââ RDS PostgreSQL (0.02$/h)
Scripts quotidiens
./aws-start.sh # matin â deploy ephemeral + configure kubectl
./aws-stop.sh # soir â vĂ©rifier ENIs orphelins + destroy
Lessons apprises â ENIs orphelins
Lors de la destruction du VPC, des ENIs gérés par EKS et RDS peuvent bloquer la suppression des subnets.
Causes : - Terraform destroy interrompu (Ctrl+C, redĂ©marrage container) - ENIs owned par les services AWS â pas supprimables manuellement
Solutions : - Ne jamais interrompre un terraform destroy - Utiliser tmux pour les longues opérations - aws-stop.sh vérifie les ENIs avant destroy - Si bloqué : attendre 10-15 min qu'AWS libÚre les ENIs
Lessons apprises â State Terraform orphelin
Lors de restructuration des modules, les anciens states S3 ne connaissent pas les ressources créées avec le nouveau state.
RĂšgle : terraform import avant restructuration en production. En dev : terraform destroy puis restructurer puis apply.
Architecture Kubernetes retenue
Internet
HTTPS (ACM certificate)
ALB (Application Load Balancer)
Ingress (AWS ALB Ingress Controller)
Service (ClusterIP)
Deployment (FastAPI pods)
RDS PostgreSQL (subnet privé)
AWS Secrets Manager (via External Secrets Operator)
Manifests à créer
k8s/base/
âââ namespace.yaml
âââ configmap.yaml
âââ externalsecret.yaml
âââ deployment.yaml
âââ service.yaml
âââ ingress.yaml
âââ hpa.yaml
âââ kustomization.yaml
Composants Helm Ă installer
1. AWS Load Balancer Controller
Crée et configure l'ALB automatiquement
Nécessite IRSA (IAM Roles for Service Accounts)
2. External Secrets Operator
Synchronise AWS Secrets Manager vers Kubernetes Secrets
Nécessite IRSA pour accéder à AWS Secrets Manager
Coûts infrastructure complÚte
Persistent (toujours actif) :
ECR ~0.01$/mois
IAM user 0$/mois
Ephemeral (4h/jour, 20 jours/mois) :
NAT Gateway 0.045$/h x 4h = 0.18$/jour
EKS Control 0.10$/h x 4h = 0.40$/jour
t3.medium 0.047$/h x 4h = 0.19$/jour
RDS micro 0.02$/h x 4h = 0.08$/jour
ALB 0.008$/h x 4h = 0.03$/jour
Total/jour ~0.88$/jour
Total/mois ~17.6$ (20 jours)
Références
- Ticket : #24 k8s: create kubernetes manifests
- Ticket : #28 k8s: configure AWS Secrets Manager + ESO
- Ticket : #29 infra: add ALB Ingress Controller
- Date : 2026-05-12
- Kubernetes version : 1.32
- AWS Load Balancer Controller : v2.x
- External Secrets Operator : v0.x