How to get all Logs from Kubernetes Cluster?
akhilsharmakubernetes

How to get all Logs from Kubernetes Cluster?


Troubleshooting on Kubernetes can quickly turn into a nightmare if there are multiple moving parts in your applications. Running a multi layer application on Kubernetes is complex and troubleshooting or diagnosing for issues on live logs in a live system can quickly become difficult.

So, wouldn’t it be a great idea to get a download of all logs from your Kubernetes cluster and then troubleshoot? I feel it will be great if we think of the following cases:

  • You are stuck while troubleshooting an issue and you need someone else to have a look at logs for help. So easy sharing!!
  • Diagnosing logs on your bash/powershell/cmdline can be very tedious and difficult task. So having a download or dump locally can make search fast and easy.

So, inspired Thomas who works at Microsoft, I decided to write down a powershell script for this purpose. The script automates the following tasks:

  • Get all pod logs (current and previous)
    Current -> logs from current pod
    Previous -> logs of pod from previous runs. This will show you the logs of the last run of the pod before it crashed. It is a handy feature in case you want to figure out why the pod crashed in the first place.
  • Describe all pods
  • Get all events in the Cluster

The script get all the above logs and places them at a particular location on your machine/server.

The script can be found in this GitHub repo.

$root_OutputDir="C:\templogs"
$date=Get-Date
$date = $date.ToString("yyyy-MM-dd")
$output_Namespace_Directory="pod_logs_$(kubectl config current-context)_$date"
$output_Directory="${root_OutputDir}/${output_Namespace_Directory}"
$describe_Directory= "${output_Directory}/describe"
$podlogs_Directory= "${output_Directory}/podlogs"
$eventlogs_Directory= "${output_Directory}/eventlogs"
$extension="log"
echo "Using output dir $output_Directory"
mkdir "$output_Directory"
mkdir "$describe_Directory"
mkdir "$podlogs_Directory"
mkdir "$eventlogs_Directory"

[pscustomobject]$hashtable = kubectl get po -A --no-headers
$hashtable | ForEach-Object {
$count = 0
$_.ToString().Split(" ") | foreach {
$Value1 = $_
if ($Value1 -ne "") {
    $count = $count + 1
    if ($count -eq 1) {
        $namespace=$value1
    }
    if ($count -eq 2) {
        $podname=$value1
    }
}
}
Write-Host $namespace "contains" $podname
$filename = "${describe_Directory}/${namespace}.${podname}.describe"
kubectl describe pod -n "$namespace" "$podname" > "$filename"
foreach($container in (kubectl get po -n "$namespace" "$podname" -o jsonpath="{.spec.containers[*].name}")) {
    $filename_Prefix="$podlogs_Directory"+"/"+"$namespace"+"."+"$podname"+"."+"$container"
    $filename = $filename_Prefix + ".current." + $extension
    kubectl logs -n "$namespace" "$podname" "$container" > "$filename"
    echo "$filename"
    $filename = $filename_Prefix + ".previous." + $extension
    kubectl logs -p -n "$namespace" "$podname" "$container" > "$filename"
    echo "$filename"
}
}
# Dump all events
$filename="$eventlogs_Directory/events.log"
kubectl get events -A > "$filename"

Now lets see the script in action!

I hope you find this helpful and this allows you to troubleshoot and diagnosing your issues faster and easier.