Kubernetes 允许容器在不重启 pod 的情况下退出

Kubernetes allow container to exit without pod restart

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

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

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

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

通常,要防止 POD 重述使用 restartPolicy: Never (more on Restart Policy)。

此外,对于您想要 运行 "to completion" 的东西,请使用名为 Job (more on Job) 的 k8s 组件:

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

到运行作业直到第一次成功(即exit code 0)设置restartPolicy: OnFailure.

a node container that performs a build process and doesn't need to stay up once the static files have been built

这听起来很像 init container 的定义:"They always run to completion. Each one must run successfully before the next one is started."

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

如果你真的是"building"某种意义上的东西运行宁宁像 Webpack 这样主要生成静态文件的工具,最好还是把这个过程移到 Dockerfile 中,这样你就可以运行 部署时未进行更多构建的未修改映像。