【问题标题】:"Sidecar" containers in Kubernetes podsKubernetes pod 中的“Sidecar”容器
【发布时间】:2016-07-26 22:04:46
【问题描述】:

我想要一个包含几个组件的多容器 pod:

  • 包含构建作业的“主”容器
  • 一个包含 HTTP 代理的“sidecar”容器,供“main”容器使用

这似乎很符合described in the Kubernetes documentation 的吊舱设计理念,但我相信只要“边车”运行,吊舱就会保持活力。就我而言,“主要”容器的寿命并不长。一旦它退出,“sidecar”应该被终止。

我怎样才能做到这一点?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    只要其中一个容器在运行,一个 pod 就在运行。如果您需要他们一起退出,您必须安排边车死亡。我们没有生命周期中“主要”与“次要”容器的概念,尽管这很有趣。

    一种选择是使用 emptyDir 卷并编写一个文件告诉边车“该走了”。 Sidecar 会在看到该文件时退出。

    【讨论】:

    • 在我的情况下,问题是边车不是完全在我的控制之下——它是来自第三方的服务(封闭源),所以我不知道如何安排这项服务除非可以向其进程发送信号,否则停止。
    • 一种常见的模式是将此容器用作您自己的镜像(dockerfile FROM)的基础镜像。添加一个脚本并将入口点更改为该脚本,然后执行以下操作:在后台运行“真实”应用程序,而文件 /pod/exit-now 不存在,休眠 3 秒;环形;杀死真正的应用程序
    • 另外,还有一个新的 KEP 可以教 k8s 关于“主”容器的知识。我还没有审查过它,但有一个明确的需要。
    • 好主意,谢谢分享。我最终得到了类似的东西——打开了共享进程命名空间,然后“worker”容器将 SIGTERM 发送到我无法控制的另一个容器(但是,这并没有完全解决我的问题,导致收到 SIGTERM 的应用程序以非零代码退出,并且拥有该 pod 的作业处于某种奇怪的状态 [我现在不记得确切是哪个 ATM])。
    【解决方案2】:

    对于仍在寻找答案的任何人,sidecar 功能正在开发中,应该在 Kubernetes 的 v1.17 中推出,它将具有这种确切的请求行为。

    来自提案:

    一行增强说明:容器现在可以标记为边车,以便它们在正常容器之前启动并在所有其他容器终止后关闭。

    https://github.com/kubernetes/enhancements/issues/753

    更新:看起来它现在计划用于 v1.18

    【讨论】:

      【解决方案3】:

      您是否考虑过使用http://kubernetes.io/docs/user-guide/jobs/ 资源?

      【讨论】:

      • 是的,这些 pod 正在作业下运行。但我认为只要“sidecar”容器保持运行,工作就会继续运行。
      【解决方案4】:

      当问题被问到时,该功能可能不可用,但现在可以为 pod 定义 postStart 和 preStop 处理程序。你可以在你的主容器中定义 preStop 来杀死 sidecar 容器。

      【讨论】:

        【解决方案5】:

        您可以使用活性探针来帮助解决此问题。探针检查“主”容器(以及它自己的任何检查)。一旦主容器宕机,liveness probe 就会失败,此时 pod 应该被回收。

        【讨论】:

        • 但是请记住,它会将 pod 标记为失败,以防这是您设置中的一个因素
        猜你喜欢
        • 2017-05-31
        • 1970-01-01
        • 2016-07-12
        • 2021-02-26
        • 2020-05-12
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 2017-08-25
        相关资源
        最近更新 更多