模拟 JVM 应用故障
Chaos Mesh 通过 Byteman 模拟 JVM 应用故障,主要支持以下类型的故障::
- 抛出自定义异常
- 触发垃圾回收
- 增加方法延迟
- 指定方法返回值
- 设置 Byteman 配置文件触发故障
- 增加 JVM 压力
同时,Chaos Mesh 支持对常用的服务或其 Java 客户端注入上述的故障。比如,当 MySQL Java 客户端执行指定类型的 SQL 语句(SELECT
,UPDATE
,INSERT
,REPLACE
或 DELETE
)时,你可以使用 JVM 故障注入功能在该客户端注入延迟或抛出异常。
本文主要介绍如何创建以上故障类型的 JVM 实验。
Linux 系统内核必须为 4.1 及以上版本。
使用 Dashboard 方式创建实验
-
单击实验页面中的“新的实验”按钮创建实验:
-
在“选择目标”处选择 “JVM 故障”,然后选择具体行为(如
RETURN
),最后填写具体配置:具体配置的填写方式,参考字段说明。
-
填写实验信息,指定实验范围以及实验计划运行时间:
-
提交实验。
使用 YAML 方式创建实验
下面将以指定返回值为例,展示 JVMChaos 的使用方法与效果。以下内容中涉及的 YAML 文件均可在 examples/jvm 中找到,以下步骤默认的工作路径也是在 examples/jvm
中。 默认 Chaos Mesh 安装的命名空间为 chaos-mesh
。
第 1 步:创建被测应用
Helloworld 是一个简单的 Java 应用,此处作为被测应用。被测应用定义在 example/jvm/app.yaml
中,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: helloworld
namespace: helloworld
spec:
containers:
- name: helloworld
# source code: https://github.com/WangXiangUSTC/byteman-example/tree/main/example.helloworld
# this application will print log like this below:
# 0. Hello World
# 1. Hello World
# ...
image: xiang13225080/helloworld:v1.0
imagePullPolicy: IfNotPresent
-
创建应用所属的 namespace:
kubectl create namespace helloworld
-
建立该应用 Pod:
kubectl apply -f app.yaml
-
执行
kubectl -n helloworld get pods
,预期能够观察到命名空间helloworld
中名为helloworld
的 Pod。kubectl -n helloworld get pods
预期结果如下:
kubectl get pods -n helloworld
NAME READY STATUS RESTARTS AGE
helloworld 1/1 Running 0 2m
等待 READY
成为 1/1
后,可以进行下一步。
第 2 步:观测未被注入时的行为
在注入前你可以先观测应用 helloworld
未被注入时的行为,例如:
kubectl -n helloworld logs -f helloworld
输出如下所示:
0. Hello World
1. Hello World
2. Hello World
3. Hello World
4. Hello World
5. Hello World
可以看到 helloworld
每隔一秒输出一行 Hello World
,每行的编号依次递增。
第 3 步:注入 JVMChaos 并验证
-
指定返回值的 JVMChaos 内容如下:
apiVersion: chaos-mesh.org/v1alpha1
kind: JVMChaos
metadata:
name: return
namespace: helloworld
spec:
action: return
class: Main
method: getnum
value: '9999'
mode: all
selector:
namespaces:
- helloworldJVMChaos 将
getnum
方法的返回值修改为数字9999