Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 Deployment 、ReplicaSet 或 StatefulSet 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适用于无法缩放的对象,例如DaemonSet。
我的k8s集群是用kubesphere来管理的,配置hap发现没有生效,查看文档发现需要先部署metrics-server来获取资源指标:

可以看到所有的TARGETS都是
1 | [root@master knativetest]# kubectl get hpa -A |
查看一下hpa的详情:
1 | [root@master knativetest]# kubectl describe hpa/istio-ingressgateway -n istio-system |
报错信息是不能够从metrcis api中拿到服务的指标。
所以我们得先安装metrics-server:
metrics-server的yaml文件:
1 | apiVersion: v1 |
部署:
1 | kubectl apply -f metrics-server.yaml |
部署完之后再看下hpa状态:
1 | naison@P_CAIWFENG-MB0 knativetest % kubectl get hpa -A |
还有一个hpa没生效,查hpa官方文档发现,如果不设置container的request request值,那么hpa是无法生效的。
创建一个hpa:
1 | apiVersion: autoscaling/v2 |
测试:
压测的时候发现,不一会就扩容了很多pod,之前测试出来的最优性能时,pod大概是4个,但是这个不一会儿就已经8个了,肯定有问题。
hpa的计算公式:
1 | desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )] |
意思是:
1 | 需要的pod数 = 向下取整[当前pod数 * ( pod当前使用值 / pod request值)] |
注意这里是pod,request值也就是resource的request值。
查看deployment的container中的resources标签值,发现是100m,原来是分母太小了,导致pod只用了一点儿资源,就扩容了。所以把request值设置为合理的大小就行。

