一、 场景模拟及相关原理

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"

实验结果:

  1. 通过实验结果发现,node节点的cpu稳定在90%上下,且应用能够正确访问

image.png

注入原理:
taskset 是 Linux 系统当中用于查看、设定 CPU 核使用情况的命令。 Chaosblade通过使用taskset命令,把chaos_burncpu进程与cpu核数进行绑定来模式cpu负载情况。(如下图,进程17957进程绑定了0-5核)
image.png

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"

实验结果:

  1. node节点的内存used与total的比例稳定在80%左右,且应用能够正确访问。

image.png

注入原理:
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"]

实验结果:

  1. 访问节点的31000和31500端口无法访问

image.png

  1. tcp三次握手请求只要第一次请求包,无应答包。

image.png

实验原理:
流量控制器TC(Traffic Control)用于Linux内核的流量控制,它利用队列规定建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。chaosblade 使用tc模拟网络故障
image.png

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"]

实验结果:

  1. 注入前后进程的dockerd pid发生改变

image.png

  1. k8s会发生重启(单节点)

image.png

注入原理:
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"

实验结果:

  1. 观测到pod被删除后创建

image.png

  1. 应用能够正常解析

image.png

注入原理:
通过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"

实验结果:

  1. 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:

  1. 无法ping通centos pod

image.png

实验数据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:

  1. Core dns 53端口无法访问

image.png

  1. 域名解析正常

image.png

实验数据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:

  1. Dns 53端口无法访问

image.png

  1. 域名无法解析

image.png

实验数据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:

  1. Dns 53端口访问情况

image.png

  1. 域名可以解析,速度比较慢

image.png

注入原理:
跟节点的注入原理一样,使用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"]

实验结果:

  1. 无法访问访问百度

image.png

注入原理:
修改容器/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"

实验结果:

  1. cpu达到满负载

image.png

实验原理:
跟node的原理一致

二、总结及进一步实验

通过chaosblade的实验,发现chaosblade还有一下场景未覆盖:

  1. 实验场景无定时器设置参数,例如混沌注入的时间为20秒,超时过后停止实验
  2. 现有的dns故障场景原理是修改/etc/host配置,未找到修改/etc/resolve.conf的配置,故无法植入dns服务器错误的故障
  3. 还未支持时间错误的故障场景
  4. 还未支持节点重启,关机等故障问题

进一步实验:

  1. 测试验证pod 内存满负载的实验(测试OOM)
  2. 测试k8s的高可用,使用三个master节点组成节点的高可用,测试验证某一台节点down机是否影响集群的使用
  3. 使用其他工具验证chaosblade还未支持的场景(chaos mesh)

点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部