如何使用 kubectl 查看 pods 并根据 ImagePullBackOff 状态进行过滤?
How can I view pods with kubectl and filter based on having a status of ImagePullBackOff?
我想做一个 kubectl get pods
并过滤 pod 处于 ImagePullBackOff
状态的位置。
我试过 kubectl get pods --field-selector=status.phase=waiting
和 kubectl get pods --field-selector=status.phase=ImagePullBackOff
但 returns 没有结果。
我用 -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
您可以使用以下命令:
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 documentation and Field Selectors docs:
一个Pod的status字段是一个PodStatus对象,它有一个phase字段。
以下是相位的可能值:
- 待定
- 运行
- 成功
- 失败
- 未知
所以使用custom-columns输出。
正如您在 kubernetes 的官方文档中所见,
Supported field selectors vary by Kubernetes resource type. All resource types support the metadata.name and metadata.namespace fields. Using unsupported field selectors produces an error.
参考:https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/#supported-fields
你可以试试这个:
kubectl get pod --all-namespaces | grep "ImagePullBackOff" | awk '{print " -n " }' | xargs kubectl get pod -o json
或者:
kubectl get pod -o jsonpath='{.items[?(@.status.containerStatuses[*].state.waiting.reason=="ImagePullBackOff")].metadata.name}'
使用 json
输出和管道通过 jq
:
kubectl get pod -o=json | jq '.items[]|select(any( .status.containerStatuses[]; .state.waiting.reason=="ImagePullBackOff"))|.metadata.name'
Last chunk |.metadata.name
意味着它将列出 pod 名称而不是整个结构。
我想做一个 kubectl get pods
并过滤 pod 处于 ImagePullBackOff
状态的位置。
我试过 kubectl get pods --field-selector=status.phase=waiting
和 kubectl get pods --field-selector=status.phase=ImagePullBackOff
但 returns 没有结果。
我用 -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
您可以使用以下命令:
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 documentation and Field Selectors docs:
一个Pod的status字段是一个PodStatus对象,它有一个phase字段。
以下是相位的可能值:
- 待定
- 运行
- 成功
- 失败
- 未知
所以使用custom-columns输出。
正如您在 kubernetes 的官方文档中所见,
Supported field selectors vary by Kubernetes resource type. All resource types support the metadata.name and metadata.namespace fields. Using unsupported field selectors produces an error.
参考:https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/#supported-fields
你可以试试这个:
kubectl get pod --all-namespaces | grep "ImagePullBackOff" | awk '{print " -n " }' | xargs kubectl get pod -o json
或者:
kubectl get pod -o jsonpath='{.items[?(@.status.containerStatuses[*].state.waiting.reason=="ImagePullBackOff")].metadata.name}'
使用 json
输出和管道通过 jq
:
kubectl get pod -o=json | jq '.items[]|select(any( .status.containerStatuses[]; .state.waiting.reason=="ImagePullBackOff"))|.metadata.name'
Last chunk |.metadata.name
意味着它将列出 pod 名称而不是整个结构。