使用 Kubernetes 运行和平衡批处理作业

使用 Kubernetes 运行和平衡批处理作业

我有一个应用程序。它可以生成 CSV 文件。它包括:

  • Mysql 数据库。
  • 消息队列。
  • 一些协调服务。
  • 一组工作者服务。

我无法访问该应用程序的源代码,也无法更改它。

该应用程序在设计时并未考虑 Kubernetes,但尽管如此,Kubernetes StatefulSet 似乎很乐意容纳它。(这是我做出的假设,我愿意接受其他选择。)

无论如何,令我烦恼的是如何设置以下用例:

  1. 我希望能够创建一个作业,启动一个 StatefulSet,向它提交一些工作,收集 CSV 输出,然后关闭 StatefulSet。
  2. 我想要一些方法将集群上可运行的并发 StatefulSet 数量限制为可配置的数量(例如,maxsets=2 或类似的)。
  3. 我希望将超出(2)中资源限制的提交作业放入队列。

这些作业彼此完全独立,可以随时启动,并且作业的数量是无法预先知道的。

我相信 (1) 本身可以通过 Kubernetes 的“job”结构来处理。

因此我的问题是:处理 (2) 和 (3) 的方法有哪些

注意:应用程序的资源使用情况有点混乱,因此使用 CPU/MEM 或其他基本资源限制可能不够。

答案1

不清楚为什么步骤 1 中的作业会创建一个StatefulSet来执行某些操作,然后将其删除。这似乎违背了状态性的目的

如果应用程序不需要任何稳定的标识符或有序的部署、删除或扩展,则应使用提供一组无状态副本的控制器来部署应用程序。诸如 Deployment 或 ReplicaSet 之类的控制器可能更适合您的无状态需求。

除非问题中没有说明,否则在您的场景中似乎不需要StatefulSet,并且看起来Job更适合这种情况。

由于您愿意接受其他方法,因此这里提供一种方法:

总体而言,你似乎正在尝试创建源自其他资源集群,这些资源可能不具备您需要的一些约束(即限制StatefulSets集群中运行的数量)。

我建议不要在集群中生成新对象直接与 API 对话从集群外部创建所需的一切。

这种方法具有以下优点:

  • 不受 Kubernetes 对象约束的约束
  • 集群中长时间运行的对象没有任何开销,它们只在需要时才创建
  • 代码是可版本化的(因此它可以遵循基础设施即代码范例)
  • 更容易与 CI/CD 工作流程集成
  • 如果使用,则支持多种语言

这当然需要你自己编写代码,而一个潜在的缺点可能与对象在任何操作触发后创建/部署所需的时间有关,并且可能在很大程度上取决于你的图像的大小和你的镜像拉取策略

总而言之,您可以将应用程序映像推送到您正在使用的任何存储库,并且每次需要运行新的批处理时,都可以通过 API 来创建所需的资源。

当然,这不需要以任何方式改变应用程序代码。

相关内容