Kubernetes 协调CI系统中的作业容器和卷

Kubernetes 协调CI系统中的作业容器和卷,kubernetes,Kubernetes,我正在开发一个基于tinker Kubernetes的CI系统,每个构建都作为一个作业启动。我运行这些与Drone CI非常相似,因为构建中的每个步骤都是一个单独的容器。在我的k8s CI案例中,我将每个步骤作为作业舱中的容器运行。以下是我所追求的行为: 将创建生成卷。所有步骤都将安装此。一份工作被解雇了 关闭所有定义为单独容器的步骤,顺序为 期望的执行 git步骤(容器)运行,装载共享卷并进行克隆 消息来源 “运行测试”步骤将共享卷装载到生成的容器中 来自预安装了所有依赖项的映像 如果我们的测

我正在开发一个基于tinker Kubernetes的CI系统,每个构建都作为一个作业启动。我运行这些与Drone CI非常相似,因为构建中的每个步骤都是一个单独的容器。在我的k8s CI案例中,我将每个步骤作为作业舱中的容器运行。以下是我所追求的行为:

  • 将创建生成卷。所有步骤都将安装此。一份工作被解雇了 关闭所有定义为单独容器的步骤,顺序为 期望的执行
  • git步骤(容器)运行,装载共享卷并进行克隆 消息来源
  • “运行测试”步骤将共享卷装载到生成的容器中 来自预安装了所有依赖项的映像
  • 如果我们的测试通过,我们将进入松弛公告步骤,即 另一个容器,宣告我们的成功
  • 我目前正在使用一个带有emptyDir卷的单一作业吊舱来共享构建空间。我这样做是为了在卷在节点/吊舱之间移动时不必等待。这似乎也是一种很好的方法,可以确保在构建退出时自动清理内容

    问题是,如果我使用上述所有步骤启动一个多容器作业,它们将同时执行。这意味着“运行测试”步骤可能在“git”步骤之前启动

    我曾经考虑过在每个容器中使用某种逻辑来休眠,直到共享卷中出现某个解锁/“我完成了!”文件,表示依赖步骤已经完成,但这似乎非常复杂,需要在继续之前询问其他选项

    我可以看到在协调作业中让步并使用多个作业,但随后我陷入了批量索赔领域(这比emptyDir复杂得多)

    总结问题:

    我当前的方法值得追求吗?如果是,如何对作业的容器排序?我希望能想出一些能在AWS/GCE和裸机部署上工作的方法

    我不太愿意接触PVC,因为管理和清理部分不是我希望我的系统负责的。我也不希望在emptyDir可以很好地工作时需要网络存储


    编辑:请不要建议使用其他现有CI系统,因为这没有帮助。我这样做是为了我自己的满足和实验。这个tinker CI系统不太可能是我的玩具。

    如果您希望所有构建步骤都在容器中运行,或者可能更适合您。我没有这方面的经验,但建议它也会起作用

    一旦您开始变得足够复杂,以至于需要在容器之间发送信号来订购构建步骤,那么使用一些预编译的东西就会变得更加高效

    作为一个选项,您可以使用一个静态卷(即a)作为工件缓存,并从当前容器中依次触发下一个容器,在两个阶段之间装载相同的卷。然后您可以只在构建的开始或结束添加一个步骤,以便在管道运行后“清理”


    需要明确的是:我不认为滚动您自己的CI是处理这一问题的最有效方法,因为已经有了一些系统,它们可以完全满足您的需要

    如果您希望所有的构建步骤都在容器中运行,或者可能更适合您。我没有经验,但是sugge我相信它也会起作用

    一旦您开始变得足够复杂,以至于需要在容器之间发送信号来订购构建步骤,那么使用一些预编译的东西就会变得更加高效

    作为一个选项,您可以使用一个静态卷(即a)作为工件缓存,并从当前容器中依次触发下一个容器,在两个阶段之间装载相同的卷。然后您可以只在构建的开始或结束添加一个步骤,以便在管道运行后“清理”


    说得很清楚:我不认为滚动您自己的CI是处理这一问题的最有效方法,因为已经有系统可以完全满足您的需求

    只是好奇一下,如果您看一下的话。听起来您试图实现的一切都是在那里编码的。可能没有直接使用它他们的一些与CI/CD相关的例子可以给你一些如何实现你想要做的事情的想法?看起来他们使用Jenkins来完成这类事情,而不是直接使用Kubernetes,所以可能不是。不过这是一个好主意!有一种方法可以使用k8s设置Jenkins。请看我正在用Kubernetes直接编写一个玩具CI系统。这意味着不使用Jenkins、fabric8或除直接Kubernetes之外的任何东西。主要是为了咯咯地笑,看看事情会如何映射。我想说的是,你对CI采取了一种非正统的方法。我犹豫着回答,因为总是有100种方法可以做一件事,但我可以肯定的是,你使用文件标志来同步容器的想法我It’不好。想把每一步都放在不同的容器中,背后的原因是什么?这听起来比什么都麻烦。如果你看一看,我很好奇。听起来你想要实现的一切都是在那里编码的。如果不直接使用,也许他们的一些与CI/CD相关的示例可以给你一些如何实现你想要做的事情的想法?看起来他们使用Jenkins来完成这类事情,而不是直接使用Kubernetes,所以可能不是。这是一个好主意!有一种方法可以使用k8s设置Jenkins。请看,我正在用Kubernetes直接编写一个玩具CI系统。这意味着不使用Jenkins、fabric8或其他任何东西而不是直接的库伯内特。主要是为了咯咯地笑,看看事情会发展到什么程度。我要说的是,你对CI采取了一种非正统的方法。我不太愿意回答,因为总有100种方法可以做一件事,但我不想做