MFormations
Modern Network Engineering

Chapitre 14

14 — Container Networking

> CNI (Calico, Flannel, Weave, Cilium), Docker Networking, Kubernetes Networking, eBPF (Cilium, Hubble, Tetragon), Network Policies

Cours 14 — Container Networking


1. CNI (Container Network Interface)

1.1 Architecture

CNI est un standard pour configurer les interfaces réseau des conteneurs.

Diagramme en cours de génération...

Fonctionnement :

  1. Le runtime appelle le plugin CNI avec ADD / DEL
  2. Le plugin configure le réseau dans le namespace du conteneur
  3. Le plugin assigne une IP et configure les routes

1.2 Plugins CNI standards

PluginDescription
bridgeCrée un bridge Linux, connecte les conteneurs via veth
host-localAlloue des IPs depuis un range local
portmapPort forwarding (iptables)
macvlanMAC address virtuelle, bridge direct
ipvlanIP address virtuelle, même MAC
loopbackInterface lo dans le namespace

1.3 Configuration CNI

{
  "cniVersion": "1.0.0",
  "name": "mynet",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-bridge0",
      "ipam": {
        "type": "host-local",
        "ranges": [
          [{"subnet": "10.100.0.0/16"}]
        ],
        "routes": [
          {"dst": "0.0.0.0/0"}
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

1.4 CNI Plugins populaires

Diagramme en cours de génération...
PluginTechnologiePerformanceFonctionnalités
CalicoBGP + iptablesBonneNetwork Policies, WireGuard
FlannelVXLANMoyenneSimple, overlay
WeavefastdpBonneChiffrement intégré
CiliumeBPFExcellenteL7 policies, Hubble, mTLS
AWS VPC CNIElastic ENIExcellenteIPs VPC natives

2. Docker Networking

2.1 Modes réseau Docker

Diagramme en cours de génération...

bridge :

docker network create --driver bridge my-bridge
docker run --network my-bridge nginx

overlay (Swarm) :

docker swarm init
docker network create --driver overlay --attachable my-overlay
docker service create --network my-overlay --name web nginx

macvlan :

docker network create -d macvlan \
    --subnet=192.168.1.0/24 \
    --gateway=192.168.1.1 \
    -o parent=eth0 my-macvlan

3. Kubernetes Networking

3.1 Modèle réseau K8s

Kubernetes impose 3 règles fondamentales :

  1. Tous les pods peuvent communiquer avec tous les pods (sans NAT)
  2. Tous les nodes peuvent communiquer avec tous les pods (sans NAT)
  3. L'IP vue par un pod est son IP réelle (pas de NAT)
Diagramme en cours de génération...

3.2 Pod-to-Pod

Diagramme en cours de génération...

3.3 Service — kube-proxy

Les services K8s sont implémentés par kube-proxy (iptables, IPVS, ou userspace).

Diagramme en cours de génération...
# Voir les règles kube-proxy (iptables mode)
iptables -t nat -L KUBE-SERVICES
iptables -t nat -L KUBE-SVC-XXXXX

3.4 Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
    - hosts: [app.example.com]
      secretName: app-tls
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 8080
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

3.5 Egress

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-egress-dns
spec:
  podSelector:
    matchLabels:
      app: web
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - port: 53
          protocol: UDP
        - port: 53
          protocol: TCP

4. Network Policies

4.1 Principe

Les Network Policies contrôlent le trafic pod-level (comme un Security Group pour pods).

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: web-policy
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
        - ipBlock:
            cidr: 10.0.0.0/16
            except:
              - 10.0.1.0/24
      ports:
        - port: 80
        - port: 443
  egress:
    - to:
        - podSelector:
            matchLabels:
              app: database
      ports:
        - port: 5432

4.2 Isolation

Diagramme en cours de génération...

5. eBPF

5.1 Architecture eBPF

Diagramme en cours de génération...

5.2 Cilium

Cilium utilise eBPF pour remplacer kube-proxy, CNI, et Network Policies.

Diagramme en cours de génération...

Avantages Cilium :

  • ~10x performance vs iptables
  • Network Policies L7 (HTTP, gRPC, Kafka)
  • Hubble pour l'observabilité
  • kube-proxy replacement
  • ClusterMesh multi-cluster

5.3 Hubble

# Hubble CLI
hubble observe --namespace default
hubble observe --pod web-5f4d4c7b8f-x9k2j -f
hubble observe --protocol http --verdict DROPPED
hubble status

5.4 Tetragon

Tetragon (anciennement Tracee) fait du security monitoring basé eBPF :

# Détection d'événements
tetra --process -o json
tetra --capabilities -o table

Résumé

Diagramme en cours de génération...