一、 HPA简介
1、HAP,全称 Horizontal Pod Autoscaler (Pod自动弹性伸缩),K8S通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络请求量)的检测,实现对Pod实例个数的动态新增和减少。
2、HPA仅适用于Deployment控制器和ReplicaSet控制器,在V1版本中仅支持根据Pod的CPU利用率扩容与缩容,在v2版本中,支持根据内存和cpu利用率扩容与缩容。HPA需要与metrics配合使用,metrics负责监控cpu和mem数据,然后提供给HPA,HPA根据使用情况自动扩容与缩容。metrics默认只能用cpu和mem两个指标(系统负载),其他监控指标(访问量等等)需要第三方给数据,比如普罗米修斯
3、HPA伸缩过程:
(1) 收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization);
(2) 对比在扩容条件里记录的cpu限额(CPU Utilization);
(3) 调整实例数(必须要满足不超过最大/最小实例数);
(4) 每隔30s做一次自动扩容的判断;
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。
4、HPA进行伸缩算法:
计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target);
ceil()表示取大于或等于某数的最近一个整数,每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。当前Pod cpu使用率与目标使用率接近时,不会触发扩容或缩容。
触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9
二、 HPA实例
1.HPA部署
可以参考官网文档:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/,准备所需镜像;
我们本地有,所以只需将真机的 hpa-example.tar发送给server1
server1导入镜像,并上传至仓库
使用以下命令删除不用的镜像;
查看磁盘使用,现在有6.6G可用
创建一个存放hpa文件的目录;
编辑deploy.yaml 文件
apiVersion: apps/v1
kind: Deployment %创建Deployment控制器
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1 %副本数为1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: hpa-example 镜像是hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m %cpu上限0.5
requests:
cpu: 200m %cpu下限0.2
---
apiVersion: v1
kind: Service %创建svc
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
应用deploy.yaml 文件,创建pod和svc
查看php-apache服务的详细信息,地址为10.106.97.49,测试访问
2.压力测试
php-apache 服务器已经运行,通过 kubectl autoscale 命令创建 HPA,用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。即:HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量,以保持所有 Pod 的平均 CPU 利用率在 50% 左右(由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核)。自动扩缩完成副本数量的改变可能需要几分钟的时间。Hpa会根据Pod的CPU使用率动态调节Pod的数量。
设定hpa伸缩控制器;
kubectl autoscale deployment php-apache :表示deployment名为php-apache;
–cpu-percent= 50 :表示cpu使用率不超过50%;
–min= 1 --max= 10: 副本最小个数为1,最大个数为10。
可以看到hpa创建成功,目前只有一个pod
查看pod的cpu使用情况
接下来进行压力测试,模拟增加访问php-apache服务的负荷,查看hpa是否生效;
每0.01秒访问一次服务,如果hpa生效,则会适应性增/减pod副本的数量以保持每个pod的cpu平均使用率在50%左右。成功访问一次,会出现一个OK
因为执行命令后,进程会一直在运行,所以需要再打开一个终端来查看cpu的使用率信息
可以看到在hpa的作用下,pod节点增加到了6个,来维持50%的cpu使用率,此时cpu使用率大概为47%;
即hpa会根据Pod的CPU使用率动态调节Pod的数量。
现在取消压力测试
hpa会自动缩容,但是缩的速度比扩的速度慢很多
压力测试结束后,现在的cpu使用率为0,但是副本数量还是6,这是因为压力刚结束要预防压力再次回升。
等待压力测试结束后大约3-5分钟,pod副本数量逐渐缩减为1个;
hpa的机制是扩容很迅速,缩容很慢。原因是压力上来了,需要马上扩容,才能应对压力;等压力小了,不能马上缩容,防止压力再次上升,不能及时应对。
3.同时监控cpu和内存
API-v1版本只能监控单一指标,v2版本可以支持多个度量指标,但hpa只能采集到cpu和内存,其他指标需要使用普罗米修斯等第三方监控系统,应用采集后将数据交给hpa。
如果要同时对cpu和内存进行hpa伸缩监控,需要将hpa升级到v2版本,通过使用yaml配置文件的方式生成hap。
查看以下信息
编辑hpa-v2.yaml 文件;
kind: HorizontalPodAutoscaler :类型是HPA;
maxReplicas: 10 :最大副本数10;
minReplicas: 1 :最小副本数1;
averageUtilization: 60 :cpu目标使用率是百分之六十;
averageValue: 50Mi :mem目标使用大小是50M。
应用配置
查看hpa,可以看到现在同时监控cpu和内存
查看pod的实时资源使用情况