Search code examples
kuberneteskubectl

Get pods in Kubernetes where all containers are "ready" in one line using kubectl


We have cluster with Istio and also Jenkins job to get "stable" pods, which uses this kubectl query:

kubectl get po -o=jsonpath="{range .items[?(@.status.containerStatuses[-1].ready==true)]}{.spec.containers[0].image}{'\\n'}{end}"
registry/my-proj/admin:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/bar:2.0.0.000123

This query fetches pods where last container (application) is ready, because we also have Istio sidecar containers. But here is tricky thing, it looks like array is built using alphabet, so if Istio container will be last - it fetches it as ready pod, because last container is ready.

I've tried to use go-template also, but the best thing I've managed to do

kubectl get po -o go-template='{{range .items}}{{range .status.containerStatuses}}{{if eq .ready true }}{{end}}{{end}}{{.metadata.name}}{{println}}{{end}}
registry/my-proj/admin:2.0.0.000123
registry/my-proj/admin:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/foo:2.0.0.000123
registry/my-proj/bar:2.0.0.000123

It fetches 2 times pods where 2 containers are ready and only 1 if 1 container is ready.

TL;DR;

I am looking for ultimate query which can fetch pods where all containers are ready, thanks


Solution

  • Get all ready pods:

    kubectl get po -o go-template='{{ $readyFlag := true}}{{range .items}}{{range .status.containerStatuses}}{{ if not .ready}}{{ $readyFlag = false}}{{end}}{{end}}{{if $readyFlag }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}'
    

    Get all not ready pods:

    kubectl get po -o go-template='{{ $readyFlag := true}}{{range .items}}{{range .status.containerStatuses}}{{ if not .ready}}{{ $readyFlag = false}}{{end}}{{end}}{{if not $readyFlag }}{{.metadata.name}}{{"\n"}}{{end}}{{end}}'
    

    Implementation details:

    1. We define variable $readyFlag with initial value true
    2. We loop over all containers statuses and if its field ".ready" is not true - update our flag value to false
    3. In the end we just check if $readyFlag has value false - then at least one of checked containers had status not ready. If value true - then all containers was ready