如何通过脚本为Kubernetes集群中的有状态应用增加负载以触发HPA扩缩容
实现步骤与脚本示例
前置检查
先确认基础配置正常,避免负载注入后HPA不触发:
- 执行
kubectl get hpa <你的HPA名称> -n <命名空间>,确认TARGET列的阈值配置符合预期 - 执行
kubectl top pod -n <你的应用命名空间>,确认metrics-server可以正常返回Pod的CPU/内存指标
方案1:通用CPU负载注入脚本(无需暴露应用端口)
该方案不依赖应用类型,直接在Pod内部执行CPU密集型进程拉高利用率,适配所有有状态应用:
#!/bin/bash # 替换为你的应用实际配置 STATEFULSET_NAME="your-statefulset-name" NAMESPACE="your-namespace" # 获取有状态集下所有Pod列表 POD_LIST=$(kubectl get pods -n $NAMESPACE -l app=$STATEFULSET_NAME -o jsonpath='{.items[*].metadata.name}') for POD in $POD_LIST; do echo "正在为Pod $POD 注入CPU负载..." # 后台执行低优先级CPU密集任务,避免直接夯死业务进程 kubectl exec -n $NAMESPACE $POD -- sh -c "nice -n 19 sha1sum /dev/zero &" > /dev/null 2>&1 done echo "负载注入完成,1-2分钟后可查看HPA状态:kubectl get hpa -n $NAMESPACE" echo "停止负载命令:kubectl exec -n $NAMESPACE -l app=$STATEFULSET_NAME -- pkill sha1sum"
注意:如果你的有状态集Pod的标签不是
app: <statefulset名称>,请自行替换脚本中kubectl get pods的标签选择器参数;如果镜像内无sha1sum工具,可替换为md5sum /dev/zero或dd if=/dev/zero of=/dev/null,效果一致。
方案2:HTTP服务业务压测脚本(贴合真实场景)
如果你的有状态应用是HTTP/HTTPS服务,推荐用业务流量压测的方式触发扩容,更符合生产实际逻辑:
#!/bin/bash # 替换为你的服务实际配置 SVC_URL="http://<服务ClusterIP/域名>/<压测接口路径>" NAMESPACE="your-namespace" # 压测配置:并发数、压测时长(秒) CONCURRENCY="200" DURATION="300" # 集群内启动wrk压测Pod,无需本地安装压测工具 kubectl run -n $NAMESPACE wrk-press --image=williamyeh/wrk --restart=Never -- -t4 -c$CONCURRENCY -d${DURATION}s $SVC_URL echo "压测已启动,查看实时压测日志:kubectl logs -n $NAMESPACE wrk-press -f" echo "压测完成后清理压测Pod:kubectl delete pod -n $NAMESPACE wrk-press"
可根据HPA的当前CPU利用率调整并发数,直到利用率超过你设置的扩容阈值,正常1-3分钟即可触发扩容动作
扩缩容验证
执行kubectl get hpa -n <你的命名空间> -w可以实时监控HPA的指标变化、扩容/缩容事件,停止负载后等待HPA默认的5分钟冷却时间,即可观察到自动缩容动作。
内容的提问来源于stack exchange,提问作者divya krishana
相关产品推荐
相关产品推荐

