Skip to content

ADR 012 — Densité de pods : Prefix Delegation du VPC CNI

Statut

Remplacé (2026-06-18) par la migration vers Cilium (ADR 019, #80). Accepté à l'origine le 2026-06-11 comme solution AWS-native. La Prefix Delegation est retirée : l'overlay Cilium donne aux pods des IP hors VPC, ce qui affranchit la densité du plafond ENI (le maxPods: 110 du launch template est conservé, désormais servi par l'overlay). Cet ADR reste pour l'historique de la décision.

Contexte

L'installation d'ArgoCD (#72) a échoué : 4 pods restaient en Pending avec FailedScheduling: Too many pods. Diagnostic :

  • Node unique t3.medium, max-pods = 17.
  • Cette limite n'est pas liée au CPU/mémoire (mesurés à 34 %), mais au réseau : avec le VPC CNI d'AWS, chaque pod consomme une IP secondaire d'ENI. Le nombre d'ENI et d'IP par ENI dépend du type d'instance (t3.medium : 3 ENI × 6 IP − 1 = 17).
  • Le node était plein (17/17) avec les pods système + opérateurs (Envoy, cert-manager, ESO, ExternalDNS, metrics-server) + fastapi.
  • Le problème va s'aggraver au Sprint 4 : #74 (kube-prometheus-stack) et #75 (Loki + Alloy) ajoutent de nombreux pods.

Même en désactivant les composants ArgoCD non essentiels (dex, notifications, applicationset), l'ensemble ne rentre pas dans 17. La capacité de pods doit être augmentée à la racine.

Décision

Activer la Prefix Delegation du VPC CNI : chaque ENI alloue des préfixes /28 (16 IP) au lieu d'IP unitaires, ce qui fait passer max-pods de 17 à 110 sur t3.medium. Gratuit, c'est la bonne pratique AWS recommandée pour la densité de pods.

Deux changements Terraform (terraform/modules/eks/main.tf) :

  1. Addon vpc-cni : configuration_values.env.ENABLE_PREFIX_DELEGATION = "true" (+ WARM_PREFIX_TARGET = "1" pour garder un préfixe chaud).
  2. aws_launch_template pour le node group, avec user-data nodeadm (AL2023) forçant maxPods: 110.

⚠️ Point clé : un managed node group "simple" (sans launch template) garde max-pods = 17 même avec la Prefix Delegation activée sur le CNI, car EKS calcule max-pods au boot sans en tenir compte. Le launch template avec override maxPods est donc obligatoire, pas optionnel.

Alternatives écartées

  • Grossir l'instance (t3.large/xlarge) : gaspille du CPU/mémoire (déjà à 34 %) pour gagner des IP, coût, et le plafond ENI demeure une limite (juste plus haute).
  • Ajouter un 2e node : double le coût, ne traite pas le fond (la densité par node reste à 17), masque le vrai sujet.
  • Réduire le nombre de pods ArgoCD : insuffisant (ne rentre pas dans 17), et bloquerait quand même l'observabilité à venir.

Conséquences

  • L'ajout d'un launch template à un node group qui n'en avait pas force son remplacement (terraform apply recycle le node, bref downtime sur cluster mono-node éphémère).
  • Ordre des dépendances (critique, INC-053) : l'addon CNI doit être configuré avant le boot des nodes. Sinon les nodes démarrent leurs ENI en mode IP classique, et activer la Prefix Delegation après coup ne les reconfigure pas (maxPods=110 mais aws-cni failed to assign an IP) ; il faut alors recycler le node. Le code pose donc aws_eks_node_group.main depends_on aws_eks_addon.vpc_cni (et l'addon ne dépend plus du node group).
  • Première activation sur cluster existant : l'ordre n'étant pas encore correct au 1er apply, le node a dû être recyclé manuellement (terminate de l'instance, remplacée par le node group, qui boote alors en mode prefix). Au montage from-scratch (aws-start), l'ordre cluster → addon CNI → node group rend la densité disponible dès le boot, sans recyclage. Validé le 2026-06-12 (aws-start from-scratch) : max-pods=110 dès le boot, aucun recyclage manuel.

Validation

  • Node recyclé : max-pods passé de 17 → 110 (kubectl get node ... allocatable.pods).
  • Les pods ArgoCD précédemment Pending se schedulent.

Évolution : migration vers Cilium

La Prefix Delegation est une solution AWS-native (couplée au VPC CNI). Une migration vers Cilium (CNI eBPF, CNCF) est retenue pour une prochaine session from-scratch, motivée par la portabilité (même CNI sur EKS, homelab on-prem, platform) et la puissance (CiliumNetworkPolicy L7, Hubble, kube-proxy replacement). En mode overlay, Cilium s'affranchit de la contrainte d'IP par ENI et rendrait cette Prefix Delegation obsolète. Cet ADR documente la solution intermédiaire qui débloque le Sprint 4. Voir l'issue dédiée.

Références