Kubernetes 批量水平吊舱自动校准

Kubernetes 批量水平吊舱自动校准,kubernetes,hpa,horizontal-pod-autoscaling,Kubernetes,Hpa,Horizontal Pod Autoscaling,看看(这是一个非常新的情况),我正在处理的用例是将相同的HPA规则应用于所有部署(在特定的命名空间中) 因此,理想情况下,我希望实现如下内容: apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: generalHpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: [deploymentOb

看看(这是一个非常新的情况),我正在处理的用例是将相同的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
,并且需要针对特定的部署对象


关于如何处理此情况并避免为每个
部署按名称逐个创建
hpa
s的任何建议?

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

  • 描述的声明性方法:
  • 以声明方式创建自动缩放器 不必强制使用
    kubectl autoscale
    命令来创建HorizontalPodAutoscaler,我们可以使用以下文件以声明方式创建它:

    apiVersion:autoscaling/v1 种类:水平足自动秤 元数据: 名称:php apache 规格: scaleTargetRef: apiVersion:apps/v1 种类:部署 名称:php apache 2005年:1 最大副本数:10 targetCPU利用率:50
    我们将通过执行以下命令来创建autoscaler:

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

  • 第一种方法没有留下太多进一步解释的空间。语法是严格指定的,您对此无能为力。正如您所看到的,应该指定我们的缩放目标的
    种类
    名称
    ,尽管您的伪代码看起来可能是一个有趣的建议,但它没有发挥作用的机会。根据规范,
    名称
    字段是一个地图/字典,而列表在此上下文中不能使用

    当谈到命令式方法时,实际上您可以通过使用相当简单的bash one-liner将其自动化,从而使您的生活更加轻松。如果你有。。。假设有50种不同的部署,您希望
    自动缩放所有这些部署,这样可以节省大量时间

    为了简单起见,我只创建了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的关系。一个
    部署
    正好对应一个
    HorizontalPodAutoscaler
    对象。如果还需要处理不同的
    名称空间
    ,则可以进一步扩展脚本


    回到你的具体要求,问题是这样一个解决方案的合法性。虽然用一个
    HorizontalPodAutoscaler
    对象管理所有
    部署似乎很有诱惑力(一开始的工作量较少),但如果您仔细观察这种方法的所有潜在缺点,您可能会很快改变主意。首先,这种解决方案的可扩展性不强。事实上,它根本不可伸缩。想象一下,出于某种原因,您想要更改单个
    部署
    对象的
    targetCPUUtilizationPercentage
    。好。。。你有问题。它由一个全球autoscaler管理,您需要快速重新设计环境并创建单独的hpa。因此,在
    HorizontalPodAutoscaler
    Deployment
    /
    ReplicationController
    /
    ReplicateSet
    之间建立一对一的关系非常有意义。您通常需要的是更细粒度的控制,而不是通过一个庞大的通用对象来管理一切。

    我认为将
    hpa
    与每个部署清单打包在一起是最好的选择。
    kubectl get deployments -o jsonpath='{.items[*].metadata.name}'