Kubernetes Debugging met Ephemeral Containers

Het debuggen van applicaties die draaien op Kubernetes kan heel makkelijk zijn, mits je in je containers zelf daar de goede tools voor hebt. Nu gaat er natuurlijk niks boven goede instrumentatie met goede traces, logs, en metrics, maar helaas zijn die niet altijd beschikbaar. Echte debugging tools in je container images (denk aan bijvoorbeeld gdb en vrienden) is vaak niet aan te raden, omdat we vanuit een beveiligings-standpunt dat soort tools niet in onze images willen hebben zitten.

Het wordt pas echt leuk als je container images zelfs geen shell erin hebben zitten. Denk hierbij aan de groeiende hoeveelheid “Distroless”-images, maar ook aan images met slechts een enkele, statisch-gelinkte, binary, zoals veel Golang applicaties.

Systeem Tracing met bpftrace

Op moderne Linux machines kun je bijna alles van het kernel en userspace inspecteren met eBPF, de Extended Berkeley Packet Filter. Oorspronkelijk bedoelt voor firewalls is dat nu uitgegroeid tot een framework voor volledige systeem tracing.

Voor de fossielen onder ons: Denk SystemTap, maar dan meer gestandaardiseerd, en zonder rare kernel modules.

Één van de makkelijkste manieren om met eBPF te werken op een Linux systeem is met het tooltje bpftrace. bpftrace laat je programma’s schrijven met een syntax die wat lijkt op awk, en die je rechtstreeks vanaf de commandline kunt laten uitvoeren. Dit is niet de enige, of de beste, methode, maar wel een heel erg toegankelijke.

Debugging met strace en ltrace

Soms heb je een probleem waar je met de gewone foutmeldingen of logging niet uitkomt. Applicaties die alleen maar zeggen “File not found”, maar niet zeggen welk pad ze proberen te openen bijvoorbeeld. In dat soort gevallen zou je naar een volledige, zware, debugger als gdb kunnen grijpen, maar je kunt ook eerst iets eenvoudigers proberen.