是否可以为 Kubernetes 作业设置一个工作池以避免 pod 创建时间?

Is it possible to have a worker pool for Kubernetes Jobs to avoid pod creation time?

截至目前,我正在为特定的处理任务启动单独的 K8s 作业。其中一些任务需要大量 CPU/memory,但其他任务相当简单,可以通过内存处理轻松完成。由于 pod 创建时间的原因,与 运行 作为 K8s 作业相比,一个在内存中需要几毫秒的简单任务要慢得多。

我想知道是否有可能有类似工作池之类的东西专用于那些特定的 K8s 作业,这样强度较低的任务就不会产生 K8s 作业 pod 创建时间的开销。例如,如果我有 5 pods 个已经创建并空闲等待任务,它们可以快速接收传入的请求进行处理(无需等待 pod 启动)。如果这些 pods 不足以处理传入的任务量,理想情况下它们会自动缩放以适应更多处理。我找不到关于我正在尝试做的事情的明确文档,因此我们将不胜感激。谢谢!

没有 Kubernetes 的最小单元是 pod - 它要么直接启动(创建 pod),要么由其他资源控制,例如。复制集、工作、cronjob。

如果您的工作节点上已经存在映像,则创建 Pod 的时间应该相当短。您的工作人员是否因为自动缩放器而在每项工作后终止?我不确定您的用例到底是什么以及您会考虑什么启动时间 'small enough'。此外,这在很大程度上取决于不同的工作是否需要不同的环境 运行 in.

您可以部署队列服务(例如 RabbitMQ)并通过向该队列添加消息来创建任务,并部署监视这些队列的工作人员。有像 dramatiq 这样的框架可以使这变得非常容易,并负责所有队列处理。还有一些解决方案可以根据自定义指标进行 kubernetes 部署扩展,例如。 https://github.com/kedacore/keda ,如果作业堆积在队列中,这将涵盖自动缩放。

如果您不想自己编写代码,可以查看开源自动化服务器,例如。詹金斯。通常你会让 Jenkins 在你的集群中启动 pods,但你也可以添加一些立即执行作业的静态工作节点。 (自动缩放可能是该方法中的一个问题,但这绝对是可能的)