目录
一、什么是HPA
1、HPA伸缩过程
2、HPA进行伸缩算法
二、HPA实例
创建HPA
1、压力测试
2、同时监控cpu和memory
一、什么是HPA
HPA的全称为(Horizontal Pod Autoscaling)它可以根据当前pod资源的使用率(如CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个pod的压力。当pod负载达到一定的阈值后,会根据扩缩容的策略生成更多新的pod来分担压力,当pod的使用比较空闲时,在稳定空闲一段时间后,还会自动减少pod的副本数量。
官网:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
1、HPA伸缩过程
收集HPA控制下所有Pod最近的cpu使用情况(CPUutilization)
对比在扩容条件里记录的cpu限额(CPUUtilization)
调整实例数(必须要满足不超过最大/最小实例数)
每隔30s做一次自动扩容的判断
CPU utilization的计算方法是用cpu usage(最近一分钟的平均值,通过metrics可以直接获取到)除以cpu request(这里cpu request就是我们在创建容器时制定的cpu使用核心数)得到一个平均值,这个平均值可以理解为:平均每个Pod CPU核心的使用占比。
2、HPA进行伸缩算法
计算公式:TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
ceil()表示取大于或等于某数的最近一个整数
每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。
当前Pod Cpu使用率与目标使用率接近时,不会触发扩容: 触发条件:avg(CurrentPodsConsumption) / Target >1.1 或 <0.9
二、HPA实例
仓库上传所需的镜像
创建hpa目录 编辑hpa.yaml资源清单
配置启动一个 Deployment 控制器来运行这个镜像并暴露一个服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
查看pod信息running php-apache服务地址为10.244.141.208
创建 Horizontal Pod Autoscaler
现在,php-apache 服务器已经运行,我们将通过 kubectl autoscale 命令创建 Horizontal Pod Autoscaler。 以下命令将创建一个 Horizontal Pod Autoscaler 用于控制我们上一步骤中创建的 Deployment,使 Pod 的副本数量维持在 1 到 10 之间。 大致来说,HPA 将(通过 Deployment)增加或者减少 Pod 副本的数量以保持所有 Pod 的平均 CPU 利用率在 50% 左右。由于每个 Pod 请求 200 毫核的 CPU,这意味着平均 CPU 用量为 100 毫核。
kubectl autoscale deployment php-apache --cpu-percent=50(cpu使用率上限为50%) --min=1 (最少为一个pod)--max=10(最多为10个pod)
查看 Autoscaler 的状态 可以看到目前只创建了一个pod 请注意当前的 CPU 利用率是 0%,这是由于我们尚未发送任何请求到服务器 (CURRENT 列显示了相应 Deployment 所控制的所有 Pod 的平均 CPU 利用率)。
1、压力测试
增加负载
现在,我们将看到 Autoscaler 如何对增加负载作出反应。
启动一个容器并通过一个循环向php-apache服务器发送无限请求 模拟大流量高负压的访问 每0.01秒访问一次服务 如果hpa生效 会适应性增减pod副本的数量以保持每个pod的cpu平均使用率在50%左右 资源清单中我们设置了cpu的最低需求为200m 这里定义cpu的50%实际为100m
重新开启server2终端查看
一分钟时间左右之后,通过以下命令,我们可以看到 CPU 负载升高了 这时,由于请求增多,CPU 利用率已经升至请求值的 124%。 可以看到,Deployment 的副本数量已经增长到了5
说明: 有时最终副本的数量可能需要几分钟才能稳定下来。由于环境的差异, 不同环境中最终的副本数量可能与本示例中的数量不同。
可以看到在hpa的作用下 pod副本增加到了6个 来维持50%的cpu使用率 查看hpa信息 可以看到现在cpu平均使用率为49% 接近50% 100m
通过访问svc 负载到新的pod上 查看php-apache服务器负载了6个pod
停止负载
我们将通过停止负载来结束我们的示例。输入<Ctrl> + C 来终止负载的产生
再次检查负载状态(等待几分钟时间)压力测试结束 现在CPU 利用率已经降到 0,但是副本的数量还是6 这是因为压力刚结束要预防压力再次回升。
说明: 自动扩缩完成副本数量的改变可能需要几分钟的时间。 HPA 最后将自动缩减副本数量至 1
实验完成后删除hpa.yaml文件 清理实验环境
2、同时监控cpu和memory
API-v1版本只能监控单一指标,v2可以支持多个度量指标,但hpa只能采集到cpu和内存,其他指标需要用普罗米修斯等第三方监控系统应用采集后将数据交给hpa
如果要同时对cpu和内存进行hpa伸缩监控,需要将hpa升级到v2版本 利用 autoscaling/v2beta2 API 版本,你可以在自动扩缩 php-apache 这个 Deployment 时使用其他度量指标。这里我们利用资源清单的方式创建 将hpa的版本设置为apiVersion: autoscaling/v2beta2
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-example
spec:
maxReplicas: 10
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
metrics:
- type: Resource
resource:
name: cpu
target:
averageUtilization: 60
type: Utilization
- type: Resource
resource:
name: memory
target:
averageValue: 50Mi
type: AverageValue
运行应用 查看hpa 可以看到同时监控cpu和内存
实验完成后删除hpa.yaml文件 清理实验环境
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)