有两种设置新HorizontalPodAutoscaler
对象的方法:
- 此处描述的声明性方法:
以声明方式创建自动缩放器
我们可以使用以下文件以声明方式创建它,而不是使用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
命令:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=5
第一种方法没有留下太多进一步解释的空间。语法是严格指定的,您对此无能为力。正如你所看到的kind
,name
我们的扩展目标都应该被指定,虽然你的伪代码看起来像是一个有趣的提议,但它没有机会工作。根据规范,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
很有意义。您通常需要的是更细粒度的控制,而不是通过一个巨大的通用对象来管理所有内容的可能性。