Yesterday I spent the afternoon learning about Kubernetes deployments. These are amazingly cool for managing the lifecycle of a set of containers. Deployments allow a set of containers to be scaled up, scaled down, updated new new versions and rolled back to know working versions. All of these actions are performed in a staged fashion to ensure that a given service continues to function while the underlying infrastructure is changing. To oberve how this worked I wanted to be able to watch the logs from all of the pods in a deployment to observe this phenomenon live.
After a bit of searching I came across Johan Haleby's kubetail shell script. Kubetail allows you to tail the logs from a set of pods based on a label selector, context or container id. It also provides colored output with timestamps and you can utilize the "--since" option to control how far back to retrieve logs.
To show how useful this is let's spin up 5 pods using the kuard image discussed in Kubernetes: Up and Running (great book!):
$ kubectl run --replicas=5 --image=gcr.io/kuar-demo/kuard-amd64:1 kuard
deployment "kuard" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kuard-59f4bf4795-2nljr 1/1 Running 0 0s
kuard-59f4bf4795-8w99t 1/1 Running 0 0s
kuard-59f4bf4795-c8bnz 1/1 Running 0 0s
kuard-59f4bf4795-mgmcl 1/1 Running 0 0s
kuard-59f4bf4795-q9w9v 1/1 Running 0 0s
If I run kubetail with the argument "kuard" it will start tailing the logs from each pod:
$ kubetail kuard
Will tail 5 logs...
kuard-59f4bf4795-2nljr
kuard-59f4bf4795-8w99t
kuard-59f4bf4795-c8bnz
kuard-59f4bf4795-mgmcl
kuard-59f4bf4795-q9w9v
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:17 127.0.0.1:45940 GET /ready/api
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:17 127.0.0.1:45940 GET /ready/api
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:18 127.0.0.1:45940 GET /ready/api
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:19 127.0.0.1:45940 GET /ready/api
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:20 127.0.0.1:45940 GET /ready/api
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:21 127.0.0.1:45944 GET /
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:21 Loading template for index.html
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:21 127.0.0.1:45944 GET
/static/css/bootstrap.min.css
[kuard-59f4bf4795-2nljr] 2018/02/04 14:35:21 127.0.0.1:45946 GET
/built/bundle.js
This is a useful script but there is one downside. It doesn't pick up new containers as they are created. For that functionality you will need to use kail and stern.