模拟文件 I/O 故障
IOChaos 是 Chaos Mesh 中的一种故障类型。通过创建 IOChaos 类型的混沌实验,你可以模拟文件系统发生故障的情景。目前,IOChaos 支持模拟以下故障类型:
- latency:为文件系统调用加入延迟
- fault:使文件系统调用返回错误
- attrOverride:修改文件属性
- mistake:使文件读到或写入错误的值
详细的功能介绍参见。
注意事项
创建 IOChaos 实验前,请确保目标 Pod 上没有运行 Chaos Mesh 的 Controller Manager。
IOChaos 可能会损坏你的数据,在生产环境中请谨慎使用。
单击实验页面中的新的实验按钮创建实验。
在选择目标处选择文件系统注入,并选择具体行为,如LATENCY。
填写实验信息,指定实验范围以及实验计划运行时间。
提交实验。
使用 YAML 文件创建实验
将实验配置写入到文件中 ,内容示例如下:
依据此配置示例,Chaos Mesh 将向
/var/run/etcd
目录注入延迟故障,使该目录下的所有文件系统操作(包括读,写,列出目录内容等)产生 100 毫秒延迟。使用
kubectl
创建实验,命令如下:kubectl apply -f ./io-latency.yaml
使用
kubectl
创建实验,命令如下:kubectl apply -f ./io-fault.yaml
将实验配置写入到文件中
io-attr.yaml
,内容示例如下:依据此配置示例,Chaos Mesh 将向 目录注入
attrOverride
故障,使该目录下的所有文件系统操作将有 10% 的概率使目标文件的权限变为 72(即八进制下的 110),这将使得文件只能由拥有者与其所在的组执行,无权进行其他操作。使用
kubectl
创建实验,命令如下:kubectl apply -f ./io-attr.yaml
将实验配置写入到文件中
io-mistake.yaml
,内容示例如下:依据此配置示例,Chaos Mesh 将向
/var/run/etcd
目录注入读写错误故障,使该目录下的读写操作将有 10% 的概率将发生错误。其中以字节为单位,最大长度为 10 的 1 处随机位置将被替换为 0。使用
kubectl
创建实验,命令如下:kubectl apply -f ./io-mistake.yaml
通用字段
与 action 相关的字段
latency
参数 类型 说明 默认值 是否必填 示例 delay string 具体的延迟时长 是 100 ms fault
常见的错误号见附录 B
attrOverride
参数 类型 说明 默认值 是否必填 示例 attr AttrOverrideSpec 具体的属性覆写规则 是 见下 AttrOverrideSpec 定义如下
TimeSpec 定义如下
参数 类型 说明 默认值 是否必填 示例 sec int 以秒为单位的时间戳 否 nsec int 以纳秒为单位的时间戳 否 关于参数的具体含义,你可以参考 。
mistake
MistakeSpec 定义如下
参数 类型 说明 默认值 是否必填 示例 filling string 错误数据的填充内容,只能为 zero(填充 0)或 random(填充随机字节) 是 maxOccurrences int 错误在每一次操作中最多出现次数 是 1 maxLength int 每次错误的最大长度(单位为字节) 是 1
警告
不推荐在除了 READ 和 WRITE 之外的文件系统调用上使用 mistake 错误。这可能会导致预期之外的结果,包括但不限于文件系统损坏、程序崩溃等。
如果你不确定某个 Chaos 的效果,也可以使用 在本地测试相应功能。Chaos Mesh 同样使用 toda 实现 IOChaos。
附录 A:methods 类型
- lookup
- forget
- getattr
- setattr
- readlink
- mknod
- mkdir
- unlink
- rmdir
- symlink
- rename
- link
- open
- read
- write
- release
- fsync
- opendir
- readdir
- releasedir
- fsyncdir
- statfs
- setxattr
- getxattr
- listxattr
- removexattr
- access
- create
- getlk
- setlk
- bmap
- 1: Operation not permitted
- 2: No such file or directory
- 5: I/O error
- 6: No such device or address
- 12: Out of memory
- 16: Device or resource busy
- 17: File exists
- 20: Not a directory
- 22: Invalid argument
- 24: Too many open files
- 28: No space left on device
详见 Linux 源码