Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
A comprehensive comparison of k3s distributions (official, k3sup, k3d, AutoK3s) and CNI plugins (Flannel, Calico, Cilium, Canal) covering NetworkPolicy support, performance benchmarks, ingress, storage, and production deployment considerations.
Kubernetes NetworkPolicy ist die Standard-API zur Steuerung des Traffics zwischen Pods â aber die API-Spezifikation ist lediglich ein Vertrag. Wie dieser Vertrag durchgesetzt wird, hĂ€ngt vollstĂ€ndig vom gewĂ€hlten CNI-Plugin ab, und der Performance-Unterschied zwischen den Implementierungen ist bei groĂen Skalierungen dramatisch.
Dieser Artikel befasst sich mit den zwei dominierenden DurchsetzungsansÀtzen: eBPF-basiert (Cilium) und iptables-basiert (Calico). Wir untersuchen die interne Funktionsweise, reale Performance-Benchmarks bei 100 bis 10.000 Policies, die RealitÀt von L7-Policies und praktische Debugging-Muster.
Cilium hĂ€ngt eBPF-Programme an mehreren Hook-Punkten im Linux-Kernel an. Jede Policy-Entscheidung erfolgt im Kernel-Space â ohne Userspace-Proxy, ohne iptables-Traversierung und ohne Context-Switches.
Hook-Punkte (in der Reihenfolge der Paketverarbeitung):
| Hook-Punkt | Ort | Funktion |
|---|---|---|
| XDP | NIC-Treiber-Level | FrĂŒhestmögliche Interzeption. Verwirft abgelehnte Pakete, bevor sie den Kernel-Netzwerkstack betreten. Erfordert einen nativ XDP-fĂ€higen NIC-Treiber (Mellanox ConnectX, Intel XL710, Bare Metal). |
| TC ingress | veth-Interface | L3/L4-Policy-Durchsetzung fĂŒr Pod-zu-Pod-Traffic. BPF-Maps speichern Policies als Identity + Bitmap-Lookups â O(1) unabhĂ€ngig von der Anzahl der Regeln. |
| TC egress | veth-Interface | Egress-Policy-Durchsetzung, FQDN-basierte Regeln, Rate Limiting. |
| Socket-Level | connect() Syscall | L7-Policy-Durchsetzung via Redirect an einen pro-Node Envoy-Proxy zur Inspektion von HTTP/gRPC/Kafka/DNS. |
Die vom Cilium-Agent kompilierten eBPF-Programme nutzen BPF-Maps fĂŒr das Zustandsmanagement. Policy-Updates pushen neuen BPF-Bytecode in den Kernel â es gibt keine regelbasierte Programmierung von iptables-Chains.
Packet flow with Cilium eBPF:
NIC â [XDP: drop/allow] â TC ingress â [BPF map lookup: identity+port] â Pod
Pod â [BPF map lookup] â TC egress â [FQDN resolve] â NIC
Zentrale Design-Eigenschaft: Der Policy-Lookup erfolgt via BPF-Maps in O(1). Das HinzufĂŒgen des 10.000sten Services oder der 1.000sten Policy Ă€ndert nichts an den Lookup-Kosten. Dies ist der fundamentale Performance-Vorteil.
Der Felix-Agent von Calico lĂ€uft auf jedem Node und ĂŒbersetzt NetworkPolicy-Objekte in iptables-Chains. Jede Policy-Regel wird zu einer oder mehreren iptables-Regeln in einer strukturierten Chain-Hierarchie.
Funktionsweise:
cali-fi-veth-abc123).PREROUTING â FORWARD â INPUT/OUTPUT â POSTROUTING.Packet flow with Calico iptables:
NIC â netfilter PREROUTING â FORWARD chain
â cali-forward chain â cali-fi-veth-* chain
â [Rule 1: match? no â Rule 2: match? no â ... â Rule N]
â ACCEPT/DROP â Pod
Calico verfĂŒgt ebenfalls ĂŒber eine eBPF-Dataplane (verfĂŒgbar seit v3.13). Wenn diese aktiviert ist, wird iptables umgangen und eBPF fĂŒr die Paketverarbeitung genutzt â eine Ă€hnliche Architektur wie bei Cilium. Dies ist jedoch ein Opt-in, und Calicos eBPF-Implementierung ist weniger ausgereift als das eBPF-native Design von Cilium.
| Dimension | Cilium eBPF | Calico iptables | Calico eBPF |
|---|---|---|---|
| Policy-Lookup | O(1) BPF-Map | O(n) sequenzielle Chain | O(1) BPF-Map |
| Kernel-Bypass | Ja (kein iptables) | Nein (Netfilter-Traversierung) | Ja (kein iptables) |
| Context-Switches | Null fĂŒr L3/L4 | Pro-Paket Netfilter | Null fĂŒr L3/L4 |
| Standard in 2026 | GKE, AKS (Option), EKS (Option) | AKS (Option), k3s (RKE2) | Opt-in |
| L7-Durchsetzung | Nativ (In-Kernel Redirect) | Envoy-Sidecar erforderlich | Envoy-Sidecar erforderlich |
Die wichtigste Erkenntnis aus mehreren unabhÀngigen Benchmarks: eBPF-basierte L3/L4-Policy-Durchsetzung verursacht keinen messbaren Overhead.
Cilium eBPF L3/L4 Overhead (aus Tencent TKE Benchmark, 2026):
| Metrik | Keine Policy | L3/L4 Policy angewendet | Overhead |
|---|---|---|---|
| Durchsatz (native) | 104.787 req/s | 104.083 req/s | -0,7% |
| Durchsatz (overlay) | 100.242 req/s | 100.599 req/s | +0,4% |
Dies liegt im Bereich des Messrauschens. Der Grund: BPF-Map-Lookup + Identity-Check ist ein Hash-Tabellen-Lookup im Kernel-Space. Er fĂŒgt nur Nanosekunden pro Paket hinzu.
Calico iptables mit skalierenden Policies (aus einer akademischen Studie von Kim et al. 2025):
| Policy-Anzahl | Durchsatz | Latenz | CPU |
|---|---|---|---|
| 100 Regeln | 8,8 Kbps | 43 ms | 3,24% |
| 500 Regeln | 8,5 Kbps | 46 ms | 3,45% |
| 1.000 Regeln | 8,2 Kbps | 51 ms | 3,89% |
Calico zeigt eine graduelle Verschlechterung. Die iptables-Chain wĂ€chst linear mit der Anzahl der Regeln â jedes Paket muss mehr Regeln durchlaufen.
Die eigentliche Divergenz tritt bei der Service-Skalierung auf, nicht bei der Anzahl der Policies. kube-proxy im iptables-Modus programmiert eine Regel pro Service pro Endpoint. Bei 10.000 Services mit jeweils 10 Endpoints sind das 420.000 iptables-Regeln.
Degradierung bei Service-Skalierung (aus Tencent TKE Benchmark, Kernel 6.6):
| Skalierung | iptables Degradierung | Cilium eBPF Degradierung |
|---|---|---|
| 5.000 Services Ă 10 Endpoints (209K Regeln) | -28,5% short-conn RPS | -13,2% |
| 10.000 Services Ă 10 Endpoints (420K Regeln) | -42,3% short-conn RPS | -11,5% |
Cilium verwendet BPF-Maps, in denen Endpoints Map-Werte und keine eigenstĂ€ndigen Regeln sind. Das HinzufĂŒgen von Endpoints verlĂ€ngert den Lookup nicht â es fĂŒgt lediglich Werte zum selben Map-Eintrag hinzu.
Latenz bei Skalierung (gleicher Benchmark):
| Dimension | iptables | Cilium eBPF |
|---|---|---|
| TCP_RR p99 | 111 ÎŒs | 96 ÎŒs |
| TCP_CRR p99 | 499 ÎŒs | 558 ÎŒs |
| HTTP p99 @ 1000 QPS | 0,99 ms | 0,99 ms |
Interessanterweise ist die TCP_RR-Latenz von Cilium auf modernen Kerneln (6.6+) tatsÀchlich niedriger als bei iptables, da eBPF den iptables-Overhead komplett umgeht. TCP_CRR (Verbindungsaufbau) ist jedoch aufgrund des conntrack-Overheads leicht höher.
Die L7-Policy-Durchsetzung (Filterung von HTTP-Pfaden/Methoden, gRPC-Service-Filterung) unterscheidet sich grundlegend von L3/L4. Sowohl Cilium als auch Calico leiten L7-Traffic an einen Userspace-Proxy (Envoy) fĂŒr die Deep Packet Inspection weiter. Der Overhead ist massiv.
Cilium L7 Overhead:
| Metrik | Keine Policy | L7 CNP angewendet | Overhead |
|---|---|---|---|
| Durchsatz (native) | 104.787 req/s | 13.591 req/s | -87,0% |
| Durchsatz (overlay) | 100.242 req/s | 11.984 req/s | -88,0% |
| Dies ist kein Fehler von Cilium â es ist der inhĂ€rente Preis fĂŒr L7-Sichtbarkeit. Jede L7-Anfrage erfordert: |
Der Envoy-Proxy pro Node teilt sich einen einzigen CPU-Kern mit allen Pods auf diesem Node. Auf ARM64-Nodes mit 1 vCPU fĂŒhrt dies zu 8,3-mal mehr Kernel-Scheduling-Aufwand pro Anfrage im Vergleich zur Baseline.
Service-Mesh-Vergleich (aus idmcarvalho service-mesh-benchmark):
| Szenario | QPS vs. Baseline (50c) | p50 Latenz | CS/Anfrage |
|---|---|---|---|
| Baseline (kein Mesh) | â | 42 ms | 202 |
| Cilium eBPF L3/L4 | -1,3% | 43 ms | 188 (-7%) |
| Istio ambient (ztunnel) | -28,5% | 54 ms | 283 (+40%) |
| Istio sidecar | -57,0% | 88 ms | 482 (+139%) |
| Cilium L7 | -84,5% | 249 ms | 1.667 (+726%) |
Cilium L7 ist tatsÀchlich schlechter als der Istio-Sidecar, da der gemeinsam genutzte Envoy-Proxy pro Node direkt mit den Application-Workloads um die CPU konkurriert.
Aus dem HMoradiRad-Vergleich (kind-Cluster, Bare-Metal-SchÀtzungen):
| Szenario | Cilium | Calico (iptables) | Gewinner |
|---|---|---|---|
| Same-node Durchsatz | 32,9 Gbps | 23,8 Gbps | Cilium (+38%) |
| Cross-node Durchsatz | 13,6 Gbps | 11,7 Gbps | Cilium (+16%) |
| Same-node Latenz | 0,83 ms | 0,91 ms | Cilium |
| Cross-node Latenz | 0,240 ms | 0,205 ms | Calico (leicht) |
Cilium gewinnt beim Durchsatz in beiden Szenarien dank des direkten veth-to-veth Forwardings von eBPF (keine Bridge, kein Netfilter). Calico gewinnt leicht bei der Cross-Node-Latenz â was auf den einfacheren Host-IP-Stack-Pfad im nativen Routing-Modus zurĂŒckzufĂŒhren ist.
Aus einer NSF-geförderten akademischen Studie (perf-basierte CPP-Messung):
| CNI | Gesamt-CPP | eBPF | Netfilter | Bridge | IP-Forwarding |
|---|---|---|---|---|---|
| Cilium | ~1.280 | ~1.200 | 0 | 0 | 0 |
| Calico (ohne Policy) | ~480 | 0 | 0 | 0 | ~240 |
| Calico (mit Policy) | ~2.700 | 0 | ~2.200 | 0 | ~240 |
| Flannel | ~330 | 0 | 0 | ~250 | 0 |
| Kube-router | ~250 | 0 | 0 | ~250 | ~250 |
Der eBPF-Overhead von Cilium (~1.200 CPP) ist höher als bei Bridge-basierten AnsĂ€tzen in FĂ€llen ohne Policies, aber Calico mit Policies kostet ~2.700 CPP â mehr als das Doppelte der Gesamtkosten von Cilium. Das Durchlaufen des Netfilters ist hier der entscheidende Flaschenhals.
| Feature | Kubernetes NetworkPolicy | Calico (iptables) | Calico eBPF | Cilium |
|---|---|---|---|---|
| L3/L4 (IP, Port, Protokoll) | â | â | â | â |
| L7 HTTP (Pfad, Methode, Header) | â | â (nur Enterprise) | â (nur Enterprise) | â Nativ |
| L7 gRPC (Service, Methode) | â | â | â | â Nativ |
| L7 Kafka (Topic, Client ID) | â | â | â | â Nativ |
| DNS-basierte (FQDN) Policy | â | â (nur Enterprise) | â | â via DNS-Proxy |
| CIDR-Bereiche | â | â | â | â |
| IdentitĂ€tsbasiert | â (IP-basiert) | Teilweise (Label-basiert) | Teilweise | â (Labels, Service Accounts) |
| Clusterweite Policies | â (Namespace-scoped) | â GlobalNetworkPolicy | â | â ClusterwideNP |
| Policy-Reihenfolge | â (implizit) | â (explizite Order) | â | â |
| Host-Firewall | â | â HostEndpoint | â | â |
| Egress-Gateway | â | â (nur Enterprise) | â | â |
| Policy-Tiers | â | â (Enterprise) | â | â |
| Feature | Cilium | Calico |
|---|---|---|
| Flow-Sichtbarkeit | â Hubble (integriert, L7-aware) | â (nur Enterprise / externe Tools) |
| Policy-Urteile | â ALLOWED/DENIED pro Flow | â |
| Echtzeit-Netzwerkkarte | â Hubble UI | â |
| CLI | hubble observe --namespace X --type drop | calicoctl flowlogs (eingeschrÀnkt) |
| Prometheus-Metriken | â
hubble_flows_processed_total | â (Setup erforderlich) |
| Runtime-Security | â Tetragon (eBPF-basiert) | â |
Hubble ist das Killer-Feature von Cilium fĂŒr den Betrieb. Man kann jedes verworfene Paket sehen, welche Policy es verworfen hat und die L7-Details (HTTP-Methode, Pfad, Statuscode) â alles direkt aus dem eBPF im Kernel, ohne Sidecars.
| Feature | Cilium | Calico |
|---|---|---|
| kube-proxy Ersatz | â (ausgereift, empfohlen) | â (nur eBPF-Modus) |
| Service Mesh | â (sidecarless, eBPF-basiert) | â |
| BGP-Routing | Nur Control-Plane | â (BIRD-Daemon, First-Class) |
| Multi-Cluster | ClusterMesh (bis zu 255) | Federation via BGP/Overlay |
| VerschlĂŒsselung | WireGuard, IPsec | WireGuard, IPsec |
| Bandbreitenmanagement | â EDT-basiertes Rate Limiting | Via Annotationen |
| Load Balancing | Maglev, DSR, XDP | IPVS oder iptables |
| Windows-Nodes | â | â (Windows HNS) |
| CNCF-Status | Graduated (Okt 2023) | Nicht CNCF (Tigera-Besitz) |
WĂ€hlen Sie Cilium, wenn:
WĂ€hlen Sie Calico, wenn:
Bei Clustern mit weniger als 500 Services und ohne L7-Policy-Bedarf ist der Performance-Unterschied vernachlÀssigbar. Der iptables-Modus von Calico verbraucht weniger Ressourcen (~278 MB/Node vs. ~153 MB/Node bei Cilium) und ist einfacher zu betreiben.
Die Entscheidung sollte auf sekundÀren Faktoren basieren: BGP-Bedarf (Calico) vs. Observability-Bedarf (Cilium).
Phase 1: Dual-Run-Validierung
Cilium kann wĂ€hrend der Migration parallel zu Calico betrieben werden. Installieren Sie Cilium mit einem reservierten CIDR-Bereich, der sich nicht mit dem von Calico ĂŒberschneidet:
ipam:
operator:
clusterPoolIPv4PodCIDRList: "10.200.0.0/16" # Separate from Calico's range
routingMode: "native"
kubeProxyReplacement: "probe" # Don't replace yet
Deployen Sie Cilium ohne kube-proxy-Replacement. Validieren Sie die KonnektivitĂ€t und verschieben Sie anschlieĂend die Workloads Namespace fĂŒr Namespace.
Phase 2: Policy-Migration
Standard-Kubernetes NetworkPolicy-Objekte funktionieren auf beiden CNIs ohne Modifikationen. Die MigrationsflÀche beschrÀnkt sich auf die erweiterten Policy-CRDs:
| Calico CRD | Cilium-Ăquivalent | Notizen |
|---|---|---|
NetworkPolicy (projectcalico.org) | CiliumNetworkPolicy | L7-Features lassen sich direkt zuordnen |
GlobalNetworkPolicy | CiliumClusterwideNetworkPolicy | Clusterweiter Scope |
NetworkSet | N/A (CIDR oder DNS nutzen) | IP-Gruppendefinitionen |
HostEndpoint | CiliumHostPolicy | Firewall auf Host-Ebene |
Nutzen Sie den Calico Network Policy Converter, um Calico-spezifische CRDs in entsprechende CiliumNetworkPolicy-Objekte zu ĂŒbersetzen.
Phase 3: Entfernung von kube-proxy
Sobald alle Workloads ĂŒber den Cilium-Datapath laufen, aktivieren Sie das vollstĂ€ndige kube-proxy-Replacement:
kubeProxyReplacement: "strict" # Fully replace
loadBalancer:
mode: "dsr" # Direct Server Return for Service LB
Schreiben Sie, wann immer möglich, Standard-Kubernetes NetworkPolicy. Greifen Sie nur dann auf CiliumNetworkPolicy oder Calico GlobalNetworkPolicy zurĂŒck, wenn Sie tatsĂ€chlich erweiterte Funktionen benötigen. So bleibt der GroĂteil Ihrer Policies CNI-agnostisch.
Das gleiche Muster aus dem k3s NetworkPolicy-Artikel gilt auch hier. Verlassen Sie sich niemals darauf, dass ein Policy-Objekt existiert â verifizieren Sie, dass es erzwungen wird:
# Deploy a test client and server
kubectl run test-client --image=busybox --command -- sleep 3600
kubectl run test-server --image=nginx --port=80
# Create a deny-all policy
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
EOF
# Test: should fail
kubectl exec test-client -- wget -q --timeout=3 http://test-server.default && echo "FAIL: policy not enforced" || echo "PASS: policy enforced"
Mit Cilium + Hubble können Sie genau sehen, welche Policy welchen Flow steuert:
# Watch all dropped packets in the payments namespace
hubble observe --namespace payments --type drop
# Output:
# Oct 11 10:23:45.123: default/test-client:42321 > default/test-server:80 (HTTP) FlowID:12345
# Verdict: DENIED (L7 Policy: allow-only-get)
# HTTP Method: POST, Path: /api/v1/admin/delete
Bei Calico erfordert das Debugging die direkte Inspektion der iptables-Chains:
# Show Calico's iptables chains
iptables -L cali-fi-veth-$(kubectl get pod test-server -o jsonpath='{.status.podIP}' | tr '.' '-') -n -v --line-numbers
# Count total iptables rules (the scaling concern)
iptables-save | grep -c "^-A"
Bei groĂen Installationen wird diese Ausgabe unĂŒbersichtlich. Aus diesem Grund werden fĂŒr das Policy-Debugging in groĂem MaĂstab Calico Enterprise oder externe Observability-Tools empfohlen.
| Ihre Situation | Empfehlung | Warum |
|---|---|---|
| Neuer Cluster, moderner Kernel (â„5.8) | Cilium | eBPF-native, beste Performance bei Skalierung, Hubble Observability |
| Bestehendes Calico, funktioniert gut | Bei Calico bleiben | Kein zwingender Grund fĂŒr eine Migration, auĂer L7 oder Hubble werden benötigt |
| 10.000+ Services | Cilium | iptables bricht bei Skalierung ein (-42%), Cilium bleibt stabil |
| BGP-Peering mit physischen Routern | Calico | BIRD-Daemon, erstklassige BGP-Integration |
| L7 HTTP/gRPC Policy benötigt | Cilium | Natives L7 im Kernel ohne Sidecars |
| Windows-Nodes erforderlich | Calico | Einziges CNI mit Windows HNS Dataplane |
| Kleiner Cluster (<500 Services) | Beide | Performance-Unterschied ist vernachlÀssigbar |
| Managed K8s (GKE/AKS) | Cilium | Bereits integriert (GKE Dataplane V2, Azure CNI Powered by Cilium) |
| Edge / k3s / ressourcenbeschrÀnkt | Calico (iptables) | Geringerer Memory-Footprint (~100 MB vs ~200 MB) |
L3/L4 NetworkPolicy hat mit eBPF keinen Overhead â Die BPF-Map-Lookups von Cilium kosten nur Nanosekunden pro Paket. Wenden Sie L3/L4-Policies bedenkenlos breit ĂŒber alle Workloads an.
L7 NetworkPolicy ist ĂŒberall kostspielig â Ein Overhead von 87 % ist der immanente Preis fĂŒr die Inspektion durch Userspace-Proxies. Wenden Sie L7 selektiv nur auf Pods an, die tatsĂ€chlich eine Steuerung auf Anwendungsebene benötigen (Ingress-Gateways, sensible API-Endpunkte).
iptables bricht bei Service-Skalierung zusammen â 10.000 Services mit 420.000 Regeln fĂŒhren zu einer Durchsatzminderung von 42 %. Dies ist der Hauptgrund, warum man sich fĂŒr eBPF in mittelgroĂen bis groĂen Clustern entscheiden sollte.
Hubble ist das herausragende Operational-Feature von Cilium â Echtzeit-Flow-Visibility mit Policy-Urteilen, L7-Details und Prometheus-Metriken. Kein iptables-basiertes CNI kann dies ohne Sidecars erreichen.
Standard NetworkPolicy ist portabel â Beide CNIs implementieren die Standard-API. Nur erweiterte CRDs (CiliumNetworkPolicy, GlobalNetworkPolicy) fĂŒhren zu einem Vendor-Lock-in. Schreiben Sie nach Möglichkeit portable Policies.
Calico ist nicht falsch â FĂŒr BGP-Umgebungen, Windows-Nodes oder Cluster, bei denen die iptables-Skalierung kein Problem darstellt, bleibt Calico eine ausgereifte und praxiserprobte Wahl. Die LĂŒcke zwischen den beiden Ăkosystemen wird zwar gröĂer, aber das Kernversprechen von Calico (BGP + FlexibilitĂ€t) bleibt gĂŒltig.