12
votes

Is there a way to check whether a pod status is in the completed state? I have a Pod that I only wanted to use once (where init containers didn't quite serve my purpose) and want to write a check to wait for Completed status.

I am able to get it for Running, Pending, but not for Completed.

Running:

[user@sandbox gcp_kubernetes_installation]$ kubectl get pods --field-selector=status.phase=Running -n mynamespace
NAME                                READY   STATUS    RESTARTS   AGE
mssql-deployment-795dfcf9f7-l2b44   1/1     Running   0          6m
data-load-pod    1/1     Running   0          5m

Pending:

[user@sandbox gcp_kubernetes_installation]$ kubectl get pods --field-selector=status.phase=Pending -n mynamespace
NAME                    READY   STATUS    RESTARTS   AGE
app-deployment-0   0/1     Pending   0          5m

Completed:

[user@sandbox gcp_kubernetes_installation]$ kubectl get pod -n namespace
NAME                                READY   STATUS      RESTARTS   AGE
mssql-deployment-795dfcf9f7-l2b44   1/1     Running     0          11m
data-load-data-load-pod    0/1     Completed   0          10m
app-deployment-0               0/1     Pending     0          10m
[user@sandbox gcp_kubernetes_installation]$ kubectl get pods --field-selector=status.phase=Completed -n namespace
No resources found.

I believe there may be a bug in the field-selector, but just wondering if there are any fixes or details on a workaround.

1
I think that the best option is to use a Job controller instead of a bare pod, and use kubectl wait to wait for the Job complete condition. Take a look at this answer.Eduardo Baitello

1 Answers

13
votes

The correct status.phase for completed pods is Succeeded.

So, to filter only completed pods, you should use this:
kubectl get pod --field-selector=status.phase=Succeeded

Although, the use of bare pods is not recommended. Consider using a Job Controller:

A Job creates one or more Pods and ensures that a specified number of them successfully terminate. As pods successfully complete, the Job tracks the successful completions.

You can check job conditions and wait for them with this:
kubectl wait --for=condition=complete job/myjob