Kubernetes允许容器退出而无需重启pod

时间:2018-11-15 16:15:55

标签: docker kubernetes docker-compose containers devops

我在docker上看到的一个相当普遍的设置是让容器旋转起来执行任务,然后退出。 这是我在docker-compose上经常执行的操作,其中我有一个节点容器来执行构建过程,并且在构建了静态文件后不需要保持运行。 在这些情况下,如果我查看docker-compose ps的输出,而我的其他容器处于打开状态并暴露在端口上,则节点容器的状态将为“退出0”。 尽管在其他情况下如果我需要访问此容器,则它处于休眠状态,可以将其旋转。

将此设置转换为Kubernetes的好习惯是什么?

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

该容器是否应移至另一个无法重启的容器中?似乎这样会使部署不必要地复杂化。

2 个答案:

答案 0 :(得分:5)

通常,为了防止POD重新使用restartPolicy: Nevermore on Restart Policy)。

此外,对于要“完成”运行的事物,请使用名为Jobmore on Job)的k8s组件:

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

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

答案 1 :(得分:4)

  

一个执行构建过程的节点容器,一旦构建了静态文件,则无需保持运行状态

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

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

如果您实际上是在运行诸如Webpack之类的工具来“构建”某种东西,该工具主要生成静态文件,那么最好还是将此过程移到Dockerfile中,这样您就可以运行未修改的映像而无需进行更多构建在部署时。