Kubernetes Jobs 中的 Sidecar 容器?

Posted

技术标签:

【中文标题】Kubernetes Jobs 中的 Sidecar 容器?【英文标题】:Sidecar containers in Kubernetes Jobs? 【发布时间】:2016-07-12 12:24:44 【问题描述】:

我们在这里使用 Kubernetes Jobs 进行大量批处理计算,我想为每个作业配备一个监控边车,以便根据作业的进度更新集中式跟踪系统。

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

我还是试了一下(alpine sidecar 每 1 秒打印一次“hello”),在我的主要任务完成后,Jobs 在 Kubernetes 1.2 中被认为是 Successfulkubectl get pods .0 显示:

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

然后GETing 作业的 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

所以看起来我的 sidecar 需要监视主进程(如何?),一旦它检测到它单独在 pod 中,它就会优雅地退出?如果这是正确的,那么是否有最佳实践/模式(边车是否应该以主容器的返回码退出?但它是如何得到的?)?

** 更新 ** 经过进一步的实验,我还发现了以下内容: 如果一个 pod 中有两个容器,那么直到 pod 中的所有容器都返回退出代码为 0 时才被认为是成功的。

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

【问题讨论】:

这绝不是一个优雅的解决方案,但我认为你可以在你的 Sidecar 上设置一个 liveness probe 来实际探测主容器。然后,当主容器宕机时,探测会失败,kubelet 会杀死 sidecar。 【参考方案1】:

您可以使用downward api 从 sidecar 中找出您自己的 podname,然后从 apiserver 检索您自己的 pod 以查找存在状态。让我知道这是怎么回事。

【讨论】:

@JKnight 怎么样了? @JKnight 据我所知,向下 API 不会公开容器状态。您介意分享有关您如何实施此解决方案的更多详细信息吗? @JKnight 该链接返回 404。kyocum/disdat 存储库不存在。 @Adrian 现在可能有点晚了,但是 Kubernetes 通过/var/secrets/https://kubernetes.default/ 公开了API information。所以基本上,你可以通过向下的 API 将 pod 的命名空间和名称暴露给容器,然后与 Kubernetes API 接口查询其他容器的状态。 访问 k8s api 与此处描述的类似:***.com/questions/30690186/…

以上是关于Kubernetes Jobs 中的 Sidecar 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动删除由 CronJob 创建的已完成 Kubernetes 作业?

Kubernetes - 作业调度 API

kubernetes 1.14安装部署dashboard

kubernetes(k8s)Gitlab CI Runner 的安装

从 JOBS 中的包调用过程

如何将参数传递给 Play 中的 Jobs!框架 1.2.x?