blade create k8s pod-IO

blade create k8s pod-IO

给kubernetes的pod注入文件系统I/O故障

介绍

k8s pod文件系统I/O异常场景,可以模拟对指定路径上的文件读写异常,包括延迟,错误等.
注意!!!此场景需要激活--webhook-enable参数,如需使用此功能,请在 chaosblade-operator 参数中添加 --webhook-enable,或者在安装时指定,例如 helm 安装时: --set webhook.enable=true 指定。

前提条件

  • 集群中部署了chaosblade-admission-webhook
  • 需要注入故障的volume设置mountPropagation为HostToContainer
  • pod上面添加了如下annotations:
1
chaosblade/inject-volume: "data" //需要注入故障的volume name
2
chaosblade/inject-volume-subpath: "conf" //volume挂载的子目录
Copied!

命令

blade create k8s pod-pod IO

参数

除了上述基础场景各自所需的参数外,在 kubernetes 环境下,还支持的参数如下:
1
--namespace string Pod 所属的命名空间,只能填写一个值,必填项
2
--evict-count string 限制实验生效的数量
3
--evict-percent string 限制实验生效数量的百分比,不包含 %
4
--labels string Pod 资源标签,多个标签之前是或的关系
5
--names string Pod 资源名
6
--kubeconfig string kubeconfig 文件全路径(仅限使用 blade 命令调用时使用)
7
--waiting-time string 实验结果等待时间,默认为 20s,参数值要包含单位,例如 10s,1m
8
--methods string I/O故障方法
9
--delay string I/O延迟时间
10
--errno string 指定特性的I/O异常错误码
11
--random string 随机产生I/O异常错误码
12
--percent string I/O错误百分比 [0-100]
13
--path string I/O异常的目录或者文件
Copied!

案例

首先,通过deployment部署测试pod,并在pod的annotation里面指定需要注入I/O异常的volume以及子目录。
1
apiVersion: extensions/v1beta1
2
kind: Deployment
3
metadata:
4
labels:
5
app: test
6
name: test
7
namespace: test
8
spec:
9
replicas: 1
10
selector:
11
matchLabels:
12
app: test
13
template:
14
metadata:
15
annotations:
16
chaosblade/inject-volume: data
17
chaosblade/inject-volume-subpath: conf
18
labels:
19
app: test
20
spec:
21
containers:
22
- command: ["/bin/sh", "-c", "while true; do sleep 10000; done"]
23
image: busybox
24
imagePullPolicy: IfNotPresent
25
name: test
26
volumeMounts:
27
- mountPath: /data
28
mountPropagation: HostToContainer
29
name: data
30
volumes:
31
- hostPath:
32
path: /data/fuse
33
name: data
Copied!
chaosblade webhook会根据pod的annotation,注入fuse的sidecar容器:
  1. 1.
    chaosblade/inject-volume指明需要注入故障的volume name,比如例子中的data
  2. 2.
    chaosblade/inject-volume-subpath指明volume挂载路径的子目录。上面的例子中,volume的挂载路径是/data,子目录是conf,则在pod内,注入I/O异常的目录是/data/conf
  3. 3.
    指定需要注入故障的volume需要指定mountPropagation:HostToContainer,这个字段的含义可以参考官方文档Volumes
通过上面的yaml文件创建deployment后,chaosblade webhook会自动插入sidecar容器:
1
kubectl get pod -n test
2
NAME READY STATUS RESTARTS AGE
3
test-bc7786698-k6tb7 2/2 Running 0 3m40s
Copied!
这时虽然插入了sidecar容器,但是还没有注入I/O异常,可以通过下面的yaml注入相关的I/O异常:
1
apiVersion: chaosblade.io/v1alpha1
2
kind: ChaosBlade
3
metadata:
4
name: inject-pod-by-labels
5
spec:
6
experiments:
7
- scope: pod
8
target: pod
9
action: IO
10
desc: "Pod IO Exception by labels"
11
matchers:
12
- name: labels
13
value:
14
- "app=test"
15
- name: namespace
16
value:
17
- "test"
18
- name: method
19
value:
20
- "read"
21
- name: delay
22
value:
23
- "1000"
24
- name: path
25
value:
26
- ""
27
- name: percent
28
value:
29
- "60"
30
- name: errno
31
value:
32
- "28"
Copied!
在这里例子中,我们对read操作注入两种异常,异常率为百分之60:
  • read操作增加1s的延迟,支持的操作类型包括:
1
1. open
2
2. read
3
3. write
4
4. mkdir
5
5. rmdir
6
6. opendir
7
7. fsync
8
8. flush
9
9. release
10
10. truncate
11
11. getattr
12
12. chown
13
13. chmod
14
14. utimens
15
15. allocate
16
16. getlk
17
17. setlk
18
18. setlkw
19
19. statfs
20
20. readlink
21
21. symlink
22
22. create
23
23. access
24
24. link
25
25. mknod
26
26. rename
27
27. unlink
28
28. getxattr
29
29. listxattr
30
30. removexattr
31
31. setxattr
Copied!
  • read操作返回错误28,支持的错误码包括:
1
1: Operation not permitted
2
2: No such file or directory
3
5: I/O error
4
6: No such device or address
5
12: Out of memory
6
16: Device or resource busy
7
17: File exists
8
20: Not a directory
9
22: Invalid argument
10
24: Too many open files
11
28: No space left on device
Copied!
当用上面的yaml文件注入I/O异常后,在pod内读取指定目录中的文件,发现返回了No space left on device,因为有重试,显示有3s的延迟。
1
kubectl exec test-bc7786698-k6tb7 -c test -n test time cat /data/conf/file
2
cat: read error: No space left on device
3
Command exited with non-zero status 1
4
real 0m 3.00s
5
user 0m 0.00s
6
sys 0m 0.00s
Copied!