OMNI52
Cilium Cheatsheet OMNI52™ GmbH

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)

Cilium Cheatsheet Seite 1: Architektur & Identity, Install & kube-proxy-Replacement, CiliumNetworkPolicy, L7-Policies & toFQDNs
Cilium Cheatsheet Seite 2: Hubble, Encryption, ClusterMesh, Gateway API, Diagnose, Anti-Patterns

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.

Cilium Cheatsheet (PDF, ~100 KB)

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

CC BY-SA 4.0. Du darfst dieses Cheatsheet kopieren, weiterverteilen, ausdrucken und in eigenen Materialien zitieren. Bedingung: Quellenangabe „Cilium Cheatsheet, OMNI52 GmbH, cilium-cheatsheet.de“ bleibt sichtbar, und abgeleitete Werke stehen unter der gleichen Lizenz (Share-Alike).

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.