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 %---
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 中。
---
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 ...]
// TODO: switch to using cluster DNS. 注释,你可能需要覆盖 apiserver。[kubernetes]
host="https://your-apiserver-url.com:apiport"
调度在每个工作日每天进行一次——此时会生成当天终止操作的日程。在调度期间,kube-monkey 将:
kube-monkey/mtbf 计算当天要杀死的 Pod 数量。一个应用每天被杀死的次数为 24h/mtbf,因此 mtbf
为一天或更长时最多会导致一次终止,而更短的 mtbf 则会导致多次终止这是当天随机生成的时间,受害者 k8s 应用将在此时间有一个 Pod 被杀死。 在终止时间,kube-monkey 将:
kube-monkey 的 Docker 镜像可以在 DockerHub 找到。
克隆该仓库并构建容器。
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 中找到。
[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
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
注意:此模式将每 60 秒持续攻击 Pod,无论你为 startHour 和 endHour 配置了什么。
[debug]
enabled= true
schedule_immediate_kill= true
kube-monkey 支持通知,并且可以在攻击后通知你选择的端点。它可以是 Slack webhook 或自定义 API。
[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 环境变量设置,否则为空) message: '{
"what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
"who": "{$name}",
"when": {$timestamp}
}'
请求头支持一种特殊占位符,用于获取环境变量的值。 这在调用具有受保护端点的 API 时非常有用。 典型场景是将 API 令牌传递给 Kube-monkey 容器;该令牌存储在 Kubernetes Secret 中,而你希望通过环境变量传递它。
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]
{$env:API_TOKEN} 将被环境变量 API_TOKEN 的值替换。
注意:如果环境变量不存在,通知调用不会被取消。该值将解析为空字符串,并且日志中会出现警告。
手动部署
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
kube-system)中。参见目录 examples/ 获取示例 Kubernetes yaml 文件。
kubectl logs -f deployment.apps/kube-monkey --namespace=kube-system 看到调试日志,这里的 deployment.apps/kube-monkey 是 kube-monkey 的 k8s deployment。Helm Chart
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 日志页面,其中推荐了社区日志级别约定
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
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 文件。
fookube-monkey/identifier: fookube-monkey/kill-mode