HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一个功能,用于自动调整 Pod 的副本数量,以根据 CPU 使用率或其他指标来实现横向扩展和缩减。
HPA 的工作原理如下:
- 用户创建一个 HPA 对象,并指定要自动扩缩容的目标 Deployment、ReplicaSet 或 StatefulSet。
- 用户定义了 HPA 的基本配置,包括目标 CPU 使用率、最小/最大副本数量和调整策略等。
- HPA 控制器会以一定的时间间隔(默认为 15 秒)查询目标资源的当前 CPU 使用率。
- 根据当前的 CPU 使用率和定义的目标使用率,HPA 控制器计算出需要扩展或缩减的副本数量。
- 如果计算出的副本数量超过预定义的最小/最大副本数量范围,HPA 控制器会对目标资源进行调整,增加或减少副本的数量。
- 调整后的副本数量会导致集群进行自动缩放,以适应负载的变化。
HPA 支持根据 CPU 使用率以外的指标进行自动扩缩容,例如根据内存使用量、网络流量或自定义指标。可以使用 Prometheus、Heapster 等监控工具来收集和提供这些指标。
通过使用 HPA,Kubernetes 用户可以根据负载情况动态调整 Pod 的副本数量,以确保应用程序具有足够的资源来处理流量高峰,并减少资源浪费。这样可以提高应用程序的可伸缩性、性能和稳定性。
需要注意的是,在使用 HPA 之前,需要先部署正确配置的监控系统,并确保目标资源能够提供相应的指标数据供 HPA 控制器使用。
HPA 自动扩缩容
开启指标服务
# 下载 metrics-server 组件配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
# 修改镜像地址为国内的地址
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
# 修改容器的 tls 配置,不验证 tls,在 containers 的 args 参数中增加 --kubelet-insecure-tls 参数
# 安装组件
kubectl apply -f metrics-server-components.yaml
# 查看 pod 状态
kubectl get pods --all-namespaces | grep metrics
cpu,内存指标监控
实现 cpu 或内存的监控,首先有个前提条件是该对象必须配置了 resources.requests.cpu 或 resources.requests.memory 才可以,可以配置当 cpu/memory 达到上述配置的百分比后进行扩容或缩容
创建一个 HPA:
先准备一个好一个有做资源限制的 deployment
执行命令 kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5
通过 kubectl get hpa 可以获取 HPA 信息
测试:找到对应服务的 service,编写循环测试脚本提升内存与 cpu 负载
while true; do wget -q -O- http://<ip:port> > /dev/null ; done
可以通过多台机器执行上述命令,增加负载,当超过负载后可以查看 pods 的扩容情况 kubectl get pods
查看 pods 资源使用情况
kubectl top pods
扩容测试完成后,再关闭循环执行的指令,让 cpu 占用率降下来,然后过 5 分钟后查看自动缩容情况
自定义metrics
控制管理器开启–horizontal-pod-autoscaler-use-rest-clients
控制管理器的–apiserver指向API Server Aggregator
在API Server Aggregator中注册自定义的metrics API