Running kubectl logs
shows me the stderr/stdout of one Kubernetes container.
How can I get the aggregated stderr/stdout of a set of pods, preferably those
To build on the previous answer if you add -f
you can tail the logs.
kubectl logs -f deployment/app
You can use labels
kubectl logs -l app=elasticsearch
Previously provided solutions are not that optimal. The kubernetes team itself has provided a solution a while ago, called stern.
stern app1
It is also matching regular expressions and does tail and -f (follow) by default. A nice benefit is, that it shows you the pod which generated the log as well.
app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2
Grab the go-binary for linux or install via brew for OSX.
https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/
https://github.com/wercker/stern
You can also do this by service name.
First, try to find the service name of the respective pod which corresponds to multiple pods of the same service. kubectl get svc
.
Next, run the following command to display logs from each container.
kubectl logs -f service/<service-name>
If the pods are named meaningfully one could use simple Plain Old Bash:
keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
grep $keyword | grep Running | awk '{print $1}'); do
command="$command (kubectl logs --tail=2 -f $line &) && "
done
command="$command echo)"
eval $command
Explanation: Loop through running pods with name containing "nodejs". Tail the log for each of them in parallel (single ampersand runs in background) ensuring that if any of the pods fail the whole command exits (double ampersand). Cat the streams from each of the tail commands into a unique stream. Eval is needed to run this dynamically built command.
I use this command.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m