Cilium — eBPF Networking pre Kubernetes
Cilium je open-source CNI plugin pre Kubernetes, ktorý na rozdiel od klasických CNI (Flannel, Calico v iptables režime) postavuje celý networking stack nad eBPF. Výsledkom je moderná platforma, ktorá zjednocuje networking, security a observability v jednom komponente — a to všetko bez sidecarov, iptables pravidiel a bez kernel modulov.
V roku 2023 sa Cilium stal prvým CNI projektom, ktorý dosiahol CNCF Graduated status. Dnes ho v produkcii používajú Google (GKE Dataplane V2), Azure (AKS Azure CNI powered by Cilium), Datadog, Adobe, ByteDance a mnohí ďalší.
Prečo Cilium — problém klasických CNI
Klasické Kubernetes CNI fungujú na princípe iptables (alebo IPVS) v kernel space:
- Každý service → iptables chain → iptables rule per pod → DNAT.
- Pri tisícach podov má iptables tisíce pravidiel, každý packet ich musí lineárne prejsť.
- Network policies sa prekladajú do ďalších iptables pravidiel — exponenciálny rast.
- L7 policies (napr. "povoliť iba GET /api/public") sú nemožné bez sidecar proxy.
- Observability je minimálna — iptables neposkytuje drop/allow metriky per flow.
Cilium rieši toto cez eBPF programy, ktoré sa pripájajú priamo k socket, tc (traffic control) a XDP (eXpress Data Path) hookom v kerneli:
- Load balancing per-packet v kerneli — žiadne iptables, O(1) lookup cez eBPF hash mapu.
- Network policies vyhodnocované v eBPF — bez sidecar proxy, aj L3/L4/L7.
- Observability zadarmo — každý flow je nahraný cez Hubble.
- Service mesh — Cilium Service Mesh funguje bez sidecarov (používa Envoy na node-level).
eBPF v skratke
Podrobnejší rozbor eBPF nájdete v samostatnom článku eBPF. Tu len minimum potrebné na pochopenie Cilium.
eBPF (extended Berkeley Packet Filter) je technológia Linux kernelu, ktorá umožňuje bezpečne spustiť malé programy priamo v kernel space, bez potreby modulu. Program sa verifikuje (verifier kontroluje bounds, memory safety), JIT-kompiluje do natívneho kódu a priradí ku konkrétnemu hook pointu (socket, tc, XDP, tracepoint, kprobe).
Cilium pomocou eBPF nahrádza iptables, connection tracking (conntrack), load balancing (kube-proxy) a časti Linux network stacku vlastnými optimalizovanými implementáciami.
Architektúra Cilium
┌─────────────────────────────────────────────┐
│ Kubernetes Control Plane │
│ ┌──────────────────┐ ┌─────────────────┐ │
│ │ cilium-operator │ │ Hubble Relay │ │
│ └────────┬─────────┘ └────────┬────────┘ │
└───────────┼─────────────────────┼───────────┘
│ │
┌────────┴──────────────┐ │
│ Kubernetes Node │ │
│ ┌─────────────────┐ │ │
│ │ cilium-agent │ │ │
│ │ (DaemonSet) │ │ │
│ └────────┬────────┘ │ │
│ │ │ │
│ ┌──────┴──────┐ │ │
│ │ eBPF programs│ │◄─────┘
│ │ (tc/XDP) │ │
│ └─────────────┘ │
│ Pods: P1, P2, P3... │
└───────────────────────┘
- cilium-agent — DaemonSet na každom node, loaduje eBPF programy, spravuje identity, sync-uje endpoint state.
- cilium-operator — cluster-wide riadenie (IPAM, cluster mesh, identity allocation).
- Hubble — observability stack, ktorý streamuje flow data z eBPF programov.
- cilium CLI — nástroj pre debugging (
cilium status,cilium connectivity test).
Inštalácia na kind / k3s
Cilium má vlastný CLI installer. Demonštrácia na lokálnom kind klastri:
# 1. kind klaster bez default CNI
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
networking:
disableDefaultCNI: true
kubeProxyMode: "none" # Cilium nahradi kube-proxy
EOF
kind create cluster --config=kind-config.yaml
# 2. Inštalácia Cilium
cilium install --version 1.16.0 \
--set kubeProxyReplacement=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
# 3. Overenie
cilium status --wait
cilium connectivity test
kubeProxyReplacement=true znamená, že Cilium úplne nahradí kube-proxy — services fungujú priamo cez eBPF. Úspora: jeden komponent menej, rádovo rýchlejšie pri tisícoch services.
Network Policies — L3/L4/L7
L3/L4 (štandardný Kubernetes NetworkPolicy)
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-api
namespace: production
spec:
podSelector:
matchLabels:
app: api
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- port: 8080
protocol: TCP
Toto funguje aj v Calico. Cilium ale v eBPF vyhodnocuje toto bez iptables, O(1).
L7 (CiliumNetworkPolicy)
Iba Cilium dovoľuje HTTP/gRPC/Kafka policies bez sidecaru:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: frontend-api-http
namespace: production
spec:
endpointSelector:
matchLabels:
app: api
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: GET
path: "/api/v1/public/.*"
- method: POST
path: "/api/v1/login"
Frontend môže na API volať iba GET /api/v1/public/* a POST /api/v1/login. Ostatné cesty sú drop-nuté priamo v eBPF programe na node-level Envoy. Bez sidecaru, bez iptables.
DNS policy
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-external-api
spec:
endpointSelector:
matchLabels:
app: payment
egress:
- toFQDNs:
- matchName: "api.stripe.com"
toPorts:
- ports:
- port: "443"
protocol: TCP
Payment pod môže volať iba api.stripe.com (Cilium interceptuje DNS response a updatne eBPF mapu).
Hubble — observability
Hubble je Cilium-native observability nad eBPF flow data. Poskytuje:
- Real-time flow logs — každý packet, allow/deny, L7 metadata
- Service map UI — graf služieb a ich závislostí
- Metriky — HTTP status, latency, throughput per flow, exportované do Prometheu
# Aktívne flows v namespace
hubble observe --namespace production --follow
# Iba drop-nute packety
hubble observe --verdict DROPPED --follow
# HTTP 5xx chyby
hubble observe --http-status 500 --follow
Hubble UI (cilium hubble ui) otvorí interaktívny graf, kde vidíte v reálnom čase toky medzi podmi. Pre debug network problémov je to neporaziteľné — vidíte prečo bol packet drop-nutý (konkrétna policy rule).
Cilium Service Mesh — sidecarless
Tradičný service mesh (Istio, Linkerd) injektuje sidecar proxy (Envoy) do každého podu. To znamená:
- 2× tolko kontajnerov v klastri
- Extra latency na každý hop
- Extra CPU/RAM rezerva
Cilium Service Mesh vyhráva tým, že beží Envoy per-node (nie per-pod), a eBPF redirecty traffic priamo do node-level Envoy, keď treba L7 spracovanie. Pre L3/L4 sa Envoy vôbec nepoužíva — všetko sa odohráva v eBPF.
Features: mTLS, traffic splitting, retry, circuit breaking, ingress gateway — všetko bez sidecarov.
Cilium vs Calico vs Flannel
| Aspekt | Flannel | Calico | Cilium |
|---|---|---|---|
| Dataplane | iptables / VXLAN | iptables / eBPF (beta) | eBPF natívne |
| Network Policies | ❌ | ✅ L3/L4 | ✅ L3/L4/L7/FQDN |
| kube-proxy replacement | ❌ | Čiastočne | ✅ Plne |
| Observability | ❌ | Minimálna | ✅ Hubble |
| Service Mesh | ❌ | ❌ | ✅ Sidecarless |
| Multi-cluster mesh | ❌ | ❌ | ✅ Cluster Mesh |
| Komplexnosť | Nízka | Stredná | Vysoká |
Flannel je dobrý pre lab a ultra-malé klastre. Calico je zrelá voľba pre väčšinu produkcie, ak vám stačia L3/L4 policies. Cilium je dnes predvolená voľba pre náročné produkcie, multi-cluster a tam, kde potrebujete L7 bez service mesh komplikácií.
Kedy Cilium a kedy nie
Cilium je vhodný ak:
- Máte > 100 nodov alebo > 1000 services a iptables sa stáva úzkym hrdlom.
- Chcete L7 policies (HTTP, gRPC, Kafka, DNS/FQDN).
- Potrebujete detailnú network observability bez externých nástrojov.
- Plánujete service mesh a chcete sa vyhnúť sidecarom.
- Máte multi-cluster setup (Cluster Mesh).
Cilium môže byť overkill ak:
- Spúšťate malé klastre (< 20 nodov) a stačia vám default services.
- Vaši operátori nepoznajú eBPF a tím nie je pripravený na debugging v kerneli.
- Používate managed K8s, ktorý má vlastný CNI (vtedy môže byť Cilium už pod kapotou — GKE Dataplane V2, AKS Cilium).
Zhrnutie
Cilium premieňa Kubernetes networking z "iptables záhady" na moderný, pozorovateľný a rýchly systém. Za cenu vyššej komplexnosti a krivky učenia získate veci, ktoré žiadne iné CNI neposkytuje — L7 policies bez sidecaru, sidecarless service mesh, per-node load balancing v O(1), real-time observability cez Hubble.
Ak dnes staviate Kubernetes platformu na vlastnej infraštruktúre a chcete byť pripravení na budúcnosť, Cilium je smerovanie, ktorým sa uberá veľká časť priemyslu.