【问题标题】:Why the multiple containers pod status is Completed even when one of the containers exit with error?为什么即使其中一个容器出现错误退出,多个容器的 pod 状态也是 Completed?
【发布时间】:2020-01-31 01:23:10
【问题描述】:

我有一个带有多个容器的 pod,其中一个 (containerA) 因错误退出:

Containers:
  containerA:
    ......
    State:          Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Fri, 27 Sep 2019 16:21:53 -0700
      Finished:     Fri, 27 Sep 2019 16:21:53 -0700
    Ready:          False
    Restart Count:  0

  containerB:
    ......
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Fri, 27 Sep 2019 16:21:54 -0700
      Finished:     Fri, 27 Sep 2019 16:21:59 -0700
    Ready:          False
    Restart Count:  0

  containerC:
    ......
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Fri, 27 Sep 2019 16:21:54 -0700
      Finished:     Fri, 27 Sep 2019 16:21:58 -0700
    Ready:          False
    Restart Count:  0

这个 pod 有 restartPolicy: Never。它由backoffLimit: 9 的作业控制。在所有尝试过程中,pod 状态显示为:

NAME                   READY   STATUS       RESTARTS   AGE
my-pod-2scsn           0/4     Completed    0          3d18h
my-pod-8z7qq           0/4     Completed    0          3d18h
my-pod-9cjnc           0/4     Completed    0          3d18h
my-pod-f6hxr           0/4     Completed    0          3d18h
my-pod-fz7hk           0/4     Completed    0          3d18h
.....

这个Completed 在这里令人困惑(其中一个容器因错误而退出)。为什么这里的 pod 状态是Completed

【问题讨论】:

    标签: kubernetes containers kubernetes-pod


    【解决方案1】:

    根据官方 Kubernetes documentationJob 认为一旦整个容器中的任何一个以非零退出代码退出或检测到某些资源超出限制,Pod 就会失败。由于这个事实,Pod phase 实际上是通用 Pod 生命周期的主要指标,告诉初始 Job 最新的 Pod 状态。

    但是,我观察到,kubectl get pod 输出 STATUS 列不显示 Pod 阶段状态,而是检索 Pod 内特定容器的值并使用 .status.containerStatuses.state.terminated.reason 字段显示 STATUS列数据。

    事实上,您甚至可以获得更多信息输出,为标准kubectl 命令行工具提供自定义列:

    $ kubectl get po -o=custom-columns=NAME:.metadata.name,PHASE:.status.phase,CONTAINERS:.spec.containers[*].name,STATUS:.status.containerStatuses[*].state.terminated.reason
    

    由于 Job 达到 backoffLimit: 9 计数,它将以 BackoffLimitExceeded 警告消息终止:

    警告 BackoffLimitExceeded 54m 作业控制器作业已达到 指定的退避限制

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 1970-01-01
      • 2021-07-09
      • 2021-07-13
      • 2017-08-20
      • 2022-08-24
      • 2018-03-15
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多