微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

批处理水平吊舱自动缩放 以声明方式创建自动定标器

如何解决批处理水平吊舱自动缩放 以声明方式创建自动定标器

看看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中的选择器/ macthLabel将其应用于所有标签对象。 但是看来name是必需的,并且必须针对特定的部署对象。

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

解决方法

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

  1. 描述性方法here

以声明方式创建自动定标器

我们不必使用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 command

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

第一种方法并没有太多空间作进一步解释。语法是严格指定的,您不能做太多事情。如您所见,应同时指定我们的扩展目标kindname,尽管您的伪代码可能看起来像是一个有趣的建议,但它没有工作的机会。根据规范,name字段是地图/词典,而列表不能在这种情况下使用。

当涉及到命令式方法时,实际上,您可以使用相当简单的 bash one-liner 使它自动化,从而使您的生活更加轻松。如果您拥有...假设有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循环轻松地对其进行迭代。请注意,这里我们仍然具有一对一的关系。一个Deployment对象恰好对应一个HorizontalPodAutoscaler对象。如果您还需要处理其他namespaces,则可以进一步扩展脚本。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。