Kube monkey
简介
kube-monkey 会在一天的随机的一个时间点删除 pod,用来测试高可用服务在突发故障下是否仍能正常工作。
Kube-monkey 遵循混沌工程原理,可随机删除 K8s pod 并检查服务是否具有故障恢复能力,并提高系统健康性。
Kube-monkey 由 TOML 文件配置,可在其中指定要杀死的应用程序及恢复时间。
部署 kube-monkey
git clone https://github.com/asobti/kube-monkey.git
cd kube-monkey
helm install --name kube-monkey helm/kubemonkey
chart 模板中 debug 模式只支持配 enabled 和 schedule_immediate_kill 两个配置项,其他配置项需要 helm 部署之后,修改 kubemonkey-kube-monkey
configmap 的值
kube-monkey 运行参数配置
可通过 kubectl edit configmap -n <kube-monkey 安装命名空间> kubemonkey-kube-monke
修改,修改完毕后需重建 kube-monkey 的 pod
[kubemonkey]
dry_run = true
run_hour = 8
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" ] # 不攻击的 namespace 列表
whitelisted_namespaces = [ "default" ] # 攻击的 namespace 列表
time_zone = "Asia/Shanghai" # 时区
[debug] # 无视 start_hour 配置和 end_hour 配置,每隔 60s 都会攻击 pod
enabled = false
schedule_immediate_kill = false
[notifications]
enabled = false
[notifications.attacks]
[kubemonkey]
dry_run = true
run_hour = 8
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" ] # 不攻击的 namespace 列表
whitelisted_namespaces = [ "default" ] # 攻击的 namespace 列表
time_zone = "Asia/Shanghai" # 时区
[debug] # 无视 start_hour 配置和 end_hour 配置,每隔 60s 都会攻击 pod
enabled = true
schedule_immediate_kill = false
[notifications]
enabled = true
reportSchedule = false
[notifications.attacks]
endpoint = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=bec1f42f-5d6f-4854-a0a8-c91746d77b00"
headers = ["Content-Type:application/json"]
message = '{"msgtype": "markdown","markdown": {"content": "删除命名空间 {$namespace} 中的 {$name}\n执行时间:{$date}"}}'
工作负载标签
可以通过在 k8s app 中打如下几种 label 来让 kube-monkey 管理:
-
kube-monkey/enabled:设置为 "enabled" 选择加入 kube-monkey
-
kube-monkey/mtbf:平均故障间隔时间(以天为单位)。例如,如果设置为 "3",则 k8s 应用程序预计大约每三个工作日就会杀死一个 Pod。
-
kube-monkey/identifier:k8s 应用程序的唯一标识符。这用于识别属于 k8s 应用程序的 Pod,因为 Pods 从其 k8s 应用程序继承标签。因此,如果 kube-monkey 检测到该应用程序 foo 已注册成为受害者,kube-monkey 将查找具有标签的所有 pod。kube-monkey/identifier: foo 以确定哪些 pod 是候选者杀死。建议将此值设置为与应用名称相同。
-
kube-monkey/kill-mode:默认行为是 kube-monkey 只杀死应用程序的一个 pod。您可以通过将值设置为:
-
"kill-all" 如果您希望 kube-monkey 杀死所有 pod,而不管其状态如何(包括未准备好或未运行的 pod)。不需要杀伤值。小心使用这个标签。
-
fixed 如果你想用 kill-value 杀死特定数量的正在运行的 pod。如果您过度指定,它将杀死所有正在运行的 pod 并发出警告。
-
random-max-percent 指定可以杀死的最大百分比与杀死值。在预定时间,将终止一个统一随机指定百分比的正在运行的 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 的百分比
labels:
kube-monkey/enabled: enabled
# kube-monkeypod
kube-monkey/identifier: monkey-victim
# () pod
kube-monkey/mtbf: '5'
# killpod
kube-monkey/kill-mode: "fixed"
# kill-all killpod
# fixed kill-valuepod
# random-max-percent kill-value pod
# fixed-percen kill-valuepod
kube-monkey/kill-value: '1'
使用如下脚本给 deployment 加标签
#!/usr/bin/env bash
global_namespace=$1
workloads=$(kubectl get deployment -n "${global_namespace}" |grep -v 'NAME'|awk '{print $1}')
sleep 1
for workload in ${workloads[@]}
do
echo "patch label for deployment ${workload}"
export workload
kubectl label deployment -n "${global_namespace}" "${workload}" kube-monkey/enabled=enabled --overwrite=true
kubectl label deployment -n "${global_namespace}" "${workload}" kube-monkey/identifier="${workload}" --overwrite=true
kubectl label deployment -n "${global_namespace}" "${workload}" kube-monkey/mtbf=5 --overwrite=true
kubectl label deployment -n "${global_namespace}" "${workload}" kube-monkey/kill-mode=fixed --overwrite=true
kubectl label deployment -n "${global_namespace}" "${workload}" kube-monkey/kill-value=1 --overwrite=true
yq -i '.spec.template.metadata.labels."kube-monkey/identifier" = strenv(workload)' patch.yaml
kubectl patch deployment -n "${global_namespace}" "${workload}" --patch-file patch.yaml
done
patch 的内容如下