Cilium
auf einem Blatt.
Dichte Referenz für Senior Platform Engineers und SREs zur eBPF-basierten Networking-, Observability- und Security-Lösung für Kubernetes. Identity-based Policies von L3 bis L7, kube-proxy-Replacement, Hubble, Encryption, ClusterMesh, Gateway API, Diagnose und Anti-Patterns. Keine Einsteiger-Folien.
Vorschau (2 Seiten A4 quer + Brand-Rückseite)


PDF herunterladen
Direkter Download, keine Mail-Adresse nötig. CC BY-SA 4.0 , kopieren, drucken, weiterverteilen ist ausdrücklich erlaubt, solange die Quellenangabe sichtbar bleibt.
Was drin steht
eBPF & Identity
eBPF-Datapath statt iptables, cilium-agent/-operator, clusterweite Security-Identity aus security-relevanten Pod-Labels statt IP-basierter Regeln.
Policies L3–L7
CiliumNetworkPolicy + CiliumClusterwideNetworkPolicy: fromEndpoints, toEntities, toCIDR, toFQDNs, HTTP-Rules via node-lokalem Envoy, Enforcement-Modi.
kube-proxy-Replacement
Socket-LB für ClusterIP, NodePort, LoadBalancer, externalIPs, HostPort. k8sServiceHost/-Port als Pflicht, Verify per cilium-dbg status.
Hubble
Flow-Observability direkt aus dem Datapath: Relay clusterweit, UI mit Service-Map, hubble observe, Metriken für Prometheus.
Encryption & ClusterMesh
WireGuard (cilium_wg0, UDP 51871) oder IPsec mit manueller Key-Rotation. Multi-Cluster-Verbund mit globalen Services.
Gateway API & Diagnose
Eingebauter Gateway-API-Controller (GatewayClass cilium). cilium status, connectivity test, sysdump. Anti-Patterns aus der Praxis.
Cheatsheet im Volltext
Derselbe Inhalt wie im PDF, zum Mitlesen, Durchsuchen und direkten Kopieren der YAML-Snippets. Stand: Cilium v1.19 (Edition 2026.07).
Architektur & Identity
eBPF-Datapath
CNI mit eBPF-Datapath: Networking, Load-Balancing, Policy und Observability laufen als eBPF-Programme im Kernel, mit kube-proxy-Replacement ohne iptables-Ketten pro Service.
Komponenten: cilium-agent
(DaemonSet, je Node), cilium-operator (clusterweite
Aufgaben, z.B. IPAM), Hubble (Observability),
cilium-CLI. CNCF-graduated.
Identity statt IP
Jeder Endpoint bekommt eine clusterweite Security-Identity, abgeleitet aus den security-relevanten Pod-Labels. Endpoints mit identischem Label-Set teilen eine Identity.
Policy-Entscheidungen laufen gegen die Identity, nicht gegen flüchtige Pod-IPs , das skaliert unabhängig von der Endpoint-Zahl.
cilium status --wait kubectl get ciliumendpoints -A # Identity je Pod kubectl get ciliumidentities
Install & kube-proxy-Replacement
Helm-Install
Ohne kube-proxy müssen
k8sServiceHost / k8sServicePort gesetzt
sein, sonst findet der Agent den API-Server nicht (den
Service löst sonst niemand auf).
helm repo add cilium https://helm.cilium.io/ helm install cilium cilium/cilium \ --namespace kube-system \ --set kubeProxyReplacement=true \ --set k8sServiceHost=<api-server-ip> \ --set k8sServicePort=6443
kube-proxy-Replacement
eBPF übernimmt ClusterIP, NodePort, LoadBalancer, externalIPs und HostPort.
Socket-LB: Service-zu-Backend-Übersetzung
schon beim connect()/sendmsg()-Syscall
, kein Paket-Rewriting auf dem Pfad.
kubectl -n kube-system exec ds/cilium -- \ cilium-dbg status --verbose | \ grep KubeProxyReplacement
CiliumNetworkPolicy (L3/L4)
Selektoren, Entities, CIDR
endpointSelector wählt die Ziel-Endpoints;
fromEndpoints/toEndpoints selektieren
per Label (Identity).
toEntities: world,
cluster, host,
kube-apiserver.
toCIDR/toCIDRSet: für
externe Ziele, Cluster-intern per Label
selektieren.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata: {name: backend-allow, namespace: shop}
spec:
endpointSelector:
matchLabels: {app: backend}
ingress:
- fromEndpoints:
- matchLabels: {app: frontend}
toPorts:
- ports:
- {port: "8080", protocol: TCP}
Clusterwide & Enforcement-Modi
CiliumClusterwideNetworkPolicy: gleiche Syntax, nicht namespaced, für Baselines über alle Namespaces.
policyEnforcementMode: default
(alles offen, bis eine Regel den Endpoint selektiert, dann
default-deny je Richtung), always,
never.
L7-Policies & toFQDNs
HTTP-Rules (L7)
L7-Regeln hängen unter toPorts.rules.http:
method, path, host, Header
(Regex). Durchsetzung via node-lokalem Envoy;
Verstoss liefert HTTP 403 statt Paket-Drop.
Weitere L7-Typen: dns, kafka (beta).
spec:
endpointSelector:
matchLabels: {app: api}
ingress:
- fromEndpoints:
- matchLabels: {app: frontend}
toPorts:
- ports:
- {port: "80", protocol: TCP}
rules:
http:
- method: GET
path: /v1/.*
toFQDNs (Egress nach Namen)
matchName exakt, matchPattern mit
Wildcard.
Pflicht-Voraussetzung: eine
rules.dns-Regel schaltet den DNS-Proxy ein, ohne DNS-Sichtbarkeit kann Cilium FQDNs nicht auf IPs mappen und
die Policy läuft leer.
egress:
- toEndpoints:
- matchLabels: {k8s-app: kube-dns}
toPorts:
- ports: [{port: "53", protocol: ANY}]
rules:
dns: [{matchPattern: "*"}]
- toFQDNs:
- matchName: api.example.com
- matchPattern: "*.storage.example.com"
toPorts:
- ports: [{port: "443", protocol: TCP}]
Hubble (Observability)
Flows, Relay, UI
Hubble liest Flows (L3/L4/L7) direkt aus dem eBPF-Datapath, ohne Sidecars oder Paket-Mirroring.
Relay aggregiert clusterweit (auch über
ClusterMesh), UI zeigt die
Service-Dependency-Map, die CLI
(hubble) filtert Flows live.
cilium hubble enable --ui cilium hubble port-forward & hubble status hubble observe --namespace shop \ --verdict DROPPED hubble observe --protocol http --last 20
Metriken
Hubble-Metriken für Prometheus per Helm:
hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,httpV2}".
Agent/Operator-Metriken: prometheus.enabled=true,
operator.prometheus.enabled=true.
Encryption
WireGuard
Transparente Verschlüsselung des Pod-Traffics
zwischen Nodes (Device cilium_wg0,
UDP 51871, Firewall freischalten!).
Key-Paar erzeugt jeder Node selbst, Public-Key-Austausch via
CiliumNode-Annotation.
Node-zu-Node zusätzlich:
encryption.nodeEncryption=true. Same-Node-Traffic
bleibt unverschlüsselt.
helm upgrade cilium cilium/cilium \ -n kube-system --reuse-values \ --set encryption.enabled=true \ --set encryption.type=wireguard kubectl -n kube-system exec ds/cilium -- \ cilium-dbg status | grep Encryption
IPsec
encryption.type=ipsec; Key liegt im Secret
cilium-ipsec-keys (kube-system), Algorithmus
wählbar (z.B. GCM-128-AES).
Key-Rotation ist manuell (KEYID 1–15 inkrementieren), nie während eines Upgrades rotieren.
ClusterMesh
Multi-Cluster-Verbund
Pod-Konnektivität über Cluster-Grenzen, globale Services mit Cross-Cluster-Load-Balancing, Policies über Cluster hinweg.
Voraussetzungen: PodCIDRs aller Cluster
disjunkt, eindeutiger cluster.name +
cluster.id (1–255), IP-Konnektivität
zwischen allen Nodes, clustermesh-apiserver
gegenseitig erreichbar.
cilium clustermesh enable --context c1 cilium clustermesh connect --context c1 \ --destination-context c2 cilium clustermesh status --wait
Globale Services
Annotation service.cilium.io/global: "true" auf
dem gleichnamigen Service in beiden Clustern, Cilium
load-balanct auf die Backends beider Cluster.
service.cilium.io/shared: "false":
Remote-Backends nutzen, eigene nicht teilen.
Gateway API
Eingebauter Controller
Cilium implementiert die Gateway API (CRDs v1.4.1 vorab installieren): GatewayClass, Gateway, HTTPRoute, GRPCRoute, ReferenceGrant, TLSRoute (experimentell).
Voraussetzungen:
kubeProxyReplacement=true, l7Proxy=true
(Default), gatewayAPI.enabled=true. GatewayClass
heisst cilium.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata: {name: web-gw, namespace: shop}
spec:
gatewayClassName: cilium
listeners:
- {name: http, port: 80, protocol: HTTP}
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata: {name: web, namespace: shop}
spec:
parentRefs: [{name: web-gw}]
rules:
- matches:
- path: {type: PathPrefix, value: /}
backendRefs: [{name: web, port: 80}]
Diagnose (cilium-CLI)
Werkzeuge
cilium status --wait: Health aller Komponenten.
cilium connectivity test: E2E-Testsuite im Cluster.
cilium sysdump: Support-Archiv für
Bug-Reports.
Im Agent-Pod: cilium-dbg
(endpoint list, policy get,
monitor).
cilium connectivity test cilium sysdump --output-filename dump kubectl -n kube-system exec ds/cilium -- \ cilium-dbg endpoint list kubectl -n kube-system exec ds/cilium -- \ cilium-dbg monitor --type drop
Anti-Patterns
Was du nicht tun solltest
toFQDNs ohne DNS-Rule: ohne
rules.dns-Sichtbarkeit kein FQDN-zu-IP-Mapping
, Policy blockt oder läuft leer.
kube-proxy-frei ohne k8sServiceHost/Port: Agent erreicht den API-Server nicht, Cluster-Bootstrap hängt.
CIDR-Regeln für Cluster-Traffic:
toCIDR ist für externe Ziele gedacht; Pod-IPs
sind flüchtig, Labels/Identities selektieren.
Default-Modus falsch verstanden: ohne selektierende Regel ist alles offen; die erste Regel schaltet den Endpoint auf default-deny (je Richtung).
WireGuard ohne UDP 51871: Nodes müssen sich auf dem Port erreichen, sonst kein Tunnel.
IPsec-Keys während des Upgrades rotieren: erst alle Nodes auf gleiche Cilium-Version, dann rotieren.
ClusterMesh mit überlappenden PodCIDRs
oder doppelter cluster.id: Verbund kommt nicht
sauber hoch, vorab planen.
Aus der OMNI52 Cheatsheet-Fabrik
Verwandte Sheets in dichter Senior-Qualität:
service-mesh-cheatsheet.de, Service Mesh im Vergleich
istio-cheatsheet.de, Istio in der Tiefe
kubernetes-cheatsheet.de, Kubernetes Core
rke2-cheatsheet.de, RKE2 (CNI-Wahl)
Lizenz & Weiterverteilung
Nicht erlaubt: Logo, Marken oder den Eindruck zu vermitteln, dass der Inhalt von dir/euch stammt oder dass OMNI52 GmbH die Weiterverwendung sponsort.
Volltext der Lizenz: creativecommons.org/licenses/by-sa/4.0/deed.de.
Cilium is a trademark of The Linux Foundation, registered in the United States and/or other countries. Kubernetes is a registered trademark of The Linux Foundation. OMNI52™ is a trademark of OMNI52 GmbH (filed, not yet registered). This website is operated by OMNI52 GmbH and is not affiliated with, endorsed by, or sponsored by The Linux Foundation, the CNCF, or the Cilium project. “Cilium” is used in a nominative / descriptive sense to indicate the technology this cheatsheet documents.