Kindling 是一款基于标准化错误定界和定位理念设计的开源监控工具,其设计和核心思路是,对于云上环境和容器环境中,应用程序可能出现的各种故障,能够以标准化的步骤,定位故障出现的位置和原因,而不依赖于用户对应用的了解或对k8s,linux知识的积累。
太空舱计划设计的目的是检验监控工具的标准化故障排查能力,推动Kindling项目的不断演进,以实现对各类故障的覆盖。
项目中总结了一些常见的应用异常场景,这些异常场景由项目组的开发和运维经验整理而来,覆盖了云上项目各类异常场景,包括网络设备,运行资源,应用程序缺陷等多种原因。
这些场景通过预设置的Demo应用和故障注入程序进行封装,可以在各种k8s环境和云主机环境中复现.
用户可以快捷的将自己的测试环境改造成太空舱环境,并部署演示应用,来自行注入故障以验证监控工具的错误检测和定界定位能力。
我们期望Kindling项目能够尽可能地覆盖用户在云上的各种异常场景,欢迎任何有兴趣的开发者参与丰富我们未设想到的缺陷场景,又或是对其他监控工具进行错误检测和定位测,来帮助所有的eBPF监控工具共同进步。
v1.18.1 -> 1.23.1 已验证
其他版本如不适配,请提issues,提pr更加欢迎
- 下载release到master节点(保证能执行kubectl命令即可)之后解压
- 创建演示namespace -> kubectl create namespace practice
- cd space-capsule目录,执行./install.sh安装 chaosblade-operator 和 示例应用
- 执行 kubectl get po -n chaosblade 可查看chaosblade-operator是否安装成功
NAME READY STATUS RESTARTS AGE
chaosblade-operator-748dc7588b-z9kts 1/1 Running 1 5d22h
chaosblade-tool-69whc 1/1 Running 3 12d
chaosblade-tool-8jrxx 1/1 Running 1 12d
chaosblade-tool-8mcjx 1/1 Running 1 4d23h
chaosblade-tool-987fq 1/1 Running 3 12d
chaosblade-tool-ksw9w 1/1 Running 2 12d
chaosblade-tool-mwt76 1/1 Running 1 12d
- 执行 kubectl get po -n practice 可查看示例应用是否安装成功
NAME READY STATUS RESTARTS AGE
bop-67bddbd49-n5nzf 1/1 Running 0 20h
configservice-7f67b8846d-4h6kv 1/1 Running 0 3h49m
configservice-fbcb85d77-8zqhb 1/1 Running 0 3h56m
coreservice-5779d97d6b-4hhs8 1/1 Running 0 3h51m
cronservice-77dbf765f9-zfsrp 1/1 Running 0 4h7m
dataservice-96d785bdc-r7lww 1/1 Running 0 3h51m
etcs-7b9d99bbb5-vs2ng 1/1 Running 0 3h50m
gateway-f5c68b974-z4vcm 1/1 Running 0 3h50m
ng-b76f67475-2qwth 1/1 Running 0 3h50m
riskservice-78956c8bf8-8ckqx 1/1 Running 0 3h49m
rocketmq-0 1/1 Running 0 4h
- ng为入口应用,默认通过ingress-nginx(需自配) 暴露ng-svc的端口,如果没有ingress-nginx可将ng-svc修改为nodePort形式
[root@10 space-capsule-alpha]# kubectl get svc -n practice
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
bop-svc ClusterIP 10.99.95.76 <none> 8080/TCP 35d
core-svc ClusterIP 10.96.122.223 <none> 8080/TCP 35d
cron-svc ClusterIP 10.108.84.197 <none> 8080/TCP 34d
data-svc ClusterIP 10.99.95.79 <none> 8080/TCP 35d
etcs-svc ClusterIP 10.99.95.80 <none> 8080/TCP 35d
gateway-svc ClusterIP 10.99.95.75 <none> 8080/TCP 35d
ng-svc ClusterIP 10.99.95.71 <none> 8080/TCP 36d
risk-svc ClusterIP 10.99.95.78 <none> 8080/TCP 35d
rocketmq-svc ClusterIP 10.99.95.77 <none> 8080/TCP 5d20h
- 使用 ./space-capsule case1 创建第一个故障场景
[root@10 space-capsule-alpha]# ./space-capsule case12 --namespace practice --pod coreservice-67dd66b57c-hsm2b
Check result True
Chaosblade Exist
Copy file finished
['bash', '-c', '/opt/chaosblade/blade prepare jvm --process java ']
{"code":200,"success":true,"result":"01aa8dca66762cf7"} None
agent ['01aa8dca66762cf7']
slow_code injected done!
- 使用 ./space-capsule undo case1 还原第一个故障场景
[root@10 space-capsule-alpha]# ./space-capsule undo case12
{"code":200,"success":true,"result":{"target":"jvm","action":"delay","flags":{"classname":"com.imooc.appoint.service.Impl.PracticeServiceImpl","methodname":"httpTxn1","offset":"100","process":"java","time":"3000"}}}
- 下载release到主机节点之后解压
- cd space-capsule目录
- 使用 ./space-capsule case1-vm 创建第一个故障case,虚机加后缀-vm
[root@nginx space-capsule-alpha]# ls
example history install.sh space-capsule
[root@nginx space-capsule-alpha]# ./space-capsule case1-vm
- 使用 ./space-capsule undo case1 还原第一个故障场景
[root@nginx space-capsule-alpha]# ./space-capsule undo case1-vm
{"code":200,"success":true,"result":{"target":"network","action":"delay","flags":{"interface":"ens192","local-port":"8080,8081","offset":"100","time":"2000"}}}
- 位于/space-capsule/jemter文件夹下面
- 修改用户定义的变量中ngIp,ngport为nginx暴露的端口或者nodeport方式暴露的端口
- 下发配置
- 禁用start线程组,启用init线程组,执行。查看结果树,每个请求项data不为空表示配置下发成功。
{
"data": {
"mysql_resp_interval": "-1",
"get_http_url1": "http:\/\/gateway-svc:8080\/bookDemo\/gateway\/practice\/httpTxn1",
"get_http_url2": "http:\/\/gateway-svc:8080\/bookDemo\/gateway\/practice\/httpTxn1",
"get_http_url3": "http:\/\/gateway-svc:8080\/bookDemo\/gateway\/practice\/httpTxn1",
"get_http_url4": "http:\/\/gateway-svc:8080\/bookDemo\/gateway\/practice\/httpTxn2And4",
"http_error_resp_code": "200",
"http_resp_interval": "10"
},
"success": true,
"Connection": "keep-alive"
}
- 发送流量
- 禁用init线程组,启用start线程组,执行,查看执行结果树:
{
"data": {
"result": "Success",
"data": "{\"data\":{\"result\":\"Success\",\"d`...`"}",
"status": 200
},
"success": true,
"Connection": "keep-alive"
}
- 待开始
No | 案例原因 | 案例表现 | 案例类型 | k8s支持 | 云主机支持 |
---|---|---|---|---|---|
case1 | 主机网卡之间存在高网络延时 | 请求超时/响应慢 | 网络异常 | ✅ | ✅ |
case2 | 容器网卡之间存在高网络延时 | 请求超时/响应慢 | 网络异常 | ✅ | NA |
case3 | 主机网卡之间存在丢包 | 请求超时/异常返回 | 网络异常 | ✅ | ✅ |
case4 | 容器网卡之间存在丢包 | 请求超时/异常返回 | 网络异常 | ✅ | NA |
case5 | 集群内网络隔离 | 建立连接失败 | 网络异常 | ✅ | NA |
case6 | 域名解析失败 | 建立连接失败/无访问请求 | 网络异常 | ✅ | 待开始 |
case7 | 由于主机防火墙导致的长tcp连接中断 | 请求超时/请求返回异常 | 网络异常 | 待开始 | 待开始 |
case8 | 主机节点负载过高,应用程序无法分配到充足的资源 | 请求超时/响应慢 | 资源异常 | ✅ | ✅ |
case9 | k8s资源配置不合理,limit无法满足程序需要 | 请求超时/响应慢 | 资源异常 | ✅ | NA |
case10 | 容器/主机内部文件打开数达到限制,无法建立更多连接 | 无法建立连接 | 资源异常 | 实施中 | 待开始 |
case11 | 命名空间资源配额限制,服务无法创建实例 | 无法建立连接 | 资源异常 | ✅ | NA |
case12 | Java程序低效代码长时间运行 | 请求超时/响应慢 | 程序缺陷 | ✅ | 待开始 |
case13 | Java程序死锁 | 请求超时/响应慢 | 程序缺陷 | ✅ | ✅ |
case14 | Java程序未捕获异常导致程序致命终止 | 请求异常返回/建立连接失败 | 程序缺陷 | ✅ | ✅ |
case15 | 磁盘io慢 | 请求处理缓慢 | 资源异常 | 实施中 | 待开始 |
case16 | 应用程序使用的线程池资源耗尽 | 业务请求超时 | 资源异常 | 待开始 | 待开始 |
case17 | Java程序使用的内存资源超过Xmx限制 | 请求异常 | 资源异常 | 待开始 | 待开始 |
case18 | 应用程序中使用的Sql语句执行时间过久 | 请求超时 | 资源异常 | 待开始 | 待开始 |
示例应用是一个基于SpringBoot完成的演示程序,用于模拟正常状态下的用户服务。
graph LR;
Nginx-->Gateway;
Gateway-->Bop;
Bop-->Coreservice;
Bop-->Cronservice;
Coreservice-->Riskservice;
Riskservice-->Dataservice;
Cronservice-->Dataservice;
Dataservice-->Rocketmq;
graph LR;
Nginx-->Gateway;
Gateway-->Bop;
Bop-->Cronservice;
Cronservice-->Dataservice;
Dataservice-->Rocketmq;
graph LR;
Nginx-->Gateway;
Gateway-->Bop;
Bop-->Cronservice;
Cronservice-->Bop;
Bop-->Coreservice;
Coreservice-->Riskservice;
Riskservice-->Dataservice;
Dataservice-->Rocketmq;
- 基于命令行工具,快速构建实验环境。
- 罗列常见的问题场景和导致问题的原因
- 通过注入程序快速复现用户异常场景,并支持快速恢复
- 复现指定原因导致的问题场景
- 网络类故障: 基于chaosblade封装的网络故障注入工具,底层为tc命令实现
- 资源类故障: 基于chaosblade和k8s api-server实现应用的资源控制和节点的资源控制
- 应用代码类故障: 基于chaosblade的JVM代码注入工具
- 权限和策略故障: 基于k8s api-server和示例应用内部逻辑
- 支持出网和入网流量延迟和丢包场景,支持以下粒度: node,workload,pod,containers
- 支持资源抢占场景,包括 cpu,mem和disk资源, 支持以下粒度: node,workload,pod,containers
- 支持k8s资源限制场景,包括cpu,memory和ephemeral storage的requests,limit限制
- 支持Java应用程序异常场景,包括死锁,资源异常使用,RuntimeError, 外部资源阻塞等情况