自定义Kubernetes HPA算法

自定义Kubernetes HPA算法,kubernetes,Kubernetes,我正在尝试水平自动缩放工作负载,不仅通过自定义度量,而且还通过与所描述的算法不同的算法 这可能吗 2/如果不是,并且假设我不介意创建一个为我而不是为HPA执行自动缩放的容器,那么我应该调用什么API来执行与kubectl scale deployments/--replications=等效的操作 以下是用例: 1/工作负载使用队列中的单个请求,处理它们,完成后删除它处理的项目,并使用下一条消息 2/当有超过0条消息准备就绪时-我想放大到消息准备就绪的数量(或最大规模,如果它更大)。 当有0条消

我正在尝试水平自动缩放工作负载,不仅通过自定义度量,而且还通过与所描述的算法不同的算法

这可能吗

2/如果不是,并且假设我不介意创建一个为我而不是为HPA执行自动缩放的容器,那么我应该调用什么API来执行与
kubectl scale deployments/--replications=
等效的操作

以下是用例:

1/工作负载使用队列中的单个请求,处理它们,完成后删除它处理的项目,并使用下一条消息

2/当有超过0条消息准备就绪时-我想放大到消息准备就绪的数量(或最大规模,如果它更大)。 当有0条消息正在处理时-我希望缩小到0

将消息准备就绪/正在处理的消息发送到metrics服务器不是问题

通过“消息准备就绪”来扩展HPA也不是问题

但是

HPA算法逐渐扩展。。。 当我在队列中放置10个项目时——首先是4个,然后是8个,然后是10个

它也逐渐缩小,当它缩小时,它可以终止正在处理的pod,从而增加“准备就绪”并导致放大

如果我知道要调用的api,我会运行node.js代码(HPA的intead):

让desiredToSet=0;
if(!readyMessages&&!processingMessages){
//若我们并没有任何东西在队列中,并且所有的工人都完成了他们的工作,那个么我们可以缩减到最小
//我们喜欢它,而不是慢慢减少,因为这样我们就不会冒着杀死正在工作的工人的风险
desiredToSet=config.minDesired;
}
否则{
//消息已在队列中就绪,请将工作进程数增加到允许的最大值
desiredToSet=Math.max(Math.min(readyMessages+processingMessages,config.maxDesired),currentDeploymentReplicas);
}
//如果没有更改,发送更改请求没有意义
如果(desiredToSet!==currentDeploymentReplicas){
;
}
我认为这是不可能的。HPA控制器内置于Kubernetes中,我认为其算法无法扩展/替换

2) 是的,您可以创建一个自定义控制器,该控制器使用您自己的算法执行HPA的工作。要通过Kubernetes API上下扩展部署,您需要了解部署的细节

具体地说,要将部署扩展到新数量的副本,您需要发出以下请求:

PUT /apis/apps/v1/namespaces/{namespace}/deployments/{name}/scale

使用资源(包含所需的副本计数)作为主体参数,如API参考中所述。

听起来像我想要的:)谢谢。我正在考虑从中使用readNamespacedDeploymentScale()和replaceNamespacedDeploymentScale(),而不是用纯http请求重新发明轮子。在这样做的时候,我应该注意哪些提示/事项?当然,如果Kubernetes客户端库提供了相应的功能,那么您应该使用它们。我认为没有什么特别的考虑,这些功能只是在引擎盖下进行HTTP请求。也许认为原始的HPA算法确保了缩放操作之间的最小延迟,以防止“敲击”,即过于频繁的反对缩放操作,见最后注意:我使用上面提到的KubNeNETs客户端JavaScript lib来结束,由于它节省了大量设置对kubernetes.default的请求的代码,而这些请求不会因不良信誉等而引发。对于在启用rbac的集群中使用此功能的用户,需要注意的一点是:不要忘记添加角色、serviceAccount、roleBinding,并将部署与服务帐户相关联。
PUT /apis/apps/v1/namespaces/{namespace}/deployments/{name}/scale