Introduction
VPC CNI est le CNI (Container Network Interface) par défaut dans EKS. Il attache directement des adresses IP du VPC aux Pods, ce qui offre une intégration native avec les services AWS (security groups, VPC Flow Logs, Network ACLs).
Mais il est relativement limité en termes de Network Policies, d'observabilité, et de chiffrement du trafic. Cilium, lui, excelle dans ces domaines grâce à eBPF, mais en mode standalone, il gère aussi l'IPAM, ce qui fait perdre l'intégration native avec le VPC.
Le mode chaining (ou hybrid mode) résout ce dilemme : Cilium se greffe sur le VPC CNI pour la gestion des IP, tout en prenant en charge les Network Policies, la visibilité et le chiffrement via eBPF.
Pourquoi utiliser le mode chaining ?
| Critère | VPC CNI seul | Cilium standalone | Cilium chaining |
|---|---|---|---|
| IP native AWS | Oui | Non | Oui |
| Security groups par Pod | Oui (sauf en Auto Mode) | Non | Oui |
| Network Policies | Limitée | Avancée (L3-L7) | Avancée (L3-L7) |
| Observabilité | Minimale | Hubble (L3-L7) | Hubble (L3-L7) |
| Chiffrement | Non | Wireguard / IPsec | Wireguard / IPsec |
| VPC Flow Logs | Oui | Non | Oui |
| Compatibilité AWS | Maximale | Partielle | Maximale |
Le mode chaining est particulièrement adapté si :
- Vous avez besoin des security groups par Pod (native AWS)
- Vous voulez Network Policies L7 (HTTP, gRPC, Kafka)
- Vous cherchez une observabilité fine avec Hubble
- Vous voulez du chiffrement du trafic sans side-car
Architecture
Le principe est simple : la chaîne CNI exécute d'abord le VPC CNI (branchement de l'interface, allocation IP), puis Cilium applique ses programmes eBPF sur l'interface déjà configurée.
Cilium n'intervient pas dans l'allocation des IP.
Il se contente de :
- Détecter l'interface créée par le VPC CNI
- Attacher ses programmes eBPF (tc / XDP)
- Appliquer les policies réseau
- Collecter les métriques et flows pour Hubble
Installation
Prérequis
- Cluster EKS (ou tout cluster AWS avec VPC CNI)
- AWS VPC CNI v1.18+ (recommendé v1.19+)
- Cilium ≥ 1.16 (recommandé 1.17+)
- Nœuds avec kernel ≥ 5.10 (Amazon Linux 2023 recommandé)
1. Configurer le VPC CNI
Le VPC CNI doit être configuré pour déléguer les Network Policies à Cilium.
# Désactiver les Network Policies du VPC CNI
kubectl set env daemonset aws-node -n kube-system \
NETWORK_POLICY_ENFORCING_MODE=disabled
# Configurer l'ENABLE_POD_ENI si vous voulez les security groups par Pod
kubectl set env daemonset aws-node -n kube-system \
ENABLE_POD_ENI=true2. Installer Cilium en mode chaining
Créez un fichier cilium-values.yaml :
cni:
chainingMode: aws-cni
chainingTarget: aws-node
ipam:
mode: kubernetes
identityAllocationMode: crd
enableIPv4Masquerade: false
bpf:
masquerade: true
hubble:
enabled: true
relay:
enabled: true
ui:
enabled: true
encryption:
enabled: true
type: wireguard
l7Proxy: true
rollOutCiliumPods: trueExplications :
chainingMode: aws-cni— active le mode chaining avec le VPC CNIipam: kubernetes— Cilium n'alloue pas les IP, il utilise l'IPAM du VPC CNIenableIPv4Masquerade: false— le VPC CNI gère le masquerade (via son propre SNAT)bpf.masquerade: true— Cilium peut optimiser le masquerade via BPF si besoin
Appliquez avec Helm :
helm repo add cilium https://helm.cilium.io
helm repo update
helm upgrade --install cilium cilium/cilium \
--namespace kube-system \
--values cilium-values.yaml3. Vérifier l'installation
# Vérifier que les pods Cilium sont bien démarrés
kubectl -n kube-system get pods -l k8s-app=cilium
# Vérifier le status de l'agent Cilium
kubectl -n kube-system exec daemonset/cilium -- cilium status
# Vérifier le mode chaining
kubectl -n kube-system exec daemonset/cilium -- cilium status | grep ChainingSortie attendue :
Chaining: aws-cniNetwork Policies
Avec le chaining, les Network Policies sont gérées uniquement par Cilium. Les ressources standard NetworkPolicy Kubernetes sont respectées, mais vous pouvez aussi utiliser les CRD avancées de Cilium.
Policy L3/L4 standard
Une policy classique fonctionne sans modification :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow
spec:
podSelector:
matchLabels:
app: api
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080Policy L7 (HTTP)
Cilium permet de filtrer par méthode HTTP, path, et headers :
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: api-l7
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: GET
path: "/users/.*"
- method: POST
path: "/users"
- method: "GET"
path: "/healthz"Policy DNS
Cilium peut aussi filtrer les requêtes DNS :
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: dns-allow
spec:
endpointSelector:
matchLabels:
app: worker
egress:
- toFQDNs:
- matchPattern: "*.amazonaws.com"
- matchName: "api.mon-saas.com"
toPorts:
- ports:
- port: "443"
protocol: TCPObservabilité avec Hubble
Hubble est l'observabilité réseau de Cilium. Il donne une visibilité L3/L7 sur tout le trafic.
Installation (déjà activée dans les valeurs ci-dessus)
# Activer le port-forward vers Hubble UI
kubectl port-forward -n kube-system svc/hubble-ui 12000:80
# Utiliser Hubble CLI
hubble observe --namespace production --protocol httpExemple de sortie Hubble :
Jul 9 10:23:45.123 frontend-7f8b9c → api-6d4f8a http GET /users/123 200
Jul 9 10:23:46.456 api-6d4f8a → redis-2b3c1a tcp 6379 allowed
Jul 9 10:23:47.789 worker-9e1f2d → api.amazonaws.com dns AAAA NXDOMAINMétriques Prometheus
Cilium expose des métriques Prometheus pour le monitoring :
kubectl -n kube-system exec daemonset/cilium -- cilium metrics listLes métriques clés pour le mode chaining :
cilium_forward_count_total— paquets forwardéscilium_drop_count_total— paquets bloqués par policycilium_policy_l7_total— requêtes HTTP filtrées par policy
Chiffrement du trafic
Avec le mode chaining, Cilium peut chiffrer le trafic entre les nœuds via Wireguard (recommandé) ou IPsec.
WireGuard
Pour activer WireGuard, assurez-vous que les nœuds ont le module wireguard chargé (Amazon Linux 2023 l'inclut nativement) :
encryption:
enabled: true
type: wireguardVérification :
# Vérifier les clés WireGuard sur un nœud
kubectl -n kube-system exec daemonset/cilium -- cilium encrypt status
# Tester le chiffrement en capturant un paquet entre deux nœuds
kubectl -n kube-system exec daemonset/cilium -- tcpdump -i any -c 10 udp port 51871Migration depuis une installation VPC CNI seule
La migration est transparente et sans interruption de service si elle est bien préparée.
# 1. Installer Cilium avec chaining (les pods existants ne sont pas impactés)
helm upgrade --install cilium cilium/cilium \
--namespace kube-system \
--values cilium-values.yaml
# 2. Redémarrer les pods pour qu'ils utilisent la nouvelle chaîne CNI
kubectl rollout restart deployment -n production --all
# 3. Désactiver les Network Policies du VPC CNI
kubectl set env daemonset aws-node -n kube-system \
NETWORK_POLICY_ENFORCING_MODE=disabledImportant : Les Network Policies existantes (standard Kubernetes) restent appliquées. Cilium les prend en charge automatiquement via le mode chaining.
Pièges à éviter
VPC CNI préfixe / max-pods
En mode chaining, Cilium ne gère pas l'IPAM. La limite du nombre de Pods par nœud est toujours celle du VPC CNI. Pensez à activer les préfixes /28 (VPC CNI v1.16+) pour augmenter la capacité :
kubectl set env daemonset aws-node -n kube-system \
ENABLE_PREFIX_DELEGATION=true
kubectl set env daemonset aws-node -n kube-system \
WARM_PREFIX_TARGET=1Security groups par Pod (SGPP)
Si vous utilisez les security groups par Pod, assurez-vous que ENABLE_POD_ENI=true est configuré sur le VPC CNI. Cilium n'interfère pas avec ce mécanisme.
⚠️ Non compatible EKS Auto Mode — Les security groups par Pod nécessitent la gestion manuelle du VPC CNI (
aws-nodedaemonset modifiable). En Auto Mode, AWS gère le CNI de bout en bout, etENABLE_POD_ENIn'est pas configurable. Si vous avez besoin de SGPP, vous devez utiliser un cluster EKS standard (avec node groups gérés ou self-managed), pas Auto Mode.
Masquerade (SNAT)
Ne pas activer ipMasqAgent de Cilium si vous avez déjà aws-node configuré pour le SNAT. Les deux risquent de créer des conflits sur les règles iptables.
# Désactiver le SNAT Cilium si le VPC CNI le gère déjà
enableIPv4Masquerade: falseNoeuds Windows
Le mode chaining ne fonctionne pas sur les nœuds Windows. Cilium nécessite eBPF, qui est Linux-only. Les nœuds Windows continuent d'utiliser le VPC CNI seul.
Résumé
| Fonctionnalité | VPC CNI seul | VPC CNI + Cilium chaining |
|---|---|---|
| IP native AWS | Oui | Oui |
| Security groups par Pod | Oui (sauf en Auto Mode) | Oui |
| Network Policies | Limitée | L3/L4/L7 |
| Observabilité | CloudWatch | Hubble (flows, HTTP, DNS) |
| Chiffrement | Non | WireGuard / IPsec |
| ClusterMesh (multi-cluster) | Non | Oui |
| CLI diagnostic | aws CLI | cilium connectivity test |
| Complexité opérationnelle | Faible | Moyenne |
Le mode chaining est la configuration recommandée pour les clusters EKS qui veulent sortir du minimum viable sans perdre l'intégration native AWS. Il ne remplace pas le VPC CNI — il le complète.