在夜间低峰期自动下调容器副本数以节省电力

解读

面试官想验证候选人能否把“降本增效”落到技术细节,而非简单回答“用 Cron 缩容”。
国内机房普遍执行阶梯电价+尖峰平谷计费,夜间(通常 23:00-08:00)电价可低至白天的 40 %;若业务 QPS 同步下降 70 % 以上,副本数与节点数联动缩容可直接减少宿主机功耗,单台 16C32G 物理机在低负载时可降 120 W 左右,千台规模一晚即可省 1000 kWh。
因此,答案必须体现:

  1. 可观测:精准识别“低峰”
  2. 可编排:Docker Swarm 原生或结合 K8s HPA 实现
  3. 可回退:异常时 1 min 内恢复
  4. 可审计:操作留痕,方便财务核算

知识点

  1. Docker Swarm Service 模型:replicas 字段支持热更新,rollback 策略可配置 parallelism=1、delay=10s
  2. 资源指标来源
    • 内置 docker stats 内存/CPU 瞬时值
    • Prometheus + cAdvisor 落库,Granfana 告警
    • 业务层 QPS、RT、队列长度,通过 /metrics 暴露
  3. 调度器选型
    • Swarm 内置:docker service scale <service>=<num>
    • 结合 cron+shell:轻量但无并发安全
    • 自研 Python/Go 控制器:list→evaluate→scale→record
  4. 节点级省电
    • Swarm Drain 低负载节点 → 触发 IPMI 或 BMC 下电
    • 公有云可调用 阿里云 ECS StopInstances API腾讯云 CVM StopInstances
  5. 安全与合规
    • 缩容前检查 PDB(PodDisruptionBudget)或 Swarm 的 max_unavailable_availability
    • 镜像拉取凭证、Secrets 在节点重启后仍可用,需提前放入 Docker Login KeychainKMS
  6. 回退策略
    • 保留最近 3 个 replicas 历史值,Prometheus 告警规则:若 qps>白天均值 30 % 持续 2 min,立即 scale 回原副本
    • 使用 Swarm RollbackK8s kubectl rollout undo 保证版本一致

答案

我曾在某头部电商负责千万级订单服务容器化,夜间 00:00-06:00 QPS 下降 80 %,通过以下四步实现自动省电缩容:

  1. 指标采集:cAdvisor 采集 15 s 粒度 CPU<10 % 且 QPS<白天 20 % 持续 30 min,Prometheus 记录为 low_traffic=1
  2. 决策服务:自研 NightScaler(Go 实现,部署为 Swarm global service),每 10 min 查询 Prometheus,若连续 3 周期满足条件,调用
    docker service scale app-service=2(白天 20 副本)
  3. 节点联动:Swarm Drain 多余 worker,阿里云 ECS 自动停机 API 关闭 60 % 节点,关机前把 /var/lib/docker 挂载的云盘做 快照备份
  4. 回退保障:
    • 设置 Grafana 告警:QPS>阈值 2 min 即触发 Webhook,NightScaler 立即 scale 回原副本并 ECS StartInstances
    • 操作记录写入 钉钉群 Bot+ELK,方便审计与财务对账
      结果: nightly 节省 1200 kWh,全年电费下降 18 万元,SLA 仍保持 99.95 %,无一次因缩容导致告警漏报

拓展思考

  1. 若公司已全部迁往 K8s,可改用 KEDA 的 Cron ScaledObject,或 HPA+Cluster-Autoscaler 实现节点级关机;注意云厂商的 按量计费抢占式实例 价差,综合评估是否真“省电”
  2. 对状态服务(MySQL、Kafka)缩容风险高,可仅缩无状态前端网关,把 节省重点放在计算节点 而非有状态节点
  3. 国内部分省份 22:00 后电价低于 0.3 元/kWh,可反向思考:把 离线批处理(大模型训练、日志压缩)调度到夜间,白天缩容批处理池,形成“错峰用电”双收益
  4. 未来可接入 碳排放交易平台,将夜间省下的 kWh 折算成碳指标,在 全国碳市场 出售,进一步量化技术对双碳目标的贡献