如何根据状态为 ImagePullBackOff 使用 kubectl 和过滤器查看 pod?

Chr*_*ski 9 kubernetes kubectl

我想做一个kubectl get pods并过滤 pod 处于ImagePullBackOff.

我试过了kubectl get pods --field-selector=status.phase=waitingkubectl get pods --field-selector=status.phase=ImagePullBackOff但没有返回任何结果。

我查看了 JSON 输出-o json

...
            {
                "image": "zzzzzzzzzzzzzzzz",
                "imageID": "",
                "lastState": {},
                "name": "nginx",
                "ready": false,
                "restartCount": 0,
                "state": {
                    "waiting": {
                        "message": "Back-off pulling image \"zzzzzzzzzzzzzzzz\"",
                        "reason": "ImagePullBackOff"
                    }
                }
            }
...
Run Code Online (Sandbox Code Playgroud)

如果我尝试定位该值:

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
Run Code Online (Sandbox Code Playgroud)

Ego*_*kio 8

使用json输出和管道通过jq

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

最后一个块|.metadata.name意味着它将列出 pod 名称而不是整个结构。

  • 这是 jq 的一个令人印象深刻的使用!谢谢你! (2认同)

Vit*_*Vit 6

您可以使用以下命令:

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
Run Code Online (Sandbox Code Playgroud)

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

根据官方文档字段选择器文档

Pod 的 status 字段是一个 PodStatus 对象,它有一个 phase 字段。

以下是相位的可能值:

  • 待办的
  • 跑步
  • 成功
  • 失败的
  • 未知

所以使用自定义列输出。