【问题标题】:kubectl status.phase=Running return wrong resultskubectl status.phase=运行返回错误结果
【发布时间】:2021-08-13 20:46:06
【问题描述】:

当我跑步时:

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。

【问题讨论】:

    标签: kubernetes kubectl


    【解决方案1】:

    使用kubectl get pods --field-selector=status.phase=Failed 命令可以显示Failed 阶段的所有Pod。

    Failed 表示 Pod 中的所有容器都已终止,并且至少有一个容器因故障而终止(参见:Pod phase):

    Failed - Pod 中的所有容器都已终止,并且至少有一个容器因故障而终止。也就是说,容器要么以非零状态退出,要么被系统终止。

    在您的示例中,两个 Pod 都处于 Running 阶段,因为每个 Pod 中至少有一个容器仍在运行。:

    正在运行 - Pod 已绑定到一个节点,并且所有容器都已创建。至少有一个容器仍在运行,或者正在启动或重新启动过程中。

    您可以使用以下命令检查 Pod 的当前阶段:

    $ 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
    

    另外值得一提的是,您可以检查 Pods 中所有容器的状态:

    $ 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"}}
    

    【讨论】:

    • 谢谢您提供的信息非常丰富,但尚未回答问题。 “我怎样才能只获取处于此错误状态的 pod?”在我的示例中,我只想获得 testm-45gfg
    • 我已经回答了这个问题。看一句:To list all pods with the Error status, you can simply use:
    • 这个状态栏完全是混乱的。基本上pod状态与pod无关。它只是报告一些容器的......状态或原因或......谁知道。
    【解决方案2】:

    您可以简单地使用 grep 错误 pod

    kubectl get pods --all-namespces | grep Error
    

    从集群中删除所有错误 pod

    kubectl delete pod `kubectl get pods --namespace <yournamespace> | awk '$3 == "Error" {print $1}'` --namespace <yournamespace>
    

    大多数 Pod 故障会返回可以在状态字段中观察到的显式错误状态

    错误:

    您的 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

    【讨论】:

      【解决方案3】:

      这是一个基于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
      

      我的 pod 状态:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-05-05
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多