【问题标题】:Kubernetes allow container to exit without pod restartKubernetes 允许容器在不重启 pod 的情况下退出
【发布时间】:2019-04-18 19:15:57
【问题描述】:

我看到的一个相当常见的 docker 设置是让容器启动执行任务然后退出。 这是我经常使用 docker-compose 做的事情,我有一个节点容器来执行构建过程,并且一旦构建了静态文件就不需要熬夜了。 在这些情况下,如果我查看docker-compose ps 输出,而我的其他容器已启动并暴露在端口上,节点容器状态将为“Exit 0”。 虽然如果我需要访问这个容器,它会处于休眠状态。

将此设置转换为 Kubernetes 的最佳做法是什么?

我最初的方法是将所有内容放在一个 pod 中,但容器退出会导致 CrashLoopBackOff 并且由于 pod 重启策略,pod 会不断重启。 如果我要保留此设置,我只希望在其他容器之一失败时重新启动 pod。它已经将构建静态文件移动到其他容器可以访问的卷中。

是否应该将此容器移动到另一个不会重新启动的 pod 中?似乎这会使部署变得不必要地复杂化。

【问题讨论】:

    标签: docker kubernetes docker-compose containers devops


    【解决方案1】:

    一般来说,为了防止 POD 重复使用 restartPolicy: Never (more on Restart Policy)。

    此外,对于您想要“完成”运行的东西,请使用名为 Job (more on Job) 的 k8s 组件:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: <job_name>
    spec:
      template:
        spec:
          containers:
          <...>
    

    要运行 Job 直到第一次成功(即exit code 0),请设置restartPolicy: OnFailure

    【讨论】:

    • 好的,谢谢。我最初尝试了“OnFailure”的重启策略,但这是在一个部署中,它是 ReplicaSet 的更高级别的 api,它只允许“始终”作为重启策略。通过在工作中隔离的容器,我已经实现了我想要的。
    【解决方案2】:

    一个执行构建过程的节点容器,一旦构建了静态文件就不需要熬夜

    这听起来就像 init container 的定义:“它们总是运行到完成。每个都必须在下一个开始之前成功运行。”

    在您的部署规范中,在 Pod 模板部分,您将有一个单独的 initContainers: 部分,其中包含单独的仅构建容器。它与包含主应用程序的containers: 部分具有完全相同的格式,但首先运行一次,直到完成一次。您可能需要在 Pod 的上下文中创建一个卷以与主容器共享内容,但这可能类似于 emptyDir: 类型的 pod,没有实际的持久存储。

    如果你真的在运行像 Webpack 这样主要生成静态文件的工具的意义上“构建”一些东西,最好还是把这个过程移到 Dockerfile 中,这样你就可以运行未修改的镜像而无需进行更多构建在部署时。

    【讨论】:

    • 啊,谢谢。我会让这个被接受,因为它似乎更准确地定义了我需要的东西,我认为它使 yaml 配置更加简洁。关于你的最后一部分,你是对的,这实际上就是我正在做的,尽管我没有在我的操作中这样描述它。它所做的“构建”过程只是移动一些已构建的静态文件,以通过您解释的卷使它们可用。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多