混沌工程介绍
2008年8月, Netflix 主要数据库的故障导致了三天的停机, DVD 租赁业务中断,多个国家的大量用户受此影响。之后 Netflix 工程师着手寻找替代架构,并在2011年起,逐步将系统迁移到 AWS 上,运行基于微服务的新型分布式架构。这种架构消除了单点故障,但也引入了新的复杂性类型,需要更加可靠和容错的系统。为此, Netflix 工程师创建了 Chaos Monkey ,会随机终止在生产环境中运行的 EC2 实例。工程师可以快速了解他们正在构建的服务是否健壮,有足够的弹性,可以容忍计划外的故障。至此,混沌工程开始兴起。
混沌工程,是一种提高技术架构弹性能力的复杂技术手段。Chaos工程经过实验可以确保系统的可用性。混沌工程旨在将故障扼杀在襁褓之中,也就是在故障造成中断之前将它们识别出来。通过主动制造故障,测试系统在各种压力下的行为,识别并修复故障问题,避免造成严重后果。一句话就是“不断验证您的服务是否能够抵御故障”的过程称为混沌工程。
开源方案
LitmusChaos
LitmusChaos 是一个具有跨云支持的云原生混沌工程框架。 这是一个 CNCF 沙盒项目,已被多个组织采用。 它的使命是通过提供完整的混沌工程框架和相关的混沌实验来帮助 Kubernetes SRE 和开发人员发现非 Kubernetes 以及在 Kubernetes 上运行的平台和应用程序的弱点。
Litmus 最初可用于在暂存环境中运行混沌实验,最终在生产环境中运行以发现错误和漏洞,修复从而提高系统的弹性。 Litmus 采用 Kubernetes 原生方法,通过自定义资源以声明性方式定义混沌意图。
LitmusChaos 具有以下特点:
- 图形化界面
- 多用户支持
- 社区活跃,代码提交频繁,github start数2.5k
- 功能丰富,原生自带大约 48 个实验,并可开发自定义实验,重要的实验包括
- 云原生
- 部署简单,可使用helm一键安装;
- 支持arm64和x86_64平台;
- 环境要求较低,仅有以下要求:
-
Kubernetes 1.17 或更高版本
-
20GB 的持久卷
-
ChaosToolkit
有如下特点:
- 功能上与litmus差不多
- 安装方式:使用pip直接将chaos二进制文件安装在master节点,不支持安装在k8s上
- 无图形化界面,纯命令行操作
Chaosblade
Chaosblade 是遵循混沌工程(Chaos Engineering)原理的实验工具,用于模拟常见的故障场景,帮助提升分布式系统的可恢复性和对故障的容错性。
Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。
Chaosblade 可直接编译运行,cli 命令提示使执行混沌实验更加简单。目前支持的演练场景有操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod
问题:官方暂未提供arm64镜像,只支持x86_64平台
Chaos Mesh
Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。Chaos Mesh 提供完善的可视化操作,旨在降低用户进行混沌工程的门槛。用户可以方便地在 Web UI 界面上设计自己的混沌场景,以及监控混沌实验的运行状态。
Chaos Mesh 作为业内领先的混沌测试平台,具备以下核心优势:
- 核心能力稳固:Chaos Mesh 起源于 TiDB 的核心测试平台,发布初期即继承了大量 TiDB 已有的测试经验。
- 被充分验证:Chaos Mesh 被众多公司以及组织所使用,例如腾讯和美团等;同时被用于众多知名分布式系统的测试体系中,例如 Apache APISIX 和 RabbitMQ 等。
- 系统易用性强:图形化操作和基于 Kubernetes 的使用方式,充分利用了自动化能力。
- 云原生:Chaos Mesh 原生支持 Kubernetes 环境,提供了强悍的自动化能力。
- 丰富的故障模拟场景:Chaos Mesh 几乎涵盖了分布式测试体系中基础故障模拟的绝大多数场景。
- 灵活的实验编排能力:用户可以通过平台设计自己的混沌实验场景,场景可包含多个混沌实验编排,以及应用状态检查等。
- 安全性高:Chaos Mesh 具有多层次安全控制设计,提供高安全性。
- 活跃的社区:Chaos Mesh 为全球知名开源混沌测试平台,CNCF 开源基金会沙箱项目。
- 强大的扩展能力:Chaos Mesh 为故障测试类型扩展和功能扩展提供了充分的扩展能力。
ChaosMesh安装
helm安装
helm repo add chaos-mesh https://charts.chaos-mesh.org kubectl create ns chaos-testing helm install -name chaos-mesh -n chaos-testing chaos-mesh/chaos-mesh --set chaosDaemon.env.DOCKER_API_VERSION=1.40 |
默认安装最新版本,可选择指定版本安装,使用helm search repo chaos-mesh -l查看所有版本,helm install时使用--version xxx指定版本
注:--set chaosDaemon.env.DOCKER_API_VERSION=1.40见文末问题
检查安装
# kubectl get pod -n chaos-testing NAME READY STATUS RESTARTS AGE chaos-controller-manager-7558797dc-9dzlt 1/1 Running 0 35m chaos-controller-manager-7558797dc-gszvr 1/1 Running 0 35m chaos-controller-manager-7558797dc-qmq9d 1/1 Running 0 35m chaos-daemon-7vs54 1/1 Running 0 35m chaos-daemon-96d4j 1/1 Running 0 35m chaos-daemon-9znkn 1/1 Running 0 35m chaos-daemon-cp8gl 1/1 Running 0 35m chaos-daemon-hzj9r 1/1 Running 0 35m chaos-daemon-klk7c 1/1 Running 0 35m chaos-daemon-p7rqx 1/1 Running 0 35m chaos-daemon-tkt59 1/1 Running 0 35m chaos-daemon-xkrr6 1/1 Running 0 35m chaos-daemon-zrqsg 1/1 Running 0 35m chaos-dashboard-7887bf5fcf-8vp48 1/1 Running 0 35m |
ChaosMesh使用
页面访问
查看服务端口
# kubectl get svc -n chaos-testing NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE chaos-daemon ClusterIP None <none> 31767/TCP,31766/TCP 152m chaos-dashboard NodePort 10.233.36.176 <none> 2333:30483/TCP 152m chaos-mesh-controller-manager ClusterIP 10.233.7.169 <none> 443/TCP,10081/TCP,10082/TCP,10080/TCP 152m |
使用30483端口访问
创建token
第一次登录时创建admin用户,勾选上cluster scoped,角色选择Manager,后续其他用户可不勾选cluster scoped或者选择viewe角色
token登录
后台获取到token后复制到此处,name随意
切换为中文
在settings中设置为中文
查看导航栏功能
点击教程查看
创建实验
有如下实验可供选择,包括kubernetes和物理机
都是中文,不再演示,工作流为多个实验的组合,也不演示,官方演示很详细:
模拟物理机故障
如果为arm64节点,需要自己编译chaosd,注意需要在arm64环境下编译,不要使用交叉编译,否则会报错:["failed to open DB"] [error="Binary was compiled with 'CGO_ENABLED=0', go-sqlite3 requires cgo to work. This is a stub"]
https://github.com/chaos-mesh/chaosd
编译
进入chaosd/cmd目录,go build -o chaosd
运行服务
在目标节点以服务的形式运行起来,使用http方式测试,也可手动执行命令进行测试
以服务的方式运行,端口可选择一个未被使用的端口,默认为80:
./chaosd server -p 80
运行实验
LitmusChaos安装
添加 litmus helm
helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/ helm repo list |
创建命名空间
ChaosCenter 可以放置在任何命名空间中,但通常我们选择litmus
作为命名空间。
kubectl create ns litmus |
安装 Litmus
helm install chaos litmuschaos/litmus --namespace=litmus |
检查安装
# kubectl get pods -n litmus NAME READY STATUS RESTARTS AGE litmusportal-frontend-97c8bf86b-mx89w 1/1 Running 2 6m24s litmusportal-server-5cfbfc88cc-m6c5j 2/2 Running 2 6m19s mongo-0 1/1 Running 0 6m16s # kubectl get svc -n litmus chaos-litmus-frontend-service NodePort 10.96.70.5 <none> 9091:31655/TCP 161m chaos-litmus-mongo ClusterIP 10.96.170.74 <none> 27017/TCP 161m chaos-litmus-server-service NodePort 10.96.163.87 <none> 9002:31597/TCP,9003:32507/TCP,8000:31408/TCP,3030:30881/TCP 161m |
因本k8s平台使用的是kind安装的平台,因此从外部访问时需要配置一个dnat,172.20.42.80为主机ip,172.18.0.3为一个kind节点(容器)ip
iptables -t nat -A PREROUTING -d 172.20.42.80 -p tcp --dport 31655 -j DNAT --to-destination 172.18.0.3 |
页面访问
默认用户名密码为
Username: admin Password: litmus |
登录之后会要求修改密码,修改为自己的密码即可
登录之后界面如下
LitmusChaos使用
创建待测应用
创建一个nginx应用用于测试
apiVersion: apps/v1 kind: Deployment metadata: name: litmus-test spec: replicas: 3 selector: matchLabels: app: nginx-litmus-test template: metadata: labels: app: nginx-litmus-test spec: containers: - name: nginx-litmus-test image: nginx:lst imagePullPolicy: Never |
创建结果如下
# kubectl get pod NAME READY STATUS RESTARTS AGE litmus-test-5b758fbbdd-dntkb 1/1 Running 0 83m litmus-test-5b758fbbdd-hdjrl 1/1 Running 0 83m litmus-test-5b758fbbdd-l4ps8 1/1 Running 0 83m |
创建WorkFlow
(1) 点击Schedule a workflow
(2)选择一个agent,默认只有一个Self-Agent,选择即可,点击Next
(3)从ChaosHub选择一个实验,点击Next
(4)输入名称和描述,点击Next
(5)点击Add a new experiment
(6)有很多选项,本次测试为测试pod删除,因此选择pod delete,点击Done
(7)修改experiment配置,默认生成的标签选择器为app=nginx,我们创建的测试pod的标签为app=nginx-litmus-test,点击右侧`笔`进行修改,本次只修改标签,也可修改其他参数
(8)修改后如下所示,点击Next
(9)设置权重,每个工作流可以有多个测试,每个测试都可设置权重,最后的结果会根据权重评分,当前测试只有一个,直接设置为10即可,点击Next
(10)点击schedule now,立即测试,点击Next,点击Finish
(11)查看WorkFlow
(12)查看pod删除情况
# kubectl get pod NAME READY STATUS RESTARTS AGE litmus-test-5b758fbbdd-dntkb 1/1 Running 0 106m litmus-test-5b758fbbdd-hdjrl 0/1 Terminating 0 106m litmus-test-5b758fbbdd-l4ps8 1/1 Running 0 106m litmus-test-5b758fbbdd-n57jc 0/1 ContainerCreating 0 1s |
(13)可查看日志
(14)等待运行完成后查看结果
多用户
(1)添加用户
(2)新用户没有默认agent,需要自己部署
(3)部署agent需要安装litmusctl
(4)设置配置文件,http://172.18.0.3:31655为自己的litmus服务地址
litmusctl config set-account --endpoint="http://172.18.0.3:31655" --username="user1" --password="123123" litmusctl config set-account --endpoint="http://172.18.0.3:31655" --username="admin" --password="123123" |
配置文件如下所示,current-user表示当前上下文用户为admin
# cat ~/.litmusconfig accounts: - users: - expires_in: "1643160778" token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDMxNjA3NzgsInJvbGUiOiJ1c2VyIiwidWlkIjoiODMwNzA5NmMtZjFiMC00MjMwLWIwOGEtYTZhOGQ3NjlmZWNjIiwidXNlcm5hbWUiOiJ3ZWlodWl6aG91In0.L1CQ1IoYLhuN_hjmSu0ggvVaNBXvT3d3Isl1SJeBchaIH6ofVmw1eK-XShUfmTL9U4Ezl1k8EjgR8ExkrFyr8g username: user1 - expires_in: "1643162036" token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NDMxNjIwMzYsInJvbGUiOiJhZG1pbiIsInVpZCI6IjM4NjE5ZjUyLTM3MzYtNDMzZC05YWJiLTdiMTk5M2QyMWUyMyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.K9WFodHAqCez6XdoX-LUzcUEFK04fRZY94mQ1kr7Y0Msh2t0Nn_7rLtlrXgraHN64NJPwVTsR4YOECGDV7emTQ username: admin endpoint: http://172.18.0.3:31655 apiVersion: v1 current-account: http://172.18.0.3:31655 current-user: admin kind: Config |
(5)修改当前用户为user1
litmusctl config use-account --endpoint "http://172.18.0.3:31655" --username "user1" |
(6)为每个agent创建命名空间
不管是创建集群级别的agent还是命名空间级别的agent,都会将agent组件部署在某个命名空间中,并且组件名称相同,因此为了防止覆盖已有的agent,不同的agent要放在不同的命名空间中
kubectl create ns user1-litmus-agent |
(7)交互式创建agent
Installing ChaosAgents in interactive mode | Litmus Docs
team使用
邀请其他用户到自己的组,被邀请的用户可有两种角色,viewer和editor,viewer只可查看,editor可运行workflow及其他操作,对方同意后即可使用当前用户的agent和workflow
Invite a Team Member | Litmus Docs
问题
chaos mesh运行实验时出现以下问题
Error response from daemon: client version 1.41 is too new. Maximum supported API version is 1.40
安装时加入env
helm install -name chaos-mesh -n chaos-testing chaos-mesh/chaos-mesh --version 2.1.3 --set chaosDaemon.env.DOCKER_API_VERSION=1.40
参考链接
Litmus 实践:让群魔在混沌中乱舞,看 K8s 能撑到何时 - 知乎