当我运行:
kubectl get pods --field-selector=status.phase=Running
我看到:
NAME READY STATUS RESTARTS AGE
k8s-fbd7b 2/2 Running 0 5m5s
testm-45gfg 1/2 Error 0 22h
我不明白为什么这个命令给我pod是在错误状态?根据K8S api,没有STATUS=Error
这样的东西
如何获取处于此错误状态的pod ?
当我运行:
kubectl get pods --field-selector=status.phase=Failed
它告诉我没有pod处于该状态。
使用kubectl get pods --field-selector=status.phase=Failed
命令显示Failed
阶段的所有pod。
Failed
表示Pod中的所有容器都已终止,并且至少有一个容器已在故障中终止(参见:Pod阶段):
Failed - Pod中的所有容器都已终止,并且至少有一个容器因失败而终止。也就是说,容器要么以非零状态退出,要么被系统终止。
在您的示例中,两个pod都处于Running
阶段,因为每个pod中至少有一个容器仍在运行:
Running - Pod已经绑定到一个节点,并且所有的容器都已经创建。至少有一个容器仍在运行,或正在启动或重新启动。
您可以使用以下命令查看Pods的当前阶段:
$ kubectl get pod -o=jsonpath='{range .items[*]}{.metadata.name}{"t"}{.status.phase}{"n"}{end}'
让我们来看看这个命令是如何工作的:
$ kubectl get pods
NAME READY STATUS
app-1 1/2 Error
app-2 0/1 Error
$ kubectl get pod -o=jsonpath='{range .items[*]}{.metadata.name}{"t"}{.status.phase}{"n"}{end}'
app-1 Running
app-2 Failed
可以看到,只有app-2
Pod处于Failed
阶段。在app-1
Pod中仍有一个容器在运行,因此该Pod处于Running
阶段。
要列出所有状态为Error
的pod,只需使用:
$ kubectl get pods -A | grep Error
default app-1 1/2 Error
default app-2 0/1 Error
另外,值得一提的是,您可以检查pod中所有容器的状态:
$ kubectl get pod -o=jsonpath='{range .items[*]}{.metadata.name}{"t"}{.status.containerStatuses[*].state}{"n"}{end}'
app-1 {"terminated":{"containerID":"containerd://f208e2a1ff08c5ce2acf3a33da05603c1947107e398d2f5fbf6f35d8b273ac71","exitCode":2,"finishedAt":"2021-08-11T14:07:21Z","reason":"Error","startedAt":"2021-08-11T14:07:21Z"}} {"running":{"startedAt":"2021-08-11T14:07:21Z"}}
app-2 {"terminated":{"containerID":"containerd://7a66cbbf73985efaaf348ec2f7a14d8e5bf22f891bd655c4b64692005eb0439b","exitCode":2,"finishedAt":"2021-08-11T14:08:50Z","reason":"Error","startedAt":"2021-08-11T14:08:50Z"}}
您可以简单地使用
kubectl get pods --all-namespces | grep Error
从集群中删除所有错误pod
kubectl delete pod `kubectl get pods --namespace <yournamespace> | awk '$3 == "Error" {print $1}'` --namespace <yournamespace>
大多数Pod失败返回显式的错误状态,可以在status字段中观察到
错误:
您的pod崩溃了,它能够成功地调度节点,但之后崩溃了。要调试它,您可以使用不同的方法或命令
kubectl describe pod <Pod name > -n <Namespace>
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-pod-replication-controller/my-pod-is-crashing-or-otherwise-unhealthy
这是一个基于go-template
的过度尝试:
kubectl get pods -o go-template='{{range $index, $element := .items}}{{range .status.containerStatuses}}{{range .state }}{{if .reason }}{{if (eq .reason "Error") }}{{$element.metadata.name}} {{$element.metadata.namespace}}{{"n"}}{{end}}{{end}}{{end}}{{end}}{{end}}'
job1-stn45 default
My pod status:
k get pod
NAME READY STATUS RESTARTS AGE
foo 1/1 Running 1 2d11h
nginx-0 1/1 Running 3 5d10h
nginx-2 1/1 Running 3 5d10h
nginx-1 1/1 Running 3 5d10h
job1-stn45 0/1 Error 0 113m
update-test-27145740-82z7s 0/1 ImagePullBackOff 0 96m
update-test-27145500-7f2l9 0/1 ImagePullBackOff 0 5h36m