Horizontal Pod Autoscaler (以下简称HPA)
根据监测 CPU内存 利用率(或自定义自标或安装应用配合)弹性伸缩 复制控制器、部署、副本集或有状态集中的 Pod 数量。请注意HPA不适用于无法缩放的对象,例如DaemonSet。
在k8s中,有以下弹性伸缩模式:
- Pod 水平伸缩(HPA)
- Pod 垂直伸缩(VPA)
- 集群node弹性伸缩(CA)
不同类型的弹性伸缩,使用场影不同
CA
当集群资源不足时,CA 会自动配置新的计算资源并添加到集群中
使用方式
一般是借助公有云 等提供的服务进行配置操作,像阿里云就提供了弹性伸缩的服务,在流量高峰使用弹性伸缩+定时任务 可以避免服务坑不住,或服务器成本过高的情况
k8s官网云厂商方案: github.com/kubernetes/…
当然了,博主感觉使用ca来做node节点的弹性还不如直接用 云厂商的弹性伸缩服务,用过之后都说好
VPA
有些时候无法通过增加 Pod 数来扩容,比如数据库。这时候可以通过 VPA 增加 Pod 的大小,比如调整 Pod 的 CPU 和内存
使用方式
需要配合监控来操作,通常需要部署metrics-server来进行,当然使用prometheus+脚本配合也是可以的
实际部署可以参考这位大佬的博客: www.jianshu.com/p/94ea8bee4…
HPA
hpa是常用的弹性缩伸模式,擅长给无状态服务做扩容缩容等操作
HAP原理
HPA 实现为一个控制循环,其周期由控制器管理器的--horizontal-pod-autoscaler-sync-period
标志控制(默认值为 15 秒)。
在每个时间段内,控制器管理器根据每个 HPA 定义中指定的指标查询资源利用率。
控制器管理器从资源指标 API(对于每个 Pod 资源指标)或自定义指标 API(对于所有其他指标)获取指标。
-
对于每个 Pod 的资源指标(如 CPU),控制器从 HPA 所针对的每个 Pod 的资源指标 API 中获取指标。然后,如果设置了目标利用率值,则控制器将利用率值计算为每个 Pod 中容器上的等效资源请求的百分比。如果设置了目标原始值,则直接使用原始度量值。
然后,控制器取所有目标 Pod 的利用率或原始值(取决于指定的目标类型)的平均值,并生成用于扩展所需副本数量的比率。
请注意,如果 Pod 的某些容器没有设置相关的资源请求,则不会定义 Pod 的 CPU 利用率,并且自动缩放器不会针对该指标采取任何行动。
-
对于每个 Pod 的自定义指标,控制器的功能类似于每个 Pod 的资源指标,不同之处在于它使用原始值,而不是利用率值。
-
对于对象度量标准和外部度量标准,将获取一个描述相关对象的度量标准。
将该指标与目标值进行比较,以产生上述比率。在
autoscaling/v2beta2
API 版本中,在进行比较之前,可以选择将此值除以 Pod 的数量
资源获取
-
kubelet 每 10 秒抓取一次 Pod 的 CPU 和内存使用情况
-
Horizontal Pod Autoscaler 每 15 秒检查一次 Pod 指标
-
每分钟,Metrics Server 都会聚合这些指标并将它们公开给 k8s api
HPA部署实战
安装metrics
安装官网一条命令安装既可(前提是你的k8s版本大于1.19+)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml如
复制代码
如果版本低于1.19,那就使用下面命令(这是兼容版本,支持1.8到1.21)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml查
复制代码
查看部署状态
kubectl get po -n kube-system | grep metrics
复制代码
应用配置HPA
这里以 前面章节中deployment 部署的springboot-hive为例,传送门: juejin.cn/post/697645…
配置hpa一条命令既可,这里为了直观方便,以Rancher界面配置
使用命令的话就是
kubectl autoscale deployment springboot-hive --cpu-percent=10 --min=1 --max=10
复制代码
我们这里了为方便压测,将CPU平均利用率设为10
HAP界面
压测
hpa配置好之后,因为我们在开发环境,没有流量,所以了cpu也上不来,这里来压测一下,给pod加点压力,压测工具使用的WebBench
WebBench官网: github.com/EZLippi/Web…
压测命令:
t 是benchmark持续多久
c是指time时间内请求多少次
启动100个客户端同时请求接口,持续60s
webbench -t 60 -c 100 http://k8s-node1:30112/
复制代码
不一会就启动了一堆的机器
最后启动了10 就不会再扩展了,因为我们定义的就是10台,停止压测,需要等5分钟后,机器就会慢慢的回收,直接变成定义的1台