自定义Kubernetes HPA算法

时间:2019-09-13 16:03:08

标签: kubernetes

我正在尝试不仅通过自定义指标而且通过与here所述算法不同的算法来水平自动缩放工作负载

1 /有可能吗?

2 /如果不是,并且假设我不介意创建一个为我而不是HPA进行自动缩放的容器,那么我应该调用什么API来完成kubectl scale deployments/<name> --replicas=<newDesired>的作用?

这是用例:

1 /工作负载只消耗一个队列中的单个请求,对其进行处理,完成后会删除它处理的项目,并消耗下一条消息。

2/2,当准备好多于0的消息时-我想扩大到准备好的消息数(或更大的最大比例)。 当有0条消息正在处理时-我想缩小为0。

准备好消息/将消息处理到度量服务器不是问题。

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

但是...

HPA算法逐渐扩展... 当我将10个项目放入队列时-首先是4,然后是8,然后是10。

它也逐渐缩小,缩小时可以终止正在处理的吊舱-这样就增加了“就绪”并导致放大。

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

    let desiredToSet = 0;
    if (!readyMessages && !processingMessages) {
      //if we have nothing in queue and all workers completed their work - we can scale down to minimum
      //we like it better than reducing slowly as this way we are not risking killing a worker that's working
      desiredToSet = config.minDesired;
    }
    else {
      //messages ready in the queue, increase number of workers up to max allowed
      desiredToSet = Math.max(Math.min(readyMessages + processingMessages, config.maxDesired), currentDeploymentReplicas);
    }
    //no point in sending a request to change, if nothing changed
    if (desiredToSet !== currentDeploymentReplicas) {
      <api to set desiredToSet of deployment to come here>;
    }

1 个答案:

答案 0 :(得分:3)

1)我认为不可能。 HPA控制器内置在Kubernetes中,我认为它的算法不能扩展/替换。

2)是,您可以创建一个自定义控制器,该控制器使用您自己的算法来完成HPA的工作。要通过Kubernetes API上下扩展部署,请manipulate the Scale sub-resource部署。

具体地,为了将Deployment扩展到新的副本数,请发出以下请求:

my_array = np.array([(0.9, 0.95), (0.8, 0.96)], dtype=[('score', np.float64), ('confidence', np.float64)])

print(my_array)

>>> array([(0.9, 0.95), (0.8, 0.96)],
      dtype=[('score', '<f8'), ('confidence', '<f8')])

print(my_array['score'])

>>> array([0.9, 0.8])

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