首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Chaos Monkey - 生产环境随机故障注入工具

Chaos Monkey - 生产环境随机故障注入工具

原创
作者头像
qife122
发布2026-04-29 14:27:34
发布2026-04-29 14:27:34
1460
举报

Chaos Monkey

GoReportCard

Chaos Monkey 随机终止生产环境中运行的虚拟机实例和容器。通过让工程师更频繁地面对故障,激励他们构建更具弹性的服务。

功能特性

  • 随机实例终止:在指定范围内随机选择并终止实例,模拟真实故障场景
  • 多分组策略:支持按应用(App)、堆栈(Stack)或集群(Cluster)级别进行终止分组
  • Spinnaker 深度集成:与 Netflix 的持续交付平台 Spinnaker 无缝集成,支持 AWS、GCE、Azure、Kubernetes、Cloud Foundry 等后端
  • 灵活调度系统:可配置终止时间窗口、工作日限制、最小/平均终止间隔
  • 异常白名单:支持为特定账户、区域、堆栈或集群配置终止豁免规则
  • 时间约束:基于工作日日历,仅在配置的时间窗口内执行终止操作
  • 可插拔架构:支持自定义解密器、错误计数器、追踪器等扩展模块
  • 数据库持久化:使用 MySQL 存储调度计划和终止记录,支持迁移管理

安装指南

系统要求

  • Go 1.11+ 开发环境
  • Spinnaker 管理的基础设施(AWS、GCE、Azure、Kubernetes 等)
  • MySQL 数据库(可选,用于存储调度记录)

本地安装

代码语言:bash
复制
# 获取 Chaos Monkey 二进制文件
go get github.com/netflix/chaosmonkey/cmd/chaosmonkey

配置文件

Chaos Monkey 会在以下路径查找 chaosmonkey.toml 配置文件:

  • .
  • /apps/chaosmonkey
  • /etc
  • /etc/chaosmonkey

部署说明

详细部署和配置说明请参考官方文档

使用说明

基础命令

代码语言:bash
复制
# 查看版本
chaosmonkey --version

# 安装 Chaos Monkey(设置 cron、应用数据库迁移)
chaosmonkey install

# 生成终止调度计划
chaosmonkey schedule

# 手动终止指定组中的实例
chaosmonkey terminate --app=myapp --account=prod --region=us-east-1

# 从 API 获取并安装调度计划
chaosmonkey fetch-schedule

# 检查是否有正在进行的故障
chaosmonkey outage

# 查看可终止的实例列表(测试用)
chaosmonkey eligible --app=myapp --account=prod

# 应用数据库迁移
chaosmonkey migrate

# 导出应用配置
chaosmonkey config --app=myapp

# 导出 Chaos Monkey 全局配置
chaosmonkey config

配置示例

代码语言:toml
复制
# chaosmonkey.toml 配置示例
[chaos]
enabled = true
leashed = false                    # true 表示模拟终止,false 表示实际终止
accounts = ["prod", "staging"]
start_hour = 9                     # 开始时间(本地时间)
end_hour = 17                      # 结束时间(本地时间)
location = "America/Los_Angeles"   # 时区
max_apps = 50                      # 单次调度最大应用数

应用级配置

通过 Spinnaker 为每个应用配置 Chaos Monkey:

代码语言:json
复制
{
  "name": "myapp",
  "attributes": {
    "chaosMonkey": {
      "enabled": true,
      "meanTimeBetweenKillsInWorkDays": 5,
      "minTimeBetweenKillsInWorkDays": 1,
      "grouping": "cluster",
      "regionsAreIndependent": false,
      "exceptions": [
        {
          "account": "prod",
          "stack": "*",
          "cluster": "*",
          "region": "us-west-2"
        }
      ]
    }
  }
}

核心代码

主程序入口

代码语言:go
复制
// main.go - Chaos Monkey 主入口
package main

import (
    "github.com/Netflix/chaosmonkey/v2/command"
    
    // 匿名导入以注册相关模块
    _ "github.com/Netflix/chaosmonkey/v2/constrainer"
    _ "github.com/Netflix/chaosmonkey/v2/decryptor"
    _ "github.com/Netflix/chaosmonkey/v2/env"
    _ "github.com/Netflix/chaosmonkey/v2/errorcounter"
    _ "github.com/Netflix/chaosmonkey/v2/outage"
    _ "github.com/Netflix/chaosmonkey/v2/tracker"
)

func main() {
    command.Execute()
}

调度计划生成

代码语言:go
复制
// schedule.go - 生成每日终止调度计划
func do(d deploy.Deployment, g chaosmonkey.AppConfigGetter, 
        ss schedstore.SchedStore, cfg *config.Monkey, 
        cons schedule.Constrainer, apps []string) error {
    
    // 创建新的调度计划
    s := schedule.New()
    
    // 填充应用实例
    err := s.Populate(d, g, cfg, apps)
    if err != nil {
        return fmt.Errorf("failed to populate schedule: %v", err)
    }
    
    // 应用约束条件过滤
    sched := cons.Filter(*s)
    
    // 部署调度计划到 API 和本地 cron
    err = deploySchedule(&sched, ss, cfg)
    if err != nil {
        return fmt.Errorf("failed to deploy schedule: %v", err)
    }
    
    return nil
}

实例终止逻辑

代码语言:go
复制
// term.go - 核心终止逻辑
func Terminate(d deps.Deps, app string, account string, 
               region string, stack string, cluster string) error {
    
    // 检查 Chaos Monkey 是否启用
    enabled, err := d.MonkeyCfg.Enabled()
    if !enabled {
        log.Println("not terminating: enabled=false")
        return nil
    }
    
    // 检查是否有故障正在进行
    problem, err := d.Ou.Outage()
    if err != nil {
        return errors.Wrap(err, "could not check for outage")
    }
    if problem {
        log.Println("not terminating: currently in an outage")
        return nil
    }
    
    // 获取符合条件的实例列表
    group := grp.New(app, account, region, stack, cluster)
    instances, err := eligible.Instances(group, cfg.Exceptions, d.Dep)
    if err != nil {
        return err
    }
    
    // 随机选择一个实例并终止
    selected := instances[rand.Intn(len(instances))]
    termination := chaosmonkey.Termination{
        Instance: selected,
        Time:     time.Now(),
    }
    
    return d.T.Execute(termination)
}

应用配置解析

代码语言:go
复制
// spinnaker.go - 从 Spinnaker API 获取应用配置
func (s Spinnaker) Get(app string) (*chaosmonkey.AppConfig, error) {
    url := s.appURL(app) + "?expand=false"
    resp, err := s.client.Get(url)
    if err != nil {
        return nil, errors.Wrapf(err, "http get failed at %s", url)
    }
    defer resp.Body.Close()
    
    if resp.StatusCode != http.StatusOK {
        return nil, errors.Errorf("unexpected response code (%d)", resp.StatusCode)
    }
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return nil, errors.Wrapf(err, "body read failed")
    }
    
    return fromJSON(body)
}

工作日判断

代码语言:go
复制
// cal/cal.go - 工作日判断逻辑
func IsWorkday(t time.Time) bool {
    return isWeekday(t)
}

func isWeekday(t time.Time) bool {
    switch t.Weekday() {
    case time.Monday, time.Tuesday, time.Wednesday, 
         time.Thursday, time.Friday:
        return true
    case time.Saturday, time.Sunday:
        return false
    }
    panic(fmt.Sprintf("Unknown weekday: %s", t.Weekday()))
}

配置文件结构

代码语言:go
复制
// chaosmonkey/chaosmonkey.go - 核心数据结构
type AppConfig struct {
    Enabled                        bool        // 是否启用
    RegionsAreIndependent          bool        // 区域是否独立
    MeanTimeBetweenKillsInWorkDays int         // 平均终止间隔(工作日)
    MinTimeBetweenKillsInWorkDays  int         // 最小终止间隔(工作日)
    Grouping                       Group       // 分组策略
    Exceptions                     []Exception // 异常规则
    Whitelist                      *[]Exception // 白名单
}

type Exception struct {
    Account string  // 账户名称
    Stack   string  // 堆栈名称(* 表示所有)
    Detail  string  // 详细信息
    // ... 其他字段
}

支持

  • Simian Army Google Group - 用户讨论组
  • 官方文档 - 详细配置和部署指南
  • 混沌工程原则 - 了解混沌工程的核心原则 u76viuDi2iHmnaGlMXpDJR273tQn5BvVlpP5cH8/ttQ=

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Chaos Monkey
    • 功能特性
    • 安装指南
      • 系统要求
      • 本地安装
      • 配置文件
      • 部署说明
    • 使用说明
      • 基础命令
      • 配置示例
      • 应用级配置
    • 核心代码
      • 主程序入口
      • 调度计划生成
      • 实例终止逻辑
      • 应用配置解析
      • 工作日判断
      • 配置文件结构
    • 支持
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档