模拟文件 I/O 故障

本文档主要介绍如何在 Chaos Mesh 中创建 IOChaos 混沌实验。

IOChaos 介绍

IOChaos 是 Chaos Mesh 中的一种故障类型。通过创建 IOChaos 类型的混沌实验,你可以模拟文件系统发生故障的情景。目前,IOChaos 支持模拟以下故障类型:

  • latency:为文件系统调用加入延迟
  • fault:使文件系统调用返回错误
  • attrOverride:修改文件属性
  • mistake:使文件读到或写入错误的值

详细的功能介绍参见使用 YAML 文件创建实验

注意事项

  1. 创建 IOChaos 实验前,请确保目标 Pod 上没有运行 Chaos Mesh 的 Controller Manager。

  2. IOChaos 可能会损坏你的数据,在生产环境中请谨慎使用。

使用 Dashboard 创建实验

  1. 单击实验页面中的新的实验按钮创建实验。

    新建实验

  2. 选择目标处选择文件系统注入,并选择具体行为,如LATENCY

    设置实验类型

  3. 填写实验信息,指定实验范围以及实验计划运行时间。

    设置实验内容

    设置目标和运行时间

  4. 提交实验。

    提交实验

使用 YAML 文件创建实验

latency 示例

  1. 将实验配置写入到文件中 io-latency.yaml,内容示例如下:

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: IOChaos
    3. metadata:
    4. name: io-latency-example
    5. namespace: chaos-testing
    6. spec:
    7. action: latency
    8. mode: one
    9. selector:
    10. labelSelectors:
    11. app: etcd
    12. volumePath: /var/run/etcd
    13. path: '/var/run/etcd/**/*'
    14. delay: '100ms'
    15. percent: 50
    16. duration: '400s'

    依据此配置示例,Chaos Mesh 将向 /var/run/etcd 目录注入延迟故障,使该目录下的所有文件系统操作(包括读,写,列出目录内容等)产生 100 毫秒延迟。

  2. 使用 kubectl 创建实验,命令如下:

    1. kubectl apply -f ./io-latency.yaml

fault 示例

  1. 将实验配置写入到文件中 io-fault.yaml,内容示例如下:

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: IOChaos
    3. metadata:
    4. name: io-fault-example
    5. namespace: chaos-testing
    6. spec:
    7. action: fault
    8. mode: one
    9. selector:
    10. labelSelectors:
    11. app: etcd
    12. volumePath: /var/run/etcd
    13. path: /var/run/etcd/**/*
    14. errno: 5
    15. percent: 50
    16. duration: '400s'

    依据此配置示例,Chaos Mesh 将向 /var/run/etcd 目录注入文件错误故障,使该目录下的所有文件系统操作有 50% 的概率发生错误,并返回错误码 5 (Input/output error)。

  2. 使用 kubectl 创建实验,命令如下:

    1. kubectl apply -f ./io-fault.yaml

attrOverride 示例

  1. 将实验配置写入到文件中 io-attr.yaml,内容示例如下:

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: IOChaos
    3. metadata:
    4. name: io-attr-example
    5. namespace: chaos-testing
    6. spec:
    7. action: attrOverride
    8. mode: one
    9. selector:
    10. labelSelectors:
    11. app: etcd
    12. volumePath: /var/run/etcd
    13. path: /var/run/etcd/**/*
    14. attr:
    15. perm: 72
    16. percent: 10
    17. duration: '400s'

    依据此配置示例,Chaos Mesh 将向 /var/run/etcd 目录注入 attrOverride 故障,使该目录下的所有文件系统操作将有 10% 的概率使目标文件的权限变为 72(即八进制下的 110),这将使得文件只能由拥有者与其所在的组执行,无权进行其他操作。

  2. 使用 kubectl 创建实验,命令如下:

    1. kubectl apply -f ./io-attr.yaml

mistake 示例

  1. 将实验配置写入到文件中 io-mistake.yaml,内容示例如下:

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: IOChaos
    3. metadata:
    4. name: io-mistake-example
    5. namespace: chaos-testing
    6. spec:
    7. action: mistake
    8. mode: one
    9. selector:
    10. labelSelectors:
    11. app: etcd
    12. volumePath: /var/run/etcd
    13. path: /var/run/etcd/**/*
    14. mistake:
    15. filling: zero
    16. maxOccurrences: 1
    17. maxLength: 10
    18. methods:
    19. - READ
    20. - WRITE
    21. percent: 10
    22. duration: '400s'

    依据此配置示例,Chaos Mesh 将向 /var/run/etcd 目录注入读写错误故障,使该目录下的读写操作将有 10% 的概率将发生错误。其中以字节为单位,最大长度为 10 的 1 处随机位置将被替换为 0。

  2. 使用 kubectl 创建实验,命令如下:

    1. kubectl apply -f ./io-mistake.yaml

字段说明

通用字段

参数类型说明默认值是否必填示例
actionstring表示具体的故障类型,仅支持 latency、fault、attrOverride、mistakelatency
modestring指定实验的运行方式,可选择的方式包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)one
selectorstruct指定注入故障的目标 Pod,详情请参考定义实验范围
valuestring取决与 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比1
volumePathstringvolume 在目标容器内的挂载点,必须为挂载的根目录/var/run/etcd
pathstring注入错误的生效范围,可以是通配符,也可以是单个文件默认对所有文件生效/var/run/etcd/*/
methodsstring[]需要注入故障的文件系统调用类型,具体支持的类型见附录 A所有类型READ
percentint每次操作发生故障的概率,单位为%100100
containerNamestring指定注入的容器名
durationstring指定具体实验的持续时间30s

与 action 相关的字段

这些字段仅在 action 为对应值时才有意义:

  • latency

    参数类型说明默认值是否必填示例
    delaystring具体的延迟时长100 ms
  • fault

    参数类型说明默认值是否必填示例
    errnoint返回的错误号22

    常见的错误号见附录 B

  • attrOverride

    参数类型说明默认值是否必填示例
    attrAttrOverrideSpec具体的属性覆写规则见下

    AttrOverrideSpec 定义如下

    参数类型说明默认值是否必填示例
    inointino 的号
    sizeint文件大小
    blocksint文件占用块数
    atimeTimeSpec最后访问时间
    mtimeTimeSpec最后修改时间
    ctimeTimeSpec最后状态变更时间
    kindstring文件类型,详见 fuser::FileType
    permint文件权限的十进制表示72(八进制下为 110)
    nlinkint硬链接数量
    uidint所有者的用户 ID
    gidint所有者的组 ID
    rdevint设备 ID

    TimeSpec 定义如下

    参数类型说明默认值是否必填示例
    secint以秒为单位的时间戳
    nsecint以纳秒为单位的时间戳

    关于参数的具体含义,你可以参考 man stat

  • mistake

    参数类型说明默认值是否必填示例
    mistakeMistakeSpec具体错误规则

    MistakeSpec 定义如下

    参数类型说明默认值是否必填示例
    fillingstring错误数据的填充内容,只能为 zero(填充 0)或 random(填充随机字节)
    maxOccurrencesint错误在每一次操作中最多出现次数1
    maxLengthint每次错误的最大长度(单位为字节)1
警告

不推荐在除了 READ 和 WRITE 之外的文件系统调用上使用 mistake 错误。这可能会导致预期之外的结果,包括但不限于文件系统损坏、程序崩溃等。

本地调试

如果你不确定某个 Chaos 的效果,也可以使用 toda 在本地测试相应功能。Chaos Mesh 同样使用 toda 实现 IOChaos。

附录 A:methods 类型

  • lookup
  • forget
  • getattr
  • setattr
  • readlink
  • mknod
  • mkdir
  • unlink
  • rmdir
  • symlink
  • rename
  • link
  • open
  • read
  • write
  • flush
  • release
  • fsync
  • opendir
  • readdir
  • releasedir
  • fsyncdir
  • statfs
  • setxattr
  • getxattr
  • listxattr
  • removexattr
  • access
  • create
  • getlk
  • setlk
  • bmap

详见 fuser::Filesystem

附录 B:常见错误号

  • 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 源码