![使用 Kubernetes 运行和平衡批处理作业](https://linux22.com/image/740994/%E4%BD%BF%E7%94%A8%20Kubernetes%20%E8%BF%90%E8%A1%8C%E5%92%8C%E5%B9%B3%E8%A1%A1%E6%89%B9%E5%A4%84%E7%90%86%E4%BD%9C%E4%B8%9A.png)
我有一个应用程序。它可以生成 CSV 文件。它包括:
- Mysql 数据库。
- 消息队列。
- 一些协调服务。
- 一组工作者服务。
我无法访问该应用程序的源代码,也无法更改它。
该应用程序在设计时并未考虑 Kubernetes,但尽管如此,Kubernetes StatefulSet 似乎很乐意容纳它。(这是我做出的假设,我愿意接受其他选择。)
无论如何,令我烦恼的是如何设置以下用例:
- 我希望能够创建一个作业,启动一个 StatefulSet,向它提交一些工作,收集 CSV 输出,然后关闭 StatefulSet。
- 我想要一些方法将集群上可运行的并发 StatefulSet 数量限制为可配置的数量(例如,maxsets=2 或类似的)。
- 我希望将超出(2)中资源限制的提交作业放入队列。
这些作业彼此完全独立,可以随时启动,并且作业的数量是无法预先知道的。
我相信 (1) 本身可以通过 Kubernetes 的“job”结构来处理。
因此我的问题是:处理 (2) 和 (3) 的方法有哪些?
注意:应用程序的资源使用情况有点混乱,因此使用 CPU/MEM 或其他基本资源限制可能不够。
答案1
不清楚为什么步骤 1 中的作业会创建一个StatefulSet
来执行某些操作,然后将其删除。这似乎违背了状态性的目的:
如果应用程序不需要任何稳定的标识符或有序的部署、删除或扩展,则应使用提供一组无状态副本的控制器来部署应用程序。诸如 Deployment 或 ReplicaSet 之类的控制器可能更适合您的无状态需求。
除非问题中没有说明,否则在您的场景中似乎不需要StatefulSet
,并且看起来Job
更适合这种情况。
由于您愿意接受其他方法,因此这里提供一种方法:
总体而言,你似乎正在尝试创建源自其他资源集群,这些资源可能不具备您需要的一些约束(即限制StatefulSets
集群中运行的数量)。
我建议不要在集群中生成新对象直接与 API 对话从集群外部创建所需的一切。
这种方法具有以下优点:
- 不受 Kubernetes 对象约束的约束
- 集群中长时间运行的对象没有任何开销,它们只在需要时才创建
- 代码是可版本化的(因此它可以遵循基础设施即代码范例)
- 更容易与 CI/CD 工作流程集成
- 如果使用,则支持多种语言
这当然需要你自己编写代码,而一个潜在的缺点可能与对象在任何操作触发后创建/部署所需的时间有关,并且可能在很大程度上取决于你的图像的大小和你的镜像拉取策略。
总而言之,您可以将应用程序映像推送到您正在使用的任何存储库,并且每次需要运行新的批处理时,都可以通过 API 来创建所需的资源。
当然,这不需要以任何方式改变应用程序代码。