一、 场景模拟及相关原理
1.1 模拟节点 CPU满负载
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: cpu-load
spec:
experiments:
- scope: node
target: cpu
action: fullload
desc: "increase node cpu load by names"
matchers:
- name: names
value:
- "node1" #设置节点 node1的cpu使用率为100%
- name: cpu-percent
value:
- "100"
实验结果:
- 通过实验结果发现,node节点的cpu稳定在90%上下,且应用能够正确访问
注入原理:
taskset 是 Linux 系统当中用于查看、设定 CPU 核使用情况的命令。 Chaosblade通过使用taskset命令,把chaos_burncpu进程与cpu核数进行绑定来模式cpu负载情况。(如下图,进程17957进程绑定了0-5核)
1.2 模拟节点内存满负载
节点内存占用模式有 ram 和 cache 两种模式,ram 采用代码实现,cache 是通过挂载tmpfs实现。本实验使用ram模式
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: node-mem
spec:
experiments:
- scope: node
target: mem
action : "load"
desc: "node memory"
matchers:
- name: names
value:
- "node1" # 设置节点1的内存使用率为80%
- name: mode
value:
- "ram"
- name: mem-percent
value:
- "80"
实验结果:
- node节点的内存used与total的比例稳定在80%左右,且应用能够正确访问。
注入原理:
ram 模式采用代码申请内存实现。 cache 模式采用 dd、mount 命令实现,挂载 tmpfs 并且进行文件填充。
1.3 模拟节点网卡丢包
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: loss-node-network-by-names
spec:
experiments:
- scope: node
target: network
action: loss
desc: "node network loss"
matchers:
- name: names
value: ["node1"]
- name: percent
value: ["100"]
- name: interface
value: ["enp0s8"]
- name: local-port
value: ["31000", "31500"]
实验结果:
- 访问节点的31000和31500端口无法访问
- tcp三次握手请求只要第一次请求包,无应答包。
实验原理:
流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。chaosblade 使用tc模拟网络故障
1.4 模拟节点进程被杀死
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: node-process
spec:
experiments:
- scope: node
target: process
action: kill
desc: "kill docker"
matchers:
- name: names
value: ["node1"]
- name: process
value: ["dockerd"]
实验结果:
- 注入前后进程的dockerd pid发生改变
- k8s会发生重启(单节点)
注入原理:
Kill命令杀死指定进程 (chaosblade-tool以daemonset的模式部署)
1.5 模拟 pod 被删除
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: delete-pod
spec:
experiments:
- scope: pod
target: pod
action: delete
desc: "delete pod"
matchers:
- name: labels
value:
- "k8s-app=kube-dns"
- name: namespace
value:
- "kube-system"
- name: evict-count
value:
- "1"
实验结果:
- 观测到pod被删除后创建
- 应用能够正常解析
注入原理:
通过client-go的clientset 删除制定的pod
1.6 模拟 pod IO压力
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: pod-io
spec:
experiments:
- scope: pod
target: pod
action: IO
desc: "pod io"
matchers:
- name: labels
value:
- "app=test"
- name: namespace
value:
- "default"
- name: method
value:
- "read"
- name: delay
value:
- "1000"
- name: path
value:
- ""
- name: percent
value:
- "90"
- name: errno
value:
- "28"
实验结果:
- pod内读取指定目录中的文件,返回了No space left on device,因为有重试,显示有3s的延迟。
注入原理:
dd技术原理(chaos mesh 使用的是mount + 填充数据的技术)
1.7 模拟 pod 网卡丢包
实验数据1:
普通网卡丢包
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: loss-pod-network-by-names
spec:
experiments:
- scope: pod
target: network
action: loss
desc: "loss pod network by names"
matchers:
- name: names
value:
- "centos-5fdd8cb94-d5rxv"
- name: namespace
value:
- "default"
- name: interface
value: ["eth0"]
- name: percent
value: ["100"]
实验结果1:
- 无法ping通centos pod
实验数据2:
Core dns 53端口无法访问
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: dns-loss
spec:
experiments:
- scope: pod
target: network
action: loss
desc: "dns网卡丢包"
matchers:
- name: names
value:
- "coredns-8475bb5bf9-zfb87"
- name: namespace
value:
- "kube-system"
- name: interface
value: ["eth0"]
- name: local-port
value: ["53"]
- name: percent
value: ["100"]
实验结果2:
- Core dns 53端口无法访问
- 域名解析正常
实验数据3:
Core dns丢包100%
kind: ChaosBlade
metadata:
name: dns-loss
spec:
experiments:
- scope: pod
target: network
action: loss
desc: "dns网卡丢包"
matchers:
- name: names
value:
- "coredns-8475bb5bf9-7zchg"
- "coredns-8475bb5bf9-zfb87"
- name: namespace
value:
- "kube-system"
- name: interface
value: ["eth0"]
- name: local-port
value: ["53"]
- name: percent
value: ["100"]
实验结果3:
- Dns 53端口无法访问
- 域名无法解析
实验数据4:
Core dns丢包80%
kind: ChaosBlade
metadata:
name: dns-loss
spec:
experiments:
- scope: pod
target: network
action: loss
desc: "dns网卡丢包"
matchers:
- name: names
value:
- "coredns-8475bb5bf9-7zchg"
- "coredns-8475bb5bf9-zfb87"
- name: namespace
value:
- "kube-system"
- name: interface
value: ["eth0"]
- name: local-port
value: ["53"]
- name: percent
value: ["80"]
实验结果4:
- Dns 53端口访问情况
- 域名可以解析,速度比较慢
注入原理:
跟节点的注入原理一样,使用nsenter + tc实现
1.8 模拟 pod dns 故障
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: dns-pod-network-by-names
spec:
experiments:
- scope: pod
target: network
action: dns
desc: "dns pod network by names"
matchers:
- name: names
value:
- "centos-5fdd8cb94-d5rxv"
- name: namespace
value:
- "default"
- name: domain
value: ["www.baidu.com"]
- name: ip
value: ["192.168.34.34"]
实验结果:
- 无法访问访问百度
注入原理:
修改容器/etc/hosts配置信息
1.9 模拟 pod cpu满负载
实验数据:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: pod-cpu
spec:
experiments:
- scope: pod
target: cpu
action: fullload
desc: "pod cpu打满"
matchers:
- name: labels
value:
- "app=centos"
- name: cpu-percent
value:
- "100"
实验结果:
- cpu达到满负载
实验原理:
跟node的原理一致
二、总结及进一步实验
通过chaosblade的实验,发现chaosblade还有一下场景未覆盖:
- 实验场景无定时器设置参数,例如混沌注入的时间为20秒,超时过后停止实验
- 现有的dns故障场景原理是修改/etc/host配置,未找到修改/etc/resolve.conf的配置,故无法植入dns服务器错误的故障
- 还未支持时间错误的故障场景
- 还未支持节点重启,关机等故障问题
进一步实验:
- 测试验证pod 内存满负载的实验(测试OOM)
- 测试k8s的高可用,使用三个master节点组成节点的高可用,测试验证某一台节点down机是否影响集群的使用
- 使用其他工具验证chaosblade还未支持的场景(chaos mesh)
发表评论 取消回复