我的要求是按自定义指标扩展PODS,例如来自队列的待处理消息增加,必须增加pod才能处理作业。在kubernetes中,使用prometheus适配器和prometheus运算符可以很好地进行Scale up。
我在Pod中运行时间很长,但是HPA会检查自定义指标并尝试缩小规模,因为此过程会导致操作中断并丢失该消息。我如何控制HPA仅杀死没有进程正在运行的免费Pod。
答案 0 :(得分:1)
当前,无法将HPA配置为容纳这种性质的工作负载。 HPA只需根据伸缩算法将部署上的副本数设置为所需值,然后部署选择一个或多个Pod终止。
this Kubernetes issue中有许多关于此主题的讨论,您可能会感兴趣。 HPA不能解决它,而且可能永远也不能解决。对于这种类型的工作负载,可能需要使用其他类型的自动缩放器。链接中提供了一些建议,可以帮助您定义其中之一。
如果我自己考虑这一点,我将创建一个新的控制器,并使用相应的CRD包含作业定义和缩放要求。与其扩展部署,不如让它启动工作。我会让工作完成他们的工作(处理队列),直到它们变得空闲(队列中没有项目)然后退出。控制器只会通过添加作业来扩大规模,而永远不会缩减规模。当队列为空时,作业本身可以通过退出来缩小。
这将要求您的作业能够通过检查队列并退出(如果那里什么也没有)来检测它们何时变得空闲。如果您的队列永远无法读取,则将无法正常工作,您将需要其他解决方案。
kubebuilder project是工作控制器的一个很好的例子。我将从此开始,然后再扩展它以检查您发布的指标并相应地开始工作。
另请参见Kubernetes文档中的Fine Parallel Processing Using a Work Queue。
答案 1 :(得分:0)
我会在这里提出建议和想法,您可以运行自定义脚本以在扩展后立即禁用 HPA,并且脚本应继续检查资源和进程,当没有进程启用 HPA 并缩小时,或使用以下命令杀死 pod kubectl 命令并启用 HPA。
答案 2 :(得分:0)
我有类似的用例来根据队列长度扩展部署,我使用了 KEDA (keda.sh),它正是这样做的。只要知道它会缩减为该部署创建的额外 Pod,即使 Pod 当前正在处理数据/输入 - 您必须配置冷却参数以适当缩减。
答案 3 :(得分:0)