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:

    chaosblade/inject-volume: "data" //需要注入故障的volume name
    chaosblade/inject-volume-subpath: "conf" //volume挂载的子目录

    命令

    blade create k8s pod-pod IO

参数

除了上述基础场景各自所需的参数外,在 kubernetes 环境下,还支持的参数如下:

--namespace string Pod 所属的命名空间,只能填写一个值,必填项
--evict-count string 限制实验生效的数量
--evict-percent string 限制实验生效数量的百分比,不包含 %
--labels string Pod 资源标签,多个标签之前是或的关系
--names string Pod 资源名
--kubeconfig string kubeconfig 文件全路径(仅限使用 blade 命令调用时使用)
--waiting-time string 实验结果等待时间,默认为 20s,参数值要包含单位,例如 10s,1m
--methods string I/O故障方法
--delay string I/O延迟时间
--errno string 指定特性的I/O异常错误码
--random string 随机产生I/O异常错误码
--percent string I/O错误百分比 [0-100]
--path string I/O异常的目录或者文件

案例

首先,通过deployment部署测试pod,并在pod的annotation里面指定需要注入I/O异常的volume以及子目录。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: test
name: test
namespace: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
annotations:
chaosblade/inject-volume: data
chaosblade/inject-volume-subpath: conf
labels:
app: test
spec:
containers:
- command: ["/bin/sh", "-c", "while true; do sleep 10000; done"]
image: busybox
imagePullPolicy: IfNotPresent
name: test
volumeMounts:
- mountPath: /data
mountPropagation: HostToContainer
name: data
volumes:
- hostPath:
path: /data/fuse
name: data

chaosblade webhook会根据pod的annotation,注入fuse的sidecar容器: 1. chaosblade/inject-volume指明需要注入故障的volume name,比如例子中的data 2. chaosblade/inject-volume-subpath指明volume挂载路径的子目录。上面的例子中,volume的挂载路径是/data,子目录是conf,则在pod内,注入I/O异常的目录是/data/conf。 3. 指定需要注入故障的volume需要指定mountPropagation:HostToContainer,这个字段的含义可以参考官方文档Volumes

通过上面的yaml文件创建deployment后,chaosblade webhook会自动插入sidecar容器:

kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
test-bc7786698-k6tb7 2/2 Running 0 3m40s

这时虽然插入了sidecar容器,但是还没有注入I/O异常,可以通过下面的yaml注入相关的I/O异常:

apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: inject-pod-by-labels
spec:
experiments:
- scope: pod
target: pod
action: IO
desc: "Pod IO Exception by labels"
matchers:
- name: labels
value:
- "app=test"
- name: namespace
value:
- "test"
- name: method
value:
- "read"
- name: delay
value:
- "1000"
- name: path
value:
- ""
- name: percent
value:
- "60"
- name: errno
value:
- "28"

在这里例子中,我们对read操作注入两种异常,异常率为百分之60:

  • read操作增加1s的延迟,支持的操作类型包括:

    ```

  • open

  • read

  • write

  • mkdir

  • rmdir

  • opendir

  • fsync

  • flush

  • release

  • truncate

  • getattr

  • chown

  • chmod

  • utimens

  • allocate

  • getlk

  • setlk

  • setlkw

  • statfs

  • readlink

  • symlink

  • create

  • access

  • link

  • mknod

  • rename

  • unlink

  • getxattr

  • listxattr

  • removexattr

  • setxattr

    ```

  • read操作返回错误28,支持的错误码包括:

    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

当用上面的yaml文件注入I/O异常后,在pod内读取指定目录中的文件,发现返回了No space left on device,因为有重试,显示有3s的延迟。

kubectl exec test-bc7786698-k6tb7 -c test -n test time cat /data/conf/file
cat: read error: No space left on device
Command exited with non-zero status 1
real 0m 3.00s
user 0m 0.00s
sys 0m 0.00s