公司上线了一个电商促销活动,流量在晚上8点突然暴增,系统差点崩掉。运维小李一边盯着监控一边手动扩容节点,手忙脚乱。其实,这种场景完全可以通过ref="/tag/2020/" style="color:#479099;font-weight:bold;">Kubernetes集群自动伸缩来解决,不用人肉盯守,也能应对突发流量。
什么是集群自动伸缩
Kubernetes集群自动伸缩不是简单地给Pod加副本。它分为两个层面:一个是Pod层面的HPA(Horizontal Pod Autoscaler),另一个是节点层面的Cluster Autoscaler。前者根据CPU、内存等指标调整Pod数量,后者则在节点资源不足时自动添加新节点。
HPA:让Pod自己“长大”
假设你部署了一个商品详情服务,平时10个Pod就够了。但每逢大促,请求量翻倍。这时候可以配置HPA,让它根据CPU使用率自动增减副本数。
比如,定义一个HPA策略:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: product-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: product-service
minReplicas: 5
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
当平均CPU超过60%,HPA就会自动增加Pod,最多到50个;负载降下来后,又会自动回收。
Cluster Autoscaler:节点不够?自动加机器
HPA能扩Pod,但如果所有节点都快跑满了,再怎么扩Pod也没用。这时候就得靠Cluster Autoscaler出手了。
比如你在阿里云或AWS上跑K8s集群,开启Cluster Autoscaler后,当调度器发现有Pod因资源不足无法调度时,它会自动调用云API创建新的工作节点,并加入集群。等高峰期过去,空闲节点还会被自动清理,节省成本。
部署时只需要给节点打上特定标签,比如:
--nodes=3:10:worker-group-1
表示这个组最少3台,最多10台。剩下的交给系统自动处理。
实际使用中的几个坑
别以为配完就高枕无忧。有个团队开了HPA,结果发现Pod疯狂扩容到上限,一查才发现监控数据没采集到,导致指标一直是未知状态,HPA误判为高负载。
建议开启Metrics Server,并定期检查HPA状态:
kubectl get hpa
另外,自动伸缩不是越灵敏越好。频繁扩缩容会导致服务抖动。可以设置稳定窗口,比如5分钟内不重复触发:
behavior:
scaleUp:
stabilizationWindowSeconds: 300
这样避免“脉冲式”流量引发不必要的扩容。
结合业务节奏更聪明
有些场景是可以预判的。比如每周五晚上的直播带货,流量准时到来。与其等监控报警,不如提前用CronHPA做定时伸缩。
比如周五下午5点先把副本升到30,撑住晚高峰,第二天早上再降回来。既保证体验,又避免资源浪费。
自动伸缩不是万能药,但也别把它想得太复杂。合理配置后,半夜三点再也不用爬起来加节点了,这才是现代运维该有的样子。