如何告诉 Knative Pod Autoscaler 不要杀死正在进行的长时间运行的 Pod

问题描述

我的目标: 实现一个每周运行一次的 cron 作业,我打算在 Knative 上实现这个拓扑以节省计算资源:

PingSource -> knative 服务

PingSource 将每周向 knative 服务发出一次虚拟事件,以启动 1 个 knative 服务 pod。 knative service pod 会得到海量的数据然后进行处理。

我的担忧: 如果我将 enable-scale-to-zero 设置为 true,即使 pod 尚未完成其工作,Knative pod 自动缩放器也可能会关闭 knative 服务 pod。

到目前为止,我探索了:

  • scale-to-zero-grace-period 可以配置为告诉自动缩放器在最后一次流量结束后应该等待多长时间来关闭 pod。但我不认为这种方法是微妙的。我更喜欢有点类似于 readinessProbe 或 livenessProbe。在发送终止信号之前,自动缩放器应该发送一个探测器来了解 Pod 是否正在处理某些事情。

  • 此外,根据 knative 的文档,有两种类型的事件接收器:可调用和可寻址。 Addressable 和 Callable 都返回响应或确认。在 pod 返回响应/确认之前,knative 自动缩放器是否会将 pod 视为处理请求?所以只要 pod 没有响应,它就不会被自动缩放器移除。

解决方法

Knative 自动缩放器依赖于严格以请求/响应方式工作的 pod。只要将“海量数据”作为 HTTP 请求(或 Websocket 会话、gRPC 会话等)的一部分进行处理,Pod 甚至不会被考虑删除。

发送请求,立即返回然后在后台处理数据是行不通的。自动缩放器会认为根本没有活动,因此将其关闭。不过,有一个 sandbox project 试图实现这种异步语义。