【问题标题】:Kubernetes container crashKubernetes 容器崩溃
【发布时间】:2022-01-02 18:22:51
【问题描述】:

我有一个部署 YAML 文件,我在一个 pod 中有 4 个不同的容器。 我想在其中一个容器崩溃时执行此操作,然后我想重新启动 pod。

现在当容器崩溃时,只有那个容器重新启动,但我想重新启动所有容器

【问题讨论】:

  • 相关的,如果不是重复的question。 TL;开箱即用不支持 DR
  • 有点相关,但我不使用 initContainers
  • 这与你是否使用 init 容器无关。

标签: kubernetes kubernetes-pod


【解决方案1】:

Deployment 无法做到这一点,但您可以滥用 Job 和 Never 的 restartPolicy 来实现它。但这是一种 hack,而且绝对违反了最佳做法。如果任何其他容器发生故障,它将要求每个容器人为地失败:

  1. 使用 restartPolicy 为 Never 的 Job 而不是 Deployment
  2. 让每个容器定期向某个共享位置写入一些“我还活着”消息,例如在 Pod 中的所有容器之间共享的 emptyDir 卷
  3. 让每个容器监视所有其他容器的“我还活着”消息,当一个容器丢失时(这意味着这个容器崩溃了),然后故意让这个容器崩溃(例如exit 1

这样做的效果是,当一个容器崩溃时,所有容器都会崩溃。当所有容器崩溃时,Pod 被声明为Failed,并且 Job Controller 重新启动整个 Pod。

但是请注意,每次重新启动都计入 Job 的 backoffLimit,因此当达到此限制时,Job 将被声明为失败,并且 Pod 将不再重新启动。另请注意,这仅在 Job 中的 Pod 模板的 restartPolicy 为 Never 时才有效,因为使用 OnFailure(请参阅docs),失败的容器会立即重新启动,并且每次容器重新启动都计入 Job 的 backoffLimit(请参阅docs)。

如上所述,这是对 Job 应该做的事情的滥用,因此我不建议在生产或任何严重的工作负载中使用它。但它可能会让你做你想做的事情。

【讨论】:

    【解决方案2】:

    您可以在每个容器上使用 preStop 钩子向其他容器发送消息以关闭,这将重新启动这些容器。它与重新启动 pod 不同,但可能对您的用例有所帮助

    【讨论】:

    • 这仅在容器通过 Kubernetes API 或 Kubernetes 管理事件终止时有效,但在容器自行崩溃时无效,因为在这些情况下不会执行 preStop 处理程序(请参阅docs )。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2016-06-02
    • 2021-12-23
    • 2020-05-10
    • 2022-10-13
    • 2016-04-23
    相关资源
    最近更新 更多