繁体   English   中英

批量水平 Pod 自动缩放

[英]Batch horizontal pod autoscaling

查看HPA (对此很新),我正在处理的用例是将相同的 HPA 规则应用于所有部署(在特定命名空间中)。

所以我理想地想要实现这样的东西:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: generalHpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: [deploymentObject1, deploymentObject2, deploymentObject3,...]
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

我希望通过标签/选择器来处理这个问题,而所有部署对象都标有特定标签(例如enableHpa ),并以某种方式使用HorizontalPodAutoscaler选择器/macthLabels 将其应用于所有这些对象。 但看起来name是必需的,并且需要针对特定​​的部署对象。

关于如何处理这种情况并避免按名称为每个deployment一个一个地创建hpa的任何建议?

有两种方法可以设置新的HorizontalPodAutoscaler对象:

  1. 此处描述的声明性方法:

以声明方式创建自动缩放器

我们可以使用以下文件以声明方式创建它,而不是使用kubectl autoscale命令命令性地创建 Horizo​​ntalPodAutoscaler:

application/hpa/php-apache.yaml

 apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: php-apache spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache minReplicas: 1 maxReplicas: 10 targetCPUUtilizationPercentage: 50

我们将通过执行以下命令来创建自动缩放器:

 kubectl create -f https://k8s.io/examples/application/hpa/php-apache.yaml
  1. 命令式方法,即通过调用kubectl autoscale命令

     kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=5

第一种方法没有为进一步解释留下太多空间。 语法是严格指定的,您对此无能为力。 正如你所看到的,我们的缩放目标的kindname都应该被指定,虽然你的伪代码看起来是一个有趣的提议,但它没有机会工作。 根据规范, name字段是一个地图/字典,并且在这种情况下根本不能使用列表

当涉及到命令式方法时,实际上您可以使用相当简单的bash 单行程序将其自动化,并使您的生活更轻松。 如果您有...比方说有 50 个不同的部署,并且您想autoscale扩展所有这些部署,它可以为您节省大量时间。

为简单起见,我只创建了 3 个不同的部署:

$ kubectl get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment-1   3/3     3            3           4m3s
nginx-deployment-2   3/3     3            3           3m58s
nginx-deployment-3   3/3     3            3           3m54s

为了不手动一一创建hpa ,我使用了如下单行bash脚本:

$ for i in $(kubectl get deployments -o jsonpath='{.items[*].metadata.name}');do kubectl autoscale deployment $i --cpu-percent=50 --min=1 --max=3; done

其结果是:

horizontalpodautoscaler.autoscaling/nginx-deployment-1 autoscaled
horizontalpodautoscaler.autoscaling/nginx-deployment-2 autoscaled
horizontalpodautoscaler.autoscaling/nginx-deployment-3 autoscaled

命令:

kubectl get deployments -o jsonpath='{.items[*].metadata.name}'

仅返回部署的名称,因此可以通过for循环轻松迭代它们。 请注意,我们这里仍然是 1 对 1 的关系。 一个Deployment正好对应一个HorizontalPodAutoscaler对象。 如果您还需要处理不同的namespaces ,可以进一步扩展该脚本。

回到您的具体要求,问题在于这种解决方案的合法性。 尽管通过一个HorizontalPodAutoscaler对象来管理所有Deployments似乎很诱人(一开始的工作量较少),但如果您仔细研究这种方法的所有潜在缺点,您可能会很快改变主意。 首先,这种解决方案的可扩展性不是很强。 事实上,它根本没有可扩展性。 想象一下,出于某种原因,您想要更改单个Deployment对象的targetCPUUtilizationPercentage 嗯……你有问题。 它由一个全局自动缩放器管理,您需要快速重新设计您的环境并创建一个单独的 hpa。 所以HorizontalPodAutoscalerDeployment / ReplicationController / ReplicaSet之间的ReplicaSet关系是非常有意义的。 您通常需要的是更精细的控制级别,而不是通过一个巨大的通用对象来管理所有内容的可能性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM