Debug Shell in Kubernetes

Kubernetes Fehlersuche

Die Fehlersuche in Kubernetes ist manchmal aufgrund der restriktiven Container Images nicht ganz trivial, da wichtige Tools für das Debugging fehlen.

Am einfachsten ist es einen weiteren POD zu Starten, um von dort die Fehlersuche durchzuführen.

Kubernetes “run” – to the Rescue!

Kubernetes besitzt mit run wie bei Docker auch einen Container zu starten. Dieses nutzen wir nun, um einen weiteren temporären Container zu starten. Sehr leichtgewichtige Images sind Busybox und Alpine, was ein schnelles hochfahren ermöglicht.

Bash Funktion

# open debug shell
k8sdebug() {
  case "$#" in
  "2")
    kubectl run -i --tty --rm debug --image=$1 -n $2 --restart=Never -- sh
    ;;
  "1")
    kubectl run -i --tty --rm debug --image=busybox -n $1 --restart=Never -- sh
    ;;
  "0")
    echo "Synopsis: k8sdebug [imagename] namespace"
    echo "if no image is specified busybox is used"
    echo "e.g.: k8sdebug alpine liferay-dev to start an alpine linux in namespace liferay-dev"
  esac
}

Beispiele

Hier noch ein paar Anregungen für den Einsatz der Debug-Shell.

Wget

Wer nur wget benötigt, der kann auf Busybox Image starten. Es muss nur der Namespace angegeben werden.

[sascha@vbox ~]$ k8sdebug liferay
If you don't see a command prompt, try pressing enter.
/ # wget
BusyBox v1.32.1 (2021-01-12 00:38:40 UTC) multi-call binary.

Usage: wget [-c|--continue] [--spider] [-q|--quiet] [-O|--output-document FILE]
        [-o|--output-file FILE] [--header 'header: value'] [-Y|--proxy on/off]
        [--no-check-certificate]
        [-P DIR] [-S|--server-response] [-U|--user-agent AGENT] [-T SEC] URL...

Retrieve files via HTTP or FTP

        --spider        Only check URL existence: $? is 0 if exists
        --no-check-certificate  Don't validate the server's certificate
        -c              Continue retrieval of aborted transfer
        -q              Quiet
        -P DIR          Save to DIR (default .)
        -S              Show server response
        -T SEC          Network read timeout is SEC seconds
        -O FILE         Save to FILE ('-' for stdout)
        -o FILE         Log messages to FILE
        -U STR          Use STR for User-Agent header
        -Y on/off       Use proxy
/ #

Curl

Möchte man lieber ein echtes Curl verwenden, dann ist alpine linux die beste Wahl.

[sascha@vbox ~]$ k8sdebug alpine liferay
If you don't see a command prompt, try pressing enter.
/ # apk add curl
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/5) Installing ca-certificates (20191127-r5)
(2/5) Installing brotli-libs (1.0.9-r3)
(3/5) Installing nghttp2-libs (1.42.0-r1)
(4/5) Installing libcurl (7.74.0-r0)
(5/5) Installing curl (7.74.0-r0)
Executing busybox-1.32.1-r0.trigger
Executing ca-certificates-20191127-r5.trigger
OK: 8 MiB in 19 packages
/ # curl svc-or-ip

NC – NetCat

NC ist bestandteil des busybox Images. Hier abruf einer Seite von Liferay auf dem Port 8080.

[sascha@vbox ~]$ k8sdebug liferay
If you don't see a command prompt, try pressing enter.
/ # nc liferay-cluster:8080
GET /index.html