使用 Pumba 随机停止容器并验证重试策略

解读

在国内云原生面试中,“用 Pumba 做混沌实验” 已成为验证候选人是否真正落地过容器稳定性的高频题。
面试官不仅想看你会不会敲命令,更关注:

  1. 你能否把故障注入业务重试策略闭环验证;
  2. 是否理解Docker 重启策略应用层重试的互补关系;
  3. 能否给出可观测的量化结论(日志、指标、告警)。
    一句话:不是“跑通 Pumba”,而是用数据证明系统在随机掉容器场景下依然满足 SLA

知识点

  1. Pumba:开源混沌工具,可对运行中的容器做随机 kill、stop、pause、网络丢包等操作,支持正则筛选目标容器、设置周期与概率。
  2. Docker 重启策略:no、on-failure、unless-stopped、always;仅作用于容器进程退出,对“被 stop”无效,因此必须与应用层重试/熔断配合。
  3. 健康检查:Dockerfile HEALTHCHECK、docker-compose healthcheck、K8s probe;是判断“重启”还是“继续等待”的唯一可信信号
  4. 重试策略维度
    • 次数/退避/超时;
    • 幂等设计;
    • 异常分类(可重试 5xx、不可重试 4xx)。
  5. 可观测三板斧:日志(JSON 统一输出)、指标(Prometheus 暴露 RED 指标)、追踪(OpenTelemetry)。
  6. 国内合规:生产混沌须提前报备,避开监管交易时段;金融、证券类还需保留审计日志 6 个月以上。

答案

以下示例基于Docker 20.10+Pumba 0.9.0,在单台 CentOS 7 测试机上演示,镜像使用官方 nginx:1.25-alpine 模拟业务,sidecar 容器暴露 /retry 接口验证重试逻辑。

步骤 1:准备带重试逻辑的 Demo
Dockerfile

FROM nginx:1.25-alpine
COPY nginx.conf /etc/nginx/nginx.conf
# 内置 lua 脚本,访问 /retry 时 upstream 指向 localhost:8080
# 若 8080 不可达,最多重试 3 次,每次退避 200ms,返回 200 或 503

构建并打标签

docker build -t demo:retry .

步骤 2:启动两个副本,模拟多实例

docker run -d --name web1 --label chaos=web demo:retry
docker run -d --name web2 --label chaos=web demo:retry

步骤 3:启动 Pumba 随机 stop

docker run -d --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gaiaadm/pumba:0.9.0 \
  pumba --random \
        --interval 30s \
        --label chaos=web \
        stop --duration 10s

解释:每 30 s 随机选 1 个带 label chaos=web 的容器,执行 docker stop(SIGTERM+SIGKILL,10 s 后恢复)。

步骤 4:实时验证重试是否生效
在另一台同网段主机使用阿里云的压测工具或本地 hey:

hey -n 10000 -c 50 http://<宿主机IP>:8000/retry

观察:

  • 成功率 ≥ 99.5 %(3 次重试兜底,单次中断 10 s 内完成);
  • P99 延迟 < 600 ms(含退避);
  • 容器重启次数为 0(因 stop 由 Pumba 触发,Docker 未感知退出,验证重启策略无法兜底);
  • 日志中出现 upstream retry 1/3、2/3、3/3 字样,证明重试逻辑被触发

步骤 5:出具报告

结论:在 30 min 混沌实验中,共注入 60 次 stop,业务成功率 99.57 %,
满足 SLA(≥ 99.5 %),重试策略有效。

拓展思考

  1. 与 K8s 场景的差异

    • K8s 通过 Pod 级重启策略+就绪探针自动摘除未就绪副本,无需业务重试也可保证流量无损
    • 但在 Docker Swarm 或裸 Docker 主机中,只能靠业务层重试,因此必须保留上述验证。
  2. 网络故障注入
    使用 pumba netem --duration 20s loss 30% 模拟高丢包,可验证重试退避是否指数增长,避免惊群效应打垮剩余实例。

  3. Secrets 与合规
    若业务容器通过阿里云 KMS 拉取密钥,Pumba stop 后 sidecar 重新启动需重新鉴权;此时应把重试与AK 续期结合,防止因鉴权失败把正常错误归类为可重试。

  4. 灰度混沌
    国内大厂(蚂蚁、字节)普遍采用金丝雀 + 监控自动熔断方式:

    • 先对 5 % 副本注入故障;
    • 若错误率 > 1 % 且持续 1 min,自动终止实验并回滚
    • 全程通过内部 ChaosMonkey 平台审批,避免人工误操作。
  5. 面试加分项

    • 提到**“把 Pumba 实验写进 CI”**,用 GitLab CI 定时跑,失败自动开 Jira;
    • Grafana + Loki 做实时大盘,面试官一眼能看到红色故障窗口与绿色恢复窗口
    • 最后总结一句:“混沌工程不是证明系统不犯错,而是证明系统犯错时用户无感知”,瞬间拉高格局