节点 CPU 负载
目标: 指定一个节点,做 CPU 负载 80% 实验
node_cpu_load.yaml内容:
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:
- "docker20"
- name: cpu-percent
value:
- "80"
选择一个节点,修改 node_cpu_load.yaml 中的 names 值。
执行命令:
$ kubectl apply -f node_cpu_load.yaml
查看状态
执行 kubectl get blade cpu-load -o json 命令,查看实验状态。
查看结果
进入该 Node 节点,使用 top 命令可以看到该节点 CPU 达到预期效果。
停止
执行命令:kubectl delete -f node_cpu_load.yaml
或者直接删除 blade 资源:kubectl delete blade cpu-load
节点网络相关场景
操作前,请先登录 node 节点,使用 ifconfig 命令查看网卡信息,不是所有系统默认的网卡名称都是 eth0
节点网络延迟场景
目标: 指定节点的本地 32436 端口添加 3000 毫秒访问延迟,延迟时间上下浮动 1000 毫秒
选择一个节点,修改 delay_node_network_by_names.yaml 中的 names 值
对 docker20 节点本地端口 32436 访问丢包率 100%。
delay_node_network_by_names.yaml 内容:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: delay-node-network-by-names
spec:
experiments:
- scope: node
target: network
action: delay
desc: "delay node network loss"
matchers:
- name: names
value: ["docker20"]
- name: interface
value: ["ens33"]
- name: local-port
value: ["32436"]
- name: time
value: ["3000"]
- name: offset
value: ["1000"]
执行命令:
$ kubectl apply -f delay_node_network_by_names.yaml
查看状态
执行 kubectl get blade delay-node-network-by-names -o json 命令,查看实验状态。
查看结果
# 从实验节点访问 Guestbook
$ time echo "" | telnet 192.168.1.129 32436
Trying 192.168.1.129...
Connected to 192.168.1.129.
Escape character is '^]'.
Connection closed by foreign host.
echo "" 0.00s user 0.00s system 35% cpu 0.003 total
telnet 192.168.1.129 32436 0.01s user 0.00s system 0% cpu 3.248 total
停止
执行命令:kubectl delete -f delay_node_network_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade delay-node-network-by-names
节点网络丢包场景
目标: 指定节点的 32436 端口注入丢包率 100% 的故障
选择一个节点,修改 loss_node_network_by_names.yaml 中的 names 值。
loss_node_network_by_names.yaml 内容:
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: ["docker20"]
- name: percent
value: ["100"]
- name: interface
value: ["ens33"]
- name: local-port
value: ["32436"]
执行命令,开始:
$ kubectl apply -f loss_node_network_by_names.yaml
查看状态
执行 kubectl get blade loss-node-network-by-names -o json 命令,查看状态。
查看结果
该端口为 Guestbook nodeport 的端口,访问实验端口无响应,但是访问未开启实验的端口可以正常使用:
# 获取节点 IP
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
docker20 Ready worker 3d16h v1.17.6 192.168.1.129 <none> Ubuntu 18.04.4 LTS 4.15.0-101-generic docker://19.3.11
kk Ready controlplane,etcd,worker 4d16h v1.17.6 192.168.4.210 <none> Ubuntu 18.04.4 LTS 4.15.0-101-generic docker://19.3.11
# 从操作节点访问 Guestbook - 无法访问
$ telnet 192.168.1.129 32436
Trying 192.168.1.129...
telnet: connect to address 192.168.1.129: Operation timed out
telnet: Unable to connect to remote host
# 从非操作节点访问 Guestbook - 正常访问
$ telnet 192.168.4.210 32436
Trying 192.168.4.210...
Connected to 192.168.4.210.
Escape character is '^]'.
同样也可以直接从浏览器访问地址验证。
停止
执行命令:kubectl delete -f loss_node_network_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade loss-node-network-by-names
节点域名访问异常场景
目标: 本实验通过修改 Node 的 hosts,篡改域名地址映射,模拟 Pod 内域名访问异常场景。
选择一个节点,修改 dns_node_network_by_names.yaml 中的 names 值。
dns_node_network_by_names.yaml 内容:
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: dns-node-network-by-names
spec:
experiments:
- scope: node
target: network
action: dns
desc: "dns node network by names"
matchers:
- name: names
value:
- "docker20"
- name: domain
value: ["www.baidu.com"]
- name: ip
value: ["10.0.0.1"]
执行命令,开始实验:
$ kubectl apply -f dns_node_network_by_names.yaml
查看实验状态
执行 kubectl get blade dns-node-network-by-names -o json 命令,查看实验状态。
查看实验结果
# 进入实验 node
$ ssh kk@192.168.1.129
# Ping www.baidu.com
$ ping www.baidu.com
# 无响应
可以看到 Node 的 /etc/hosts 文件被修改,模拟了 dns 解析异常的场景。
停止
执行命令:kubectl delete -f dns_node_network_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade dns-node-network-by-names