如何解决批处理水平吊舱自动缩放 以声明方式创建自动定标器
看看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
对象的方法:
- 描述性方法here:
以声明方式创建自动定标器
我们不必使用
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
command:kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=5
第一种方法并没有太多空间作进一步解释。语法是严格指定的,您不能做太多事情。如您所见,应同时指定我们的扩展目标的kind
和name
,尽管您的伪代码可能看起来像是一个有趣的建议,但它没有工作的机会。根据规范,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。因此,HorizontalPodAutoscaler
和Deployment
/ ReplicationController
/ ReplicaSet
之间的一对一关系非常合理。通常,您需要的是更精细的控制级别,而不是通过一个庞大的通用对象来管理所有内容的可能性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。