Kubernetes 批量水平吊舱自动校准
看看(这是一个非常新的情况),我正在处理的用例是将相同的HPA规则应用于所有部署(在特定的命名空间中) 因此,理想情况下,我希望实现如下内容: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
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}'