Kubernetes Jobs中的辅助容器是什么?

36

我们在这里使用 Kubernetes Job 来进行大量批处理计算,我想为每个 Job 添加一个监控 sidecar,以便将作业进度更新到集中式跟踪系统中。

唯一的问题是,我无法弄清楚 Job 中多个容器的语义(或应该是什么)。

我还是尝试了一下(使用一个每秒打印“hello”的 alpine sidecar ),在我的主要任务完成后,Job 被认为是 Successful ,Kubernetes 1.2.0 中的 kubectl get pods 显示:

NAME                                         READY     STATUS      RESTARTS   AGE
    job-69541b2b2c0189ba82529830fe6064bd-ddt2b   1/2       Completed   0          4m
    job-c53e78aee371403fe5d479ef69485a3d-4qtli   1/2       Completed   0          4m
    job-df9a48b2fc89c75d50b298a43ca2c8d3-9r0te   1/2       Completed   0          4m
    job-e98fb7df5e78fc3ccd5add85f8825471-eghtw   1/2       Completed   0          4m

如果我描述其中一个豆荚

State:              Terminated
  Reason:           Completed
  Exit Code:        0
  Started:          Thu, 24 Mar 2016 11:59:19 -0700
  Finished:         Thu, 24 Mar 2016 11:59:21 -0700

然后GET工作的yaml会显示每个容器的信息:

  status:
    conditions:
    - lastProbeTime: null
      lastTransitionTime: 2016-03-24T18:59:29Z
      message: 'containers with unready status: [pod-template]'
      reason: ContainersNotReady
      status: "False"
      type: Ready
    containerStatuses:
    - containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
      image: luigi-reduce:0.2
      imageID: docker://sha256:5a5e15390ef8e89a450dac7f85a9821fb86a33b1b7daeab9f116be252424db70
      lastState: {}
      name: pod-template
      ready: false
      restartCount: 0
      state:
        terminated:
          containerID: docker://333709ca66462b0e41f42f297fa36261aa81fc099741e425b7192fa7ef733937
          exitCode: 0
          finishedAt: 2016-03-24T18:59:30Z
          reason: Completed
          startedAt: 2016-03-24T18:59:29Z
    - containerID: docker://3d2b51436e435e0b887af92c420d175fafbeb8441753e378eb77d009a38b7e1e
      image: alpine
      imageID: docker://sha256:70c557e50ed630deed07cbb0dc4d28aa0f2a485cf7af124cc48f06bce83f784b
      lastState: {}
      name: sidecar
      ready: true
      restartCount: 0
      state:
        running:
          startedAt: 2016-03-24T18:59:31Z
    hostIP: 10.2.113.74
    phase: Running

看起来我的边车需要监视主进程(如何实现?)并在检测到它独自在Pod中时优雅退出?如果是这样的话,是否有最佳实践/模式(应该使用主容器的返回代码退出边车吗?但是如何获取这个代码?)?

**更新** 经过进一步实验,我还发现了以下内容: 如果一个Pod中有两个容器,则除非Pod中的所有容器都以退出代码0返回,否则该Pod将不被视为成功。

此外,如果在Pod规范上设置了restartPolicy: OnFailure,则任何以非零退出代码终止的Pod中的容器都将在相同的Pod中重新启动(这对于监视边车来计算重试次数并在一定数量后删除作业可能很有用(解决目前Kubernetes作业中没有最大重试次数的问题))。


1
这绝不是一种优雅的解决方案,但我认为您可以在您的 sidecar 上设置一个活动探针,实际上对主容器进行探测。然后,当主容器关闭时,探针将失败,kubelet 将终止 sidecar。 - Tim Allclair
1个回答

9
您可以使用向下API来确定在旁路器内的自己的Pod名称,然后从apiserver检索自己的Pod以查找存在状态。请告诉我您的进展情况。

1
@JKnight,就我所知,向下的API没有暴露容器状态。您能否分享一下您如何实现这个解决方案的更多细节? - Adrian
1
@JKnight 这个链接返回了404错误。kyocum/disdat仓库不存在。 - Adrian
抱歉,看来这个仓库仍然是私有的。一旦我们公开它,我会再次在这里通知您。 - JKnight
2
@Adrian 现在可能有点晚了,但是 Kubernetes 通过 /var/secrets/https://kubernetes.default/ 公开API信息。因此,基本上,您可以通过向下API将 pod 命名空间和名称暴露给容器,然后与 Kubernetes API 进行交互以查询其他容器的状态。 - ProgrammingLlama
1
访问k8s API的方式与此处描述的类似:https://dev59.com/9l0a5IYBdhLWcg3wHlil - eCeleritas
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接