在专用 Pod 上运行 Kubernetes cronjob

问题描述

我有一个 API 作为 Kubernetes 服务,我需要每小时在 API 中运行一个端点。 (大量统计计算,大约需要3-5分钟)

目前我使用curl直接调用端点:

containers:
- name: callout
    image: 'buildpack-deps:curl'
    args:
        - /bin/sh
        - '-ec'
        - 'curl http://api-service/v1/Stats/CalculateStats'

问题是任务被发送到服务,它最终在其中一个 pod 上。运行计算会使 Pod 保持忙碌,而来自普通用户通过前端的其他请求会变慢。

如何从具有更高 cpu 请求的同一 API 映像创建专用 Pod(因此它可以运行得更快)并在其上运行计算,然后移除 Pod 并在下一个计划中重复该过程?

谢谢

解决方法

这是我想到的:

  1. 为您的 cronjob 任务创建单独的部署。此部署与生产部署基本相同,但具有更高的 CPU 声明和(重要!)单独的标签。默认情况下将副本计数设置为 0。此部署可以在生产部署更新时更新,因此两个部署都运行相同版本的应用程序。
  2. 创建一个单独的服务,将所有 pod 绑定到 1 中新创建的标签。该服务不应公开(即互联网)。

在定时任务中:

  • 将 1. 中创建的部署扩展到 1
  • 等待部署的 pod 准备就绪
  • 执行curl命令
  • 将 1. 中创建的部署缩减回 0

这将确保仅在执行昂贵的请求时才消耗额外的资源。这种方法的一个缺点是,如果没有足够的资源可用,pod 的部署可能会失败,因此我们应该监控集群并在部署扩展时保留一些资源“准备好”。这可以完成,例如,通过 AWS 上的集群自动缩放器。缩放可能需要一些时间,因此 cronjob 应该能够处理这种延迟。

顺便说一句:我还建议通过公开的“昂贵操作”来保护/隐藏端点,这样任何用户都无法“意外”或出于恶意意图拆除生产部署。