如何在生产环境灰度执行混沌实验

解读

国内互联网大厂(如阿里、字节、腾讯)普遍把“灰度+混沌”作为稳定性保障双保险。面试官问这道题,核心想验证三件事:

  1. 你是否理解生产环境不可触碰底线(可观测、可回滚、可限流);
  2. 能否用 Docker 生态工具把爆炸半径锁在容器级别
  3. 是否具备数据驱动决策的灰度意识(监控指标→自动判断→自动中止)。
    回答时务必体现“小步快跑、实时监控、一键止损”的国内落地套路,否则会被认为“纸上谈兵”。

知识点

  • Docker 标签与节点亲和性:用 docker node update --label-add gray=1 把灰度机器单独打标签,保证故障只落在灰度容器。
  • Compose 覆盖能力docker-compose -f docker-compose.yml -f docker-compose.chaos.yml up -d 实现灰度单独注入故障,无需改动主干文件。
  • cgroup 级故障注入:用开源工具 chaosbladepumba 直接对容器 pid namespace 做 CPU 满载、网络延迟,不依赖宿主机 root,符合国内安全合规。
  • 镜像版本双注册表策略:灰度镜像推送到 harbor-gray.xxx.com,生产镜像在 harbor.xxx.com,通过 Docker Content Trust 签名,防止灰度镜像误入生产。
  • Prometheus+Alertmanager 熔断:在灰度容器内跑 metric-exporter,一旦 P99 延迟>500ms 或错误率>1%,Alertmanager 调用 docker scale service=0 实现秒级摘除
  • 国家等保要求:日志必须落盘到宿主机 /var/log/chaos/ 并设置 180 天 retention,审计可追溯

答案

生产灰度混沌实验的完整闭环分五步,全部基于 Docker 原生能力,不碰 K8s 也能落地:

  1. 环境切割
    docker node ls 选出 5% 宿主机,打标签 gray=chaos;Compose 文件里加 deploy.placement.node.labels.gray==chaos,确保只有灰度容器会被注入故障

  2. 镜像隔离
    灰度镜像单独打 tag {git-sha}-gray,推送到 harbor-gray.xxx.com/library/app:xxx,并通过 DOCKER_CONTENT_TRUST=1 签名;生产环境 Registry 设置 Replicate Rule 禁止灰度 tag 同步,从源头隔离。

  3. 故障注入
    使用 chaosblade 容器化模式:

    docker run --rm --pid=container:target_app \
      chaosbladeio/chaosblade:1.7.2 \
      blade create docker cpu --cpu-percent 80 --timeout 120s
    

    该命令只对目标容器 pid namespace 生效,宿主机和其他容器零感知;同时把实验 ID 写入 labels.com.chaosblade.exp_id,方便后续回滚。

  4. 实时观测与熔断
    灰度容器内置 otel-collector sidecar,把 RED 指标推到公司统一 Prometheus;Alertmanager 里配一条国家推荐阈值

    - alert: ChaosGrayAbort
      expr: rate(http_requests_total{gray="true",status=~"5.."}[1m]) > 0.01
      for: 30s
      annotations:
        command: docker service scale app_gray=0
    

    触发后 30 秒内自动缩容灰度服务,爆炸半径可控在 5% 流量以内

  5. 一键回滚与复盘
    实验结束无论成功或熔断,都执行 docker service update --rollback 回到上一版本;日志通过 docker logs target_app > /var/log/chaos/${exp_id}.log 落盘,180 天后自动清理,满足等保审计。

整个流程通过 GitLab CI 模板固化,研发只需合并 MR 即可自动创建灰度混沌流水线,人走流程在,国内大厂 SRE 团队已验证可行。

拓展思考

如果公司未来半年计划从 Docker Swarm 迁移到 阿里云 ACK,如何复用现有混沌实验资产

  • chaosblade 容器模式改造成 daemonset,利用 containerdnerdctl 继续对旧 Docker 镜像做故障注入,避免二次开发
  • MSE 混沌工程平台的“应用维度的灰度开关”接管 Docker 标签,实现跨 Swarm→K8s 的双模灰度
  • 原有 Prometheus 规则直接通过 alicloud-monitor-controller 同步到 ARMS,熔断脚本从 docker scale 改为 kubectl patch,零业务改造即可平滑过渡。