如何基于状态为ImagePullBackOff的kubectl和滤镜查看吊舱?

时间:2019-07-26 14:35:26

标签: kubernetes kubectl

我想做一个kubectl get pods并过滤pod处于ImagePullBackOff状态的地方。

我尝试过kubectl get pods --field-selector=status.phase=waitingkubectl get pods --field-selector=status.phase=ImagePullBackOff,但是没有返回结果。

我用-o json看了JSON输出:

...
            {
                "image": "zzzzzzzzzzzzzzzz",
                "imageID": "",
                "lastState": {},
                "name": "nginx",
                "ready": false,
                "restartCount": 0,
                "state": {
                    "waiting": {
                        "message": "Back-off pulling image \"zzzzzzzzzzzzzzzz\"",
                        "reason": "ImagePullBackOff"
                    }
                }
            }
...

如果我尝试定位该值:

kubectl get pods --field-selector=state.waiting=ImagePullBackOff 
Error from server (BadRequest): Unable to find "/v1, Resource=pods" that match label selector "", field selector "state.waiting=ImagePullBackOff": field label not supported: state.waiting

3 个答案:

答案 0 :(得分:1)

您可以在下面使用命令:

kubectl get pods --all-namespaces -o custom-columns=NAMESPACE:metadata.namespace,POD:metadata.name,PodIP:status.podIP,STATE:status.containerStatuses[*].state.waiting.reason | grep ImagePullBackOff

顺便说一句:您的命令kubectl get pods --field-selector=state.waiting=ImagePullBackOff失败,因为kubernetes中没有state.waiting选择器。这就是为什么您看到field label not supported: state.waiting错误的原因。

根据official documentationField Selectors docs

Pod的状态字段是PodStatus对象,其中包含一个相位字段。

以下是相位的可能值:

  • 待处理
  • 跑步
  • 成功
  • 失败
  • 未知

因此,请使用custom-columns输出。

答案 1 :(得分:1)

如您在kubernetes的官方文档中所见,

  

受支持的字段选择器因Kubernetes资源类型而异。所有资源类型都支持metadata.name和metadata.namespace字段。使用不受支持的字段选择器会产生错误。

参考:https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/#supported-fields

您可以尝试以下方法:

kubectl get pod --all-namespaces | grep "ImagePullBackOff" | awk '{print $2 " -n " $1}' | xargs kubectl get pod -o json

或者:

kubectl get pod -o jsonpath='{.items[?(@.status.containerStatuses[*].state.waiting.reason=="ImagePullBackOff")].metadata.name}'

答案 2 :(得分:1)

使用json输出并通过jq进行管道传输:

kubectl get pod -o=json | jq '.items[]|select(any( .status.containerStatuses[]; .state.waiting.reason=="ImagePullBackOff"))|.metadata.name'

最后一块|.metadata.name表示它将列出pod名称,而不是整个结构。