Workshop-Wiki · Deutsch

Troubleshooting: Kubernetes

Dieses Dokument ist eine vollständige Troubleshooting-Referenz für Kubernetes. Du nutzt es, wenn ein Cluster, ein Node, ein Add-on oder eine Anwendung nicht wie erwartet funktioniert. Es ist bewusst nicht nur eine Liste einzelner Fehlerb…

Workshop-Beispiele als ZIP
Lernstand in der Web-App

Kapitel als gelesen markieren, Lesefortschritt sehen und Praxismodule abhaken: Diese Funktionen stehen nach Aktivierung der optionalen Web-App zur Verfügung. Der Workshop-Fortschritt ergibt sich automatisch aus den Kapiteln aller Dokumentseiten. Deine Auswahl bleibt auf diesem Gerät; es gibt kein Konto und keinen Serverabgleich. Eine Installation ist nicht erforderlich. Beim Widerruf in den Datenschutz-Einstellungen wird der Lernstand gelöscht.

Lesefortschritt0%
0%
0 / 31 Kapitel gelesen
Weitere SprachfassungEnglisch ↗

Troubleshooting: Kubernetes

Umfangreiche Troubleshooting-Referenz für Kubernetes-Workshops, Labs und produktionsnahe Umgebungen.

Stand: 2026-06-13.
Fokus: WSL, kind, minikube, k3d, Docker Desktop, lokale VMs, Vagrant, Remote-VMs, Bare Metal, kubeadm, k3s, RKE2, k0s, Talos, EKS, AKS, GKE, OpenShift/OKD und weitere Cloud-Provider.


1. Ziel und Abgrenzung

Dieses Dokument ist eine vollständige Troubleshooting-Referenz für Kubernetes. Du nutzt es, wenn ein Cluster, ein Node, ein Add-on oder eine Anwendung nicht wie erwartet funktioniert. Es ist bewusst nicht nur eine Liste einzelner Fehlerbilder. Es beschreibt Vorgehensmodelle, Umgebungsspezifika, Runbooks, Diagnosekommandos, Beweissicherung und Validierung.

1.1. Zielgruppen

Rolle Nutzen
Entwickler Du erkennst, ob ein Fehler aus Manifest, Image, Konfiguration, Dependency, Probe oder Anwendungscode stammt.
DevOps Engineer Du strukturierst Rollout-, Netzwerk-, Storage-, RBAC-, Helm- und GitOps-Fehler.
SRE Du sammelst belastbare Daten, korrelierst Metriken, Logs und Events und stabilisierst Services.
Platform Engineer Du unterscheidest Workload-, Add-on-, Node-, Control-Plane- und Provider-Probleme.
Security Engineer Du erkennst RBAC-, Admission-, Secret-, Runtime- und Incident-Signale.
Trainer Du erhältst Labs, Fehlerbilder und Review-Fragen für Workshops.

1.2. Nicht-Ziele

Dieses Dokument ersetzt keine produktspezifischen Support-Verträge, keine formale Incident-Response-Policy und keine providerseitigen Statusseiten. Es ersetzt auch nicht das Verständnis deiner Plattformarchitektur. Es gibt dir aber einen vollständigen Arbeitsrahmen, damit du nicht planlos einzelne Kommandos ausführst.

1.3. Leitgedanke

Ein Kubernetes-Fehler ist fast nie nur ein Kubernetes-Fehler. Er liegt meistens an einer Schnittstelle:

  • Manifest gegen API-Schema,
  • gewünschter Zustand gegen tatsächlichen Zustand,
  • Scheduler gegen Node-Kapazität,
  • Pod gegen Container Runtime,
  • Service gegen Labels und Endpoints,
  • DNS gegen CoreDNS und Netzwerk,
  • Ingress oder Gateway gegen Controller und Load Balancer,
  • PVC gegen StorageClass und CSI,
  • RBAC gegen Identität,
  • Add-on gegen CRDs, Webhooks und Versionen,
  • Cloud-Controller gegen IAM, Quotas, Subnetze oder Security Groups.
01 / 31

2. Grundprinzipien für Troubleshooting

2.1. Von außen nach innen prüfen

  1. Benutzerpfad: Ist das Problem aus Sicht des Nutzers reproduzierbar?
  2. DNS und Routing: Erreicht der Client den richtigen Namen, die richtige IP und den richtigen Port?
  3. Ingress, Gateway oder Load Balancer: Kommt Traffic am Cluster an?
  4. Service: Hat der Service Endpoints oder EndpointSlices?
  5. Pod: Ist der Pod Running und Ready?
  6. Container: Startet der Container stabil und hört er auf dem erwarteten Port?
  7. Anwendung: Sind Konfiguration, Secrets, Dependencies und Datenzugriff korrekt?
  8. Node: Hat der Node Runtime-, CNI-, Storage-, Ressourcen- oder OS-Probleme?
  9. Control Plane: Funktionieren API Server, Controller, Scheduler und etcd?
  10. Provider: Blockieren Cloud-IAM, Quotas, Subnetze, Firewalls, Routen, Tags oder Limits?

2.2. Erst beobachten, dann ändern

Ändere nicht sofort ein Manifest, nur weil ein Pod fehlschlägt. Sammle zuerst Status, Events, Logs, letzte Änderungen und Umgebungskontext. Ohne Ausgangszustand kannst du später nicht belegen, ob deine Änderung geholfen oder den Fehler nur verschoben hat.

2.3. Ereignisse sind oft wichtiger als Status

kubectl get zeigt dir einen aktuellen Zustand. kubectl describe und kubectl get events zeigen dir, wie Kubernetes zu diesem Zustand gekommen ist. Bei Scheduling-, ImagePull-, Mount-, Probe-, Admission- und Controller-Problemen sind Events häufig die schnellste Fehlerquelle.

2.4. Zwischen Symptom und Ursache trennen

Symptom Mögliche Ursache
CrashLoopBackOff App beendet sich, Config fehlt, Secret fehlt, Liveness Probe tötet den Container, Dependency nicht erreichbar.
Pending Node-Kapazität fehlt, PVC nicht gebunden, Taint nicht toleriert, Affinity nicht erfüllbar, Admission blockiert.
Service antwortet nicht Selector passt nicht, Pods nicht ready, EndpointSlices leer, kube-proxy/eBPF-Problem, NetworkPolicy blockiert.
DNS schlägt fehl CoreDNS nicht bereit, DNS-Egress blockiert, falscher Namespace, resolv.conf defekt, NodeLocal DNS Cache gestört.
Ingress antwortet 404 falsche Host-Regel, falsche IngressClass, kein Controller, Service-Port falsch, Default-Backend greift.
PVC bleibt Pending keine Default-StorageClass, CSI fehlt, Topology passt nicht, Cloud-Quota erschöpft, AccessMode nicht unterstützt.
Node NotReady kubelet down, Runtime down, CNI defekt, Zertifikat abgelaufen, DiskPressure, Netzwerk getrennt.

2.5. Minimal reproduzieren

Wenn du nicht weißt, ob das Problem in der App oder in der Plattform liegt, deploye eine minimale Referenz-App und einen Debug-Pod. Funktioniert die Referenz-App, liegt der Fehler wahrscheinlich in App, Manifest, Image, Secret oder Policy. Funktioniert sie nicht, prüfst du Plattformpfad, Netzwerk, DNS, Runtime und Add-ons.

02 / 31

3. Ersttriage in zehn Minuten

Nutze diesen Block, wenn du schnell entscheiden musst, ob du bei Workload, Node, Control Plane, Netzwerk, Storage oder Provider weitermachst.

bash
# 1. Kontext prüfen
kubectl config current-context
kubectl cluster-info
kubectl version

# 2. Clusterzustand grob prüfen
kubectl get nodes -o wide
kubectl get pods -A -o wide --sort-by=.metadata.creationTimestamp
kubectl get events -A --sort-by=.lastTimestamp | tail -100

# 3. Workload und Namespace prüfen
NS=demo
APP=demo
kubectl get all -n "$NS"
kubectl get deploy,rs,sts,ds,job,cronjob -n "$NS"
kubectl get pod -n "$NS" -o wide --show-labels

# 4. Fehlerhafte Pods identifizieren
kubectl get pods -A \
  --field-selector=status.phase!=Running \
  -o wide

# 5. Details, Logs und letzte Logs prüfen
POD=<pod>
kubectl describe pod "$POD" -n "$NS"
kubectl logs "$POD" -n "$NS" --all-containers --tail=200
kubectl logs "$POD" -n "$NS" --all-containers --previous --tail=200

# 6. Netzwerkpfad prüfen
kubectl get svc,endpoints,endpointslices,ingress -n "$NS" -o wide
kubectl get networkpolicy -A

# 7. Storagepfad prüfen
kubectl get storageclass
kubectl get pv,pvc -A

# 8. RBAC prüfen
kubectl auth can-i get pods -n "$NS"
kubectl auth can-i '*' '*' -n "$NS"

3.1. Sofortklassifizierung

Ergebnis Nächster Schritt
kubectl erreicht den API Server nicht API/kubeconfig/Netzwerk/Provider prüfen.
Viele Pods in mehreren Namespaces fehlerhaft Cluster-, Node-, CNI-, DNS-, CSI- oder Providerproblem prüfen.
Nur ein Namespace betroffen Manifest, Quota, RBAC, NetworkPolicy, Secrets und Dependencies prüfen.
Nur neue Version betroffen Rollout, Image, Config, Helm-Werte, GitOps-Revision und Migration prüfen.
Pods laufen, aber Service antwortet nicht Service, EndpointSlices, Readiness, Netzwerk, DNS, Ingress/Gateway prüfen.
Nodes NotReady oder Unknown kubelet, Runtime, CNI, OS, Disk, Memory, Zertifikate und Provider prüfen.
PVCs Pending StorageClass, CSI, Topology, Cloud-Quota und AccessModes prüfen.
Forbidden Identität, Role, RoleBinding, ClusterRoleBinding und impersonation prüfen.
03 / 31

4. Entscheidungsbaum

flowchart TD
    A[Problem gemeldet] --> B{kubectl API erreichbar?}
    B -- Nein --> C[Kontext, kubeconfig, VPN, API Server, Provider prüfen]
    B -- Ja --> D{Betrifft es viele Namespaces?}
    D -- Ja --> E{Nodes gesund?}
    E -- Nein --> F[Node, Runtime, CNI, Disk, Zertifikate, Provider]
    E -- Ja --> G{CoreDNS, CNI, CSI oder Admission auffällig?}
    G -- Ja --> H[Add-on Runbook]
    G -- Nein --> I[Control Plane, Quotas, Cloud Limits, globale Policies]
    D -- Nein --> J{Pod vorhanden?}
    J -- Nein --> K[Deployment, ReplicaSet, Job, GitOps, Helm prüfen]
    J -- Ja --> L{Pod Ready?}
    L -- Nein --> M[Scheduling, ImagePull, CrashLoop, Probes, Mounts]
    L -- Ja --> N{Service hat Endpoints?}
    N -- Nein --> O[Labels, Selector, Readiness, EndpointSlices]
    N -- Ja --> P{Traffic erreicht Service?}
    P -- Nein --> Q[DNS, NetworkPolicy, kube-proxy/eBPF, CNI]
    P -- Ja --> R[App, Backend, Datenbank, externe Dependency]

4.1. Datenfluss für HTTP-Probleme

sequenceDiagram
    participant Browser as Browser oder Client
    participant DNS as DNS
    participant LB as Load Balancer
    participant GW as Ingress/Gateway Controller
    participant SVC as Kubernetes Service
    participant EPS as EndpointSlice
    participant Pod as Pod
    participant App as App Container

    Browser->>DNS: Hostname auflösen
    DNS-->>Browser: IP-Adresse
    Browser->>LB: TCP/TLS/HTTP Request
    LB->>GW: Weiterleitung an Controller
    GW->>SVC: Routing nach Host/Path/Route
    SVC->>EPS: Backend-Auswahl
    EPS->>Pod: Pod-IP und Port
    Pod->>App: Container-Port
    App-->>Browser: Antwort oder Fehler

4.2. Regel für schnelle Eingrenzung

  • HTTP 404 deutet oft auf falsche Ingress-/Gateway-Route oder falschen Host hin.
  • HTTP 503 deutet oft auf fehlende oder nicht bereite Backends hin.
  • Connection refused deutet oft auf falschen Port, nicht laufenden Listener oder Node-/Port-Mapping-Problem hin.
  • Timeout deutet oft auf Firewall, NetworkPolicy, Route, CNI, Load Balancer oder Providerproblem hin.
  • TLS-Fehler deutet oft auf Zertifikat, SNI, Secret, Trust Store oder Controller-Konfiguration hin.
04 / 31

5. Umgebungsmatrix

Umgebung Typische Fehlerquelle Erste Diagnose Besonderheit
WSL2 unter Windows 11 Docker Desktop Integration, NAT/Mirrored Networking, Windows Firewall, Hosts-Datei wsl -l -v, docker context ls, ss -tulpn, PowerShell Test-NetConnection Edge läuft auf Windows, nicht in WSL. Hostnamen müssen ggf. in der Windows-Hosts-Datei stehen.
kind Port-Mappings fehlen, Docker-Netz, Ingress nicht vorbereitet kind get clusters, docker ps, kind export logs Host-Port-Mappings müssen beim Cluster-Create gesetzt werden.
minikube Driver, Tunnel, Add-ons, VM/Docker-Netz minikube status, minikube logs, minikube service list minikube tunnel muss für LoadBalancer/Ingress-Zugriff offen bleiben.
k3d Load-Balancer-Container, Port-Mapping, Traefik, Registry k3d cluster list, docker ps, k3d kubeconfig get Ports werden meist über den k3d-Load-Balancer veröffentlicht.
Docker Desktop Kubernetes Ressourcenlimit, Kontext, integrierter Cluster, Proxy docker info, kubectl config get-contexts Gut für lokale Tests, aber nicht identisch mit produktiven Nodes.
Lokale VM NAT/Bridged/Host-only, Snapshot, DNS, Firewall ip a, ip r, systemctl, journalctl Netzwerkmodus entscheidet, ob dein Host den Cluster erreicht.
Vagrant Provisioner nicht idempotent, private Netzwerke, SSH, Provider vagrant status, vagrant ssh, vagrant provision Fehler entstehen oft vor Kubernetes durch VM-Netz oder Provisioning.
Remote-VM Cloud-Firewall, Security Groups, Floating IP, MTU, private Netze curl, nc, Provider-CLI, ip route Prüfe immer Provider-Firewall und OS-Firewall getrennt.
Bare Metal Firmware, NIC, VLAN, MTU, Storage, BMC, Kernel dmesg, ip link, ethtool, journalctl Hardware- und Netzwerkfehler sehen oft wie CNI- oder Node-Probleme aus.
kubeadm Zertifikate, kubelet, containerd, CNI, etcd kubeadm certs check-expiration, crictl, journalctl Ohne funktionierendes CNI bleiben viele Pods nicht netzwerkfähig.
k3s Embedded etcd/SQLite, Traefik, ServiceLB, Token, Systemd systemctl status k3s, kubectl -n kube-system get pods K3s bringt eigene Defaults mit, etwa Traefik und ServiceLB.
RKE2 Canal/Cilium, SELinux, Server/Agent, Zertifikate systemctl status rke2-server, journalctl -u rke2-server Härtung und FIPS-/SELinux-Aspekte sind relevanter als bei lokalen Labs.
k0s Controller/Worker-Rollen, Join-Token, systemd k0s status, k0s kubectl get nodes k0s kubectl kann bei Pfad- und kubeconfig-Problemen helfen.
Talos Kein SSH, Machine Config, API-Zugriff, etcd talosctl health, talosctl logs, talosctl dmesg Du debugst über talosctl, nicht über Shell-Login.
EKS IAM, VPC CNI, Security Groups, Node Groups, Add-ons aws eks describe-cluster, kubectl get nodes, CloudWatch Node-Join- und Pod-IP-Probleme liegen oft bei IAM, Subnetzen oder VPC CNI.
AKS Managed Identity, Node Pool, Azure CNI, Load Balancer, Upgrades az aks show, az aks get-credentials, kubectl get events Upgrades erzeugen Surge Nodes und drainen Nodes; PDBs können blockieren.
GKE IAM, Autopilot-Constraints, VPC-native IPs, Logging API, Quotas gcloud container clusters describe, kubectl get events Autopilot validiert und beschränkt manche Pod-Spezifikationen stärker.
OpenShift/OKD Operatoren, SCC, Routes, MachineConfig, ClusterVersion oc get co, oc adm must-gather, oc describe Operator-Degraded-Status ist oft der beste Einstieg.
05 / 31

6. Diagnosewerkzeuge

6.1. Kubernetes-CLI

bash
kubectl version
kubectl cluster-info
kubectl config get-contexts
kubectl api-resources
kubectl api-versions
kubectl explain deployment.spec.template.spec.containers
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/livez?verbose'
kubectl get --raw='/metrics' | head

6.2. Workload-Diagnose

bash
kubectl get pod -A -o wide
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --all-containers --tail=200
kubectl logs <pod> -n <namespace> --all-containers --previous --tail=200
kubectl exec -it <pod> -n <namespace> -- sh
kubectl debug -it <pod> -n <namespace> --image=nicolaka/netshoot --target=<container>

6.3. Node-Diagnose

bash
kubectl describe node <node>
kubectl get events -A --field-selector involvedObject.kind=Node --sort-by=.lastTimestamp
kubectl top nodes
kubectl top pods -A
ssh <node>
systemctl status kubelet containerd crio
journalctl -u kubelet -n 300 --no-pager
journalctl -u containerd -n 300 --no-pager
crictl info
crictl ps -a
crictl pods
crictl logs <container-id>

6.4. Netzwerkdiagnose

bash
kubectl get svc,endpoints,endpointslices -A -o wide
kubectl get ingress -A
kubectl get gateway,httproute -A
kubectl get networkpolicy -A
kubectl run netshoot -n default --rm -it --restart=Never --image=nicolaka/netshoot -- bash
kubectl run dnsutils -n default --rm -it --restart=Never --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- nslookup kubernetes.default

6.5. Storage-Diagnose

bash
kubectl get storageclass
kubectl get pv,pvc -A -o wide
kubectl describe pvc <pvc> -n <namespace>
kubectl get volumeattachment
kubectl get csidriver
kubectl get pods -A | grep -i csi

6.6. Security-Diagnose

bash
kubectl auth whoami
kubectl auth can-i get pods -n <namespace>
kubectl auth can-i '*' '*' --as system:serviceaccount:<namespace>:<serviceaccount>
kubectl get role,rolebinding -n <namespace>
kubectl get clusterrole,clusterrolebinding
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration
kubectl get validatingadmissionpolicy,validatingadmissionpolicybinding

6.7. Linux- und Netzwerktools

bash
ip addr
ip route
ip neigh
ss -tulpn
ss -antp
resolvectl status || cat /etc/resolv.conf
nft list ruleset || iptables-save
journalctl -xe --no-pager
dmesg -T | tail -200
df -h
findmnt
free -m
uptime

6.8. Cloud-CLI

bash
# AWS EKS
aws eks describe-cluster --name <cluster> --region <region>
aws eks update-kubeconfig --name <cluster> --region <region>
aws eks list-addons --cluster-name <cluster>
aws ec2 describe-security-groups --group-ids <sg-id>

# Azure AKS
az aks show -g <resource-group> -n <cluster>
az aks get-credentials -g <resource-group> -n <cluster> --overwrite-existing
az aks nodepool list -g <resource-group> --cluster-name <cluster>
az network nsg rule list -g <resource-group> --nsg-name <nsg>

# Google GKE
gcloud container clusters describe <cluster> --region <region>
gcloud container clusters get-credentials <cluster> --region <region>
gcloud container operations list --region <region>
gcloud compute firewall-rules list
06 / 31

7. Standard-Datensammlung

7.1. Minimaler Support-Bundlesatz

Sammle diese Informationen, bevor du eine Änderung ausführst:

bash
TS=$(date -u +%Y%m%dT%H%M%SZ)
OUT="k8s-debug-$TS"
mkdir -p "$OUT"

kubectl version -o yaml > "$OUT/version.yaml" 2>&1 || true
kubectl cluster-info > "$OUT/cluster-info.txt" 2>&1 || true
kubectl config current-context > "$OUT/current-context.txt" 2>&1 || true
kubectl get nodes -o wide > "$OUT/nodes.txt" 2>&1 || true
kubectl describe nodes > "$OUT/nodes-describe.txt" 2>&1 || true
kubectl get pods -A -o wide > "$OUT/pods-wide.txt" 2>&1 || true
kubectl get events -A --sort-by=.lastTimestamp > "$OUT/events.txt" 2>&1 || true
kubectl get ns -o yaml > "$OUT/namespaces.yaml" 2>&1 || true
kubectl get svc,endpoints,endpointslices -A -o wide > "$OUT/network.txt" 2>&1 || true
kubectl get ingress -A -o yaml > "$OUT/ingress.yaml" 2>&1 || true
kubectl get gateway,httproute -A -o yaml > "$OUT/gateway-api.yaml" 2>&1 || true
kubectl get storageclass,pv,pvc -A -o yaml > "$OUT/storage.yaml" 2>&1 || true
kubectl get networkpolicy -A -o yaml > "$OUT/networkpolicies.yaml" 2>&1 || true
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration -o yaml > "$OUT/webhooks.yaml" 2>&1 || true
kubectl get crd > "$OUT/crds.txt" 2>&1 || true

tar -czf "$OUT.tar.gz" "$OUT"
echo "$OUT.tar.gz"

7.2. Namespace-spezifische Sammlung

bash
NS=<namespace>
TS=$(date -u +%Y%m%dT%H%M%SZ)
OUT="k8s-debug-$NS-$TS"
mkdir -p "$OUT"

kubectl get all -n "$NS" -o wide > "$OUT/all-wide.txt" 2>&1 || true
kubectl get all -n "$NS" -o yaml > "$OUT/all.yaml" 2>&1 || true
kubectl get events -n "$NS" --sort-by=.lastTimestamp > "$OUT/events.txt" 2>&1 || true
kubectl get configmap,secret,sa,role,rolebinding -n "$NS" -o yaml > "$OUT/config-security.yaml" 2>&1 || true
kubectl get pvc -n "$NS" -o yaml > "$OUT/pvc.yaml" 2>&1 || true
kubectl get ingress,gateway,httproute,networkpolicy -n "$NS" -o yaml > "$OUT/networking.yaml" 2>&1 || true

for pod in $(kubectl get pod -n "$NS" -o name | sed 's#pod/##'); do
  kubectl describe pod "$pod" -n "$NS" > "$OUT/pod-$pod-describe.txt" 2>&1 || true
  kubectl logs "$pod" -n "$NS" --all-containers --tail=500 > "$OUT/pod-$pod-logs.txt" 2>&1 || true
  kubectl logs "$pod" -n "$NS" --all-containers --previous --tail=500 > "$OUT/pod-$pod-logs-previous.txt" 2>&1 || true
done

tar -czf "$OUT.tar.gz" "$OUT"

7.3. Was du nicht unkontrolliert sammeln solltest

  • Secrets im Klartext,
  • produktive Tokens,
  • vollständige kubeconfigs mit Client-Zertifikaten,
  • personenbezogene Daten aus Logs,
  • Datenbankdumps,
  • TLS-Private-Keys,
  • Kundennamen und interne Hostnamen, wenn das Bundle extern weitergegeben wird.

7.4. Redaction vor Weitergabe

bash
# Vorsicht: immer an einer Kopie arbeiten.
cp -r k8s-debug-<timestamp> k8s-debug-redacted
find k8s-debug-redacted -type f -name '*.yaml' -o -name '*.txt' | while read -r f; do
  sed -i \
    -e 's/[A-Za-z0-9_\.-]*@[A-Za-z0-9_\.-]*/REDACTED_EMAIL/g' \
    -e 's/password:.*/password: REDACTED/g' \
    -e 's/token:.*/token: REDACTED/g' \
    -e 's/client-key-data:.*/client-key-data: REDACTED/g' \
    "$f"
done
07 / 31

8. Sicherheits- und Beweissicherung

8.1. Bei möglichem Security Incident

Wenn du einen Security Incident vermutest, stabilisierst du nicht nur technisch. Du sicherst Beweise und minimierst Veränderung am kompromittierten System.

  1. Incident-ID erzeugen.
  2. Zeitpunkt, Melder, Symptome und Scope dokumentieren.
  3. Betroffene Namespaces, Pods, Nodes, ServiceAccounts und Images erfassen.
  4. Logs, Events, Audit-Logs und Container-Metadaten sichern.
  5. Netzwerkzugriff begrenzen, ohne Beweise zu vernichten.
  6. Tokens und Secrets rotieren, wenn Missbrauch wahrscheinlich ist.
  7. Workload neu aus vertrauenswürdiger Quelle ausrollen.
  8. Policy-Lücke schließen.

8.2. Keine blinde Bereinigung

Führe bei einem verdächtigen Pod nicht sofort kubectl delete pod aus, wenn forensische Informationen wichtig sind. Sammle zuerst:

bash
NS=<namespace>
POD=<pod>
kubectl get pod "$POD" -n "$NS" -o yaml > incident-pod.yaml
kubectl describe pod "$POD" -n "$NS" > incident-pod-describe.txt
kubectl logs "$POD" -n "$NS" --all-containers --timestamps --tail=-1 > incident-pod-logs.txt
kubectl logs "$POD" -n "$NS" --all-containers --previous --timestamps --tail=-1 > incident-pod-logs-previous.txt
kubectl get events -n "$NS" --sort-by=.lastTimestamp > incident-events.txt
kubectl get sa,role,rolebinding -n "$NS" -o yaml > incident-rbac.yaml

8.3. Isolieren statt löschen

Bei aktivem Missbrauch kannst du eine restriktive NetworkPolicy anwenden, den Service selector entfernen oder den Deployment-Replica-Count auf null setzen. Welche Maßnahme passt, hängt davon ab, ob Verfügbarkeit oder Beweissicherung wichtiger ist.

bash
# Schnelle Isolation eines Namespace, wenn dein CNI NetworkPolicies durchsetzt.
kubectl apply -n <namespace> -f - <<'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: emergency-default-deny
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
EOF
08 / 31

9. API-, kubeconfig- und kubectl-Probleme

9.1. kubectl nutzt den falschen Kontext

Symptome

  • Ressourcen fehlen angeblich.
  • Du arbeitest im falschen Cluster.
  • kubectl zeigt alte Clusterinformationen.

Diagnose

bash
kubectl config get-contexts
kubectl config current-context
kubectl config view --minify
kubectl cluster-info

Maßnahmen

bash
kubectl config use-context <context>
kubectl config set-context --current --namespace=<namespace>

Validierung

bash
kubectl get ns
kubectl auth whoami

9.2. API Server nicht erreichbar

Symptome

  • Unable to connect to the server.
  • i/o timeout.
  • connection refused.
  • x509: certificate signed by unknown authority.

Diagnose

bash
kubectl cluster-info
kubectl get --raw='/readyz?verbose'
kubectl config view --minify --raw
curl -k https://<api-server>:6443/readyz
nc -vz <api-server> 6443

Bei kubeadm-Control-Plane:

bash
sudo crictl ps -a | grep kube-apiserver
sudo crictl logs <apiserver-container-id>
sudo journalctl -u kubelet -n 300 --no-pager
sudo ls -l /etc/kubernetes/manifests/

Häufige Ursachen

  • falsche kubeconfig,
  • VPN oder Firewall blockiert,
  • API Server Pod startet nicht,
  • Zertifikat abgelaufen,
  • Load-Balancer-Endpoint falsch,
  • Cloud-Control-Plane nicht verfügbar,
  • lokale kind/minikube/k3d-Container gestoppt.

9.3. API ist langsam

Diagnose

bash
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/metrics' | grep -E 'apiserver_request_duration|apiserver_current_inflight_requests' | head -50
kubectl get events -A --sort-by=.lastTimestamp | tail -100

Ursachen

  • zu viele Watcher,
  • langsame oder blockierende Admission Webhooks,
  • etcd-Latenz,
  • API-Priority-and-Fairness-Drosselung,
  • große CRDs oder Controller mit zu vielen Requeues,
  • Cloud-API-Rate-Limits.

9.4. kubectl apply schlägt wegen Schema oder Admission fehl

bash
kubectl apply --server-side --dry-run=server -f manifest.yaml
kubectl diff -f manifest.yaml
kubectl explain <kind>.spec
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration
kubectl get events -A --sort-by=.lastTimestamp | tail -50

Wenn die Fehlermeldung von einem Webhook kommt, prüfst du den Webhook-Service:

bash
kubectl get validatingwebhookconfiguration <name> -o yaml
kubectl get svc,endpoints -n <webhook-namespace>
kubectl logs -n <webhook-namespace> deploy/<webhook-deployment>
09 / 31

10. Workload-Troubleshooting

10.1. Pod-Zustände verstehen

Zustand Bedeutung Typischer nächster Schritt
Pending Pod wurde akzeptiert, läuft aber noch nicht. describe pod, Scheduler Events, PVC, Taints, Ressourcen prüfen.
ContainerCreating Pod ist geplant, Container wird vorbereitet. Image, Volumes, CNI, Runtime, Events prüfen.
Running + NotReady Container läuft, aber Readiness ist false. Readiness Probe, App-Port, Dependencies prüfen.
CrashLoopBackOff Container startet und beendet sich wiederholt. logs --previous, Exit Code, Config, Secret, Probe prüfen.
ImagePullBackOff Image kann nicht gezogen werden. Image-Name, Tag, Registry, Secret, Netzwerk prüfen.
Completed Container lief erfolgreich zu Ende. Bei Deployments falsch, bei Jobs normal.
Unknown Node-Status unbekannt. Node, kubelet, Netzwerk, Node Controller prüfen.

10.2. Logs richtig lesen

bash
# Aktuelle Logs
kubectl logs <pod> -n <namespace> --all-containers --tail=200

# Logs des vorherigen Containerstarts
kubectl logs <pod> -n <namespace> --all-containers --previous --tail=200

# Logs eines Deployments
kubectl logs deploy/<deployment> -n <namespace> --all-containers --tail=200

# Logs mit Zeitstempeln
kubectl logs <pod> -n <namespace> --timestamps --all-containers

10.3. Exit Codes

Exit Code Bedeutung Typische Ursache
0 Prozess erfolgreich beendet. Für Deployment oft falscher Prozess oder One-Shot-Befehl.
1 Allgemeiner Fehler. Config, App-Fehler, fehlende Datei.
2 Falsche CLI-Nutzung. Argumente oder Entrypoint falsch.
126 Befehl gefunden, aber nicht ausführbar. Dateirechte, falscher User, noexec.
127 Befehl nicht gefunden. Image enthält Binary nicht, PATH falsch.
137 SIGKILL, oft OOMKilled. Memory-Limit zu klein oder Memory-Leak.
143 SIGTERM. Normaler Stop, Rollout, Scale Down, Drain.

10.4. Container startet lokal, aber nicht in Kubernetes

Prüfe Unterschiede zwischen lokalem Docker-Run und Kubernetes:

  • Environment Variables,
  • Working Directory,
  • Entrypoint und Args,
  • User und Dateirechte,
  • read-only Root Filesystem,
  • Capabilities,
  • Secrets und ConfigMaps,
  • Service DNS,
  • Netzwerkpolicy,
  • Ressourcenlimits,
  • Zeitzone und Locale,
  • Architektur des Images (amd64, arm64).
bash
kubectl get pod <pod> -n <namespace> -o jsonpath='{.spec.containers[*].image}{"\n"}'
kubectl get pod <pod> -n <namespace> -o yaml | sed -n '/containers:/,/volumes:/p'
kubectl exec -it <pod> -n <namespace> -- env | sort
kubectl exec -it <pod> -n <namespace> -- id
kubectl exec -it <pod> -n <namespace> -- pwd
kubectl exec -it <pod> -n <namespace> -- ls -la

10.5. Ephemeral Debug Container

Wenn ein Image kein Shell-Tool enthält, nutzt du kubectl debug:

bash
kubectl debug -it pod/<pod> -n <namespace> \
  --image=nicolaka/netshoot \
  --target=<container> \
  -- bash

Nicht jeder Cluster erlaubt Ephemeral Containers. Admission Policies, Pod Security, RBAC oder alte Kubernetes-Versionen können das blockieren.

10 / 31

11. Scheduling-, Ressourcen- und Autoscaling-Probleme

11.1. Scheduler-Events lesen

bash
kubectl describe pod <pod> -n <namespace> | sed -n '/Events:/,$p'
kubectl get events -n <namespace> --sort-by=.lastTimestamp | grep -i -E 'FailedScheduling|Insufficient|taint|affinity|preempt'

11.2. Ressourcenlage prüfen

bash
kubectl top nodes
kubectl top pods -A --sort-by=cpu
kubectl top pods -A --sort-by=memory
kubectl describe node <node> | sed -n '/Allocated resources:/,/Events:/p'
kubectl get resourcequota,limitrange -A

11.3. Häufige Scheduling-Ursachen

Ursache Signal Maßnahme
CPU fehlt Insufficient cpu Requests senken, Node Pool erweitern, HPA/Cluster Autoscaler prüfen.
Memory fehlt Insufficient memory Requests anpassen, Speicherleck prüfen, größere Nodes verwenden.
Taint nicht toleriert had taint ... that the pod didn't tolerate Toleration bewusst ergänzen oder anderen Node wählen.
NodeSelector falsch node(s) didn't match Pod's node affinity/selector Labels und Selector korrigieren.
PVC nicht gebunden pod has unbound immediate PersistentVolumeClaims StorageClass, CSI, PV/PVC prüfen.
Topology Spread nicht erfüllbar didn't match pod topology spread constraints Constraints, Zonen, Replica-Anzahl prüfen.
PDB/Preemption preemption is not helpful Prioritäten, PDBs und Kapazität prüfen.

11.4. HPA skaliert nicht

bash
kubectl get hpa -A
kubectl describe hpa <hpa> -n <namespace>
kubectl top pod -n <namespace>
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml
kubectl logs -n kube-system deploy/metrics-server --tail=200

Ursachen:

  • Metrics Server fehlt oder ist nicht bereit,
  • Pods haben keine CPU-Requests,
  • HPA-Metrik ist falsch referenziert,
  • Custom Metrics Adapter fehlt,
  • stabilizationWindowSeconds verzögert Skalierung,
  • Cluster Autoscaler kann keine Nodes ergänzen,
  • PodDisruptionBudget oder Quota blockieren indirekt.

11.5. Cluster Autoscaler oder Node Autoscaling reagiert nicht

Prüfe:

bash
kubectl -n kube-system get deploy | grep -i autoscaler
kubectl -n kube-system logs deploy/cluster-autoscaler --tail=300
kubectl get pods -A | grep Pending
kubectl describe pod <pending-pod> -n <namespace>

Cloud-spezifisch:

  • AWS: Auto Scaling Group, Launch Template, IAM, Subnetze, Tags.
  • Azure: VMSS, Quotas, Node-Pool-Modus, Zonen.
  • GCP: Instance Group, Quotas, Reservations, Autopilot-Constraints.
11 / 31

12. Netzwerk-, DNS-, Service-, Ingress- und Gateway-Probleme

12.1. Netzwerkpfad systematisch prüfen

bash
NS=<namespace>
APP=<app-label>
SVC=<service>

kubectl get pod -n "$NS" -l app="$APP" -o wide --show-labels
kubectl get svc "$SVC" -n "$NS" -o wide
kubectl get endpoints "$SVC" -n "$NS" -o yaml
kubectl get endpointslices -n "$NS" -l kubernetes.io/service-name="$SVC" -o yaml
kubectl get networkpolicy -n "$NS" -o yaml

12.2. Service ohne Endpoints

Ein Service routet nicht zu Pods, wenn sein Selector keine passenden und bereiten Pods findet.

bash
kubectl get svc <service> -n <namespace> -o yaml | yq '.spec.selector'
kubectl get pods -n <namespace> --show-labels
kubectl get endpoints <service> -n <namespace>
kubectl describe pod <pod> -n <namespace> | grep -A20 Conditions

Prüfe:

  • Labels passen exakt zu Selector?
  • Pods sind Ready?
  • Service-Port und targetPort korrekt?
  • Named Port existiert im Pod?
  • EndpointSlices werden durch Controller erzeugt?

12.3. DNS prüfen

bash
kubectl run dnsutils -n default --rm -it --restart=Never \
  --image=registry.k8s.io/e2e-test-images/agnhost:2.39 \
  -- nslookup kubernetes.default

kubectl run netshoot -n default --rm -it --restart=Never \
  --image=nicolaka/netshoot -- bash

# Im Debug-Pod:
cat /etc/resolv.conf
nslookup kubernetes.default.svc.cluster.local
nslookup <service>.<namespace>.svc.cluster.local
dig <service>.<namespace>.svc.cluster.local

CoreDNS prüfen:

bash
kubectl -n kube-system get deploy,po,svc,endpoints -l k8s-app=kube-dns
kubectl -n kube-system logs deploy/coredns --tail=200
kubectl -n kube-system get configmap coredns -o yaml

12.4. NetworkPolicy blockiert Traffic

Prüfe zuerst, ob dein CNI NetworkPolicies überhaupt durchsetzt. Ohne unterstützendes CNI ist eine NetworkPolicy nur ein API-Objekt ohne Enforcement.

bash
kubectl get networkpolicy -A
kubectl describe networkpolicy <policy> -n <namespace>
kubectl get pod -n <namespace> --show-labels

Typische Fehler:

  • Default-Deny ohne DNS-Egress-Ausnahme,
  • falscher podSelector,
  • falscher namespaceSelector,
  • Labels fehlen,
  • Egress zu externen APIs fehlt,
  • Service Mesh mTLS und NetworkPolicy widersprechen sich,
  • Policy wurde in falschem Namespace angelegt.

12.5. Ingress funktioniert nicht

bash
kubectl get ingress -A
kubectl describe ingress <ingress> -n <namespace>
kubectl get ingressclass
kubectl get svc,endpoints -n <namespace>
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller --tail=300
curl -v -H 'Host: <host>' http://<ingress-ip>/<path>

Prüfe:

  • Ingress Controller läuft?
  • ingressClassName passt?
  • DNS zeigt auf richtige IP?
  • Host und Path passen zur Anfrage?
  • Service-Port verweist auf existierenden Port?
  • TLS Secret liegt im selben Namespace wie Ingress?
  • Load Balancer oder NodePort ist erreichbar?

12.6. Gateway API funktioniert nicht

bash
kubectl get gatewayclass,gateway,httproute,grpcroutes,tlsroute -A
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>
kubectl get events -A --sort-by=.lastTimestamp | grep -i -E 'gateway|route|listener|accepted|resolved'

Prüfe Conditions:

  • Accepted,
  • Programmed,
  • ResolvedRefs,
  • Listener-Konflikte,
  • falsche parentRefs,
  • Cross-Namespace-Referenzen ohne ReferenceGrant,
  • GatewayClass ohne Controller.

12.7. MTU- und Fragmentierungsprobleme

Symptome:

  • kleine Requests funktionieren, große Requests hängen,
  • TLS Handshake bricht ab,
  • Service Mesh zeigt sporadische Timeouts,
  • nur bestimmte Node-zu-Node-Pfade betroffen.

Diagnose:

bash
ip link
ping -M do -s 1472 <ziel-ip>
tracepath <ziel-ip>
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- bash

Prüfe Overlay-CNI, VPN, Cloud-VPC, WireGuard, VXLAN, Geneve, IPsec und Provider-Limits.

12 / 31

13. Storage-, CSI- und Datenprobleme

13.1. PVC bleibt Pending

bash
kubectl get pvc -n <namespace>
kubectl describe pvc <pvc> -n <namespace>
kubectl get storageclass -o yaml
kubectl get events -n <namespace> --sort-by=.lastTimestamp

Ursachen:

  • keine Default-StorageClass,
  • falscher storageClassName,
  • dynamische Provisionierung nicht verfügbar,
  • CSI Controller läuft nicht,
  • Cloud-Quota erschöpft,
  • Zone/Topology passt nicht,
  • AccessMode nicht unterstützt,
  • VolumeBindingMode WaitForFirstConsumer wartet auf Scheduling.

13.2. Pod hängt in ContainerCreating wegen Mount

bash
kubectl describe pod <pod> -n <namespace> | sed -n '/Events:/,$p'
kubectl describe pvc <pvc> -n <namespace>
kubectl get pv <pv> -o yaml
kubectl get volumeattachment
kubectl get pods -A | grep -i csi

Achte auf Events wie:

  • FailedMount,
  • Unable to attach or mount volumes,
  • Multi-Attach error,
  • timed out waiting for the condition,
  • permission denied,
  • no such file or directory.

13.3. Multi-Attach-Fehler

Ein RWO-Volume kann oft nicht gleichzeitig auf mehreren Nodes read-write gemountet werden.

bash
kubectl get pod -n <namespace> -o wide | grep <app>
kubectl get volumeattachment | grep <pv>
kubectl describe volumeattachment <name>

Maßnahmen:

  • Workload kontrolliert auf einen Node verschieben,
  • hängende Attachments prüfen,
  • StatefulSet statt Deployment verwenden,
  • AccessMode und StorageBackend prüfen,
  • im Notfall Provider-spezifisches Detach nur nach Datenkonsistenzprüfung.

13.4. Daten sind nach Pod-Neustart weg

Prüfe, ob du wirklich Persistenz nutzt:

bash
kubectl get pod <pod> -n <namespace> -o yaml | yq '.spec.volumes'
kubectl get pvc -n <namespace>

Typische Ursachen:

  • emptyDir statt PVC,
  • lokale Pfade in Container-Filesystem,
  • StatefulSet ohne volumeClaimTemplates,
  • Helm-Werte deaktivieren Persistenz,
  • falscher Namespace geprüft,
  • Restore in falschen Cluster erfolgt.

13.5. CSI-Controller oder Node-Plugin defekt

bash
kubectl get csidriver
kubectl get pods -A | grep -i csi
kubectl logs -n <csi-namespace> deploy/<csi-controller> --tail=300
kubectl logs -n <csi-namespace> ds/<csi-node> --tail=300
kubectl get events -A --sort-by=.lastTimestamp | grep -i csi

Prüfe Cloud-IAM, Secret für Storage-Backend, Node-Permissions, Kernel-Module, Multipath, NFS-Erreichbarkeit, iSCSI, Ceph-Monitore, Longhorn-Engine, Rook-Ceph-Status oder Provider-Quota.

13 / 31

14. Node-, Runtime- und Betriebssystemprobleme

14.1. Node NotReady

bash
kubectl get nodes -o wide
kubectl describe node <node>
kubectl get events -A --field-selector involvedObject.kind=Node --sort-by=.lastTimestamp

Auf dem Node:

bash
systemctl status kubelet --no-pager
journalctl -u kubelet -n 300 --no-pager
systemctl status containerd crio docker --no-pager
journalctl -u containerd -n 300 --no-pager
crictl info
crictl ps -a
ip addr
ip route
df -h
free -m

14.2. Node Conditions

Condition Bedeutung Typische Ursache
Ready=False Node ist nicht betriebsbereit. kubelet, Runtime, CNI, Netzwerk, Zertifikat.
MemoryPressure=True Node hat zu wenig Memory. Memory-Leak, zu hohe Dichte, fehlende Limits.
DiskPressure=True Node hat zu wenig Disk oder Inodes. Images, Logs, ephemeral Storage, Container-Reste.
PIDPressure=True Zu viele Prozesse. Fork-Bomb, Prozessleck, Host-Limit.
NetworkUnavailable=True Node-Netz nicht bereit. CNI fehlt oder defekt.

14.3. Container Runtime defekt

bash
sudo crictl info
sudo crictl ps -a
sudo crictl images
sudo crictl pods
sudo journalctl -u containerd -n 300 --no-pager
sudo journalctl -u crio -n 300 --no-pager

Maßnahmen:

  • Runtime-Service neu starten, wenn sicher vertretbar,
  • Disk säubern,
  • Image-Pull-Probleme lösen,
  • Registry-Mirror prüfen,
  • cgroup-Treiber-Konsistenz zwischen kubelet und Runtime prüfen,
  • Kernel- und OverlayFS-Probleme prüfen.

14.4. DiskPressure beheben

bash
df -h
df -ih
sudo du -xh /var/lib/containerd /var/log /var/lib/kubelet 2>/dev/null | sort -h | tail -40
sudo crictl images
sudo crictl ps -a

Sichere Maßnahmen:

bash
# Nur ungenutzte Images löschen; vorher Impact prüfen.
sudo crictl rmi --prune
sudo journalctl --vacuum-time=7d

Nicht blind löschen:

  • /var/lib/kubelet/pods,
  • Datenverzeichnisse von CSI/Longhorn/Rook,
  • etcd-Datenverzeichnis,
  • produktive App-Daten.

14.5. CNI auf dem Node defekt

Symptome:

  • Pods bleiben in ContainerCreating,
  • FailedCreatePodSandBox,
  • Node NetworkUnavailable,
  • Pod-zu-Pod-Traffic gestört,
  • DNS-Time-outs.
bash
kubectl get pods -A -o wide | grep -i -E 'calico|cilium|flannel|weave|antrea|canal'
ls -l /etc/cni/net.d/
ls -l /opt/cni/bin/
journalctl -u kubelet -n 300 --no-pager | grep -i cni

14.6. Zeit- und NTP-Probleme

Zeitversatz verursacht TLS-, Token-, Lease-, etcd- und TTL-Probleme.

bash
timedatectl
chronyc tracking || true
journalctl -u systemd-timesyncd -n 100 --no-pager || true

Symptome:

  • Zertifikate erscheinen noch nicht gültig oder abgelaufen,
  • Nodes erneuern Leases nicht sauber,
  • Jobs werden unerwartet bereinigt,
  • etcd-Wahlen häufen sich,
  • OIDC-Token werden abgelehnt.
14 / 31

15. Control-Plane-, etcd- und kubeadm-Probleme

15.1. kubeadm-Control-Plane prüfen

bash
sudo ls -l /etc/kubernetes/manifests
sudo crictl ps -a | grep -E 'kube-apiserver|kube-controller-manager|kube-scheduler|etcd'
sudo crictl logs <container-id>
sudo journalctl -u kubelet -n 500 --no-pager
kubectl get componentstatuses 2>/dev/null || true
kubectl get --raw='/readyz?verbose'
kubectl get --raw='/livez?verbose'

15.2. Static Pods starten nicht

Static Pods werden vom kubelet aus /etc/kubernetes/manifests gelesen. Wenn API Server oder etcd nicht starten, prüfe:

  • YAML-Syntax,
  • Zertifikatspfade,
  • HostPath-Mounts,
  • Datei- und Verzeichnisrechte,
  • etcd-Datenverzeichnis,
  • Port-Konflikte,
  • Node-Zeit,
  • Container Runtime.

15.3. etcd ist nicht gesund

bash
export ETCDCTL_API=3
sudo etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint health

sudo etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  endpoint status --write-out=table

Prüfe:

  • Quorum,
  • Disk-Latenz,
  • verfügbare Inodes,
  • Zertifikate,
  • Netzwerk zwischen Control-Plane-Nodes,
  • Snapshots und Datenverzeichnis,
  • Uhrzeit.

15.4. Zertifikate abgelaufen

bash
sudo kubeadm certs check-expiration
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates

Maßnahmen bei kubeadm:

bash
sudo kubeadm certs renew all
sudo systemctl restart kubelet

Danach kubeconfigs prüfen und ggf. neu verteilen:

bash
sudo kubeadm kubeconfig user --client-name kubernetes-admin > admin.conf

15.5. kubeadm-Upgrade fehlgeschlagen

bash
kubeadm upgrade plan
kubectl get nodes
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
sudo apt-mark unhold kubeadm kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubeadm=<version>
sudo kubeadm upgrade apply <version>
sudo apt-get install -y kubelet=<version> kubectl=<version>
sudo systemctl daemon-reload
sudo systemctl restart kubelet
kubectl uncordon <node>

Wichtig:

  • Minor-Versionen nicht überspringen.
  • Erst Control Plane, dann Worker Nodes.
  • Vorher etcd-Backup erstellen.
  • CNI-, CSI- und Add-on-Kompatibilität prüfen.
  • Version-Skew beachten.

15.6. Scheduler scheduled nicht

bash
kubectl -n kube-system get pod -l component=kube-scheduler -o wide
kubectl -n kube-system logs -l component=kube-scheduler --tail=300
kubectl get events -A --sort-by=.lastTimestamp | grep -i scheduling

Bei statischem kubeadm-Scheduler:

bash
sudo crictl ps -a | grep kube-scheduler
sudo crictl logs <scheduler-container-id>
sudo cat /etc/kubernetes/manifests/kube-scheduler.yaml
15 / 31

16. Add-on-, Operator-, Helm- und GitOps-Probleme

16.1. Add-on-Grundcheck

bash
kubectl get pods -A | grep -E 'coredns|metrics-server|ingress|gateway|cert-manager|external-dns|prometheus|grafana|loki|argocd|flux|calico|cilium|flannel|rook|longhorn|velero'
kubectl get crd | grep -E 'cert-manager|gateway|prometheus|argoproj|fluxcd|kyverno|cilium|rook|longhorn|velero'
kubectl get events -A --sort-by=.lastTimestamp | tail -200

16.2. CRD fehlt oder Version passt nicht

Symptome:

  • no matches for kind,
  • Helm-Install schlägt fehl,
  • Controller verarbeitet Ressourcen nicht,
  • GitOps meldet dry-run failed.

Diagnose:

bash
kubectl api-resources | grep -i <kind>
kubectl get crd | grep -i <domain>
kubectl explain <kind> --api-version=<group>/<version>

16.3. Helm-Release fehlgeschlagen

bash
helm list -A
helm status <release> -n <namespace>
helm history <release> -n <namespace>
helm get values <release> -n <namespace>
helm get manifest <release> -n <namespace>
helm template <release> <chart> -n <namespace> -f values.yaml > rendered.yaml
kubectl apply --dry-run=server -f rendered.yaml

Maßnahmen:

bash
helm rollback <release> <revision> -n <namespace>
helm upgrade --install <release> <chart> -n <namespace> -f values.yaml --atomic --timeout 10m

16.4. Argo CD Sync oder Health fehlerhaft

bash
kubectl -n argocd get applications.argoproj.io
kubectl -n argocd describe application <app>
kubectl -n argocd logs deploy/argocd-application-controller --tail=300
kubectl -n argocd logs deploy/argocd-repo-server --tail=300
argocd app get <app>
argocd app diff <app>
argocd app sync <app> --dry-run

Prüfe:

  • Repo-Zugriff,
  • Pfad und Branch,
  • Helm/Kustomize-Werte,
  • CRD-Reihenfolge,
  • Namespace-Erstellung,
  • Sync Waves,
  • Resource Hooks,
  • RBAC der Argo-CD-Controller-Identität,
  • Drift durch manuelle Änderungen.

16.5. Flux-Reconciliation fehlerhaft

bash
flux get sources all -A
flux get kustomizations -A
flux get helmreleases -A
flux logs --all-namespaces --tail=200
kubectl -n flux-system logs deploy/source-controller --tail=200
kubectl -n flux-system logs deploy/kustomize-controller --tail=200
kubectl -n flux-system logs deploy/helm-controller --tail=200

16.6. cert-manager stellt kein Zertifikat aus

bash
kubectl get certificate,certificaterequest,order,challenge -A
kubectl describe certificate <cert> -n <namespace>
kubectl describe challenge <challenge> -n <namespace>
kubectl logs -n cert-manager deploy/cert-manager --tail=300

Prüfe:

  • Issuer/ClusterIssuer Ready,
  • DNS-01/HTTP-01-Erreichbarkeit,
  • IngressClass,
  • ACME-Rate-Limits,
  • Secret-Namespace,
  • Clock-Skew,
  • externe DNS-Zone und Credentials.
16 / 31

17. Security-, RBAC-, Admission- und Secret-Probleme

17.1. Forbidden systematisch debuggen

bash
kubectl auth whoami
kubectl auth can-i <verb> <resource> -n <namespace>
kubectl auth can-i <verb> <resource> -n <namespace> --as <user-or-serviceaccount>
kubectl get role,rolebinding -n <namespace> -o yaml
kubectl get clusterrole,clusterrolebinding -o yaml

ServiceAccount-Format:

bash
kubectl auth can-i get pods -n demo --as system:serviceaccount:demo:app

Prüfe:

  • Role existiert?
  • RoleBinding bindet richtige Identität?
  • Namespace stimmt?
  • ClusterRoleBinding nötig oder zu breit?
  • Ressource liegt in API-Gruppe?
  • Subresource benötigt, etwa pods/log, pods/exec, deployments/scale?

17.2. Admission Webhook blockiert Ressourcen

bash
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration
kubectl describe validatingwebhookconfiguration <name>
kubectl get svc,endpoints -n <webhook-namespace>
kubectl logs -n <webhook-namespace> deploy/<webhook-controller> --tail=300
kubectl get events -A --sort-by=.lastTimestamp | grep -i webhook

Typische Fehler:

  • Webhook-Service hat keine Endpoints,
  • CA Bundle falsch,
  • Timeout zu niedrig,
  • failurePolicy: Fail blockiert bei Ausfall,
  • Webhook matcht zu viele Ressourcen,
  • NetworkPolicy blockiert API Server zum Webhook,
  • Zertifikat des Webhooks abgelaufen.

17.3. Pod Security Admission blockiert Pod

bash
kubectl get ns <namespace> --show-labels
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp | grep -i 'podsecurity\|restricted\|baseline'

Prüfe Felder wie:

  • runAsNonRoot,
  • allowPrivilegeEscalation,
  • capabilities.drop,
  • seccompProfile,
  • hostNetwork, hostPID, hostIPC,
  • privileged,
  • hostPath,
  • readOnlyRootFilesystem.

17.4. Secret fehlt oder falscher Key

bash
kubectl get secret -n <namespace>
kubectl describe pod <pod> -n <namespace> | grep -A20 -i secret
kubectl get secret <secret> -n <namespace> -o jsonpath='{.data}'

Fehlerbilder:

  • CreateContainerConfigError,
  • secret not found,
  • couldn't find key,
  • App startet, aber meldet Authentifizierungsfehler,
  • Helm hat Secret in anderem Namespace erstellt,
  • External Secrets Operator hat Sync-Fehler.

17.5. Image-Signatur oder Policy blockiert Rollout

Prüfe Kyverno, Gatekeeper, Sigstore/Cosign-Verifikation oder eigene Admission-Controller:

bash
kubectl get clusterpolicy,policy -A 2>/dev/null || true
kubectl get constrainttemplates,constraints -A 2>/dev/null || true
kubectl get events -A --sort-by=.lastTimestamp | grep -i -E 'policy|admission|cosign|signature|verify'
17 / 31

18. Observability-, Monitoring-, Logging- und Alerting-Probleme

18.1. Metriken fehlen

bash
kubectl top nodes
kubectl top pods -A
kubectl get apiservice | grep metrics
kubectl describe apiservice v1beta1.metrics.k8s.io
kubectl -n kube-system logs deploy/metrics-server --tail=300

Ursachen:

  • Metrics Server fehlt,
  • kubelet TLS oder Auth blockiert,
  • Nodes nicht erreichbar,
  • Aggregated APIService nicht verfügbar,
  • Firewall blockiert Port 10250,
  • Zertifikat passt nicht,
  • Managed-Provider hat eigenes Monitoring anders konfiguriert.

18.2. Prometheus scraped Targets nicht

bash
kubectl -n monitoring get pod,svc,servicemonitor,podmonitor,prometheusrule
kubectl -n monitoring port-forward svc/prometheus-operated 9090:9090

Prüfe in Prometheus:

  • Status > Targets,
  • ServiceMonitor-Label-Selector,
  • Namespace-Selector,
  • Port-Name im Service,
  • TLS- und Auth-Einstellungen,
  • NetworkPolicy,
  • RBAC für Prometheus.

18.3. Grafana zeigt keine Daten

bash
kubectl -n monitoring get pod,svc,secret,configmap | grep -i grafana
kubectl -n monitoring logs deploy/grafana --tail=200

Prüfe:

  • Datasource-URL,
  • Service-Name,
  • Auth Secret,
  • TLS Trust,
  • Dashboards ConfigMaps,
  • Zeitbereich im Dashboard,
  • PromQL-Query.

18.4. Logs fehlen

bash
kubectl get pods -A | grep -i -E 'fluent|promtail|alloy|vector|otel|loki|elastic|opensearch'
kubectl logs -n <logging-namespace> ds/<agent> --tail=300
kubectl logs -n <logging-namespace> deploy/<backend> --tail=300

Prüfe:

  • schreibt die App auf stdout/stderr?
  • Node-Agent läuft auf allen Nodes?
  • Log-Pfad der Runtime passt?
  • RBAC des Agents reicht?
  • Backend erreichbar?
  • Tenant, Label, Index oder Stream falsch?
  • Retention löscht früher als erwartet?
  • Cloud Logging API oder Agent deaktiviert?

18.5. Alerts feuern nicht

bash
kubectl -n monitoring get prometheusrule,alertmanagerconfig
kubectl -n monitoring logs deploy/alertmanager-main --tail=200 2>/dev/null || true
kubectl -n monitoring logs statefulset/alertmanager-main --tail=200 2>/dev/null || true

Prüfe:

  • PrometheusRule wird geladen?
  • Expression liefert Daten?
  • for-Dauer noch nicht abgelaufen?
  • Alertmanager-Routing passt?
  • Silence aktiv?
  • Inhibition unterdrückt Alarm?
  • Receiver-Secret korrekt?
  • Egress zu Slack, Teams, PagerDuty oder SMTP erlaubt?
18 / 31

19. Backup-, Restore- und Disaster-Recovery-Probleme

19.1. Backup-Fähigkeit prüfen

Kubernetes-Backup besteht aus mehreren Schichten:

Schicht Beispiele Restore-Frage
Git/IaC Manifeste, Helm Values, Terraform/OpenTofu State Kannst du Infrastruktur und Manifeste reproduzieren?
API-Objekte Namespaces, Deployments, Services, CRDs Sind CRDs vor Custom Resources wiederhergestellt?
etcd Clusterzustand bei selbst betriebenem Control Plane Ist Snapshot konsistent und getestet?
Volumes PV-Daten, Datenbanken, Objektstorage Sind Daten konsistent und applikationskompatibel?
Secrets TLS, Tokens, App-Secrets Können Secrets rotiert und wiederhergestellt werden?
Images Registry, Digests, SBOMs Sind Images auch nach Registry-Ausfall verfügbar?
Observability Logs, Metriken, Traces Brauchst du sie für Forensik oder Audit?

19.2. Velero-Backup fehlerhaft

bash
velero backup get
velero backup describe <backup> --details
velero backup logs <backup>
velero restore get
velero restore describe <restore> --details
kubectl -n velero logs deploy/velero --tail=300

Prüfe:

  • Object-Storage-Credentials,
  • Bucket/Container erreichbar,
  • Volume-Snapshot-Plugin installiert,
  • CRDs vorhanden,
  • Namespace-Filter,
  • Resource-Excludes,
  • Restic/Kopia Node Agent,
  • Cloud-API-Quotas,
  • IAM/RBAC.

19.3. etcd-Restore schlägt fehl

Prüfe vor dem Restore:

  • Snapshot-Integrität,
  • Kubernetes-Version,
  • etcd-Version,
  • Cluster-ID und Member-ID,
  • Zertifikate,
  • Datenverzeichnis,
  • Static-Pod-Manifeste,
  • Quorum-Plan.
bash
ETCDCTL_API=3 etcdctl snapshot status snapshot.db --write-out=table

Restore ist eine kontrollierte Wiederherstellung, kein Live-Fix. In HA-Clustern brauchst du einen konsistenten Plan für alle Control-Plane-Nodes.

19.4. Restore erfolgreich, aber App funktioniert nicht

Prüfe:

  • CRDs vor CRs wiederhergestellt?
  • Secrets im richtigen Namespace?
  • ServiceAccount-Tokens neu generiert?
  • PVs korrekt gebunden?
  • DNS- und Ingress-Namen zeigen auf neuen Cluster?
  • ExternalDNS hat Records aktualisiert?
  • Zertifikate und Issuer funktionieren?
  • Datenbankmigrationen kompatibel?
  • App erwartet alte Cluster-IP oder Node-IP?
19 / 31

20. Upgrade-, Patch- und Wartungsprobleme

20.1. Upgrade-Vorprüfung

bash
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get pdb -A
kubectl get apiservice
kubectl get crd
kubectl get events -A --sort-by=.lastTimestamp | tail -100
kubectl api-resources --verbs=list -o name | xargs -n 1 kubectl get --ignore-not-found -A >/dev/null

Prüfe zusätzlich:

  • Version-Skew,
  • deprecated APIs,
  • CNI/CSI/Ingress-Kompatibilität,
  • Add-on-Versionen,
  • Webhooks,
  • PDBs,
  • Node-Kapazität für Drain,
  • Backup-Status,
  • Rollback- oder Ersatzcluster-Strategie.

20.2. Drain hängt

bash
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m
kubectl get pods -A -o wide --field-selector spec.nodeName=<node>
kubectl get pdb -A
kubectl describe pdb <pdb> -n <namespace>

Ursachen:

  • PodDisruptionBudget erlaubt keine Eviction,
  • Singleton-Pod ohne Replikat,
  • lokaler emptyDir-State,
  • DaemonSet ignorieren vergessen,
  • StatefulSet kann nicht umziehen,
  • finalizer blockiert Löschung,
  • toleration hält Pod auf dem Node.

20.3. CNI-Upgrade bricht Netzwerk

Vorher:

bash
kubectl get nodes -o wide
kubectl get pods -A -o wide | grep -i -E 'cilium|calico|flannel|antrea|canal'
kubectl get networkpolicy -A

Während/nachher:

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -200
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- bash

Validiere:

  • Pod-zu-Service,
  • Pod-zu-Pod über Nodes,
  • DNS,
  • NetworkPolicy-Enforcement,
  • NodePort/LoadBalancer,
  • Ingress/Gateway,
  • Service Mesh.

20.4. API-Deprecations

bash
kubectl api-resources
kubectl get --raw /metrics | grep apiserver_requested_deprecated_apis || true

Nutze außerdem Manifest-Scanning in CI:

bash
kubectl apply --dry-run=server -f manifests/
pluto detect-files -d manifests/ 2>/dev/null || true
kubent 2>/dev/null || true
20 / 31

21. Umgebungsspezifisches Troubleshooting

21.1. WSL2 unter Windows 11

WSL-Probleme liegen oft nicht in Kubernetes selbst, sondern in der Kombination aus Windows-Host, WSL-Distribution, Docker Desktop, NAT/Mirrored Networking, Firewall, DNS und Hosts-Datei.

21.1.1. Grundcheck

PowerShell:

powershell
wsl -l -v
wsl --status
wsl --version
docker version
docker context ls
Test-NetConnection localhost -Port 80
Get-Content C:\Windows\System32\drivers\etc\hosts

WSL:

bash
uname -a
cat /etc/os-release
cat /etc/wsl.conf
cat /mnt/c/Users/$USER/.wslconfig 2>/dev/null || true
ip addr
ip route
cat /etc/resolv.conf
ss -tulpn
docker version
docker context ls
kubectl config get-contexts

21.1.2. Edge erreicht lokale Endpunkte nicht

Wenn Edge auf Windows läuft, müssen Hostname und Port aus Windows erreichbar sein. Ein Hostname nur in /etc/hosts innerhalb von WSL hilft Edge nicht.

Prüfe Windows-Hosts-Datei aus WSL:

bash
sudo powershell.exe -Command "Start-Process notepad C:\\Windows\\System32\\drivers\\etc\\hosts -Verb runAs"
cat /mnt/c/Windows/System32/drivers/etc/hosts

Typischer Eintrag für lokale Ingress-Tests:

text
127.0.0.1 demo.local api.demo.local grafana.demo.local

Wenn dein Cluster über eine Minikube-IP oder VM-IP erreichbar ist, trage diese IP ein:

text
192.168.56.20 demo.local api.demo.local

Prüfung:

powershell
Resolve-DnsName demo.local
Test-NetConnection demo.local -Port 80
curl.exe -v http://demo.local/

21.1.3. WSL-Port ist aus Windows nicht erreichbar

Prüfe, ob der Prozess in WSL auf 0.0.0.0 oder 127.0.0.1 lauscht:

bash
ss -tulpn | grep -E ':80|:443|:8080|:3000'

Prüfe Windows Firewall und Portproxy nur, wenn die automatische localhost-Weiterleitung nicht greift:

powershell
netsh interface portproxy show all
Get-NetFirewallRule | ? DisplayName -Match "WSL|Docker|Kubernetes"

WSL neu starten:

powershell
wsl --shutdown

21.1.4. Docker Desktop WSL Integration defekt

bash
docker ps
docker info
ls -l /var/run/docker.sock

Prüfe in Docker Desktop:

  • WSL Integration aktiv,
  • richtige Distribution aktiviert,
  • Ressourcenlimit ausreichend,
  • Kubernetes-Cluster nicht parallel im falschen Kontext.

21.2. kind

21.2.1. Cluster startet nicht

bash
kind version
kind get clusters
docker ps -a
docker logs <kind-node-container>
kind export logs ./kind-logs

Prüfe:

  • Docker läuft,
  • genug CPU/RAM/Disk,
  • Port 6443 frei,
  • Proxy/Registry erreichbar,
  • Node-Image-Version passt,
  • Docker-Netz nicht kollidiert.

21.2.2. Ingress oder Service ist nicht erreichbar

kind-Ports müssen beim Erstellen gesetzt werden:

yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP

Nachträglich kannst du Docker-Port-Mappings nicht sauber an denselben Node-Container anhängen. Erstelle den Cluster neu, wenn der Port fehlt.

bash
kind delete cluster --name workshop
kind create cluster --name workshop --config kind.yaml

21.3. minikube

21.3.1. Startprobleme

bash
minikube version
minikube status
minikube start --driver=docker
minikube logs --file=minikube.log
minikube profile list

Prüfe:

  • passender Driver,
  • Virtualisierung aktiv,
  • Docker/Podman/VirtualBox/VMware erreichbar,
  • genug CPU/RAM,
  • Proxy und Registry,
  • alter Profilzustand.

21.3.2. LoadBalancer oder Ingress nicht erreichbar

bash
minikube tunnel
minikube service list
minikube addons list
minikube addons enable ingress
minikube ip
kubectl get ingress -A

Für lokale Hostnamen:

text
<minikube-ip> demo.local api.demo.local

Unter Windows gehört dieser Eintrag in C:\Windows\System32\drivers\etc\hosts, wenn Edge verwendet wird.

21.4. k3d

bash
k3d cluster list
k3d kubeconfig get <cluster>
docker ps --format 'table {{.Names}}\t{{.Ports}}\t{{.Status}}'
docker logs k3d-<cluster>-serverlb

Ports über den Load-Balancer veröffentlichen:

bash
k3d cluster create workshop \
  --servers 1 \
  --agents 2 \
  --port "80:80@loadbalancer" \
  --port "443:443@loadbalancer"

Typische Fehler:

  • Port-Mapping fehlt,
  • Traefik automatisch installiert, aber falsch erwartet,
  • Registry nicht verbunden,
  • Docker-Netz kollidiert,
  • kubeconfig zeigt auf alten Cluster.

21.5. Docker Desktop Kubernetes

bash
docker version
docker info
kubectl config get-contexts
kubectl config use-context docker-desktop
kubectl get nodes

Typische Maßnahmen:

  • Kubernetes in Docker Desktop zurücksetzen,
  • Ressourcenlimit erhöhen,
  • alte LoadBalancer/Ingress-Tests löschen,
  • Kontext korrigieren,
  • Docker Desktop neu starten.

21.6. Lokale VM, Vagrant und Remote-VM

bash
ip addr
ip route
ss -tulpn
sudo ufw status verbose || true
sudo firewall-cmd --list-all || true
sudo systemctl status kubelet containerd
sudo journalctl -u kubelet -n 300 --no-pager

Vagrant:

bash
vagrant status
vagrant ssh <node>
vagrant provision <node>
vagrant reload
vagrant destroy -f

Prüfe:

  • NAT/Bridged/Host-only-Netz,
  • IP-Adressen der Nodes,
  • Host-Firewall,
  • VM-Firewall,
  • DNS,
  • Snapshot-Stand,
  • Provider-Netzwerk,
  • MTU,
  • Ports 6443, 2379-2380, 10250, 30000-32767.

21.7. Bare Metal

bash
ip link
ethtool <nic>
dmesg -T | grep -i -E 'error|firmware|link|nvme|disk|xfs|ext4|oom'
lsblk
smartctl -a /dev/<disk> 2>/dev/null || true
journalctl -u kubelet -n 300 --no-pager

Prüfe:

  • BIOS/UEFI und Virtualisierung,
  • VLAN und Switch-Port,
  • MTU,
  • DHCP oder statische IPs,
  • DNS und NTP,
  • RAID/Controller,
  • Disk-Latenz für etcd,
  • BMC/IPMI/iDRAC/iLO,
  • Kernel-Module für Storage oder CNI.

21.8. k3s, RKE2 und k0s

k3s:

bash
sudo systemctl status k3s
sudo journalctl -u k3s -n 300 --no-pager
sudo k3s kubectl get nodes
sudo k3s kubectl -n kube-system get pods

RKE2:

bash
sudo systemctl status rke2-server rke2-agent
sudo journalctl -u rke2-server -n 300 --no-pager
sudo /var/lib/rancher/rke2/bin/kubectl get nodes --kubeconfig /etc/rancher/rke2/rke2.yaml

k0s:

bash
sudo k0s status
sudo k0s kubectl get nodes
sudo journalctl -u k0scontroller -n 300 --no-pager
sudo journalctl -u k0sworker -n 300 --no-pager

Prüfe Token, Server-URL, Zertifikate, Firewall, Embedded-etcd-Zustand, Add-on-Defaults, CNI und Ingress-Controller.

21.9. Talos

Talos hat keine normale SSH-Fehleranalyse. Du nutzt talosctl.

bash
talosctl version
talosctl health --nodes <node-ip> --endpoints <endpoint-ip>
talosctl service kubelet --nodes <node-ip>
talosctl logs kubelet --nodes <node-ip>
talosctl logs containerd --nodes <node-ip>
talosctl dmesg --nodes <node-ip>
talosctl get members --nodes <control-plane-ip>
talosctl etcd status --nodes <control-plane-ip>
talosctl kubeconfig --nodes <control-plane-ip>

Prüfe:

  • Endpoint und Node-Adresse,
  • Machine Config,
  • Bootstrap-Zustand,
  • Zertifikate,
  • etcd-Member,
  • Netzwerk und DNS,
  • Disk-Auswahl,
  • Control-Plane- und Worker-Rollen.
21 / 31

22. Cloud-spezifisches Troubleshooting

22.1. AWS EKS

Grundcheck

bash
aws sts get-caller-identity
aws eks describe-cluster --name <cluster> --region <region>
aws eks update-kubeconfig --name <cluster> --region <region>
kubectl get nodes -o wide
kubectl get pods -A -o wide
aws eks list-addons --cluster-name <cluster> --region <region>

Häufige EKS-Fehler

Fehlerbild Prüfen
Node joined nicht IAM Role, aws-auth/Access Entries, Security Groups, Subnetze, Bootstrap Logs.
Pods bekommen keine IP VPC CNI, ENI-Limits, Subnet IP Exhaustion, Prefix Delegation.
LoadBalancer bleibt pending AWS Load Balancer Controller, Subnet Tags, IAM, Security Groups.
EBS PVC pending EBS CSI Driver, IAM, Zone, Volume-Quota, StorageClass.
CoreDNS instabil EKS Add-on-Version, Node-Kapazität, PDB, Ressourcen.
API-Zugriff verweigert IAM Principal, Cluster Access, RBAC, kubeconfig.
bash
kubectl -n kube-system get ds aws-node
kubectl -n kube-system logs ds/aws-node --tail=300
kubectl -n kube-system get deploy coredns
kubectl get nodes -o custom-columns=NAME:.metadata.name,ZONE:.metadata.labels.topology\.kubernetes\.io/zone,INSTANCE:.metadata.labels.node\.kubernetes\.io/instance-type

22.2. Azure AKS

bash
az account show
az aks show -g <rg> -n <cluster>
az aks get-credentials -g <rg> -n <cluster> --overwrite-existing
az aks nodepool list -g <rg> --cluster-name <cluster>
kubectl get nodes -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -100

Häufige AKS-Fehler:

  • Managed Identity hat keine Rechte,
  • Node Pool Upgrade hängt an PDBs,
  • Azure CNI Subnet hat keine freien IPs,
  • Standard Load Balancer oder NSG blockiert,
  • Disk CSI oder File CSI fehlen,
  • Private Cluster wird außerhalb des Netzes angesprochen,
  • Quota für VM-Familie erschöpft.
bash
az aks nodepool show -g <rg> --cluster-name <cluster> -n <nodepool>
az vmss list -g <node-resource-group> -o table
az network nsg list -g <node-resource-group> -o table

22.3. Google GKE

bash
gcloud auth list
gcloud config list
gcloud container clusters describe <cluster> --region <region>
gcloud container clusters get-credentials <cluster> --region <region>
gcloud container operations list --region <region>
kubectl get nodes -o wide

Häufige GKE-Fehler:

  • IAM-Rolle fehlt,
  • VPC-native IP-Ranges erschöpft,
  • Autopilot lehnt Pod-Spezifikation ab,
  • Workload Identity falsch gebunden,
  • Cloud Logging API deaktiviert,
  • Firewall-Regeln blockieren,
  • Ingress/Gateway Controller hat keine Berechtigung oder falsche Annotation,
  • Persistent Disk CSI Zone passt nicht.
bash
gcloud compute firewall-rules list
gcloud compute networks subnets describe <subnet> --region <region>
gcloud container node-pools list --cluster <cluster> --region <region>

22.4. DigitalOcean DOKS, Linode LKE, Oracle OKE, IBM IKS

Diese Provider unterscheiden sich in CLI und Managed-Add-ons, aber die Fehlerklassen ähneln sich:

  • kubeconfig und API-Zugriff,
  • Node-Pool-Zustand,
  • Cloud-Firewall,
  • LoadBalancer-Controller,
  • CSI-Driver,
  • Quotas,
  • Registry-Zugriff,
  • private Cluster-Netze,
  • Version-Kompatibilität.

Allgemeines Muster:

bash
kubectl get nodes -o wide
kubectl get pods -A -o wide
kubectl get svc -A -o wide
kubectl get pvc -A
kubectl get events -A --sort-by=.lastTimestamp | tail -200

22.5. OpenShift/OKD

bash
oc whoami
oc status
oc get clusterversion
oc get co
oc get nodes
oc get pods -A -o wide
oc adm must-gather

Häufige Fehler:

  • ClusterOperator Degraded,
  • MachineConfigPool hängt,
  • SCC blockiert Pods,
  • Route oder Router-Probleme,
  • ImageStream oder Registry-Probleme,
  • Operator Lifecycle Manager blockiert Installation,
  • etcd Operator meldet Quorum- oder Disk-Probleme.
22 / 31

23. Runbook-Katalog nach Symptomen

Die folgenden Runbooks sind bewusst wiederholbar aufgebaut: Symptom, Ursachen, Diagnose, Maßnahmen und Validierung. Nutze sie als Checkliste im Incident oder als Übung im Workshop.

23.1. API Server nicht erreichbar

Symptom
kubectl liefert Timeout, Connection Refused oder TLS-Fehler.

Häufige Ursachen

  • falscher Kontext.
  • VPN oder Firewall blockiert.
  • API Server Pod down.
  • Load-Balancer-Endpoint falsch.
  • Zertifikat abgelaufen.

Diagnose

bash
kubectl cluster-info
kubectl get --raw='/readyz?verbose'
nc -vz <api-server> 6443
kubectl config view --minify --raw

Maßnahmen

  • Kontext korrigieren.
  • Netzpfad prüfen.
  • Control-Plane-Logs prüfen.
  • Zertifikate prüfen.
  • Providerstatus prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.2. kubectl meldet Forbidden

Symptom
API erreichbar, aber Aktion wird verweigert.

Häufige Ursachen

  • falscher User.
  • fehlendes RoleBinding.
  • falscher Namespace.
  • Subresource fehlt.
  • Cloud-IAM und RBAC verwechselt.

Diagnose

bash
kubectl auth whoami
kubectl auth can-i <verb> <resource> -n <namespace>
kubectl get role,rolebinding -n <namespace> -o yaml

Maßnahmen

  • RoleBinding ergänzen.
  • Subresource erlauben.
  • ServiceAccount korrigieren.
  • ClusterRoleBinding vermeiden, wenn Namespace-Role reicht.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.3. Pod Pending

Symptom
Pod wurde erstellt, aber nicht auf einem Node gestartet.

Häufige Ursachen

  • zu wenig CPU oder Memory.
  • PVC ungebunden.
  • Taint ohne Toleration.
  • NodeSelector falsch.
  • Affinity nicht erfüllbar.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl get nodes -o wide
kubectl get pvc -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp

Maßnahmen

  • Requests anpassen.
  • Kapazität erweitern.
  • PVC/StorageClass korrigieren.
  • Toleration oder NodeSelector prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.4. Pod ContainerCreating hängt

Symptom
Pod ist geplant, aber Container wird nicht fertig erstellt.

Häufige Ursachen

  • Image-Pull langsam.
  • Volume-Mount fehlerhaft.
  • CNI Sandbox fehlerhaft.
  • Runtime hängt.
  • Secret oder ConfigMap fehlt.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
journalctl -u kubelet -n 300 --no-pager
crictl ps -a
kubectl get events -n <namespace> --sort-by=.lastTimestamp

Maßnahmen

  • Mount-Fehler lösen.
  • CNI prüfen.
  • Runtime neu prüfen.
  • Image/Secret korrigieren.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.5. ImagePullBackOff

Symptom
Kubernetes kann das Container Image nicht ziehen.

Häufige Ursachen

  • Image-Name falsch.
  • Tag fehlt.
  • Registry nicht erreichbar.
  • ImagePullSecret falsch.
  • Rate Limit.
  • falsche Architektur.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl get secret -n <namespace>
crictl pull <image>
docker manifest inspect <image>

Maßnahmen

  • Image korrigieren.
  • Secret neu erstellen.
  • Registry-Netzwerk prüfen.
  • Digest pinnen.
  • Architektur prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.6. CrashLoopBackOff

Symptom
Container startet, beendet sich und wird wieder neu gestartet.

Häufige Ursachen

  • App-Fehler.
  • Config fehlt.
  • Secret fehlt.
  • falscher Entrypoint.
  • Dependency nicht erreichbar.
  • Liveness Probe tötet App.

Diagnose

bash
kubectl logs <pod> -n <namespace> --previous
kubectl describe pod <pod> -n <namespace>
kubectl get deploy <deploy> -n <namespace> -o yaml

Maßnahmen

  • Exit Code auswerten.
  • Config/Secret prüfen.
  • Probe entschärfen.
  • Dependency prüfen.
  • Rollback durchführen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.7. OOMKilled

Symptom
Container wurde wegen Speicherverbrauch beendet.

Häufige Ursachen

  • Memory-Limit zu niedrig.
  • Memory-Leak.
  • zu großer Cache.
  • Sidecar-Verbrauch.
  • Node MemoryPressure.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl top pod <pod> -n <namespace>
kubectl top nodes
kubectl logs <pod> -n <namespace> --previous

Maßnahmen

  • Memory-Profil prüfen.
  • Limit/Request anpassen.
  • Cache konfigurieren.
  • Leak beheben.
  • Node-Kapazität erweitern.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.8. Readiness bleibt false

Symptom
Pod läuft, bekommt aber keinen Service-Traffic.

Häufige Ursachen

  • Probe-Pfad falsch.
  • Port falsch.
  • App braucht länger.
  • Dependency fehlt.
  • TLS/Auth in Probe falsch.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl exec -it <pod> -n <namespace> -- wget -S -O- http://127.0.0.1:<port>/<path>
kubectl get endpoints <svc> -n <namespace>

Maßnahmen

  • Probe korrigieren.
  • InitialDelay anpassen.
  • Dependency bereitstellen.
  • Service-TargetPort prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.9. Liveness Probe verursacht Neustarts

Symptom
Pod startet immer wieder, obwohl App grundsätzlich laufen könnte.

Häufige Ursachen

  • Probe zu aggressiv.
  • Startphase nicht abgedeckt.
  • falscher Pfad.
  • Timeout zu kurz.
  • CPU throttling.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --previous
kubectl get pod <pod> -n <namespace> -o yaml | yq '.spec.containers[].livenessProbe'

Maßnahmen

  • Startup Probe ergänzen.
  • Timeout/Period erhöhen.
  • Pfad korrigieren.
  • Ressourcen anpassen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.10. InitContainer hängt

Symptom
InitContainer beendet sich nicht oder schlägt wiederholt fehl.

Häufige Ursachen

  • Migration hängt.
  • Dependency fehlt.
  • Secret fehlt.
  • Netzwerk blockiert.
  • ImagePull-Fehler.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> -c <init-container>
kubectl get pod <pod> -n <namespace> -o yaml

Maßnahmen

  • Init-Log auswerten.
  • Dependency testen.
  • Timeout definieren.
  • Idempotenz sicherstellen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.11. Deployment-Rollout hängt

Symptom
Neue ReplicaSets werden nicht vollständig bereit.

Häufige Ursachen

  • neue Pods nicht ready.
  • PDB/Quota.
  • maxUnavailable/maxSurge.
  • Image oder Config defekt.
  • Admission blockiert.

Diagnose

bash
kubectl rollout status deploy/<deploy> -n <namespace>
kubectl rollout history deploy/<deploy> -n <namespace>
kubectl describe deploy <deploy> -n <namespace>
kubectl get rs,pod -n <namespace> -l app=<app>

Maßnahmen

  • fehlerhafte ReplicaSet-Pods prüfen.
  • Rollback.
  • Strategy anpassen.
  • Quota/Kapazität prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.12. StatefulSet hängt

Symptom
Ein ordinaler Pod blockiert weitere Pods.

Häufige Ursachen

  • PVC/Mount-Fehler.
  • Readiness eines früheren Ordinals.
  • DNS Headless Service.
  • Datenmigration.
  • PodManagementPolicy.

Diagnose

bash
kubectl get sts,pod,pvc -n <namespace>
kubectl describe sts <sts> -n <namespace>
kubectl describe pod <sts>-0 -n <namespace>

Maßnahmen

  • ersten fehlerhaften Ordinal-Pod lösen.
  • PVC prüfen.
  • Readiness korrigieren.
  • Datenkonsistenz prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.13. DaemonSet läuft nicht auf allen Nodes

Symptom
DaemonSet-Pods fehlen auf bestimmten Nodes.

Häufige Ursachen

  • Taints.
  • NodeSelector.
  • Affinity.
  • HostPort-Konflikt.
  • OS/Architektur passt nicht.

Diagnose

bash
kubectl get ds -A
kubectl describe ds <ds> -n <namespace>
kubectl get nodes --show-labels

Maßnahmen

  • Tolerations ergänzen.
  • Selector korrigieren.
  • HostPort prüfen.
  • Multi-Arch-Image verwenden.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.14. Job schlägt fehl

Symptom
Job erreicht keine erfolgreiche Completion.

Häufige Ursachen

  • Exit Code.
  • BackoffLimit erreicht.
  • Deadline überschritten.
  • Secret fehlt.
  • Datenmigration nicht idempotent.

Diagnose

bash
kubectl get job -n <namespace>
kubectl describe job <job> -n <namespace>
kubectl logs job/<job> -n <namespace> --all-containers

Maßnahmen

  • Fehlerlog auswerten.
  • Backoff/Deadline anpassen.
  • Job idempotent machen.
  • Datenzustand prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.15. CronJob läuft nicht

Symptom
Geplanter Job wird nicht erzeugt oder zu spät ausgeführt.

Häufige Ursachen

  • Schedule falsch.
  • Suspend=true.
  • ConcurrencyPolicy.
  • StartDeadlineSeconds.
  • Zeitzone.
  • Controller gestört.

Diagnose

bash
kubectl get cronjob -n <namespace>
kubectl describe cronjob <cronjob> -n <namespace>
kubectl get jobs -n <namespace>

Maßnahmen

  • Schedule korrigieren.
  • Suspend deaktivieren.
  • Timezone prüfen.
  • ConcurrencyPolicy prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.16. Service hat keine Endpoints

Symptom
Service existiert, routet aber zu keinem Pod.

Häufige Ursachen

  • Selector passt nicht.
  • Pods nicht ready.
  • falscher Namespace.
  • EndpointSlice-Controller.
  • Readiness Gate.

Diagnose

bash
kubectl get svc,endpoints,endpointslices -n <namespace>
kubectl get pods -n <namespace> --show-labels
kubectl describe pod <pod> -n <namespace>

Maßnahmen

  • Labels/Selector korrigieren.
  • Readiness lösen.
  • Service-Port prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.17. ClusterIP timeout

Symptom
Service hat Endpoints, aber ClusterIP antwortet nicht.

Häufige Ursachen

  • NetworkPolicy.
  • kube-proxy/eBPF.
  • CNI.
  • falscher targetPort.
  • App lauscht nicht.

Diagnose

bash
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- bash
kubectl get endpointslices -n <namespace>
kubectl get networkpolicy -A

Maßnahmen

  • Policy anpassen.
  • CNI/kube-proxy prüfen.
  • targetPort korrigieren.
  • App-Port prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.18. DNS im Cluster defekt

Symptom
Service-Namen lassen sich nicht auflösen.

Häufige Ursachen

  • CoreDNS down.
  • NetworkPolicy blockiert DNS.
  • CoreDNS ConfigMap falsch.
  • NodeLocal DNS Cache.
  • resolv.conf defekt.

Diagnose

bash
kubectl -n kube-system get pods -l k8s-app=kube-dns
kubectl -n kube-system logs deploy/coredns --tail=200
kubectl run dnsutils --rm -it --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- nslookup kubernetes.default

Maßnahmen

  • CoreDNS skalieren.
  • DNS-Egress erlauben.
  • ConfigMap korrigieren.
  • CNI prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.19. Ingress 404

Symptom
Ingress-Controller antwortet, aber Route passt nicht.

Häufige Ursachen

  • Host falsch.
  • Path falsch.
  • IngressClass falsch.
  • Default Backend.
  • Annotation falsch.

Diagnose

bash
kubectl describe ingress <ingress> -n <namespace>
curl -H 'Host: <host>' http://<ip>/<path>
kubectl logs -n <ingress-namespace> deploy/<controller> --tail=300

Maßnahmen

  • Host/Path korrigieren.
  • IngressClass setzen.
  • DNS/Hosts-Datei prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.20. Ingress 503

Symptom
Ingress findet keine bereiten Backends.

Häufige Ursachen

  • Service ohne Endpoints.
  • Pods nicht ready.
  • targetPort falsch.
  • Backend-Protokoll falsch.
  • NetworkPolicy.

Diagnose

bash
kubectl get svc,endpoints,endpointslices -n <namespace>
kubectl describe ingress <ingress> -n <namespace>
kubectl describe pod <pod> -n <namespace>

Maßnahmen

  • Endpoints herstellen.
  • Readiness lösen.
  • Port/Protocol korrigieren.
  • Policy erlauben.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.21. Gateway API Route nicht akzeptiert

Symptom
HTTPRoute oder Gateway wird nicht programmiert.

Häufige Ursachen

  • GatewayClass ohne Controller.
  • ParentRef falsch.
  • Listener-Konflikt.
  • ReferenceGrant fehlt.
  • Service-Referenz falsch.

Diagnose

bash
kubectl get gatewayclass,gateway,httproute -A
kubectl describe gateway <gateway> -n <namespace>
kubectl describe httproute <route> -n <namespace>

Maßnahmen

  • Conditions lesen.
  • Controller installieren.
  • ParentRefs korrigieren.
  • ReferenceGrant ergänzen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.22. TLS-Zertifikat falsch

Symptom
Browser oder Client meldet Zertifikatsfehler.

Häufige Ursachen

  • falsches Secret.
  • CN/SAN passt nicht.
  • Issuer defekt.
  • alte Zertifikatskette.
  • SNI falsch.

Diagnose

bash
kubectl get secret <tls-secret> -n <namespace> -o yaml
openssl s_client -connect <host>:443 -servername <host> -showcerts
kubectl get certificate,order,challenge -A

Maßnahmen

  • Zertifikat neu ausstellen.
  • Secret referenzieren.
  • DNS/SNI korrigieren.
  • Trust Store prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.23. PVC Pending

Symptom
Claim wird nicht gebunden.

Häufige Ursachen

  • StorageClass fehlt.
  • CSI fehlt.
  • Quota.
  • Topology.
  • AccessMode.

Diagnose

bash
kubectl describe pvc <pvc> -n <namespace>
kubectl get storageclass -o yaml
kubectl get pods -A | grep -i csi

Maßnahmen

  • StorageClass setzen.
  • CSI installieren.
  • Quota erhöhen.
  • Topology/Zone prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.24. Volume Mount schlägt fehl

Symptom
Pod hängt wegen Volume-Fehler.

Häufige Ursachen

  • Secret/ConfigMap fehlt.
  • PV nicht attachbar.
  • Permission denied.
  • Multi-Attach.
  • Node-Plugin defekt.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl get volumeattachment
kubectl logs -n <csi-ns> ds/<csi-node> --tail=200

Maßnahmen

  • fehlende Ressource erstellen.
  • Attachment lösen.
  • Permissions korrigieren.
  • CSI prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.25. Node NotReady

Symptom
Node ist aus Sicht der Control Plane nicht gesund.

Häufige Ursachen

  • kubelet down.
  • Runtime down.
  • CNI defekt.
  • DiskPressure.
  • Netzwerk.
  • Zertifikat.

Diagnose

bash
kubectl describe node <node>
journalctl -u kubelet -n 300 --no-pager
crictl info
df -h

Maßnahmen

  • kubelet/Runtime stabilisieren.
  • Disk bereinigen.
  • CNI reparieren.
  • Node neu aufbauen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.26. Node DiskPressure

Symptom
Kubelet meldet knappen Speicherplatz oder Inodes.

Häufige Ursachen

  • Images.
  • Logs.
  • ephemeral-storage.
  • leere Containerreste.
  • CSI-Daten.

Diagnose

bash
df -h
df -ih
du -xh /var/lib/containerd /var/log /var/lib/kubelet | sort -h | tail
crictl images

Maßnahmen

  • Logs rotieren.
  • Images prunen.
  • Requests/Limits für ephemeral-storage setzen.
  • Node ersetzen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.27. kubelet startet nicht

Symptom
Node kann keine Pods verwalten.

Häufige Ursachen

  • Konfigurationsfehler.
  • Zertifikat.
  • Runtime Endpoint.
  • cgroups.
  • Swap.
  • Hostname.

Diagnose

bash
systemctl status kubelet
journalctl -u kubelet -n 500 --no-pager
cat /var/lib/kubelet/config.yaml

Maßnahmen

  • Config korrigieren.
  • Runtime prüfen.
  • Zertifikate erneuern.
  • Swap/cgroups prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.28. Container Runtime down

Symptom
containerd oder CRI-O ist nicht funktionsfähig.

Häufige Ursachen

  • Service down.
  • Disk voll.
  • Registry hängt.
  • cgroup-Konflikt.
  • defekte Snapshots.

Diagnose

bash
systemctl status containerd crio
journalctl -u containerd -n 300 --no-pager
crictl info
crictl ps -a

Maßnahmen

  • Service reparieren.
  • Disk bereinigen.
  • Konfiguration prüfen.
  • Node cordon/drain/reboot.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.29. Admission Webhook timeout

Symptom
API-Anfragen hängen oder werden abgelehnt.

Häufige Ursachen

  • Webhook-Service ohne Endpoints.
  • CA Bundle falsch.
  • NetworkPolicy.
  • zu niedriger Timeout.
  • Controller down.

Diagnose

bash
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration
kubectl get svc,endpoints -n <webhook-ns>
kubectl logs -n <webhook-ns> deploy/<controller> --tail=200

Maßnahmen

  • Webhook stabilisieren.
  • failurePolicy bewusst setzen.
  • Timeout prüfen.
  • Selector einschränken.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.30. Argo CD Sync failed

Symptom
GitOps-App wird nicht synchronisiert.

Häufige Ursachen

  • Repo-Zugriff.
  • CRD fehlt.
  • Helm-Render-Fehler.
  • Namespace fehlt.
  • RBAC.
  • Webhook/Admission.

Diagnose

bash
argocd app get <app>
argocd app diff <app>
kubectl -n argocd logs deploy/argocd-application-controller --tail=200

Maßnahmen

  • Repo/Path korrigieren.
  • CRDs vorziehen.
  • Sync Waves.
  • RBAC ergänzen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.31. Helm Upgrade failed

Symptom
Release kann nicht installiert oder aktualisiert werden.

Häufige Ursachen

  • Template-Fehler.
  • Values falsch.
  • CRD-Reihenfolge.
  • Hook hängt.
  • Timeout.

Diagnose

bash
helm status <release> -n <namespace>
helm history <release> -n <namespace>
helm template <release> <chart> -f values.yaml
kubectl apply --dry-run=server -f rendered.yaml

Maßnahmen

  • Values korrigieren.
  • CRDs installieren.
  • Rollback.
  • --atomic mit Timeout nutzen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.32. Logs fehlen

Symptom
Zentrale Logs zeigen keine Daten.

Häufige Ursachen

  • Agent nicht auf Node.
  • stdout/stderr fehlt.
  • Backend down.
  • RBAC.
  • Retention.
  • Cloud Logging deaktiviert.

Diagnose

bash
kubectl get pods -A | grep -i 'fluent\|promtail\|alloy\|vector\|loki'
kubectl logs -n <logging-ns> ds/<agent> --tail=200

Maßnahmen

  • Agent fixen.
  • Backend prüfen.
  • RBAC/NetworkPolicy korrigieren.
  • Cloud API aktivieren.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.33. Metriken fehlen

Symptom
kubectl top oder Prometheus zeigt keine Daten.

Häufige Ursachen

  • metrics-server fehlt.
  • kubelet TLS.
  • ServiceMonitor Selector.
  • Target down.
  • NetworkPolicy.

Diagnose

bash
kubectl top nodes
kubectl describe apiservice v1beta1.metrics.k8s.io
kubectl -n monitoring get servicemonitor,podmonitor

Maßnahmen

  • metrics-server reparieren.
  • Scrape-Config korrigieren.
  • Port-Namen prüfen.
  • Policy erlauben.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.34. Alert kommt nicht an

Symptom
Prometheus erkennt Fehler nicht oder Alertmanager liefert nicht aus.

Häufige Ursachen

  • Rule nicht geladen.
  • PromQL falsch.
  • Silence aktiv.
  • Routing falsch.
  • Receiver Secret falsch.
  • Egress blockiert.

Diagnose

bash
kubectl -n monitoring get prometheusrule,alertmanagerconfig
kubectl -n monitoring logs statefulset/alertmanager-main --tail=200

Maßnahmen

  • Expression testen.
  • Silences prüfen.
  • Receiver korrigieren.
  • Egress erlauben.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.35. Backup fehlgeschlagen

Symptom
Velero oder Provider-Backup ist fehlerhaft.

Häufige Ursachen

  • Credentials.
  • Bucket.
  • VolumeSnapshotClass.
  • Node Agent.
  • Quota.
  • CRDs.

Diagnose

bash
velero backup get
velero backup describe <backup> --details
velero backup logs <backup>
kubectl -n velero logs deploy/velero --tail=200

Maßnahmen

  • Credentials korrigieren.
  • Snapshot-Plugin prüfen.
  • Quota erhöhen.
  • Restore-Test durchführen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.36. Restore unvollständig

Symptom
Objekte oder Daten fehlen nach Restore.

Häufige Ursachen

  • CRDs fehlen.
  • Namespace-Filter.
  • Secrets fehlen.
  • PVs nicht gebunden.
  • DNS zeigt auf alten Cluster.

Diagnose

bash
velero restore describe <restore> --details
kubectl get crd
kubectl get pvc -A
kubectl get events -A --sort-by=.lastTimestamp

Maßnahmen

  • CRDs zuerst.
  • Secrets/Issuer wiederherstellen.
  • PVC binden.
  • DNS umstellen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.37. Drain hängt

Symptom
Node kann für Wartung nicht geleert werden.

Häufige Ursachen

  • PDB.
  • Singleton.
  • local storage.
  • DaemonSet.
  • Finalizer.
  • Pod nicht terminierbar.

Diagnose

bash
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=10m
kubectl get pdb -A
kubectl get pods -A -o wide --field-selector spec.nodeName=<node>

Maßnahmen

  • PDB bewerten.
  • Replikate erhöhen.
  • Stateful Workload geplant migrieren.
  • Finalizer prüfen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.38. Upgrade schlägt fehl

Symptom
Cluster- oder Add-on-Upgrade erreicht keinen gesunden Zustand.

Häufige Ursachen

  • Version-Skew.
  • deprecated APIs.
  • Add-on inkompatibel.
  • PDB blockiert.
  • Webhook blockiert.
  • CNI/CSI-Version.

Diagnose

bash
kubectl get nodes
kubectl get events -A --sort-by=.lastTimestamp
kubeadm upgrade plan
helm list -A

Maßnahmen

  • Backup prüfen.
  • Minor-Schritte einhalten.
  • Add-ons aktualisieren.
  • Rollback/Ersatzcluster planen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.39. Cloud LoadBalancer bleibt Pending

Symptom
Service vom Typ LoadBalancer erhält keine externe IP.

Häufige Ursachen

  • Controller fehlt.
  • IAM fehlt.
  • Subnet Tags.
  • Quota.
  • Security Group.
  • Region/Zone.

Diagnose

bash
kubectl describe svc <svc> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
kubectl logs -n <controller-ns> deploy/<lb-controller> --tail=200

Maßnahmen

  • Controller/IAM reparieren.
  • Subnetz-Tags setzen.
  • Quota erhöhen.
  • Annotation korrigieren.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.40. EKS Nodes joinen nicht

Symptom
Managed Node Group ist erstellt, Nodes erscheinen aber nicht im Cluster.

Häufige Ursachen

  • IAM Role.
  • Security Group.
  • Private Endpoint.
  • Bootstrap.
  • Subnet Route.
  • aws-auth/Access Entries.

Diagnose

bash
aws eks describe-nodegroup --cluster-name <cluster> --nodegroup-name <nodegroup>
kubectl get nodes
aws ec2 describe-instances --filters Name=tag:eks:cluster-name,Values=<cluster>

Maßnahmen

  • IAM/Access korrigieren.
  • Netzpfad prüfen.
  • Bootstrap-Logs sammeln.
  • NodeGroup neu erstellen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.41. AKS Upgrade hängt

Symptom
Control Plane oder Node Pool Upgrade kommt nicht weiter.

Häufige Ursachen

  • PDB.
  • Surge-Kapazität.
  • Quota.
  • Node Image.
  • Addon-Probleme.
  • Subnet-IP-Mangel.

Diagnose

bash
az aks show -g <rg> -n <cluster>
az aks nodepool show -g <rg> --cluster-name <cluster> -n <pool>
kubectl get events -A --sort-by=.lastTimestamp

Maßnahmen

  • PDB lösen.
  • Quota/Kapazität schaffen.
  • Nodepool separat prüfen.
  • Azure Operation Logs lesen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.42. GKE Autopilot lehnt Pod ab

Symptom
Pod-Spezifikation wird nicht angenommen oder mutiert.

Häufige Ursachen

  • privileged nicht erlaubt.
  • HostPath.
  • Ressourcen außerhalb Policy.
  • Capabilities.
  • Port/HostNetwork.

Diagnose

bash
kubectl describe pod <pod> -n <namespace>
kubectl get events -n <namespace> --sort-by=.lastTimestamp
gcloud container clusters describe <cluster> --region <region>

Maßnahmen

  • Spec an Autopilot-Constraints anpassen.
  • SecurityContext korrigieren.
  • Requests/Limits setzen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.43. OpenShift Operator Degraded

Symptom
Ein ClusterOperator meldet Fehler.

Häufige Ursachen

  • Operand down.
  • SCC/RBAC.
  • MachineConfig.
  • ImagePull.
  • etcd/API.
  • Upgrade.

Diagnose

bash
oc get co
oc describe co <operator>
oc adm must-gather
oc get clusterversion

Maßnahmen

  • Operator-Conditions auswerten.
  • Operand-Logs prüfen.
  • MachineConfigPool prüfen.
  • Support-Bundle sichern.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.

23.44. Security Incident: verdächtiger Pod

Symptom
Unbekannte Shell, unerwarteter Prozess oder verdächtige Verbindung.

Häufige Ursachen

  • kompromittiertes Image.
  • geleakter Token.
  • zu breite RBAC.
  • fehlende NetworkPolicy.
  • Runtime Exploit.

Diagnose

bash
kubectl get pod <pod> -n <namespace> -o yaml
kubectl logs <pod> -n <namespace> --all-containers --timestamps
kubectl get sa,role,rolebinding -n <namespace> -o yaml

Maßnahmen

  • Beweise sichern.
  • Netz isolieren.
  • Credentials rotieren.
  • Image ersetzen.
  • Policy-Lücke schließen.

Validierung

bash
kubectl get pods -A -o wide
kubectl get events -A --sort-by=.lastTimestamp | tail -50
kubectl get nodes -o wide

Umgebungshinweise

  • In lokalen Container-Clustern wie kind oder k3d prüfst du zusätzlich Docker-Container, Port-Mappings und Docker-Netzwerke.
  • In WSL prüfst du zusätzlich Windows-Firewall, Windows-Hosts-Datei und Docker-Desktop-Integration.
  • In Remote-VMs und Bare Metal prüfst du zusätzlich OS-Firewall, Routing, VLAN, MTU, DNS und NTP.
  • In Managed Kubernetes prüfst du zusätzlich Provider-Events, IAM, Quotas, Subnetze, Load Balancer und Managed Add-ons.
23 / 31

24. Wiederverwendbare Debug-Manifeste

24.1. Netshoot-Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: netshoot
  namespace: default
spec:
  restartPolicy: Never
  containers:
    - name: netshoot
      image: nicolaka/netshoot:latest
      command: ["sleep", "36000"]
bash
kubectl apply -f netshoot.yaml
kubectl exec -it netshoot -- bash

24.2. DNS-Test-Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: dnsutils
  namespace: default
spec:
  containers:
    - name: dnsutils
      image: registry.k8s.io/e2e-test-images/agnhost:2.39
      command: ["sleep", "36000"]
  restartPolicy: Always
bash
kubectl apply -f dnsutils.yaml
kubectl exec -it dnsutils -- nslookup kubernetes.default
kubectl exec -it dnsutils -- cat /etc/resolv.conf

24.3. Echo-Deployment für Service-Tests

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo
  namespace: demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo
  template:
    metadata:
      labels:
        app: echo
    spec:
      containers:
        - name: echo
          image: hashicorp/http-echo:1.0
          args:
            - "-listen=:8080"
            - "-text=ok"
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /
              port: 8080
            initialDelaySeconds: 2
            periodSeconds: 5
          resources:
            requests:
              cpu: 50m
              memory: 64Mi
            limits:
              cpu: 200m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: echo
  namespace: demo
spec:
  selector:
    app: echo
  ports:
    - name: http
      port: 80
      targetPort: 8080

24.4. Default-Deny plus DNS-Egress

yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: demo
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-egress
  namespace: demo
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: kube-system
      ports:
        - protocol: UDP
          port: 53
        - protocol: TCP
          port: 53

24.5. Test-Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: echo
  namespace: demo
spec:
  ingressClassName: nginx
  rules:
    - host: echo.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: echo
                port:
                  number: 80

Test:

bash
curl -v -H 'Host: echo.local' http://<ingress-ip>/
24 / 31

25. Sammelskripte

25.1. Cluster-Support-Bundle

bash
#!/usr/bin/env bash
set -euo pipefail

TS="$(date -u +%Y%m%dT%H%M%SZ)"
OUT="k8s-support-${TS}"
mkdir -p "${OUT}"

run() {
  local name="$1"
  shift
  echo ">>> $*" | tee "${OUT}/${name}.cmd"
  "$@" > "${OUT}/${name}.out" 2>&1 || true
}

run version kubectl version -o yaml
run context kubectl config current-context
run cluster-info kubectl cluster-info
run nodes kubectl get nodes -o wide
run nodes-yaml kubectl get nodes -o yaml
run pods kubectl get pods -A -o wide
run events kubectl get events -A --sort-by=.lastTimestamp
run services kubectl get svc,endpoints,endpointslices -A -o wide
run storage kubectl get storageclass,pv,pvc -A -o wide
run ingress kubectl get ingress -A -o yaml
run gateway kubectl get gatewayclass,gateway,httproute -A -o yaml
run netpol kubectl get networkpolicy -A -o yaml
run apiservices kubectl get apiservice -o yaml
run webhooks kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration -o yaml
run crds kubectl get crd
run namespaces kubectl get namespaces -o yaml

tar -czf "${OUT}.tar.gz" "${OUT}"
echo "Bundle: ${OUT}.tar.gz"

25.2. Node-Support-Bundle

bash
#!/usr/bin/env bash
set -euo pipefail

TS="$(date -u +%Y%m%dT%H%M%SZ)"
OUT="node-support-${HOSTNAME}-${TS}"
mkdir -p "${OUT}"

collect() {
  local name="$1"
  shift
  "$@" > "${OUT}/${name}.out" 2>&1 || true
}

collect uname uname -a
collect os cat /etc/os-release
collect ip-address ip addr
collect ip-route ip route
collect resolv cat /etc/resolv.conf
collect sockets ss -tulpn
collect disk df -h
collect inodes df -ih
collect memory free -m
collect kubelet-status systemctl status kubelet --no-pager
collect kubelet-logs journalctl -u kubelet -n 1000 --no-pager
collect containerd-status systemctl status containerd --no-pager
collect containerd-logs journalctl -u containerd -n 1000 --no-pager
collect crictl-info crictl info
collect crictl-ps crictl ps -a
collect crictl-pods crictl pods
collect dmesg dmesg -T

tar -czf "${OUT}.tar.gz" "${OUT}"
echo "Bundle: ${OUT}.tar.gz"

25.3. Windows-/WSL-Erreichbarkeitscheck

PowerShell:

powershell
param(
  [string]$HostName = "demo.local",
  [int]$Port = 80
)

Write-Host "WSL Status"
wsl -l -v

Write-Host "Docker Version"
docker version

Write-Host "DNS"
Resolve-DnsName $HostName -ErrorAction Continue

Write-Host "TCP"
Test-NetConnection $HostName -Port $Port

Write-Host "Hosts-Datei"
Get-Content C:\Windows\System32\drivers\etc\hosts | Select-String $HostName
25 / 31

26. Workshop-Labs

26.1. Lab: Service ohne Endpoints

Ziel: Du erkennst Selector-Fehler.

  1. Deployment mit Label app: web erstellen.
  2. Service mit Selector app: api erstellen.
  3. kubectl get endpoints prüfen.
  4. Selector korrigieren.
  5. End-to-End-Test mit Netshoot durchführen.

26.2. Lab: DNS durch NetworkPolicy blockiert

Ziel: Du erkennst, dass Default-Deny-Egress DNS bricht.

  1. Namespace demo erstellen.
  2. Default-Deny-Egress anwenden.
  3. DNS-Test-Pod starten.
  4. nslookup kubernetes.default ausführen.
  5. DNS-Egress erlauben.
  6. Test wiederholen.

26.3. Lab: CrashLoopBackOff durch falsche Config

Ziel: Du nutzt logs --previous und Events.

  1. App mit fehlender Environment Variable starten.
  2. CrashLoop beobachten.
  3. Logs des vorherigen Containers lesen.
  4. ConfigMap ergänzen.
  5. Rollout validieren.

26.4. Lab: PVC Pending

Ziel: Du erkennst StorageClass-Fehler.

  1. PVC mit nicht existierender StorageClass erstellen.
  2. Events auswerten.
  3. StorageClass korrigieren.
  4. Pod mit PVC starten.

26.5. Lab: Ingress aus Windows/Edge über WSL erreichbar machen

Ziel: Du unterscheidest WSL- und Windows-Hosts-Datei.

  1. kind oder minikube mit Ingress bereitstellen.
  2. Hostname echo.local definieren.
  3. Windows-Hosts-Datei aktualisieren.
  4. Edge-Test durchführen.
  5. DNS- und Portfehler gezielt erzeugen.

26.6. Lab: Node drain hängt an PDB

Ziel: Du erkennst Wartungsblocker.

  1. Deployment mit einem Replica und PDB minAvailable: 1 erstellen.
  2. Node drain versuchen.
  3. PDB analysieren.
  4. Replikate erhöhen oder PDB anpassen.
  5. Drain wiederholen.

26.7. Lab: Admission Webhook blockiert Rollout

Ziel: Du erkennst Webhook-Fehlerpfade.

  1. Eine Policy installieren, die latest-Tags blockiert.
  2. Deployment mit :latest anwenden.
  3. Fehlermeldung lesen.
  4. Image mit Digest oder Versionstag verwenden.
  5. Rollout validieren.
26 / 31

27. Abschluss-Checklisten

27.1. Nach jedem Incident

  • Ursache dokumentiert.
  • Symptom und Ursache getrennt.
  • Betroffene Namespaces, Nodes, Services und Add-ons erfasst.
  • Logs, Events und Metriken gesichert.
  • Änderung nachvollziehbar versioniert.
  • Validierung durchgeführt.
  • Monitoring oder Alerting verbessert.
  • Runbook ergänzt.
  • Risiko von Wiederholung bewertet.
  • Security-Auswirkung geprüft.

27.2. Vor produktiven Änderungen

  • Backup aktuell und Restore getestet.
  • Rollback oder Ersatzpfad definiert.
  • PDBs und Kapazität geprüft.
  • Add-on-Kompatibilität geprüft.
  • Deprecated APIs geprüft.
  • Staging-Test durchgeführt.
  • Wartungsfenster und Kommunikation geplant.
  • Monitoring-Dashboard bereit.
  • Alert-Silences bewusst gesetzt und zeitlich begrenzt.

27.3. Vor Provider-Support-Ticket

  • Cluster-ID, Region und Version vorhanden.
  • Zeitpunkt und Zeitzone dokumentiert.
  • betroffene Nodes/Pods/Services gelistet.
  • relevante Events und Logs gesammelt.
  • Änderungen der letzten 24 Stunden dokumentiert.
  • Provider-Operationen und Quotas geprüft.
  • Minimaler Reproduktionsfall beschrieben.
  • Secrets aus Support-Bundle entfernt.
27 / 31

28. Anti-Patterns

Anti-Pattern Warum problematisch Besser
Pod löschen ohne Logs zu sichern --previous-Logs und Events können verloren gehen. Erst Daten sammeln, dann löschen.
cluster-admin vergeben, um Forbidden zu lösen Versteckt RBAC-Fehler und erzeugt Risiko. Genaues Verb, Ressource und Namespace erlauben.
Liveness Probe als Readiness Probe verwenden Kubernetes tötet Pods, statt nur Traffic fernzuhalten. Startup, Readiness und Liveness sauber trennen.
NetworkPolicy aktivieren ohne DNS-Egress Pods verlieren Service Discovery. DNS explizit erlauben.
PVC-Probleme durch Pod-Neustarts lösen Storage-Fehler bleibt bestehen. PVC, PV, CSI und Events prüfen.
kubeadm-Upgrades ohne etcd-Backup Restore-Pfad fehlt. Snapshot erstellen und Restore-Fähigkeit prüfen.
kubectl apply direkt in Prod ohne Diff Risiko ungeprüfter Änderungen. diff, --dry-run=server, Review und GitOps nutzen.
Cloud LoadBalancer nur in Kubernetes suchen Provider-IAM, Subnetze und Quotas fehlen in Analyse. Kubernetes-Events und Provider-CLI kombinieren.
WSL-Hosts-Datei ändern, obwohl Edge auf Windows läuft Browser nutzt Windows-DNS, nicht WSL-DNS. Windows-Hosts-Datei anpassen.
kind-Port-Mapping nachträglich erwarten Docker-Port-Mapping muss beim Containerstart existieren. kind-Cluster mit extraPortMappings neu erstellen.
Logs nur im zentralen Backend suchen Agent oder Backend kann selbst defekt sein. Immer auch kubectl logs und Node-Logs prüfen.
Nur Status betrachten Status zeigt nicht immer Ursache. Events, Conditions und Controller-Logs lesen.
28 / 31

29. Quellen und Referenzen

Primärquellen und weiterführende Dokumentation:

  • Kubernetes Debugging-Übersicht: https://kubernetes.io/docs/tasks/debug/
  • Kubernetes Debug Pods: https://kubernetes.io/docs/tasks/debug/debug-application/debug-pods/
  • Kubernetes Debug Running Pods: https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/
  • Kubernetes Debug Services: https://kubernetes.io/docs/tasks/debug/debug-application/debug-service/
  • Kubernetes Troubleshooting Clusters: https://kubernetes.io/docs/tasks/debug/debug-cluster/
  • Kubernetes DNS Debugging: https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/
  • Kubernetes Observability: https://kubernetes.io/docs/concepts/cluster-administration/observability/
  • Kubernetes Logging Architecture: https://kubernetes.io/docs/concepts/cluster-administration/logging/
  • Kubernetes NetworkPolicies: https://kubernetes.io/docs/concepts/services-networking/network-policies/
  • Kubernetes Services: https://kubernetes.io/docs/concepts/services-networking/service/
  • Kubernetes Ingress: https://kubernetes.io/docs/concepts/services-networking/ingress/
  • Kubernetes Gateway API: https://kubernetes.io/docs/concepts/services-networking/gateway/
  • Kubernetes kubeadm Upgrade: https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
  • Kubernetes etcd Administration: https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/
  • kind WSL2: https://kind.sigs.k8s.io/docs/user/using-wsl2/
  • kind Known Issues: https://kind.sigs.k8s.io/docs/user/known-issues/
  • minikube Start: https://minikube.sigs.k8s.io/docs/start/
  • minikube Accessing Apps: https://minikube.sigs.k8s.io/docs/handbook/accessing/
  • minikube Tunnel: https://minikube.sigs.k8s.io/docs/commands/tunnel/
  • k3d Exposing Services: https://k3d.io/stable/usage/exposing_services/
  • k3d K3s Features: https://k3d.io/stable/usage/k3s/
  • AWS EKS Troubleshooting: https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html
  • Azure AKS Upgrade Practices: https://learn.microsoft.com/en-us/azure/architecture/operator-guides/aks/aks-upgrade-practices
  • Google GKE Troubleshooting: https://cloud.google.com/kubernetes-engine/docs/troubleshooting
  • OpenShift must-gather: https://docs.openshift.com/container-platform/latest/support/gathering-cluster-data.html

29 / 31

Anhang A: Schnelle Kommandoreferenz

bash
# Kontext
kubectl config get-contexts
kubectl config current-context
kubectl auth whoami

# Cluster
kubectl get nodes -o wide
kubectl describe node <node>
kubectl get events -A --sort-by=.lastTimestamp | tail -100

# Workloads
kubectl get pods -A -o wide
kubectl describe pod <pod> -n <namespace>
kubectl logs <pod> -n <namespace> --all-containers --tail=200
kubectl logs <pod> -n <namespace> --all-containers --previous --tail=200

# Rollout
kubectl rollout status deploy/<deployment> -n <namespace>
kubectl rollout history deploy/<deployment> -n <namespace>
kubectl rollout undo deploy/<deployment> -n <namespace>

# Netzwerk
kubectl get svc,endpoints,endpointslices -A -o wide
kubectl get ingress -A
kubectl get gateway,httproute -A
kubectl get networkpolicy -A

# Storage
kubectl get storageclass
kubectl get pv,pvc -A
kubectl get volumeattachment

# Security
kubectl auth can-i get pods -n <namespace>
kubectl get role,rolebinding -n <namespace>
kubectl get validatingwebhookconfiguration,mutatingwebhookconfiguration

# Node
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl uncordon <node>
30 / 31

Anhang B: Fehlerbild-Landkarte

flowchart TD
    Pending[Pod Pending] --> Scheduling[Scheduling]
    Pending --> PVC[PVC Pending]
    Pending --> Admission[Admission]
    Creating[ContainerCreating] --> CNI[CNI]
    Creating --> Mount[Volume Mount]
    Creating --> Runtime[Runtime]
    Pull[ImagePullBackOff] --> Registry[Registry]
    Pull --> Secret[ImagePullSecret]
    Crash[CrashLoopBackOff] --> App[App Fehler]
    Crash --> Config[Config/Secret]
    Crash --> Probe[Liveness]
    NotReady[Readiness false] --> Probe2[Readiness]
    NotReady --> Dependency[Dependency]
    Svc[Service timeout] --> Endpoints[Endpoints]
    Svc --> DNS[DNS]
    Svc --> Netpol[NetworkPolicy]
    Svc --> CNI2[CNI/kube-proxy/eBPF]
    Ingress[Ingress/Gateway Fehler] --> Route[Host/Path/Route]
    Ingress --> LB[Load Balancer]
    Node[Node NotReady] --> Kubelet[kubelet]
    Node --> Disk[DiskPressure]
    Node --> Runtime2[Runtime]
    Node --> Network[Node Netzwerk]
31 / 31

K8S · Orthevs Academy

31 Module als durchgängiger Lernpfad.

Die Reihenfolge bleibt unverändert: von der Laborgrundstruktur über fachliche Grundlagen und Betriebsmodelle bis zum abschließenden Troubleshooting. Die technischen Verzeichnisnamen werden bewusst beibehalten.

Orthevs – Engineering als Grundlage für das, was als Nächstes kommt.

Orthevs als App

Orthevs installieren

Die Orthevs Web-App kann auf unterstützten Mobilgeräten und Desktop-Browsern installiert werden.

iPhone und iPad

Öffnen Sie Orthevs in Safari. Tippen Sie auf Teilen, dann auf ‚Zum Home-Bildschirm‘. Aktivieren Sie gegebenenfalls ‚Als Web-App öffnen‘ und tippen Sie auf ‚Hinzufügen‘.

Android

Für die Web-App öffnen Sie das Browsermenü und wählen ‚App installieren‘ oder ‚Zum Startbildschirm hinzufügen‘. Bestätigen Sie die Installation.

Desktop-Browser

Öffnen Sie das Browsermenü oder das Installationssymbol in der Adressleiste und wählen Sie ‚App installieren‘ beziehungsweise ‚Zum Dock hinzufügen‘.

Die Web-App-Installation hängt vom Browser ab. Falls kein Installationsdialog erscheint, nutzen Sie die angezeigten Schritte im Browser.