[英]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
对象:
以声明方式创建自动缩放器
我们可以使用以下文件以声明方式创建它,而不是使用
kubectl autoscale
命令命令性地创建 HorizontalPodAutoscaler:
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
命令式方法,即通过调用kubectl autoscale
命令:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=5
第一种方法没有为进一步解释留下太多空间。 语法是严格指定的,您对此无能为力。 正如你所看到的,我们的缩放目标的kind
和name
都应该被指定,虽然你的伪代码看起来是一个有趣的提议,但它没有机会工作。 根据规范, 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。 所以HorizontalPodAutoscaler
和Deployment
/ ReplicationController
/ ReplicaSet
之间的ReplicaSet
关系是非常有意义的。 您通常需要的是更精细的控制级别,而不是通过一个巨大的通用对象来管理所有内容的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.