Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
kube-monkey — Netflix 的 Chaos Monkey 在 Kubernetes 集群上的实现 | Kitploit
工具/GitHubGitHub/asobti/kube-monkey
混沌工程
GitHubasobti/kube-monkey

kube-monkey

Netflix 的 Chaos Monkey 在 Kubernetes 集群上的实现

查看仓库
3.1k25411天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Build Go Report Card License Docker Pulls Artifact Hub

kube-monkey 是 Netflix 的 Chaos Monkey 在 Kubernetes 集群上的一个实现。它会随机删除集群中的 Kubernetes (k8s) Pod,鼓励并验证故障弹性服务的开发。

在 Kubernetes Slack 上加入我们:#kube-monkey。


kube-monkey 在每个工作日按预配置的时间(run_hour,默认为上午 8 点)运行,并生成一个部署计划,这些部署将在同一天内的某个时间面对一次随机的 Pod 终止。一天内可能发生随机 Pod 终止的时间范围是可配置的,默认为上午 10 点到下午 4 点。

kube-monkey 可以配置一个命名空间列表

  • 将其加入黑名单(黑名单命名空间内的任何部署都不会被处理)

要禁用黑名单,请在 blacklisted_namespaces 配置参数中提供 [""]。

选择加入混沌测试

kube-monkey 采用主动选择加入模式,只会为那些明确同意其 Pod 可被 kube-monkey 终止的 Kubernetes (k8s) 应用调度终止操作。

通过在 k8s 应用上设置以下标签即可选择加入:

kube-monkey/enabled:设置为 "enabled" 以选择加入 kube-monkey
kube-monkey/mtbf:平均故障间隔时间,用一个整数和单位表示:d 表示天,h 表示小时,m 表示分钟。例如, 如果设置为 "3d",则该 k8s 应用预计大约每隔三个工作日会有一个 Pod 被杀死;如果设置为 "2h",则预计每两个小时 失去一个 Pod。没有单位的值按天读取,因此 "3" 与 "3d" 含义相同。最短的平均故障间隔时间 为一分钟。请注意,所有终止操作都发生在每天的运行窗口内(参见 start_hour 和 end_hour),因此少于一天的 mtbf 会将该天的终止操作集中在该窗口内。
kube-monkey/identifier:k8s 应用的唯一标识符。此标识符用于识别归属于某个 k8s 应用的 Pod,因为 Pod 会继承其 k8s 应用的标签。因此,如果 kube-monkey 检测到应用 已登记成为受害者,kube-monkey 会查找所有带有 标签的 Pod,以确定哪些 Pod 可作为被杀死候选。建议将此值设置为与应用名称相同。 :默认行为是 kube-monkey 仅杀死应用的一个 Pod。你可以通过设置以下值来覆盖此行为:

  • kill-all:如果你希望 kube-monkey 杀死应用的所有 Pod,无论其状态如何(包括未就绪和未运行的 Pod)。不需要 kill-value。请谨慎使用此标签。
  • fixed:如果你希望通过 kill-value 杀死指定数量的运行中 Pod。如果指定数量过多,它将杀死所有运行中的 Pod 并发出警告。
  • random-max-percent:通过 kill-value 指定可被杀死的最大 %。在预定时间,将终止运行中 Pod 中均匀随机指定的 %。
  • fixed-percent:通过 kill-value 指定可被杀死的固定 %。在预定时间,将终止运行中 Pod 中指定固定的 %。

kube-monkey/kill-value:为 kill-mode 指定值

  • 如果为 fixed,提供要杀死的 Pod 的整数数量
  • 如果为 random-max-percent,提供 0-100 之间的一个数字,以指定 kube-monkey 可杀死的最大 Pod %
  • 如果为 fixed-percent,提供 0-100 之间的一个数字,以指定要杀死的 Pod %

选择加入的 Deployment 每次清理杀死一个 Pod 的示例

root@kitploit:~
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monkey-victim
  namespace: app-namespace
spec:
  template:
    metadata:
      labels:
        kube-monkey/enabled: enabled
        kube-monkey/identifier: monkey-victim
        kube-monkey/mtbf: '2'
        kube-monkey/kill-mode: "fixed"
        kube-monkey/kill-value: '1'
[... omitted ...]

对于较新版本的 Kubernetes,你可能还需要将标签添加到 k8s 应用的 metadata 中。

root@kitploit:~
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monkey-victim
  namespace: app-namespace
  labels:
    kube-monkey/enabled: enabled
    kube-monkey/identifier: monkey-victim
    kube-monkey/mtbf: '2'
    kube-monkey/kill-mode: "fixed"
    kube-monkey/kill-value: '1'
spec:
  template:
    metadata:
      labels:
        kube-monkey/enabled: enabled
        kube-monkey/identifier: monkey-victim
[... omitted ...]

覆盖 apiserver

使用场景:

  • 由于 client-go 没有显式支持 cluster dns,并且在代码中带有 // TODO: switch to using cluster DNS. 注释,你可能需要覆盖 apiserver。
  • 如果你运行的是未经认证的系统,你可能需要强制使用 http apiserver 端点。

在 config.toml 文件中覆盖 apiserver

root@kitploit:~
[kubernetes]
host="https://your-apiserver-url.com:apiport"

kube-monkey 的工作原理

调度时间

调度在每个工作日每天进行一次——此时会生成当天终止操作的日程。在调度期间,kube-monkey 将:

  1. 生成符合条件的 k8s 应用列表(已经选择加入且未被列入黑名单(如果指定)且在白名单中(如果指定)的 k8s 应用)
  2. 对于每个符合条件的 k8s 应用,根据 kube-monkey/mtbf 计算当天要杀死的 Pod 数量。一个应用每天被杀死的次数为 24h/mtbf,因此 mtbf 为一天或更长时最多会导致一次终止,而更短的 mtbf 则会导致多次终止
  3. 对于每次终止,计算一个 Pod 将被杀死的随机时间

终止时间

这是当天随机生成的时间,受害者 k8s 应用将在此时间有一个 Pod 被杀死。 在终止时间,kube-monkey 将:

  1. 检查 k8s 应用是否仍然符合条件(自调度以来未选择退出、未被列入黑名单或未从白名单中移除)
  2. 检查 k8s 应用是否更新了 kill-mode 和 kill-value
  3. 根据 kill-mode 和 kill-value 执行 Pod 终止

Docker 镜像

kube-monkey 的 Docker 镜像可以在 DockerHub 找到。

构建

克隆该仓库并构建容器。

root@kitploit:~
go get github.com/asobti/kube-monkey
cd $GOPATH/src/github.com/asobti/kube-monkey
make build
make container

配置

kube-monkey 通过环境变量或位于 /etc/kube-monkey/config.toml 的 toml 文件进行配置,并且期望在 kube-monkey 部署之前 configmap 已经存在。

配置键及其说明可以在 config/param/param.go 中找到。

config.toml 示例文件

root@kitploit:~
[kubemonkey]
dry_run = true                           # Terminations are only logged
run_hour = 8                             # Run scheduling at 8am on weekdays
start_hour = 10                          # Don't schedule any pod deaths before 10am
end_hour = 16                            # Don't schedule any pod deaths after 4pm
blacklisted_namespaces = ["kube-system"] # Critical apps live here
time_zone = "America/New_York"           # Set tzdata timezone example. Note the field is time_zone not timezone

环境变量示例

root@kitploit:~
KUBEMONKEY_DRY_RUN=true
KUBEMONKEY_RUN_HOUR=8
KUBEMONKEY_START_HOUR=10
KUBEMONKEY_END_HOUR=16
KUBEMONKEY_BLACKLISTED_NAMESPACES=kube-system
KUBEMONKEY_TIME_ZONE=America/New_York

通过启用调试模式来测试 kube-monkey 是否正常工作的示例配置

注意:此模式将每 60 秒持续攻击 Pod,无论你为 startHour 和 endHour 配置了什么。

root@kitploit:~
[debug]
enabled= true
schedule_immediate_kill= true

通知

kube-monkey 支持通知,并且可以在攻击后通知你选择的端点。它可以是 Slack webhook 或自定义 API。

将攻击通知发布到 HTTP 端点的示例配置

root@kitploit:~
[notifications]
  enabled = true
  reportSchedule = true
  [notifications.attacks]
    endpoint = "http://url1"
    message = "message1"
    headers = ["header1Key:header1Value","header2Key:header2/Value"]

占位符

消息支持以下占位符:

  • {$name}:受害者名称
  • {$kind}:受害者类型
  • {$namespace}:受害者命名空间
  • {$timestamp}:距离 Unix 纪元的攻击时间(毫秒)
  • {$time}:攻击时间
  • {$date}:攻击日期
  • {$error}:结果错误(如果有)
  • {$kubemonkeyid}:kube-monkey 标识(通过 KUBE_MONKEY_ID 环境变量设置,否则为空)
root@kitploit:~
  message: '{
            "what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
            "who": "{$name}",
            "when": {$timestamp}
           }'

请求头支持一种特殊占位符,用于获取环境变量的值。 这在调用具有受保护端点的 API 时非常有用。 典型场景是将 API 令牌传递给 Kube-monkey 容器;该令牌存储在 Kubernetes Secret 中,而你希望通过环境变量传递它。

root@kitploit:~
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]

{$env:API_TOKEN} 将被环境变量 API_TOKEN 的值替换。

注意:如果环境变量不存在,通知调用不会被取消。该值将解析为空字符串,并且日志中会出现警告。

部署

手动部署

  1. 首先,在你打算运行 kube-monkey 的命名空间(例如 kube-system 命名空间)中部署预期的 kube-monkey-config-map configmap。确保将键名定义为 config.toml

例如 kubectl create configmap km-config --from-file=config.toml=km-config.toml 或 kubectl apply -f km-config.yaml

  1. 在 Kubernetes 集群内,将 kube-monkey 作为 k8s 应用运行,并放在一个有权杀死其他命名空间中 Pod 的命名空间(例如 kube-system)中。

参见目录 examples/ 获取示例 Kubernetes yaml 文件。

  1. 你应该可以通过 kubectl logs -f deployment.apps/kube-monkey --namespace=kube-system 看到调试日志,这里的 deployment.apps/kube-monkey 是 kube-monkey 的 k8s deployment。

Helm Chart

参见 如何使用 Helm 安装 kube-monkey。

日志

kube-monkey 使用 glog 并支持 glog 的所有命令行功能。要在 Pod 上指定自定义 v 级别或自定义日志目录,请参见 args: ["-v=5", "-log_dir=/path/to/custom/log"] 示例部署文件

标准化的 glog 级别 grep -r V\([0-9]\) *

L0:无

L1:最高级别的当前状态信息及终止错误

L2:成功终止

L3:更详细的调度状态信息

L4:调试详细调度和配置信息

L5:自动解决的小问题

更多资源:参见 k8s 日志页面,其中推荐了社区日志级别约定

如何在 OpenShift 3.x 上运行

root@kitploit:~
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-role-to-user -z deployer system:deployer
oc -n kube-system adm policy add-role-to-user -z builder system:image-builder
oc -n kube-system adm policy add-role-to-group system:image-puller system:serviceaccounts:kube-system
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.4.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map

OpenShift 4.x

root@kitploit:~
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-cluster-role-to-user edit -z default --rolebinding-name kube-monkey-edit
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.3.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc set volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map

贡献方式

参见 如何贡献

许可证

本项目采用 Apache License v2.0 许可 - 详细信息请参见 LICENSE 文件。

下载工具
foo
kube-monkey/identifier: foo

kube-monkey/kill-mode