0

查看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),并以某种方式在内部使用选择器/macthLabelsHorizontalPodAutoscaler将其应用于所有这些对象。但它看起来name是必需的,并且需要针对特定​​的部署对象。

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

4

1 回答 1

0

有两种设置新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循环对其进行迭代。请注意,我们在这里仍然有一对一的关系。一个对象Deployment恰好对应一个HorizontalPodAutoscaler对象。如果你还需要处理不同namespaces的,脚本可以进一步扩展。

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

于 2020-10-03T12:50:54.390 回答