ChaosBlade:从零开始的混沌工程(四)
前言
在上篇文章中,我们介绍了如何使用 ChaosBlade Operator 对 pod 资源进行混沌实验。从本章将继续对 Kubernetes Node 资源的混沌实验进行讲解,同时也配套了 katacode[1] 交互式教程,读者可用通过 katacode,在浏览器上操作真实的 Kubernetes 和 ChaosBlade。
chaosblade.io[2] 官网也已经上线,在官网的互动教程[3]模块,也可以找到 ChaosBlade 的 KataCoda 教程,目前官网由我维护,有任何问题,欢迎在 ISSUE[4] 中进行反馈。
KataCoda 教程:《ChaosBlade Node 实验场景》
地址:https://katacoda.com/guoxudong/courses/chaosblade/chaosblade-node-experiment
实验对象:Node
在 Kubernetes 中,节点(Node)是执行工作的机器,以前叫做 minion。根据你的集群环境,节点可以是一个虚拟机或者物理机器。每个节点都包含用于运行 pods 的必要服务,并由主控组件管理。节点上的服务包括 容器运行时、kubelet 和 kube-proxy。
Node 实验场景
同上篇文章[5],本篇默认已安装 guestbook[6] 应用和 ChaosBlade Operator。
节点资源相关场景
节点 CPU 负载实验场景
实验目标:指定一个节点,做 CPU 负载 80% 实验。
开始实验
node_cpu_load.yaml
内容:
选择一个节点,修改 node_cpu_load.yaml
中的 names
值。
执行命令,开始实验:
查看实验状态
执行 kubectl get blade cpu-load -o json
命令,查看实验状态。
查看实验结果
进入该 Node 节点,可以看到该节点 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
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade delay-node-network-by-names -o json
命令,查看实验状态。
观测结果
停止实验
执行命令: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
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade loss-node-network-by-names -o json
命令,查看实验状态。
观测结果
该端口为 Guestbook
nodeport 的端口,访问实验端口无响应,但是访问未开启实验的端口可以正常使用:
同样也可以直接从浏览器访问地址,验证实验。
停止实验
执行命令: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
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade dns-node-network-by-names -o json
命令,查看实验状态。
观测结果
可以看到 Node 的 /etc/hosts
文件被修改,模拟了 dns 解析异常的场景。
停止实验
执行命令:kubectl delete -f dns_node_network_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade dns-node-network-by-names
节点磁盘相关场景
kubernetes 节点磁盘场景。
节点磁盘填充场景
实验目标:指定节点磁盘占用 80%
开始实验
选择一个节点,修改 fill_node_disk_by_names.yaml
中的 names
值。
fill_node_disk_by_names.yaml
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade fill-node-disk-by-names -o json
命令,查看实验状态。
观测结果
可以看到磁盘占用 80%。
停止实验
执行命令:kubectl delete -f fill_node_disk_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade fill-node-disk-by-names
节点进程相关场景
kubernetes 节点进程相关场景。
杀节点上指定进程
实验目标:此实验会删除指定节点上的 redis-server
进程。
开始实验
选择一个节点,修改 kill_node_process_by_names.yaml
中的 names
值。
kill_node_process_by_names.yaml
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade kill-node-process-by-names -o json
命令,查看实验状态。
观测结果
redis-server
的进程号发生改变,说明被杀掉后,又被重新拉起。
停止实验
执行命令:kubectl delete -f kill_node_process_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade kill-node-process-by-names
挂起节点上指定进程
实验目标:此实验会挂起指定节点上的 redis-server
进程。
开始实验
选择一个节点,修改 stop_node_process_by_names.yaml
中的 names
值。
stop_node_process_by_names.yaml
内容:
执行命令,开始实验:
查看实验状态
执行 kubectl get blade stop-node-process-by-names -o json
命令,查看实验状态。
观测结果
可以看到 redis-server
此刻进程处于暂停状态了(T)。
停止实验
执行命令:kubectl delete -f stop_node_process_by_names.yaml
或者直接删除 blade 资源:kubectl delete blade stop-node-process-by-names
结语
本篇我们使用 ChaosBlade Operator 对 Kubernetes Node 资源进行混沌工程实验,可以看到对于 Node 节点,ChaosBlade 依旧有简单的配置及操作来完成复杂的实验,可以通过自由组合,实现各种 Node 节点级别的复杂故障,验证 Kubernetes 集群的稳定性及可用性。同时当真正的故障来临时,由于早已模拟了各种故障情况,可以快速定位故障源,做到处变不惊,轻松处理故障。
版权声明: 本文为 InfoQ 作者【郭旭东】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f8601e2092242a638813fb29】。文章转载请联系作者。
评论