混沌工程,是一种为了提高技术架构弹性能力的复杂技术手段,通过实验来确保系统的可用性,通过主动制造故障来测试系统在各种压力下的行为。

混沌工程会将故障注入系统,以测试系统对其的响应,能够让我们为宕机做准备,并在宕机发生之前将影响降到最低。

通过chaosblade-operator在k8s执行实验场景,详情如下。

目录

1.基础资源

1)模拟cpu故障

2)模拟内存故障

2.网络

1)模拟网络延迟

2)模拟篡改dns域名

3)模拟网络包损坏

4)模拟网络包重排序

5)模拟网络包重复

3.进程

1)模拟杀进程mysql

2)模拟杀进程redis

3)模拟杀进程nginx

4)模拟暂停进程mysql

5)模拟暂停进程redis

6)模拟暂停进程nginx

4.模拟杀pod

1)服务正常的情况下进行实验

2)通过chaosblade-operator,删除节点上的服务pod,查看服务是否正常

5.节点关机


1.基础资源

1)模拟cpu故障

(1)服务正常的情况下,通过jmeter脚本对系统进行加压。

(2)创建yaml文件,控制服务部署节点一,cpu占比100%,通过chaosblade-operator开始实验,查看服务是否正常,通过jmeter脚本对系统进行加压。

(3)创建yaml文件,控制服务部署节点二,cpu占比100%,通过chaosblade-operator开始实验,查看服务是否正常,通过jmeter脚本对系统进行加压。

(4)比较前后tps变化,tps均降低,则分布式系统没有对服务进行调度。

Yaml配置如下,names为节点名,cpu-percent为节点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:

- "k8s.node1"

- name: cpu-percent

value:

- "80"

----------------------------------------------------------------

参数:

--timeout string 设定运行时长,单位是秒,通用参数

--cpu-count string 指定 CPU 满载的个数

--cpu-list string 指定 CPU 满载的具体核,核索引从 0 开始 (0-3 or 1,3)

--cpu-percent string 指定 CPU 负载百分比,取值在 0-100

执行实验:kubeclt apply -f chaosblade_cpu_load.yaml

查看实验:kubectl get blade cpu-load -o json

删除实验:kubeclt delete -f chaosblade_cpu_load.yaml

2)模拟内存故障

Chaosblade-operator未提供针对k8s的内存注入api,需要直接在节点使用chaosblade来注入内存故障。

(1)服务正常的情况下,通过jmeter脚本对系统进行加压。

(2)通过chaosblade对节点1进行实验,使其内存占用100%,查看服务是否正常,通过jmeter脚本对系统进行加压。

(3)通过chaosblade对节点2进行实验,使其内存占用100%,查看服务是否正常,通过jmeter脚本对系统进行加压。

(4)比较前后tps变化,tps均降低,则分布式系统没有对服务进行调度。

执行命令

blade create mem load

参数:

--mem-percent string 内存使用率,取值是 0 到 100 的整数

--mode string 内存占用模式,有 ram 和 cache 两种,例如 --mode ram。ram 采用代码实现,可控制占用速率,优先推荐此模式;cache 是通过挂载tmpfs实现;默认值是 --mode cache

--reserve string 保留内存的大小,单位是MB,如果 mem-percent 参数存在,则优先使用 mem-percent 参数

--rate string 内存占用速率,单位是 MB/S,仅在 --mode ram 时生效

--timeout string 设定运行时长,单位是秒,通用参数

2.网络

1)模拟网络延迟

(1)在服务正常的情况下,通过jmeter脚本对服务加压

(2)通过chaosblade-operator对服务节点网卡进行操作,选择服务调用的网卡,设置网卡延迟时间为三秒

(3)查看服务是否正常,服务正常则通过jmeter脚本对服务进行加压

Yaml文件配置如下,选择网卡eth0,端口号为8080,延迟时间3s

------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

  name: delay-node-network-by-names

spec:

  experiments:

  - scope: node

    target: network

    action: delay

    desc: "node network delay"

    matchers:

    - name: names

      value: ["k8s-node1"]

    - name: time

      value: ["3000"]

    - name: interface

      value: ["eth0"]

    - name: local-port

      value: ["8080"]

------------------------------

参数:

--interface string 网卡设备,例如 eth0 (必要参数)

--time string 延迟时间,单位是毫秒 (必要参数)

--offset string 延迟时间上下浮动的值, 单位是毫秒

2)模拟篡改dns域名

(1)在服务正常的情况下,通过jmeter对系统进行加压

(2)通过chaosblade-operator篡改dns域名为www.baidu.com,映射ip为10.0.0.0

(3)查看服务是否正常,正常则通过jmeter脚本对服务进行加压

(4)比较前后tps变化

Yaml如下,设置domain参数为www.baidu.com,设置ip为10.0.0.0

---------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

  name: dns-node-network-by-names

spec:

  experiments:

  - scope: node

    target: network

    action: dns

    desc: "node network dns"

    matchers:

    - name: names

      value: ["k8s-node1"]

    - name: domain

      value: ["www.baidu.com"]

    - name: ip

      value: ["10.0.0.0"]

---------------------------

参数:

--domain string 域名 (必要参数)

--ip string 映射的 ip (必要参数)

--timeout string 设定运行时长,单位是秒,通用参数

3)模拟网络丢包

(1)在服务正常的情况下,通过jmeter对系统进行加压

(2)通过chaosblade-operator选择服务节点,设置操作的网卡为服务调用网卡,设置丢包率为90%,

(3)查看服务是否正常,正常则通过jmeter脚本对服务进行加压

(4)比较前后tps变化

Yaml如下,设置网卡参数为eth0,设置丢包率80%

----------------------------------

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: ["k8s-node1"]

    - name: percent

      value: ["60"]

    - name: interface

      value: ["eth0"]

 ----------------------------------

参数:

--percent string 丢包百分比,取值在[0, 100]的正整数 (必要参数)

3)模拟网络包损坏

Chaosblade-operator未提供针对k8s模拟网络包损毁的api,需要直接在节点使用chaosblade来模拟网络包损坏。

(1)服务正常的情况下进行试验

(2)通过chaosblade进行模拟网络包损坏,设置90%的网络包损坏,查看服务是否正常

(3)通过jmeter进行加压,同正常情况下的tps进行对比

命令:

通过网卡为eth0的网络包损坏90%

blade create network corrupt --percent 90  --interface eth0

参数:

--percent 包损坏百分比,取值是不带%号的正整数

4)模拟网络包重排序

Chaosblade-operator未提供针对k8s模拟网络包重排序的api,需要直接在节点使用chaosblade来模拟网络包损坏。

(1)服务正常的情况下进行试验

(2)通过chaosblade进行模拟网络包重排序,设置90%的网络包重排序,查看服务是否正常

(3)通过jmeter进行加压,同正常情况下的tps进行对比

命令:

选中网卡eth0,90%网络包序列大小为2,和上一个包的相关性为90,延迟时间500毫秒

blade c network reorder --correlation 80 --percent 90 --gap 2 --time 500 --interface eth0

参数:

--gap string 包序列大小,取值是正整数,例如 --gap 5

--percent string 立即发送百分比,取值是不带%号的正整数,例如 --percent 50,(必要参数)

--time string 网络包延迟时间,单位是毫秒,默认值是 10,取值时正整数

5)模拟网络包重复

Chaosblade-operator未提供针对k8s模拟网络包重复的api,需要直接在节点使用chaosblade来模拟网络包损坏。

(1)服务正常的情况下进行试验

(2)通过chaosblade进行模拟网络包重复,查看服务是否正常

(3)通过jmeter进行加压,同正常情况下的tps进行对比

命令:

选中网卡eth0,网络包重复为90%

blade create network corrupt --percent 90  --interface eth0

参数:

--percent 包重复百分比,取值是不带%号的正整数

通用参数:

--destination-ip string 目标 IP. 支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。

--exclude-port string 排除掉的端口,默认会忽略掉通信的对端端口,目的是保留通信可用。可以指定多个,使用逗号分隔或者连接符表示范围,例如 22,8000 或者 8000-8010。 这个参数不能与 --local-port 或者 --remote-port 参数一起使用

--exclude-ip string 排除受影响的 IP,支持通过子网掩码来指定一个网段的IP地址, 例如 192.168.1.0/24. 则 192.168.1.0~192.168.1.255 都生效。你也可以指定固定的 IP,如 192.168.1.1 或者 192.168.1.1/32,也可以通过都号分隔多个参数,例如 192.168.1.1,192.168.2.1。

--interface string 网卡设备,例如 eth0 (必要参数)

--local-port string 本地端口,一般是本机暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080

--remote-port string 远程端口,一般是要访问的外部暴露服务的端口。可以指定多个,使用逗号分隔或者连接符表示范围,例如 80,8000-8080

--force 强制覆盖已有的 tc 规则,请务必在明确之前的规则可覆盖的情况下使用

--ignore-peer-port 针对添加 --exclude-port 参数,报 ss 命令找不到的情况下使用,忽略排除端口

--timeout string 设定运行时长,单位是秒,通用参数

3.进程

1)模拟杀进程mysql

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,杀死服务节点上的mysql进程,查看服务是否正常

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: kill-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: kill

desc: "kill node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["mysql"]

---------------------------------------

2)模拟杀进程redis

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,杀死服务节点上的redis进程,查看服务是否正常

(3)通过jmeter进行加压,同正常情况下的tps进行对比

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: kill-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: kill

desc: "kill node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["redis"]

---------------------------------------

3)模拟杀进程nginx

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,杀死服务节点上的nginx进程,查看服务是否正常

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: kill-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: kill

desc: "kill node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["mysql"]

---------------------------------------

Kill参数:

--process string 进程关键词,会在整个命令行中查找

--process-cmd string 进程命令,只会在命令中查找

--count string 限制杀掉进程的数量,0 表示无限制

--signal string 指定杀进程的信号量,默认是 9,例如 --signal 15

--timeout string 设定运行时长,单位是秒,通用参数

4)模拟暂停进程mysql

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,暂停服务节点上的mysql进程,查看服务是否正常

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: stop-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: stop

desc: "stop node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["mysql"]

---------------------------------------

5)模拟暂停进程redis

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,暂停服务节点上的redis进程,查看服务是否正常

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: stop-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: stop

desc: "stop node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["redis"]

---------------------------------------

6)模拟暂停进程nginx

(1)服务正常的情况下进行实验

(2)通过chaosblade-operator,暂停服务节点上的nginx进程,查看服务是否正常

Yaml:

---------------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: stop-node-process-by-names

spec:

experiments:

- scope: node

target: process

action: stop

desc: "stop node process by names"

matchers:

- name: names

value: ["k8s-node1"]

- name: process

value: ["nginx"]

---------------------------------------

Stop参数:

--evict-count string 限制实验生效的数量

--evict-percent string 限制实验生效数量的百分比,不包含 %

--labels string 节点资源标签

--names string 节点资源名,多个资源名之间使用逗号分隔

--kubeconfig string kubeconfig 文件全路径(仅限使用 blade 命令调用时使用)

--waiting-time string 实验结果等待时间,默认为 20s,参数值要包含单位,例如 10s,1m

4.模拟杀pod

1)服务正常的情况下进行实验

2)通过chaosblade-operator,删除节点上的服务pod,查看服务是否正常

Yaml:删除default下标签为app=guestbook的pod

----------------------------------

apiVersion: chaosblade.io/v1alpha1

kind: ChaosBlade

metadata:

name: delete-two-pod-by-labels

spec:

experiments:

- scope: pod

target: pod

action: delete

desc: "delete pod by labels"

matchers:

- name: labels

value:

- "app=guestbook"

- name: namespace

value:

- "default"

----------------------------------

5.节点关机

  1. 服务正常的情况下进行实验
  2. 关闭节点机器,服务是否正常
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐