kubernetes中HPA(pod水平自动伸缩)
一、介绍
HPA的全称为(Horizontal Pod Autoscaling)它可以根据当前pod资源的使用率(如CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个pod的压力。
当pod负载达到一定的阈值后,会根据扩缩容的策略生成更多新的pod来分担压力,当pod的使用比较空闲时,在稳定空闲一段时间后,还会自动减少pod的副本数量。
二、扩缩容策略
1. 通过伸缩系数判断是否要进行扩容或缩容
HPA会根据获得的指标数值,应用相应的算法算出一个伸缩系数,此系数是指标的期望值与目前值的比值,如果大于1表示扩容,小于1表示缩容。
–horizontal-pod-autoscaler-tolerance:全局配置的容忍值,默认为0.1,如果计算出的缩放比例接近1±容忍值,将会放弃本次缩放。
期望副本数 = ceil[当前副本数 * ( 当前指标 / 期望指标 )]
检查最终的Pod数量是否在HPA设定的数量范围的区间,如果超过最大值或不足最小值都会修改为最大值或最小值。
然后向k8s发出请求,修改伸缩对象的子对象scale的Pod数量
HPA控制器执行缩放操作之前,会记录缩放建议(scale recommendation)。 控制器会在设定时间内考虑所有的建议信息,并从中选择得分最高的建议。
时间可通过kube-controller-manager的启动参数进行配置,常用参数如下:
–horizontal-pod-autoscaler-downscale-stabilization 此选项的值是一个持续时间,用于指定自动缩放器必须等待多长时间才能完成当前操作后再执行另一次缩放操作。默认值为5分钟(5m0s)。
–horizontal-pod-autoscaler-upscale-stabilization
此选项的值是一个持续时间,用于指定自动扩容器必须等待多长时间才能完成当前操作后再执行另一次扩容操作。默认值为3分钟(3m0s)。
–horizontal-pod-autoscaler-initial-readiness-delay 参数(默认为30s),用于设置Pod准备时间, 在此时间内的Pod被认为未就绪。
–horizontal-pod-autoscaler-cpu-initialization-period 参数(默认为5分钟),用于设置Pod的初始化时间,在此时间内的资源指标不会被采纳。 一个HPA支持多个指标的监控,HPA会循环获取所有的指标,计算每一个指标所提议的副本数量。扩容时算最小值,缩容时算最大值一个伸缩对象在k8s中允许对应多个HPA而不会报错,但HPA彼此不知道自己监控的是同一个伸缩对象,会互相冲突。
2. 扩容是倍增的,缩容是1/2递减的
3. 扩缩容依赖的指标主要分为三种:
默认指标,主要通过metrics-server采集相关指标
自定义指标,主要通过promethues采集相关指标
第三方扩展工具,如云扩展采集工具
三、配置hpa主要有两种方式:
1.直接命令行方式,如:
kubectl autoscale --max=10 --min=1 --cpu-percent=5 deployment hpa-test
2.另外一种就是集成到服务的资源清单文件内,以nginx为例:
kind: Deployment
metadata:
name: hpa-test
labels:
app: hpa
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-c
image: nginx:1.14.2
ports:
- containerPort: 80
resources:
requests:
cpu: 0.01
memory: 100Mi
limits:
cpu: 0.01
memory: 100Mi
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: pod-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpa-test
minReplicas: 1
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
- type: Resource
resource:
name: memory
targetAverageUtilization: 50
测试验证,可以使用如下命令,其中ip是hpa pod的IP
[root@local-k8s-ms01 test-hpa]# kubectl get pods -A -owide|grep hpa-test
default hpa-test-6d87fdd849-ttmd4 1/1 Running 0 6d22h 10.244.2.20 local-k8s-nd02 <none> <none>
1
while true;do curl -I 10.244.2.20;done
————————————————