跳到主要内容

模拟 I/O 故障

IOChaos 实验能够模拟文件系统发生故障的场景。目前,I/OChaos 实验支持以下几种故障类型:

  • Latency:延迟文件系统调用;
  • Fault:使文件系统调用返回错误;
  • AttrOverride:修改文件属性;
  • Mistake:使文件读到或写入错误的值。

开始之前

  • I/O 故障注入只能在 Linux 上执行。
  • 实验结果需要进入容器内部查看,且要指定 volume 挂载路径。
  • 建议只对 Write 和 Read 操作注入 I/O 故障。

使用 kbcli 模拟故障注入

下表介绍 I/O 故障类型的常见字段。

📎 Table 1. kbcli I/O 故障参数说明

参数说明默认值是否必填
--volume-path指定 volume 在目标容器内的挂载点,必须为挂载的根目录。
--path指定注入故障的生效范围,可以是通配符,也可以是单个文件。*
--percent指定每次操作发生故障的概率,单位为 %。100
--container, -c指定注入故障的容器名称。
--method指定 I/O 操作,支持 readwrite*

Latency

执行以下命令,向 /data 目录注入延迟故障,使该目录下的所有文件内容产生 10 秒延迟。即,延迟 Read 操作。

--delay 指定具体的延迟时长,必填。

kbcli fault io latency --delay=10s --volume-path=/data

Fault

常见的错误号:

  • 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

点击参考完整的错误编号列表

执行以下命令,向 /data 目录注入文件错误故障,使该目录下的所有文件系统 100% 出现故障,并返回错误码 22(invalid argument)。

--errno 指定系统应该返回的错误号,必填。

kbcli fault io errno --volume-path=/data --errno=22

Attribute override

执行以下命令,向目录 /data 注入 attrOverride 故障,使得该目录下的所有文件系统操作 100% 将目标文件的权限更改为 72(即八进制中的 110)。这将导致文件只能由所有者和其所在的组执行,无权进行其他操作。

kbcli fault io attribute --volume-path=/data --perm=72

你可以使用以下参数来修改相关属性。

📎 Table 2. kbcli AttrOverride 参数说明

参数说明默认值是否必填
--blocks文件占用块数
--inoino 号
--nlink硬链接数量
--perm文件权限的十进制表示
--size文件大小
--uid所有者的用户 ID
--gid所有者的组 ID

Mistake

执行以下命令,向目录 /data 注入读写错误故障,使该目录下的读写操作有 10% 的概率发生错误。在此过程中,将随机选择一个最大长度为 10 个字节的位置,并将其替换为 0 字节。

kbcli fault io mistake --volume-path=/data --filling=zero --max-occurrences=10 --max-length=1

📎 Table 3. kbcli Mistake 参数说明

参数说明默认值是否必填
--filling错误数据的填充内容,只能为 zero(填充 0)或 random(填充随机字节)。
max-occurrences错误在每一次操作中最多出现次数。
--max-length每次错误的最大长度(单位为字节)。
危险

不建议在除了 READ 和 WRITE 之外的文件系统调用上使用 mistake 错误。这可能会导致文件系统损坏、程序崩溃等后果。

使用 YAML 文件模拟故障注入

本节介绍如何使用 YAML 文件模拟故障注入。你可以在上述 kbcli 命令的末尾添加 --dry-run 命令来查看 YAML 文件,还可以参考 Chaos Mesh 官方文档获取更详细的信息。

Fault latency 示例

  1. 将实验配置写入到 fault-latency.yaml 文件中。

    在下例中,Chaos Mesh 将向 /data 目录注入延迟故障,使该目录下的所有文件产生 10 秒延迟。即,延迟读取操作。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: IOChaos
    metadata:
    creationTimestamp: null
    generateName: io-chaos-
    namespace: default
    spec:
    action: latency
    delay: 10s
    duration: 10s
    mode: all
    percent: 100
    selector:
    namespaces:
    - default
    volumePath: /data
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./fault-latency.yaml

Fault fault 示例

  1. 将实验配置写入到 fault-fault.yaml 文件中。

    在下例中,Chaos Mesh 将向 /data 目录注入文件错误故障,使该目录下的所有文件系统 100% 出现故障,并返回错误码 22(invalid argument)。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: IOChaos
    metadata:
    creationTimestamp: null
    generateName: io-chaos-
    namespace: default
    spec:
    action: fault
    duration: 10s
    errno: 22
    mode: all
    percent: 100
    selector:
    namespaces:
    - default
    volumePath: /data
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./fault-fault.yaml

Fault attrOverride 示例

  1. 将实验配置写入到 fault-attrOverride.yaml 文件中。

    在下例中,Chaos Mesh 将向目录 /data 注入 attrOverride 故障,使得该目录下的所有文件系统操作 100% 将目标文件的权限更改为 72(即八进制中的 110)。这将导致文件只能由所有者和其所在的组执行,无权进行其他操作。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: IOChaos
    metadata:
    creationTimestamp: null
    generateName: io-chaos-
    namespace: default
    spec:
    action: attrOverride
    attr:
    perm: 72
    duration: 10s
    mode: all
    percent: 100
    selector:
    namespaces:
    - default
    volumePath: /data
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./fault-attrOverride.yaml

Fault mistake 示例

  1. 将实验配置写入到 fault-mistake.yaml 文件中。

    在下例中,Chaos Mesh 将向目录 /data 注入读写错误故障,使该目录下的读写操作有 10% 的概率发生错误。在此过程中,将随机选择一个最大长度为 10 个字节的位置,将其替换为 0 字节。

    apiVersion: chaos-mesh.org/v1alpha1
    kind: IOChaos
    metadata:
    creationTimestamp: null
    generateName: io-chaos-
    namespace: default
    spec:
    action: mistake
    duration: 10s
    mistake:
    filling: zero
    maxLength: 1
    maxOccurrences: 10
    mode: all
    percent: 100
    selector:
    namespaces:
    - default
    volumePath: /data
  2. 使用 kubectl 创建实验。

    kubectl apply -f ./fault-mistake.yaml