🔴 Advanced

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:

  1. Každý service → iptables chain → iptables rule per pod → DNAT.
  2. Pri tisícach podov má iptables tisíce pravidiel, každý packet ich musí lineárne prejsť.
  3. Network policies sa prekladajú do ďalších iptables pravidiel — exponenciálny rast.
  4. L7 policies (napr. "povoliť iba GET /api/public") sú nemožné bez sidecar proxy.
  5. 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.

Odkazy