睡个好觉,Cluster 正确:凌晨3点别再烧钱
Source: Dev.to
问题:始终在线的集群
大多数 Kubernetes 集群即使在用户不活跃时也会 24/7 运行。基于 CPU 的 HPA 试图提供帮助,但很快就会失效,尤其是在加入 VPA 时更是如此。没有更智能的伸缩方式,HPA 与 VPA 互相冲突,导致空闲 pod 和资源浪费。
使用 KEDA 的事件驱动伸缩
KEDA 让我们能够基于真实事件而不是猜测进行伸缩:
- Prometheus scaler – 当相关指标显示有工作时触发伸缩。
- Cron scaler – 定义明确的时间窗口(例如下班时间)来缩减工作负载。
在高峰时段,指标触发器驱动快速扩容;在低流量时段,cron 触发器执行可预测的缩容。通过组合两者,工作负载仅在有任务时运行。请求一到达,pod 就会快速扩容;较长的缩容周期处理剩余流量后,再次收缩集群。
使用 Karpenter 的节点级自动伸缩
即使 pod 伸缩完美,空闲节点仍然会产生费用。Karpenter 与 KEDA 互补:
- 在工作负载消失后立即合并并终止空节点。
- 仅在需要时提供更大、更“强壮”的节点。
- 使用 cron 触发器在早晨预热节点,确保开发者零等待就绪。
如果夜间有早鸟流量,指标驱动的伸缩会在 cron 窗口结束后接管,保持 pod 在需要时可用。
综合实现步骤
-
定义 KEDA 触发器
- 用于请求速率或延迟指标的 Prometheus scaler。
- 用于已知非高峰时段的 Cron scaler。
-
配置 VPA,在不与 HPA 冲突的情况下调整 pod 资源(KEDA 替代 HPA)。
-
启用 Karpenter,并设置合适的 provisioner 参数(实例类型、限制、合并策略)。
-
添加预热 cron 触发器,让节点在第一个开发者登录前就准备好。
好处
- 成本节约 – 不再为闲置计算或待机节点付费。
- 可预测的性能 – 工作负载仅在需要时伸缩。
- 降低运维工作量 – 自动节点供应与终止。
- 资源高效利用 – pod 和节点仅在活跃期间存在。
停止为闲置时间付费。让 KEDA 的事件驱动触发器和 Karpenter 的节点管理为你的基础设施工作。