Kubernetes NetworkPolicy ist eine dieser Funktionen, die auf den ersten Blick einfach wirkt, bis man sie in einem stark ausgelasteten Cluster tatsächlich durchsetzt. Im Jahr 2026 ist sie weiterhin ein zentrales Bauteil für Least-Privilege-Netzwerkzugriff, bleibt aber leicht falsch zu konfigurieren, weil die Durchsetzung von der CNI-Implementierung abhängt, Selektoren labelbasiert arbeiten und „was man meint“ nicht immer dem entspricht, „was die API tut“. Dieser Leitfaden konzentriert sich auf Fehler, die in der Praxis zu Vorfällen führen, sowie auf Muster, die Teams wiederholt nutzen, um Verkehr zu segmentieren, ohne die Produktion zu gefährden.
Der häufigste Fall von „es funktioniert nicht“ ist kein YAML-Problem, sondern ein Betriebsproblem: NetworkPolicy ist eine API und nicht automatisch eine Firewall. In deinem Cluster muss eine Netzwerklösung laufen, die NetworkPolicy-Regeln tatsächlich durchsetzt; andernfalls können Richtlinien existieren, ohne eine Wirkung zu haben. Selbst wenn die Durchsetzung aktiv ist, können sich Details je nach CNI unterscheiden – etwa bei Randfällen, Protokollierung und Observability. „Unterstützt“ sollte man daher immer verifizieren, nicht einfach voraussetzen.
Als Nächstes ist Präzision bei den Isolations-Semantiken wichtig. Standardmäßig sind Pods nicht isoliert und akzeptieren Traffic von überall. Ein Pod wird für Ingress und/oder Egress erst dann isoliert, wenn er von einer Richtlinie erfasst wird, die diese Richtung abdeckt (über policyTypes oder implizites Verhalten). Ab dann funktionieren Regeln als Allow-Lists: Traffic ist nur erlaubt, wenn mindestens eine passende Richtlinie ihn zulässt, und alles andere wird für die isolierte Richtung verweigert.
Außerdem sollte klar sein, auf welcher Ebene Kubernetes NetworkPolicy arbeitet. Klassische NetworkPolicy ist vor allem L3/L4: IP-Blöcke, Namespaces, Pods und Ports. Wenn die Segmentierungsanforderung lautet „nur diesen HTTP-Pfad zulassen“ oder „nur diesen DNS-Namen erlauben“, braucht man häufig CNI-spezifische Erweiterungen oder neuere Policy-APIs, statt diese Anforderungen in eine einfache NetworkPolicy zu pressen.
Eine Richtlinie in einem Cluster zu „verlassen“, in dem die Durchsetzung nicht aktiviert ist (oder nicht auf allen Node-Pools), ist weiterhin ein Top-Fehler. Das YAML sieht korrekt aus, CI ist grün, aber im Betrieb ändert sich nichts – und das fällt erst bei einem Security-Review oder nach einem Vorfall auf. Lege deshalb eine explizite Cluster-Prüfung in Runbooks fest: welches CNI erzwingt Policies und wie lässt sich das in einem Nicht-Produktions-Namespace sicher testen?
policyTypes implizit zu lassen und anzunehmen, dass beide Richtungen abgedeckt sind, erzeugt Lücken. Häufig schreibt ein Team eine Ingress-Policy und denkt, dass damit auch Outbound-Verkehr begrenzt wird – bis später klar wird, dass Egress weiterhin offen war. Für Workloads, bei denen Outbound relevant ist (das sind die meisten), sollte die Richtung immer explizit sein.
Ein weiterer Klassiker: Service-Objekte werden als „Policy-Ziele“ missverstanden. NetworkPolicy selektiert Pods, nicht Services. Man kann Policies so gestalten, dass sie die Pods hinter einem Service treffen, aber der Service-Name selbst ist kein Selektor. Wenn jemand „den Service erlaubt“, wird oft das Label-Set der Pods übersehen – die Regel matcht dann einfach nichts.
Ein Segmentierungsmodell, das echte Organisationsänderungen überlebt, baut auf Grenzen, die Bedeutung haben: Namespaces für Tenancy und Lifecycle, Labels für App-Identität und Rollen sowie eine kurze Liste geteilter Dienste (DNS, Logging, Metriken, Ingress, Service-Mesh-Gateways), die viele Workloads erreichen müssen. Wenn diese Grundlagen inkonsistent sind, werden NetworkPolicies spröde, und Teams schalten sie am Ende ab oder bauen breite Ausnahmen ein, die den Nutzen untergraben.
Ein praxistaugliches Muster ist ein minimaler Label-Vertrag für Workloads: app.kubernetes.io/name, app.kubernetes.io/part-of, app.kubernetes.io/component sowie ein Umgebungs- oder Tenant-Label auf Namespace-Ebene. Dadurch werden Selektoren lesbarer und vorhersehbarer, und man reduziert Debugging, das durch ad-hoc Labels und „warum matcht das nicht?“ entsteht.
Shared Services verdienen eine eigene Behandlung. DNS ist die häufigste selbst verursachte Störung bei Policy-Rollouts: Ein Team aktiviert Egress Default-Deny und vergisst, Egress zu DNS-Pods zu erlauben (und manchmal auch zur Node-Local-DNS-Adresse, falls genutzt). DNS, obligatorische Egress-Proxies und andere Basisabhängigkeiten sollten als First-Class-Dependencies betrachtet und im Basismuster explizit modelliert werden.
Muster 1: „Namespace-Baseline + app-spezifische Verfeinerung“. Starte mit Default-Deny für Ingress (und bei Bedarf auch Egress) auf Namespace-Ebene und ergänze dann kleine, app-spezifische Allow-Regeln. Ziel ist nicht, am ersten Tag eine perfekte Matrix zu definieren, sondern einen kontrollierten Perimeter aufzubauen und sicher zu iterieren, während legitime Flows sichtbar werden.
Muster 2: „Allow-List für Shared Services“. Halte eine kleine Menge Policies (oft im Besitz des Plattform-/SRE-Teams), die es allen App-Namespaces erlauben, essenzielle Services zu erreichen: DNS, notwendige Ingress-Backends, Observability-Agenten sowie Admission/Webhook-Endpunkte, die zum Clusterbetrieb gehören. Diese Liste sollte kurz bleiben und regelmäßig geprüft werden, weil jede „gemeinsame“ Ausnahme laterale Bewegungen erleichtern kann, wenn sie wächst.
Muster 3: „Label-basierte Tiers innerhalb eines Namespace“. Für Teams, die weniger Namespaces bevorzugen, funktionieren Tiers wie role=frontend, role=backend, role=db gut. Danach werden Flows definiert: Frontend → Backend, Backend → DB, und alles andere wird blockiert. Das passt zu gängigen Architekturmodellen und reduziert Policy-Sprawl gegenüber vielen einzelnen Selektoren.

Die sicherste Rollout-Strategie ist 2026 weiterhin progressive Durchsetzung. Man dokumentiert zunächst beabsichtigte Flows (eine einfache Tabelle reicht), führt Default-Deny in einem kontrollierten Scope ein und ergänzt Allow-Regeln iterativ unter Monitoring. Der „Big-Bang“-Ansatz – überall Default-Deny aktivieren und live reparieren – endet fast immer in einem lauten Incident und einem Rollback.
Tests sollten positive und negative Fälle abdecken. Es reicht nicht zu prüfen, ob „Service A Service B erreichen kann“; ebenso wichtig ist ein Regressionstest, dass „Service C Service B nicht erreichen kann“. Ohne negative Tests driften Policies im Laufe der Zeit häufig in Richtung zu permissiv, weil niemand die zusätzlichen, ungewollten Pfade bemerkt.
Für Troubleshooting hilft eine konsequente Methode. Zuerst prüfen, ob der Pod von einer Policy selektiert wird (und für welche Richtung), dann alle Policies im Namespace auflisten, die matchen könnten, und erst danach die Regeln im Detail ansehen. Wenn das CNI Flow-Visibility oder Policy-Verdicts/Logs bietet, sollte man diese früh nutzen: Sie verkürzen Debugging von Stunden auf Minuten, weil ersichtlich wird, welche Regel eine Verbindung erlaubt oder verweigert hat.
Egress ist der Bereich, in dem die meisten Probleme auftreten: externe APIs, Paketquellen, Identity Provider und Webhooks verwandeln „deny by default“ schnell in eine lange Allow-Liste. Zwei Gegenmaßnahmen helfen: Outbound-Traffic über einen kontrollierten Egress-Pfad (Proxy oder Gateway) führen und in Policies primär diesen Pfad erlauben, statt dutzende externe Ziele einzeln freizuschalten. Das hält Policies klein und erleichtert Audits.
Namespace-Selektoren scheitern in der Praxis, wenn Namespaces nicht konsistent gelabelt sind. Teams schreiben Regeln mit namespaceSelector und stellen später fest, dass System- oder Legacy-Namespaces keine Labels haben – die Regel kann dann nicht matchen. Die Lösung ist organisatorisch wie technisch: einen minimalen Namespace-Label-Standard definieren und durchsetzen (Policy-as-Code-Checks eignen sich dafür gut).
Zum Schluss lohnt sich der Blick auf das Ökosystem rund um NetworkPolicy. Die Upstream-Initiativen zur Weiterentwicklung von netzwerkweiten, admin-orientierten Policy-Ressourcen (als CRDs) entwickeln sich weiter, inklusive Namens- und Versionsänderungen. Wer globale Guardrails oder Baselines über Namespaces hinweg braucht, sollte diese Admin-Level-APIs im eigenen Umfeld evaluieren, statt zu versuchen, „Cluster Policies“ ausschließlich mit namespace-basierten NetworkPolicy-Objekten nachzubauen.