模拟 Linux 内核故障
本文介绍如何使用 KernelChaos 模拟 Linux 内核故障。该功能通过使用 BPF 在指定内核路径上注入基于 I/O 或内存的故障。
尽管 KernelChaos 的注入对象可以设置成一个或几个 Pod,但所属主机的其他 Pod 的性能也会受到一些影响,因为所有的 Pod 共享同一个内核。
警告
模拟 Linux 内核故障的功能默认关闭,请不要用于生产环境。
准备条件
- Linux 内核: 版本 >= 4.18
- 已启动 Linux 内核配置项 CONFIG_BPF_KPROBE_OVERRIDE
- 已设置 values.yaml 中
bpfki.create
配置项的值为true
配置文件
下面是一个简单的 KernelChaos 配置文件:
apiVersion: chaos-mesh.org/v1alpha1
kind: KernelChaos
metadata:
name: kernel-chaos-example
namespace: chaos-mesh
spec:
mode: one
selector:
namespaces:
- chaos-mount
failKernRequest:
callchain:
- funcname: '__x64_sys_mount'
failtype: 0
更多的配置示例,请参考 examples。你可按需修改这些配置示例。
配置说明:
-
mode 指定实验的运行方式,可选择的方式包括:
one
:表示随机选出一个符合条件的 Podall
:表示选出所有符合条件的 Podfixed
:表示选出指定数量且符合条件的 Podfixed-percent
:表示选出符合条件的 Pod 中指定百分比的 Podrandom-max-percent
:表示选出占符合条件的 Pod 中不超过指定百分比的 Pod
-
selector 指定需要注入故障的目标 Pods。
-
failedkernRequest 指定故障模式 (kmalloc, bio 等),可以指定一个具体的调用链路径和可选的过滤条件。配置项包括:
-
failtype 指定故障类型,可设置的值包括:
- '0':表明注入 slab 分配错误 should_failslab。
- '1':表明注入 内存页分配错误 should_fail_alloc_page。
- '2':表明注入 bio 错误 should_fail_bio。
对于这三种故障的更多信息,请参考 fault-injection 和 inject_example。
-
callchain 指定一个具体的调用链,例如:
ext4_mount
-> mount_subtree
-> ...
-> should_failslab
-