混沌工程(故障演练)-k8s
通过chaosblade-operator在k8s环境进行故障演练
混沌工程,是一种为了提高技术架构弹性能力的复杂技术手段,通过实验来确保系统的可用性,通过主动制造故障来测试系统在各种压力下的行为。
混沌工程会将故障注入系统,以测试系统对其的响应,能够让我们为宕机做准备,并在宕机发生之前将影响降到最低。
通过chaosblade-operator在k8s执行实验场景,详情如下。
目录
2)通过chaosblade-operator,删除节点上的服务pod,查看服务是否正常
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.节点关机
- 服务正常的情况下进行实验
- 关闭节点机器,服务是否正常
更多推荐
所有评论(0)