为什么即使其中一个容器错误退出,多个容器容器状态仍为“完成”?

时间:2019-10-01 17:59:51

标签: kubernetes containers kubernetes-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

此广告连播具有restartPolicy: Never。并且由backoffLimit: 9的Job控制。在所有尝试期间,广告连播状态显示为:

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在这里令人困惑(其中一个容器因错误退出)。为什么这里的广告连播状态为Completed

1 个答案:

答案 0 :(得分:0)

根据官方的Kubernetes documentation,一旦所有容器中的任何一个容器退出且退出代码为非零或检测到某些资源超出限制,Job就会将Pod视为失败。由于这个事实,就一般Pod生命周期而言,Pod phase实际上是主要指标,向初始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

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

  

警告BackoffLimit超过5400万个作业控制器作业已达到   指定的退避限制