如何使用Kubernetes处理重复的短期任务

时间:2016-11-22 21:31:55

标签: kubernetes

我有一个使用webserver(NGINX)和基于反应的前端的设置,它使用webpack来构建最终的静态源。

网络服务器有自己的kubernetes deployment + service

在网络服务器可以提供静态html / js / css文件之前,需要构建前端 - 但在此之后,pod / container可以停止。

我的想法是在网络服务器和前端volume之间共享pod。前端会将生成的文件写入volume,网络服务器可以从那里为它们提供服务。只要对前端源代码进行更新,就需要重新生成文件。

使用kubernetes工具实现这一目标的最佳方法是什么? 现在,我正在使用init-container进行构建 - 但这会导致重新启动网络服务器pod,这不是必需的。

这是解决此问题的最佳/唯一解决方案,还是应该使用kubernetes' jobs执行此类任务?

2 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点。以下是我对此的看法:

选项1:静态文件代表内置源代码

在这种情况下,您要提供的静态文件实际上应该打包并构建到nginx webserver的docker镜像中(在html目录中说)。如果要更新前端,请更新所用映像的版本并更新窗格。

选项2:静态文件代表状态

在这种情况下,您的方法是正确的。你的状态' (像数据库一样)存储在一个文件夹中。然后运行初始化容器/作业以初始化状态'然后你的网络服务器pod工作正常。

我认为选项1更好有两个原因:

  1. 您可以通过增加pod副本号来轻松地水平扩展您的网络服务器。在选项2中,您实际上正在处理状态,以便在您想要向底层k8群集添加更多节点时出现问题(您必须将文件/文件夹从一个卷/文件夹复制到另一个)。
  2. 静态文件实际上是您应用的源代码。这些不是上传的媒体文件或类似文件。在这种情况下,将它们作为docker镜像的一部分绝对有意义。否则,它会破坏集装箱化和部署的优势。

答案 1 :(得分:1)

作业初始容器,或 gitRepo 类型的对您有用。

http://kubernetes.io/docs/user-guide/volumes/#gitrepo

在您的问题中,您不清楚为什么要更新静态内容而不是简单地重新部署/更新 Pod

从某个地方开始,你必须构建网络服务器Docker镜像,最好将静态内容构建到镜像中:部署后没有移动部件,不需要卷或存储。总的来说它更简单。

如果您使用任何类型的自动化工具进行Docker构建,那么这很简单。 我个人使用Jenkins基于git repo的钩子构建Docker镜像,只要代码发生变化,就可以重建和部署镜像。

运行作业初始容器并不会给您带来太多好处:确保Web服务器一直在运行,但它很容易拥有部署,滚动更新将部署新的 Pod ,然后旧服务器将被拆除,服务器也将一直处于启动状态。

保持简单......