0

我的要求是在自定义指标上扩展 PODS,例如来自队列的待处理消息增加 pod 必须增加以处理作业。在 kubernetes 中,放大与 prometheus 适配器和 prometheus 运算符一起工作正常。

我在 pod 中运行了很长时间的进程,但是 HPA 检查自定义指标并尝试缩小,由于这个进程杀死了操作中间并丢失了该消息。我如何控制 HPA 只杀死没有进程运行的空闲 pod。

AdapterService 收集自定义指标

  • seriesQuery:'{namespace="default",service="hptest-service"}' 资源:覆盖:命名空间:资源:"namespace" 服务:资源:"service" 名称:匹配:"msg_consumergroup_lag" metricsQuery:'avg_over_time(msg_consumergroup_lag {topic="test",consumergroup="test"}[1m])'

HPA 配置

  • 类型:对象对象:描述对象:种类:服务名称:custommetric-service 指标:名称:msg_consumergroup_lag 目标:类型:值值:2
4

4 回答 4

1

目前,HPA 无法配置为适应这种性质的工作负载。HPA 只是根据扩展算法将部署上的副本数设置为所需的值,然后部署选择一个或多个 Pod 来终止。

在这个 Kubernetes issue中有很多关于这个主题的讨论,您可能会感兴趣。HPA 无法解决它,而且可能永远也不会。对于这种类型的工作负载,可能需要一种不同类型的自动缩放器。链接中提供了一些建议,可以帮助您定义其中之一。

如果我自己承担这个,我会创建一个新的控制器,对应的 CRD 包含一个作业定义和扩展需求。我不会扩展部署,而是让它启动工作。我会让工作完成他们的工作(处理队列),直到它们变得空闲(队列中没有项目)然后退出。控制器只会通过添加作业来扩大规模,而不会缩小规模。当队列为空时,作业本身将通过退出来缩小。

这将要求您的作业能够通过检查队列并在没有任何内容时退出来检测它们何时空闲。如果您的队列永远读取块,这将不起作用,您将需要不同的解决方案。

kubebuilder项目有一个很好的作业控制器示例。我将从这个开始,并通过检查您发布的指标并相应地开始工作的能力来扩展它。

另请参阅Kubernetes 文档中的使用工作队列进行精细并行处理。

于 2019-12-25T18:10:25.643 回答
0

I had similar use case to scale the deployments based on the queue length, I used KEDA (keda.sh), it does exactly that. Just know that it will scale down the additional pods created for that deployment even if the pod is currently processing the data/input - you will have to configure the cooldown parameter to scale down appropriately.

于 2021-07-04T10:45:36.080 回答
0

我将在这里提出建议和想法,您可以运行自定义脚本以在 HPA 扩展后立即禁用它,并且该脚本应继续检查资源和进程,当没有进程启用 HPA 和缩减时,或者使用 kubectl 命令杀死 pod 和启用 HPA。

于 2021-05-08T11:44:56.157 回答
0

KEDA ScaledJobs 最适合此类场景,可以通过 Queue、Storage 等触发(目前可用的 scaler 可以在这里找到)。ScaledJobs 在执行之间不会被杀死,建议用于长时间运行的执行。

于 2021-07-25T10:22:39.320 回答