kubectl status.相位=运行返回错误结果



当我运行:

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-2Pod处于Failed阶段。在app-1Pod中仍有一个容器在运行,因此该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

最新更新