Skip to content

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