Wenn eine NetworkPolicy greift nicht-Situation in Kubernetes auftritt, ist das fast immer frustrierend: Sie haben eine Policy definiert, erwarten „Default Deny“ oder gezielte Freigaben – und trotzdem fließt Traffic scheinbar unbegrenzt weiter. In der Praxis liegt das selten daran, dass Kubernetes „NetworkPolicies ignoriert“, sondern daran, dass eine von mehreren Voraussetzungen nicht erfüllt ist: Das CNI-Plugin unterstützt die Kubernetes-API nicht (oder nur teilweise), die Policy matcht nicht die richtigen Pods (Labels/NamespaceSelector), es existiert bereits eine allowende Policy, die Sie übersehen haben, oder es gibt Traffic-Pfade, die an der Policy-Ebene vorbeigehen (HostNetwork, NodePort, Ingress Controller, Service Mesh, eBPF/iptables-Interaktionen). Dieses Runbook führt Sie Schritt für Schritt durch ein Debugging, das in Calico, Cilium und ähnlichen CNIs funktioniert. Ziel ist, reproduzierbar zu prüfen: Wird die Policy überhaupt „programmiert“? Trifft sie den gewünschten Traffic? Und wenn nicht – welche konkrete technische Ursache steckt dahinter? Sie bekommen eine klare Reihenfolge, typische Fehlerbilder und sichere Remediation-Optionen, ohne reflexartig „allow all“ einzuschalten.
Grundverständnis: Was eine NetworkPolicy leisten kann – und was nicht
Kubernetes NetworkPolicies definieren Regeln für Pod-zu-Pod-Traffic (Ingress/Egress) anhand von Labels, Namespaces und Ports. Wichtig: Kubernetes selbst erzwingt diese Regeln nicht. Die Durchsetzung übernimmt das CNI (Container Network Interface) bzw. dessen Datenpfad (iptables, IPVS, eBPF oder Kombinationen). Wenn das CNI keine NetworkPolicies unterstützt oder die Policy-Funktion deaktiviert ist, bleibt eine NetworkPolicy „Papier“. Außerdem gelten Policies in der Regel nur für Pods, nicht für Node-Prozesse oder reine Host-Netzwerkpfade.
- NetworkPolicy wirkt auf Pods: Standardmäßig nicht auf Node-Dienste oder Prozesse außerhalb des Pod-Netzwerkes.
- Durchsetzung ist CNI-abhängig: Calico, Cilium und andere setzen Policies unterschiedlich um (iptables vs. eBPF, eigene CRDs, zusätzliche Features).
- Keine globale „Policy Engine“ in Kubernetes: Ohne passenden CNI-Support bleibt die Policy wirkungslos.
- Service-Abstraktionen ändern nichts am Traffic: Services (ClusterIP) sind virtuell; die Policy muss den tatsächlichen Datenpfad treffen (Pod-IP/Port, ggf. NodePort, Ingress Controller Pods).
Symptom präzisieren: „Greift nicht“ heißt nicht immer „wird ignoriert“
Bevor Sie tiefer debuggen, definieren Sie das Symptom konkret. Viele Fälle, die wie „NetworkPolicy greift nicht“ aussehen, sind tatsächlich ein Mismatch zwischen Erwartung und tatsächlichem Datenpfad.
- Erwartung: Default Deny, aber Traffic fließt weiterhin → häufig fehlt eine Default-Deny-Policy, oder der Pod wird nicht von der Policy selektiert.
- Erwartung: Nur Port 443, aber auch andere Ports funktionieren → häufig greift eine breitere Allow-Policy oder es wird über HostNetwork/NodePort umgangen.
- Erwartung: Egress blockiert, aber DNS/Internet geht trotzdem → oft testet man aus einem anderen Pod/Namespace, oder es gibt ein Egress-Gateway/Proxy-Pfad, der erlaubt ist.
- Nur einzelne Pods betroffen → Label-/Namespace-Selektoren oder unterschiedliche Sidecars (Service Mesh) sind häufige Ursachen.
Schritt 1: Prüfen, ob NetworkPolicies im Cluster überhaupt durchgesetzt werden
Der häufigste Grund: Das eingesetzte CNI unterstützt NetworkPolicy nicht oder nicht in der erwarteten Form. Auch bei unterstützenden CNIs kann die Funktion deaktiviert sein.
- CNI identifizieren: Prüfen Sie, welches CNI läuft (DaemonSet/Pods in
kube-systemoder entsprechenden Namespaces). Typische Namen sind calico-node, cilium, weave-net, flannel (Achtung: Flannel allein erzwingt NetworkPolicies in vielen Setups nicht). - Policy-Support verifizieren: In der CNI-Dokumentation nachsehen, ob Kubernetes NetworkPolicy vollständig unterstützt wird und welche Einschränkungen gelten.
- Enforcement-Modus prüfen: Bei Calico z. B. kann Policy Enforcement an/aus sein; bei Cilium hängt es vom eBPF-Datenpfad und Konfiguration ab.
- Managed Kubernetes Besonderheiten: Einige Cloud-CNIs unterstützen NetworkPolicies nur in bestimmten Modi oder mit Zusatzkomponenten.
Schnelltest: Minimaler Default Deny im Test-Namespace
Erstellen Sie in einem dedizierten Test-Namespace eine Default-Deny-Policy und prüfen Sie, ob Pod-zu-Pod- bzw. Pod-zu-DNS-Traffic wie erwartet blockiert wird. Wenn hier keine Wirkung entsteht, ist das Problem meist CNI/Enforcement, nicht Ihre konkrete Policy-Logik.
Schritt 2: Ist die Policy syntaktisch korrekt und im richtigen Namespace?
NetworkPolicies sind namespaced. Eine Policy im falschen Namespace greift nicht – selbst wenn Labels gleich heißen. Auch kleine YAML-Fehler führen zu „Policy existiert, aber matcht nichts“.
- Namespace prüfen: Liegt die Policy im Namespace der Pods, die Sie schützen wollen?
- podSelector prüfen: Matcht er tatsächlich die Zielpods? Leere Selector-Map (
{}) bedeutet „alle Pods im Namespace“. - policyTypes prüfen: Für Egress brauchen Sie
Egress, für IngressIngress. Einige User vergessenEgressund erwarten trotzdem Outbound-Block. - Ports/Protokolle: Standard ist TCP, wenn nicht anders angegeben; UDP muss explizit erlaubt/blocked werden.
Typischer Fehler: Labels stimmen nicht (oder ändern sich)
Wenn Deployments Labels nachträglich ändern (oder Helm-Templates andere Labels setzen), kann eine Policy „plötzlich“ nicht mehr matchen. Stabilisieren Sie Labels, die für Policies verwendet werden (z. B. app, component, tier) und vermeiden Sie volatile Labels wie Build-Hashes.
Schritt 3: Der wichtigste Punkt – welche Pods sind tatsächlich selektiert?
Die meisten „greift nicht“-Fälle sind Selektor-Probleme. Behandeln Sie das wie eine Menge: Die Policy wirkt nur auf die Schnittmenge aus Namespace und podSelector.
Mentales Modell als einfache Menge
WirksamePods = PodsImNamespace ∩ PodsMitLabels
- Pods anzeigen: Listen Sie Pods inklusive Labels auf und prüfen Sie, ob die Policy-Selektoren wirklich passen.
- NamespaceSelector in Rules: Achten Sie darauf, dass namespaceSelector nur Namespaces matcht, die auch entsprechend gelabelt sind (viele Cluster labeln Namespaces nicht standardmäßig).
- matchExpressions: Prüfen Sie Operatoren wie In, NotIn, Exists. Ein falscher Operator führt zu „matcht niemanden“.
Schritt 4: Gibt es eine andere Policy, die Ihren Traffic erlaubt?
Ein verbreitetes Missverständnis: NetworkPolicies sind additiv. Sobald ein Pod von irgendeiner Ingress-Policy selektiert ist, ist Ingress für diesen Pod grundsätzlich „restricted“, aber alle erlaubenden Regeln aus allen passenden Policies addieren sich. Das bedeutet: Eine einzige zu breite Allow-Policy kann Ihre restriktive Policy „aushebeln“.
- Alle Policies im Namespace sammeln: Insbesondere Helm-Releases bringen oft Default-Policies mit.
- Pod-Selektoren vergleichen: Welche Policies matchen denselben Pod?
- Allow-All-Patterns erkennen: Häufige Muster sind
from: - podSelector: {}odernamespaceSelector: {}(je nach Kontext) sowie Port-Listen, die mehr erlauben als gedacht. - Egress-Policies nicht vergessen: Auch egress-additive Regeln können zu „trotzdem geht’s“ führen.
Anti-Pattern: „Temporäre“ Allow-Policies, die dauerhaft bleiben
In Incidents werden manchmal breite Freigaben gesetzt („nur kurz“). Wenn diese später nicht entfernt werden, erscheinen neue Policies wirkungslos. Etablieren Sie eine Praxis: Jede temporäre Policy bekommt ein Ablaufdatum (Prozess/Change), Ownership und Ticket-Referenz.
Schritt 5: Prüfen, ob der Traffic-Pfad an NetworkPolicy vorbeigeht
NetworkPolicies wirken auf den Pod-Datenpfad. Einige Kubernetes-Features und Betriebsweisen können Traffic erzeugen, der nicht so gefiltert wird, wie man es intuitiv erwartet.
- hostNetwork: true: Pods im Host-Netzwerk umgehen in vielen Setups Pod-basierte Enforcement-Mechanismen oder werden anders behandelt.
- NodePort und externe Quellen: Externer Traffic erreicht zunächst den Node. Je nach CNI/Implementierung kann der Weg in den Pod anders aussehen als „direkt Pod-zu-Pod“.
- Ingress Controller: Der Ingress Controller ist selbst ein Pod (oder mehrere). Ihre Policy muss Traffic vom Ingress-Pod zum Backend erlauben/verbieten, nicht „vom Internet“.
- Service Mesh Sidecars: Sidecars (z. B. Envoy) verändern Ports und Verbindungen. Sie sehen Traffic ggf. von/to Sidecar-Prozessen statt direkt von der App.
- DNS/Proxy als „Gate“: Wenn Egress nur zum Proxy erlaubt ist, wirkt es so, als wäre Internet offen – tatsächlich ist nur der Proxy offen.
Praktische Einordnung: Wer ist der echte Source Pod?
Wenn Sie „Ingress sperren“ wollen, müssen Sie wissen, welcher Pod tatsächlich die Verbindung aufbaut. Bei Ingress ist das der Ingress Controller, bei Jobs/Sidecars ist es eventuell ein anderer Container. Prüfen Sie Quell-IPs/Labels anhand von Logs (CNI/Flow Logs) statt nur anhand des gewünschten Architekturbilds.
Schritt 6: Calico-spezifische Checks (Kubernetes NetworkPolicy vs. Calico Policy)
Calico unterstützt Kubernetes NetworkPolicies sehr gut, bringt aber zusätzlich eigene CRDs (GlobalNetworkPolicy, NetworkPolicy im Calico-Sinne) und Profile/Defaults mit. Dadurch können Effekte entstehen, die Sie ohne Calico-Kontext übersehen.
- Felix/Dataplane Status: Wenn der Calico-Agent (Felix) Probleme hat, werden Regeln nicht sauber programmiert.
- Host-Endpoint/Workload-Endpoint: Calico kann Policies auch auf Host-Interfaces anwenden. Das kann Traffic beeinflussen, der nicht „nur Pod-zu-Pod“ ist.
- GlobalNetworkPolicy: Eine globale Policy kann Namespaces übergreifend wirken und Ihre namespace-lokale Policy beeinflussen.
- Policy Order/Priorität: Calico Policies haben Ordnungsmechanismen. Eine global allow-Policy kann restriktive Regeln übersteuern (oder umgekehrt).
Typischer Calico-Fall: NamespaceSelector matcht nicht, weil Namespace nicht gelabelt ist
Calico-Nutzer arbeiten gern mit namespaceSelector. Wenn Namespaces aber keine Labels tragen, matcht der Selector niemanden. Stellen Sie sicher, dass Namespaces die erwarteten Labels besitzen oder verwenden Sie podSelector innerhalb des Namespace.
Schritt 7: Cilium-spezifische Checks (Kubernetes NetworkPolicy vs. CiliumNetworkPolicy)
Cilium kann Kubernetes NetworkPolicies durchsetzen, bietet aber zusätzlich erweiterte Features über CiliumNetworkPolicy (L7-Regeln, FQDN-Policies, DNS-aware Egress) und arbeitet häufig eBPF-basiert. Das kann Debugging verändern: Sie prüfen dann nicht nur „iptables-Regeln“, sondern eBPF-Policy-Maps, Observability (Hubble) und ggf. L7-Proxies.
- Ist Policy Enforcement aktiv? Cilium kann in unterschiedlichen Modi laufen (z. B. „default allow“ vs. „default deny“ pro Endpoint, abhängig von Konfiguration).
- L7-Proxies/Envoy: Wenn L7 aktiviert ist, kann HTTP/Genehmigung unabhängig von L3/L4 wirken. Dann „geht TCP“, aber HTTP wird blockiert (oder umgekehrt).
- FQDN/DNS-Awareness: Wenn Egress über FQDN geregelt ist, hängt Funktionalität von DNS-Visibility und Cache ab.
- Observability nutzen: Hubble (falls aktiv) kann zeigen, welche Policy den Flow erlaubt/blocked.
Typischer Cilium-Fall: Policy ist korrekt, aber Sidecar/Port-Mapping ist anders
In Mesh-Setups oder bei transparenten Proxies kann die tatsächliche Verbindung über andere Ports laufen als erwartet (z. B. 15001/15006 bei Sidecars). Eine Policy, die nur „App-Port 8080“ erlaubt, kann dann scheinbar nicht greifen, weil der Traffic einen anderen Port nutzt.
Schritt 8: Tests richtig durchführen – sonst debuggen Sie die falsche Realität
Ein häufiger Grund für Fehldiagnosen ist ein falscher Test. Beispiel: Sie testen Egress aus einem Debug-Pod, der keine Labels hat und daher nicht unter die Policy fällt. Oder Sie testen „Ingress“ über einen Service, obwohl die Policy nur Pod-IP-basierte Flows betrifft.
- Test-Pod muss matchen: Gleiche Labels (oder ein passender podSelector) wie der betroffene Pod.
- Quelle und Ziel kontrollieren: Testen Sie Pod → Pod direkt, Pod → Service und (falls relevant) Ingress → Service → Pod getrennt.
- Protokoll und Port klar definieren: TCP 443 ist nicht gleich UDP 443; DNS nutzt UDP/TCP 53.
- Ergebnis richtig interpretieren: „Connection refused“ ist etwas anderes als „Timeout“. Timeout deutet eher auf Drop/Block hin.
Schritt 9: Visibility – so finden Sie die Policy, die tatsächlich entscheidet
Ohne Sichtbarkeit wirkt NetworkPolicy-Debugging wie Rätselraten. Nutzen Sie Logs und Flow-Telemetrie, um zu sehen, ob Flows geblockt werden und durch welche Regel.
- CNI Flow Logs: Viele CNIs können Drops/Denies protokollieren.
- Hubble (Cilium): Zeigt Flows und Policy-Entscheidungen (wenn aktiviert).
- Calico Logs: Calico kann Flow-Logs bzw. Policy-Drops sichtbar machen (je nach Setup/Enterprise/Komponenten).
- Cloud Flow Logs: Ergänzend für Node/ENI/Subnet-Ebene, wenn „Policy greift“ wirkt, aber in Wahrheit Cloud-Firewall blockt.
Minimaler Nachweis: Policy greift vs. greift nicht
- Greift nicht: Keine Drops/Denies sichtbar, Traffic fließt unabhängig von Policy-Änderungen.
- Greift, aber anders als gedacht: Drops sichtbar, aber für andere Pods/Ports/Quellen als erwartet (Selektor oder Pfad falsch).
- Greift korrekt: Drops/Allows korrelieren direkt mit Tests und Policy-Änderungen.
Schritt 10: Häufige Root Causes (mit schnellen Fix-Hinweisen)
- CNI ohne NetworkPolicy-Enforcement: CNI wechseln/erweitern oder Enforcement aktivieren; Dokumentation des Providers prüfen.
- Policy im falschen Namespace: Policy in den richtigen Namespace verschieben oder NamespaceSelector sauber einsetzen.
- podSelector matcht keine Pods: Labels stabilisieren; Selector korrigieren; Test-Pod labeln.
- Andere Allow-Policy überschreibt Erwartung: Policies konsolidieren, breite Freigaben entfernen, Ownership klären.
- Traffic-Pfad umgeht Policy: hostNetwork/NodePort/Ingress Controller Pfade separat behandeln und gezielt absichern.
- Service Mesh/Sidecar verändert Ports: Sidecar-Ports berücksichtigen oder Mesh-Policies ergänzen.
- DNS/Egress Gateway als Sonderfall: Prüfen, ob nur Proxy erlaubt ist; Policy auf echte Ziele präzisieren.
Remediation: Sichere Vorgehensweise, um Policies „korrekt greifend“ zu machen
Wenn Sie die Ursache identifiziert haben, setzen Sie Fixes kontrolliert um. Priorisieren Sie dabei Stabilität und Nachvollziehbarkeit.
- Labels standardisieren: Definieren Sie feste Labels, die Policies nutzen (z. B. app, role, namespace-purpose).
- Default Deny explizit setzen: Eine leere Policy existiert nicht; Default Deny ist eine bewusste Policy-Entscheidung pro Namespace.
- Erlaubnisse minimal halten: DNS, notwendige Ports und bekannte Ziele; keine offenen namespaceSelector/podSelector ohne Grund.
- Policy Ownership etablieren: Wer ist verantwortlich? Welche Policies sind produktiv? Welche sind temporär?
- Observability aktivieren: Flow Logs/Hubble/Policy Logs, damit zukünftige Änderungen messbar bleiben.
Change-Disziplin: Eine Variable nach der anderen
Ändern Sie beim Debugging nicht gleichzeitig Labels, Policy und CNI-Konfiguration. Sonst wissen Sie nicht, welche Änderung den Effekt verursacht hat. Führen Sie Änderungen sequenziell durch und validieren Sie jeweils mit demselben Testset.
Copy-Paste-Runbook: NetworkPolicy greift nicht – Debug Step-by-Step
- CNI feststellen: Welches Plugin (Calico/Cilium/etc.) ist aktiv? Unterstützt es Kubernetes NetworkPolicy und ist Enforcement aktiviert?
- Policy Scope prüfen: Namespace korrekt?
podSelectorkorrekt?policyTypesenthalten Ingress/Egress wie erwartet? - Selektor verifizieren: Matcht die Policy die betroffenen Pods wirklich (Labels live prüfen)?
- Alle Policies evaluieren: Gibt es andere Policies im Namespace oder global (Calico), die Traffic erlauben?
- Datenpfad prüfen: hostNetwork? NodePort? Ingress Controller? Service Mesh Sidecars? Proxy/Egress Gateway?
- Tests korrekt ausführen: Debug-Pod mit passenden Labels; getrennt testen: Pod→Pod, Pod→Service, Ingress→Service→Pod, Egress zu DNS/443.
- Telemetrie nutzen: CNI Drops/Denies, Hubble (Cilium), Calico Logs/Policy Hits, Cloud Flow Logs.
- Root Cause fixen: Labels stabilisieren, Default Deny sauber definieren, breite Allow-Policies entfernen, Pfad-spezifische Absicherung ergänzen.
- Regression verhindern: Policy-Linting, Review-Prozess, Ownership, Dokumentation, Monitoring auf Policy-Drops.
Outbound-Links zu relevanten Informationsquellen
- Kubernetes NetworkPolicies: Konzepte, Semantik und Beispiele
- Kubernetes Tutorial: NetworkPolicy praktisch anwenden
- Calico: Kubernetes NetworkPolicy Support und Details
- Calico Policy vs. Kubernetes NetworkPolicy
- Cilium: Netzwerk-Policies und Durchsetzung
- Cilium Hubble: Observability für NetworkPolicy-Entscheidungen
- CNI-Spezifikation: Grundlagen der Container-Netzwerkschnittstelle
Cisco Netzwerkdesign, CCNA Support & Packet Tracer Projekte
Cisco Networking • CCNA • Packet Tracer • Network Configuration
Ich biete professionelle Unterstützung im Bereich Cisco Computer Networking, einschließlich CCNA-relevanter Konfigurationen, Netzwerkdesign und komplexer Packet-Tracer-Projekte. Die Lösungen werden praxisnah, strukturiert und nach aktuellen Netzwerkstandards umgesetzt.
Diese Dienstleistung eignet sich für Unternehmen, IT-Teams, Studierende sowie angehende CCNA-Kandidaten, die fundierte Netzwerkstrukturen planen oder bestehende Infrastrukturen optimieren möchten. Finden Sie mich auf Fiverr.
Leistungsumfang:
-
Netzwerkdesign & Topologie-Planung
-
Router- & Switch-Konfiguration (Cisco IOS)
-
VLAN, Inter-VLAN Routing
-
OSPF, RIP, EIGRP (Grundlagen & Implementierung)
-
NAT, ACL, DHCP, DNS-Konfiguration
-
Troubleshooting & Netzwerkoptimierung
-
Packet Tracer Projektentwicklung & Dokumentation
-
CCNA Lern- & Praxisunterstützung
Lieferumfang:
-
Konfigurationsdateien
-
Packet-Tracer-Dateien (.pkt)
-
Netzwerkdokumentation
-
Schritt-für-Schritt-Erklärungen (auf Wunsch)
Arbeitsweise:Strukturiert • Praxisorientiert • Zuverlässig • Technisch fundiert
CTA:
Benötigen Sie professionelle Unterstützung im Cisco Networking oder für ein CCNA-Projekt?
Kontaktieren Sie mich gerne für eine Projektanfrage oder ein unverbindliches Gespräch. Finden Sie mich auf Fiverr.

