<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Kubernetes_NetworkPolicies_Troubleshooting</id>
	<title>Kubernetes NetworkPolicies Troubleshooting - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://xinux.net/index.php?action=history&amp;feed=atom&amp;title=Kubernetes_NetworkPolicies_Troubleshooting"/>
	<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Kubernetes_NetworkPolicies_Troubleshooting&amp;action=history"/>
	<updated>2026-08-23T15:03:35Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Xinux Wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://xinux.net/index.php?title=Kubernetes_NetworkPolicies_Troubleshooting&amp;diff=72556&amp;oldid=prev</id>
		<title>Thomas.will: Die Seite wurde neu angelegt: „Dieser Artikel behandelt zwei Themen, die den Kurs abschließen: Netzwerk-Segmentierung mit NetworkPolicies und ein systematisches Vorgehen beim Debuggen kaput…“</title>
		<link rel="alternate" type="text/html" href="https://xinux.net/index.php?title=Kubernetes_NetworkPolicies_Troubleshooting&amp;diff=72556&amp;oldid=prev"/>
		<updated>2026-08-09T08:11:55Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „Dieser Artikel behandelt zwei Themen, die den Kurs abschließen: Netzwerk-Segmentierung mit NetworkPolicies und ein systematisches Vorgehen beim Debuggen kaput…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Dieser Artikel behandelt zwei Themen, die den Kurs abschließen: Netzwerk-Segmentierung mit NetworkPolicies und ein systematisches Vorgehen beim Debuggen kaputter Pods.&lt;br /&gt;
&lt;br /&gt;
==Netzwerk-Segmentierung mit NetworkPolicies==&lt;br /&gt;
&lt;br /&gt;
; Ausgangslage ohne Policy&lt;br /&gt;
* Standardmäßig darf in Kubernetes jeder Pod mit jedem anderen Pod im Cluster kommunizieren – unabhängig von Namespace oder Anwendung. Das entspricht in etwa einem einzigen, komplett offenen Netz.&lt;br /&gt;
&lt;br /&gt;
; Die Analogie zu nftables&lt;br /&gt;
* Eine '''NetworkPolicy''' funktioniert im Prinzip wie eine Firewall-Regel, nur auf Pod-Ebene statt auf Interface- oder IP-Ebene. Statt Quell-IPs und Ports zu filtern, werden Pods über ihre Labels ausgewählt – das grundsätzliche Prinzip &amp;quot;erlaubt ist nur, was explizit erlaubt wird&amp;quot; ist identisch zu dem, was aus nftables-Regelwerken bekannt ist.&lt;br /&gt;
&lt;br /&gt;
; Voraussetzung&lt;br /&gt;
* NetworkPolicies werden nicht von Kubernetes selbst durchgesetzt, sondern vom eingesetzten Netzwerk-Plugin (CNI). Das bei k3s standardmäßig verwendete Flannel unterstützt sie '''nicht'''. Für diese Übung wird deshalb ein Policy-fähiges CNI wie Calico benötigt, oder die Policy wird nur zur Veranschaulichung des YAML-Aufbaus besprochen, ohne die Durchsetzung praktisch zu erzwingen. Welcher Weg gewählt wird, hängt vom vorbereiteten Kurs-Image ab.&lt;br /&gt;
&lt;br /&gt;
===Beispiel: nur web darf zu db===&lt;br /&gt;
&lt;br /&gt;
Ziel: Ausschließlich Pods mit dem Label &amp;lt;code&amp;gt;app: web&amp;lt;/code&amp;gt; dürfen Verbindungen zum &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt;-Pod aufbauen. Jeder andere Zugriff wird verweigert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: networking.k8s.io/v1&lt;br /&gt;
kind: NetworkPolicy&lt;br /&gt;
metadata:&lt;br /&gt;
  name: db-allow-web-only&lt;br /&gt;
spec:&lt;br /&gt;
  podSelector:&lt;br /&gt;
    matchLabels:&lt;br /&gt;
      app: db&lt;br /&gt;
  policyTypes:&lt;br /&gt;
    - Ingress&lt;br /&gt;
  ingress:&lt;br /&gt;
    - from:&lt;br /&gt;
        - podSelector:&lt;br /&gt;
            matchLabels:&lt;br /&gt;
              app: web&lt;br /&gt;
      ports:&lt;br /&gt;
        - protocol: TCP&lt;br /&gt;
          port: 5432&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Wichtig zum Verständnis&lt;br /&gt;
* Sobald für einen Pod '''irgendeine''' NetworkPolicy mit &amp;lt;code&amp;gt;Ingress&amp;lt;/code&amp;gt; existiert, gilt ab diesem Moment für diesen Pod: alles ist verboten außer dem, was explizit erlaubt wurde. Vorher galt &amp;quot;alles erlaubt&amp;quot;, danach &amp;quot;alles verboten außer den Ausnahmen&amp;quot; – ein Umdenken, das viele Einsteiger überrascht.&lt;br /&gt;
&lt;br /&gt;
; Anwenden&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl apply -f db-networkpolicy.yaml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Wirkung testen&lt;br /&gt;
* Von einem Pod ohne das Label &amp;lt;code&amp;gt;app: web&amp;lt;/code&amp;gt; aus (zum Beispiel einem frisch gestarteten Test-Pod) sollte die Verbindung zu &amp;lt;code&amp;gt;db:5432&amp;lt;/code&amp;gt; nun fehlschlagen, während sie vom &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;-Pod aus weiterhin funktioniert.&lt;br /&gt;
&lt;br /&gt;
==Systematisches Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
Bei Problemen mit einem Pod hilft ein festes Vorgehen, statt wahllos Befehle auszuprobieren.&lt;br /&gt;
&lt;br /&gt;
; Schritt 1: Überblick verschaffen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl get pods -o wide&amp;lt;/code&amp;gt;&lt;br /&gt;
* Zeigt Status, Neustarts und den Node, auf dem der Pod läuft.&lt;br /&gt;
&lt;br /&gt;
; Schritt 2: Details und Ereignisse ansehen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl describe pod &amp;amp;lt;pod-name&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Der Abschnitt &amp;lt;code&amp;gt;Events&amp;lt;/code&amp;gt; am Ende der Ausgabe verrät in den meisten Fällen sofort die Ursache – falsches Image, fehlende Ressourcen, fehlgeschlagene Probe.&lt;br /&gt;
&lt;br /&gt;
; Schritt 3: Logs des aktuellen Containers prüfen&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl logs &amp;amp;lt;pod-name&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Schritt 4: Bei Neustart-Schleifen die Logs des vorherigen Versuchs prüfen&lt;br /&gt;
* Nach einem Absturz sind die aktuellen Logs oft leer oder nutzlos, weil der Container gerade erst wieder gestartet ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl logs &amp;amp;lt;pod-name&amp;amp;gt; --previous&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Schritt 5: Cluster-weite Ereignisse prüfen&lt;br /&gt;
* Hilfreich, wenn ein Pod gar nicht erst startet (zum Beispiel wegen fehlender Ressourcen im Cluster).&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl get events --sort-by='.lastTimestamp'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Schritt 6: Bei Bedarf direkt in den Container&lt;br /&gt;
* &amp;lt;code&amp;gt;kubectl exec -it &amp;amp;lt;pod-name&amp;amp;gt; -- /bin/sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Typische Fehlerbilder===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status !! Typische Ursache !! Erster Debugging-Schritt&lt;br /&gt;
|-&lt;br /&gt;
| ImagePullBackOff || Image-Name falsch geschrieben oder Tag existiert nicht || &amp;lt;code&amp;gt;kubectl describe pod&amp;lt;/code&amp;gt;, Abschnitt Events&lt;br /&gt;
|-&lt;br /&gt;
| CrashLoopBackOff || Anwendung stürzt beim Start ab || &amp;lt;code&amp;gt;kubectl logs --previous&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Pending || Zu wenig Ressourcen im Cluster oder kein passender Node || &amp;lt;code&amp;gt;kubectl describe pod&amp;lt;/code&amp;gt;, Abschnitt Events&lt;br /&gt;
|-&lt;br /&gt;
| Running, aber nicht erreichbar || Falscher Service-Selector oder fehlende Readiness || &amp;lt;code&amp;gt;kubectl get endpoints&amp;lt;/code&amp;gt;, Labels prüfen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Übung: NetworkPolicy verifizieren==&lt;br /&gt;
&lt;br /&gt;
# Wendet die oben gezeigte Policy an.&lt;br /&gt;
# Startet einen Test-Pod ohne das Label &amp;lt;code&amp;gt;app: web&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;kubectl run test --rm -it --image=curlimages/curl -- sh&amp;lt;/code&amp;gt;&lt;br /&gt;
# Versucht von dort aus, &amp;lt;code&amp;gt;db:5432&amp;lt;/code&amp;gt; zu erreichen, und bestätigt, dass die Verbindung blockiert wird.&lt;br /&gt;
# Wechselt in den &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;-Pod und bestätigt, dass die Verbindung zu &amp;lt;code&amp;gt;db:5432&amp;lt;/code&amp;gt; von dort weiterhin funktioniert.&lt;br /&gt;
&lt;br /&gt;
==Übung: Geführtes Troubleshooting==&lt;br /&gt;
&lt;br /&gt;
In dieser Übung wird absichtlich ein Fehler eingebaut, den es systematisch mit den oben gezeigten Schritten zu finden gilt, ohne die Lösung vorher zu kennen.&lt;br /&gt;
&lt;br /&gt;
# Wendet ein Deployment mit einem absichtlich falschen Image-Namen an.&lt;br /&gt;
# Findet mit dem beschriebenen Vorgehen (nicht durch Raten) die genaue Fehlerursache.&lt;br /&gt;
# Korrigiert den Fehler und bestätigt, dass der Pod danach normal läuft.&lt;br /&gt;
# Wiederholt die Übung mit einem zweiten, unangekündigten Fehler (zum Beispiel einer fehlerhaften Readiness Probe, die auf einen falschen Port zeigt) und wendet dasselbe Vorgehen erneut an.&lt;br /&gt;
&lt;br /&gt;
==Übung: Alles zusammenführen==&lt;br /&gt;
&lt;br /&gt;
Als Abschluss wird die komplette Anwendung aus den vorherigen Artikeln noch einmal von Grund auf neu aufgesetzt, diesmal ohne Anleitung Schritt für Schritt, nur anhand der eigenen Notizen:&lt;br /&gt;
&lt;br /&gt;
# Erstellt alle benötigten Objekte (ConfigMap, Secret, PVC, beide Deployments, beide Services, Ingress, NetworkPolicy) in einer sinnvollen Reihenfolge.&lt;br /&gt;
# Prüft den vollständigen Zustand mit &amp;lt;code&amp;gt;kubectl get all&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;kubectl get pvc,ingress,networkpolicy&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Führt ein Rolling Update durch und bestätigt es mit &amp;lt;code&amp;gt;kubectl rollout status&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Simuliert einen Ausfall (Pod löschen) und beobachtet die Selbstheilung.&lt;br /&gt;
# Räumt zum Abschluss den gesamten Namespace auf: &amp;lt;code&amp;gt;kubectl delete all --all&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thomas.will</name></author>
	</entry>
</feed>