PerfectScalePerfectScale

PerfectScale

kubectl debug: Der komplette Guide zum Troubleshooting von Pods & Nodes

kubectl debug ist ein integrierter Befehl zum Troubleshooting laufender Workloads in einem Kubernetes-Cluster. Er kommt zum Einsatz, wenn Sie einen Container untersuchen müssen, dem grundlegende Debugging-Tools wie eine Shell oder Netzwerk-Utilities fehlen (typisch für minimale "Distroless"-Images), oder wenn ein Pod in einem Crash-Loop feststeckt.

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Sep 25, 202616 min read
Josh Palmer

About Josh Palmer

Head of Content

I'm Josh Palmer, Head of Content at DoiT, where I split my time across multiple business units including DoiT Cloud Intelligence, PerfectScale (Kubernetes cost optimization), and SELECT (Snowflake, Databricks, and BigQuery cost optimization). Before DoiT, I spent four and a half years at OnBoard building content for a board intelligence platform used by 6,000+ organizations, and before that, two years as Content Marketing Manager at Zylo, a SaaS management platform.

My personal page

TL;DR

  • kubectl debug ist der integrierte interaktive Troubleshooting-Befehl von kubectl. Er funktioniert auf drei Arten: einen ephemeren Container zu einem laufenden Pod hinzufügen, eine Kopie eines Pods mit geänderten Einstellungen erstellen oder einen Pod auf einem Node starten, der bei Bedarf privilegierte Rechte erhalten kann.
  • Nutzen Sie ihn, wenn kubectl logs und kubectl describe nicht ausreichen – etwa bei einem Distroless-Container ohne Shell oder einem Pod im CrashLoopBackOff.
  • Grundsyntax: kubectl debug (POD | TYPE/NAME) [flags], am häufigsten kubectl debug my-pod -it --image=busybox.
  • Debug-Sessions laufen unter einem Debugging-Profil (--profile, Standard general in aktuellen kubectl-Versionen), das festlegt, welche Capabilities und Namespaces der Debug-Container erhält – er läuft standardmäßig nicht privilegiert.
  • Best Practice: Beginnen Sie mit Logs/Describe/Events, nutzen Sie ephemere Container nur zum Untersuchen (niemals, um einen laufenden Workload zu patchen), und räumen Sie jeden mit --copy-to erstellten Pod nach Abschluss wieder auf.

Was ist kubectl debug?

kubectl debug ist ein integrierter Befehl zum Troubleshooting laufender Workloads in einem Kubernetes-Cluster. Er kommt vor allem dann zum Einsatz, wenn Sie einen Container untersuchen müssen, dem grundlegende Debugging-Tools wie eine Shell oder Netzwerk-Utilities fehlen (typisch für minimale "Distroless"-Images), oder wenn ein Pod in einem Crash-Loop feststeckt.

Gängige Befehle:

Die vollständige Syntax finden Sie in der offiziellen Kubernetes-Dokumentation zu kubectl debug.

Szenario Beispielbefehl
Shell zu laufendem Pod hinzufügen kubectl debug -it <pod-name> --image=busybox
Prozess-Namespace teilen kubectl debug -it <pod-name> --image=busybox --target=<container-name>
Abstürzenden Pod debuggen kubectl debug <pod-name> -it --copy-to=debug-pod --image=ubuntu -- /bin/bash
Cluster-Node debuggen kubectl debug node/<node-name> -it --image=ubuntu

Wichtige Flags:

  • -i / -t (meist kombiniert als -it): Verbindet sofort ein interaktives TTY mit der Konsole des neuen Containers.
  • --target: Gibt einen Container im Pod an, dessen Prozess-Namespace geteilt wird, sodass Sie dessen laufende Prozesse mit Tools wie ps sehen können.
  • --copy-to: Benennt einen neuen Pod, der als Kopie des Originals für das Troubleshooting erstellt wird.
  • --profile: Wählt das Debugging-Profil (general, baseline, restricted, netadmin oder sysadmin), das den Security-Kontext und die Namespaces des Debug-Containers festlegt. Standard ist general in aktuellen kubectl-Versionen.

Anwendungsfälle für kubectl debug

Der Befehl arbeitet je nach Zielressource auf drei Arten:

  • Ephemere Container: Fügt einem bestehenden, laufenden Pod einen temporären Container mit einem Image Ihrer Wahl (z. B. busybox oder ubuntu) hinzu. So können Sie Diagnosen durchführen, ohne den Pod neu zu starten.
  • Pod-Kopien: Erstellt eine Kopie eines Pods mit geänderten Attributen, etwa einem anderen Container-Image oder Befehl. Das ist nützlich für Pods, die beim Start abstürzen und im laufenden Zustand nicht zugänglich sind.
  • Node-Debugging: Erstellt einen neuen Pod, der in den Host-Namespaces des Nodes läuft und dessen Root-Dateisystem mountet. Damit lässt sich Troubleshooting auf Infrastruktur-Ebene direkt auf einem Cluster-Node durchführen.

drei Wege zum Debuggen mit kubectl debug

Die Syntax von kubectl debug

Der Befehl kubectl debug unterstützt mehrere Debugging-Workflows: ephemere Container zu Pods hinzufügen, Pod-Kopien für das Troubleshooting erstellen und Nodes debuggen.

Terminal window
kubectl debug (POD | TYPE/NAME) [flags]

Zu den häufigsten Flag-Optionen gehören:

Option Beschreibung
-it Startet eine interaktive Terminal-Session
--image Legt das Container-Image für das Debugging fest
--target Adressiert einen bestimmten Container innerhalb eines Pods
--copy-to Erstellt eine Kopie eines Pods für das Debugging
--share-processes Aktiviert das Teilen des Prozess-Namespace in kopierten Pods
--profile Wählt das Debugging-Profil (standardmäßig general), das Security-Kontext und Namespaces des Debug-Containers festlegt
node/NODE_NAME Startet eine Debugging-Session für einen Node

Gängige Befehle mit kubectl debug

1. Shell zu laufendem Pod hinzufügen

Dieses Beispiel fügt einem bestehenden Pod einen ephemeren Container mit Shell hinzu. Der Debug-Container läuft neben den ursprünglichen Containern, ohne sie zu verändern.

Terminal window
kubectl debug my-pod -it --image=busybox

Wenn der Pod mehrere Container enthält, können Sie einen bestimmten Container adressieren:

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

Das Flag --target teilt den Prozess-Namespace mit dem angegebenen Container, sodass der Debug-Container dessen laufende Prozesse sehen (und mit ihnen interagieren) kann.

2. Prozess-Namespace teilen

Standardmäßig sehen ephemere Container unter Umständen keine Prozesse anderer Container. Das Flag --share-processes aktiviert das Teilen des Prozess-Namespace in einem kopierten Pod, sodass Sie laufende Prozesse containerübergreifend untersuchen können.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug --share-processes -it --image=busybox

Das ist nützlich für Tools wie ps, top oder strace, wenn Sie Probleme auf Prozessebene untersuchen.

3. Abstürzenden Pod debuggen

Wenn ein Container wiederholt abstürzt, wird er möglicherweise beendet, bevor Sie ihn untersuchen können. Die Option --copy-to erstellt eine Kopie des Pods mit geänderten Einstellungen für das Troubleshooting.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug -it --image=ubuntu

Anschließend können Sie gemountete Volumes, Umgebungsvariablen, Konfigurationsdateien oder Anwendungs-Binaries untersuchen, ohne den ursprünglichen Pod zu beeinträchtigen.

4. Cluster-Node debuggen

kubectl debug kann auch einen temporären Pod erstellen, der an einen Node angehängt ist – für Troubleshooting auf Node-Ebene. Das hilft bei der Untersuchung von kubelet-Problemen, Netzwerkproblemen oder der Festplattenauslastung.

Terminal window
kubectl debug node/my-node -it --image=ubuntu

Standardmäßig verwendet das Node-Debugging das Profil general: Der Debug-Pod läuft in den Host-Namespaces des Nodes (hostPID, hostNetwork, hostIPC) und mountet das Root-Dateisystem des Nodes unter /host, läuft aber nicht mit privilegiertem Security-Kontext. Von dort aus können Sie das Host-Dateisystem und Systemdienste untersuchen. Wenn Sie vollen (privilegierten) Root-Zugriff auf den Node benötigen – etwa um Kernel-Module zu laden oder Raw Sockets zu nutzen –, fordern Sie ihn explizit mit --profile=sysadmin an.

kubectl debug vs. kubectl logs vs. kubectl describe

kubectl debug, kubectl logs und kubectl describe sind allesamt Troubleshooting-Befehle, dienen aber unterschiedlichen Zwecken. kubectl logs ruft die Anwendungsausgabe ab, kubectl describe zeigt Details und Events zu Kubernetes-Ressourcen, und kubectl debug bietet interaktiven Zugriff für die Live-Analyse.

Befehl Hauptzweck Typischer Anwendungsfall
kubectl logs Container-Logs anzeigen Anwendungsausgaben und Fehlermeldungen prüfen
kubectl describe Ressourcenzustand und Events einsehen Scheduling-, Konfigurations- oder Lifecycle-Probleme diagnostizieren
kubectl debug Interaktives Debugging durchführen Laufende Container, Nodes oder Netzwerkprobleme untersuchen

kubectl logs

Der Befehl kubectl logs zeigt die stdout- und stderr-Ausgaben von Containern an. Er wird häufig genutzt, um Anwendungsabstürze, Startfehler oder Laufzeitfehler zu identifizieren.

Terminal window
kubectl logs my-pod

Bei Pods mit mehreren Containern geben Sie den Containernamen an:

Terminal window
kubectl logs my-pod -c app-container

Dieser Befehl ist leichtgewichtig und sicher, da er den Pod nicht verändert und keine neuen Container erstellt.

kubectl describe

Der Befehl kubectl describe liefert detaillierte Informationen zu Kubernetes-Ressourcen, darunter Labels, Conditions, gemountete Volumes und aktuelle Events.

Terminal window
kubectl describe pod my-pod

Dieser Befehl eignet sich zur Diagnose von Problemen wie:

Anders als kubectl logs konzentriert er sich auf den Zustand der Kubernetes-Objekte statt auf die Anwendungsausgabe.

kubectl debug

Der Befehl kubectl debug ermöglicht interaktives Troubleshooting, indem er ephemere Container anhängt oder temporäre Debug-Pods erstellt.

Terminal window
kubectl debug my-pod -it --image=busybox

Dieser Ansatz hilft, wenn Logs und Ressourcenbeschreibungen nicht ausreichen. Sie können zum Beispiel:

  • Netzwerkverbindungen prüfen
  • Dateisysteminhalte untersuchen
  • Tools zur Prozessanalyse ausführen
  • Minimale Container ohne Shell debuggen
  • Probleme auf Node-Ebene untersuchen

Da temporäre Debugging-Umgebungen erstellt werden, bietet kubectl debug tieferen Zugriff als die anderen Befehle – bei minimalen Änderungen an produktiven Workloads.

Praktische Beispiele für kubectl debug

Netzwerkverbindungen debuggen

Nutzen Sie einen Debug-Container, um DNS, Service Discovery und ausgehende Netzwerkzugriffe aus dem Netzwerk-Namespace des Pods zu testen.

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

Führen Sie im Debug-Container Befehle aus wie:

Terminal window
nslookup kubernetes.default
wget -qO- http://my-service.default.svc.cluster.local
ping 10.0.0.10

Das ist nützlich, wenn das Anwendungs-Image keine Tools wie nslookup, curl oder ping enthält.

Pod im CrashLoopBackOff debuggen

Erstellen Sie für einen Pod, der ständig neu startet, eine Kopie zur Untersuchung. So bleibt der ursprüngliche Workload unverändert.

Terminal window
kubectl debug my-pod --copy-to=my-pod-debug -it --image=ubuntu

In der Pod-Kopie können Sie Umgebungsvariablen, gemountete Dateien, Konfiguration und Netzwerkzugriff prüfen:

Terminal window
env
ls -la /etc/config
cat /etc/config/app.conf

So lassen sich fehlende Dateien, fehlerhafte Umgebungswerte oder Laufzeitabhängigkeiten identifizieren.

Debugging mit geteiltem Prozess-Namespace

Nutzen Sie das Teilen des Prozess-Namespace, wenn Sie Prozesse aus einem anderen Container des Pods untersuchen müssen.

Terminal window
kubectl debug my-pod \
--copy-to=my-pod-debug \
--share-processes \
-it \
--image=ubuntu

Prüfen Sie im Debug-Container die laufenden Prozesse:

Terminal window
ps aux
top

Das ist nützlich zur Untersuchung hängender Prozesse, Zombie-Prozesse oder unerwarteter Kindprozesse.

Debugging mit eigenem Image

Verwenden Sie ein eigenes Debug-Image, wenn Standard-Images nicht die benötigten Tools enthalten.

Terminal window
kubectl debug my-pod -it \
--image=my-registry.example.com/debug-tools:latest \
--target=my-container

Ein eigenes Image kann Tools wie curl, dig, tcpdump, strace oder Datenbank-Clients enthalten. So bleiben Produktions-Images klein, während bei Bedarf trotzdem tiefgehendes Troubleshooting möglich ist.

Best Practices für den Einsatz von kubectl debug

Hier einige bewährte Vorgehensweisen für die Nutzung dieses Befehls.

1. Erst Observability, dann die interaktive Session

Nutzen Sie kubectl logs, kubectl describe, Events, Metriken und Traces, bevor Sie eine interaktive Debug-Session starten. Diese Tools sind schneller, sicherer und reichen oft aus, um das Problem zu identifizieren.

Terminal window
kubectl logs my-pod
kubectl describe pod my-pod
kubectl get events --sort-by=.metadata.creationTimestamp

So lässt sich klären, ob das Problem an der Anwendung, am Scheduling, an Probes, Ressourcenlimits, am Netzwerk oder an der Kubernetes-Konfiguration liegt. kubectl describe zeigt beispielsweise Image-Pull-Fehler, fehlgeschlagene Readiness Probes oder Fehler beim Mounten von Volumes, bevor Sie Zeit in die direkte Untersuchung des Containers investieren.

Greifen Sie zu kubectl debug, wenn die verfügbaren Signale das Problem nicht erklären oder wenn Sie den Laufzeitzustand aus der Umgebung des Pods heraus untersuchen müssen.

2. Ephemere Container zum Untersuchen nutzen, nicht für Anwendungsänderungen

Ephemere Container sind für das Troubleshooting gedacht. Nutzen Sie sie nicht, um in einem laufenden Workload Dateien zu patchen, Dienste neu zu starten, Abhängigkeiten zu installieren oder das Anwendungsverhalten zu verändern.

Nutzen Sie sie, um den Zustand zu untersuchen, Diagnosebefehle auszuführen und Befunde zu sammeln:

Terminal window
kubectl debug my-pod -it --image=busybox --target=my-container

Sie können zum Beispiel die DNS-Auflösung prüfen, gemountete Dateien untersuchen, die Erreichbarkeit von Services testen oder laufende Prozesse einsehen. Diese Aktionen helfen zu verstehen, was passiert, ohne den Workload zu verändern.

Jede Korrektur sollte im Quellcode, im Container-Image, in den Manifesten oder in der Deployment-Pipeline erfolgen. So bleibt das Produktionsverhalten reproduzierbar, und es entstehen keine einmaligen manuellen Änderungen, die nach einem Pod-Neustart wieder verschwinden.

3. Debug-Container statt zusätzlicher Tools im Produktions-Image

Vermeiden Sie es, Shells, Paketmanager und Netzwerk-Tools nur fürs Troubleshooting in Produktions-Images zu installieren. Diese Tools vergrößern das Image und können die Angriffsfläche des Containers erweitern.

Halten Sie Anwendungs-Images stattdessen klein und nutzen Sie bei Bedarf ein separates Debug-Image:

Terminal window
kubectl debug my-pod -it --image=nicolaka/netshoot --target=my-container

Das ist besonders nützlich für minimale Images wie Distroless- oder Scratch-basierte Container, die oft keine Shell enthalten. Ein Debug-Container kann Tools wie curl, dig, tcpdump, ss und ip bereitstellen, ohne das Produktions-Image zu verändern.

Dieser Ansatz sorgt zudem für eine klare Trennung: Das Anwendungs-Image führt den Workload aus, während das Debug-Image nur in kontrollierten Troubleshooting-Sessions zum Einsatz kommt.

4. Freigegebene, sichere Debugging-Images verwenden

Debug-Images enthalten oft leistungsstarke Tools wie tcpdump, strace, curl, dig, Paketmanager und Shell-Utilities. Verwenden Sie ausschließlich freigegebene Images aus vertrauenswürdigen Registries.

Pinnen Sie Image-Versionen, statt Floating Tags zu verwenden:

Terminal window
kubectl debug my-pod -it --image=registry.example.com/debug-tools:1.4.2

Freigegebene Images sollten auf Schwachstellen gescannt und aktuell gehalten werden. Sie sollten die Tools enthalten, die Ihre Teams tatsächlich benötigen – ohne überflüssige Pakete.

Auch der Zugriff sollte per RBAC kontrolliert werden. Nicht jeder Benutzer sollte ephemere Container erstellen, sich an sensible Workloads anhängen oder Debug-Sessions auf Node-Ebene starten dürfen. Node-Debugging kann Host-Dateisysteme und Informationen auf Systemebene offenlegen und sollte daher auf vertrauenswürdige Operatoren beschränkt sein – kombinieren Sie das nach Möglichkeit mit dem Flag --profile (restricted oder baseline), um nicht mehr Zugriff zu gewähren, als die Session benötigt.

5. Debug-Pods aufräumen und die Session dokumentieren

Entfernen Sie kopierte Debug-Pods nach dem Troubleshooting, um unnötige Ressourcennutzung und Unordnung im Cluster zu vermeiden.

Terminal window
kubectl delete pod my-pod-debug

Ephemere Container, die zu bestehenden Pods hinzugefügt wurden, lassen sich nicht aus der Pod-Spezifikation entfernen, stoppen aber, sobald die Debugging-Session endet. Kopierte Pods hingegen verbleiben im Cluster, bis sie gelöscht werden.

Halten Sie fest, was geprüft wurde, welche Befehle ausgeführt wurden und was dabei herauskam. Das erleichtert die Nachbereitung des Vorfalls und hilft, Runbooks für künftige Probleme zu verbessern.

Gute Notizen umfassen den betroffenen Pod oder Node, das verwendete Debug-Image, wichtige Befehlsausgaben und die letztendliche Ursache. So müssen andere Engineers dieselbe Untersuchung später nicht wiederholen.

Weniger manuelles Debugging: Resilienzrisiken proaktiv beheben mit PerfectScale

Befehle wie kubectl debug sind unverzichtbar, wenn Sie einen abstürzenden Pod, einen hängenden Prozess oder ein Problem auf Node-Ebene in Echtzeit untersuchen müssen – doch die meisten dieser Vorfälle gehen auf Ressourcen-Fehlkonfigurationen zurück, die sich früher hätten erkennen lassen. PerfectScale steigert die Resilienz und Performance von Kubernetes autonom: durch Right-Sizing der Workloads, die Vermeidung von Ausfällen und die Optimierung der Ressourcennutzung für 99,99 % Verfügbarkeit. So verbringt Ihr Team weniger Zeit mit interaktiven Debug-Sessions und mehr Zeit mit der Auslieferung neuer Features. Statt darauf zu warten, dass ein Pod ausfällt, und dann zu ephemeren Containern zu greifen, identifiziert und behebt PerfectScale die Resilienzrisiken, die diese Ausfälle überhaupt erst verursachen.

Zentrale Funktionen von PerfectScale:

  • Automatische Problembehebung: Identifiziert und behebt Resilienzrisiken sofort, um die Verfügbarkeit zu maximieren und Latenzen zu eliminieren – und verhindert Konfigurationsfehler (fehlende CPU-Requests, fehlende Memory-Requests, fehlende Memory-Limits) sowie Unterversorgung mit Ressourcen wie OOM, CPU-Throttling und Evictions.
  • Härtung der Infrastruktur: Verschafft Ihnen einen ganzheitlichen Überblick über Ihre Nodes, um Fehlkonfigurationen proaktiv aufzudecken, verhindert die Überbuchung von Nodes durch präzise Empfehlungen für Memory-Limits, validiert Node Affinities und Taints und wählt die am besten geeigneten Node-Typen für Ihre Pods.
  • Priorisierung nach Auswirkung: Fokussiert Ihr Team in Echtzeit auf die kritischsten Probleme dank fortschrittlicher Auto-Priorisierung und richtet Alerts an Ihren SLAs und SLOs aus, damit die Service-Level im Zielbereich bleiben.
  • Echtzeit-Alerts und Ticketing-Integrationen: Sendet sofortige Benachrichtigungen über Slack, MS Teams oder Datadog und lässt Sie jedes Problem mit nur einem Klick als Ticket in Ihren etablierten Workflow eskalieren.
  • Breite Risikoabdeckung: Erkennt kontinuierlich Evictions, Out-of-Memory-Fehler, mutmaßliche Memory Leaks, CPU-Throttling, Pod-Neustarts, HPAs am Replica-Maximum sowie unterdimensionierte oder fehlende CPU- und Memory-Requests und -Limits.

Erfahren Sie mehr darüber, wie PerfectScale Ihre Cluster stabil hält und den Bedarf an manuellem Troubleshooting reduziert – auf der Plattform zur Kubernetes-Performance-Optimierung.

FAQ

Wofür wird der Befehl kubectl debug verwendet?

kubectl debug dient dem interaktiven Troubleshooting von Kubernetes-Workloads und -Nodes. Der Befehl kann einen ephemeren Container an einen laufenden Pod anhängen, eine modifizierte Kopie eines abstürzenden Pods erstellen oder einen Debug-Pod auf einem Node starten – ganz ohne Debugging-Tools, die bereits im Ziel-Image enthalten sein müssten.

Wie verwende ich kubectl debug bei einem Pod?

Führen Sie kubectl debug <pod-name> -it --image=busybox aus, um einen ephemeren Debug-Container an einen laufenden Pod anzuhängen. Ergänzen Sie --target=<container-name>, um den Prozess-Namespace mit einem bestimmten Container zu teilen, oder --copy-to=<new-pod-name>, um statt des Live-Pods eine Kopie zu debuggen (nützlich bei Pods, die beim Start abstürzen).

Wie verwende ich kubectl debug auf einem Node?

Führen Sie kubectl debug node/<node-name> -it --image=ubuntu aus, um einen Debug-Pod zu erstellen, der in den Host-Namespaces des Nodes läuft und dessen Root-Dateisystem unter /host gemountet hat. Standardmäßig gilt das Profil general, das keinen privilegierten Zugriff gewährt – nutzen Sie --profile=sysadmin, wenn Sie volle Root-Rechte benötigen.

Wie lautet die Syntax des Befehls kubectl debug?

Die allgemeine Form ist kubectl debug (POD | TYPE/NAME) [flags], am häufigsten verwendet mit --image zum Festlegen des Debug-Container-Images, -it für ein interaktives Terminal, --target zum Adressieren eines bestimmten Containers und --copy-to zum Debuggen einer Pod-Kopie.

Worin unterscheidet sich kubectl debug von kubectl exec?

kubectl exec führt einen Befehl innerhalb eines bestehenden Containers im eigenen Image des Pods aus und funktioniert daher nur, wenn dieses Image die benötigten Tools bereits enthält. kubectl debug hängt einen separaten Container (oder Pod) mit einem beliebigen Image Ihrer Wahl an – unverzichtbar bei minimalen oder Distroless-Containern, die gar keine Shell haben.

Verändert kubectl debug den ursprünglichen Pod oder seine Container?

Das Hinzufügen eines ephemeren Containers mit kubectl debug startet die bestehenden Container des Pods weder neu, noch verändert es sie – es wird lediglich ein temporärer Container daneben hinzugefügt. Mit --copy-to geht es noch einen Schritt weiter: Es wird ein separater Pod erstellt, sodass das Original völlig unangetastet bleibt.

Muss ich von kubectl debug erstellte Pods aufräumen?

Ja, bei jedem mit --copy-to erstellten Pod. Diese Pods verbleiben im Cluster, bis Sie sie mit kubectl delete pod <debug-pod-name> löschen. Ephemere Container, die direkt zu einem bestehenden Pod hinzugefügt wurden, benötigen keine separate Bereinigung – sie stoppen, wenn die Session endet, bleiben aber in der Pod-Spezifikation gelistet.