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



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

将此设置转换为Kubernetes的好方法是什么?

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

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

通常,为了防止POD重新启动,请使用restartPolicy: Never(有关重新启动策略的详细信息(。

此外,对于你想"完成"运行的东西,使用名为Job的k8s组件(更多关于Job(:

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

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

一个节点容器,它执行构建过程,并且在构建静态文件后不需要停留

这听起来正是init容器的定义:"它们总是运行到完成。每一个都必须成功运行,然后才能启动下一个。">

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

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

最新更新