为了保障云上客户的系统稳定性,最近研究了混沌工程 Chaos Engineering 的历史和相关工具。本篇探讨下混沌工程的历史,社区给的实践原则,同时演示下混沌工具 Chaos-mesh 在腾讯云 TKE 上的使用。
混沌工程原则 principles of chaos engineering 里关于 Chaos Engineering 的定义如下:
Chaos Engineering is the discipline of experimenting on a system in order to build confidence in the system’s capability to withstand turbulent conditions in production.
混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。
2010年,Netflix 迁移上 AWS 云时,为了保证 AWS 实例的故障不会给 Netflix 的用户体验造成影响,Netflix Eng Tools 团队开发了大名鼎鼎的 Chaos Monkey 工具,并用它来进行云上故障模拟测试。
2014年时,Netflix 的 Bruce Wong 设立了一个新的职位 — “混沌工程师”,接着 Dan Woods 在 Twitter 上向广大的工程社区推广。于是 混沌工程(Chaos Engineering) 这个牛B加时髦的名称从此诞生了。有关 Chaos Engineering 的发展史可参考这篇 blog:Chaos Engineering: the history, principles, and practice。
在 Netflix 大佬们出的 Chaos Engineering(一本免费的电子书,注册了 O'Reilly 账户就可以阅读)一书中体系化的阐述了混沌工程,而且还搞出了一个高大上的混沌工程成熟度模型。简单来说,该模型从 Sophistication 和 Adoption 两个维度来衡量混沌工程的落地程度:
反映混沌工程项目的有效性和安全性,比如在生产环境做混沌实验的要比测试环境好;可以自动化开展混沌实验的要比手工操作好;能够进行复杂场景的混沌实验并能控制影响范围的要比简单的制造 CPU/IO 飙升来的好。
混沌实验接纳程度,衡量混沌工程实验覆盖的广度和深度。其实就是衡量一家公司对混沌工程的接受程度。比如牛X的大厂会在所有核心系统都会经常进行混沌工程实验,那就混沌工程的接受程度就高。
此外,Chaso Community 在其 principles of chaos engineering 中也给出一些混沌工程原则和最佳实践,具体见下图。
接下来通过一个完整的在线商城系统,详细讲解下开源混沌工具 Chaos-mesh 的安装和使用。
在线商城系统是由腾讯云的服务网格团队开发的一个基于 Istio 的 service mesh demo 例子,可以在 github 上下载 tcm-demo 。需要注意一点,在安装该商城系统前,需要先在 TKE 上建立好集群以及服务网格。
下载完 tcm-demo 后,进入 install 目录,使用下面两条命令安装服务和路由。
# Step 1:安装商城服务
kubectl apply -f base_apps.yaml
# Step 1:安装路由
kubectl apply -f base_routing.yaml
安装完成后,在控制台进入服务网格 -> Gateway,即可看到下图中展示的公网 IP,在浏览器中打开后就能看到在线商城的页面了。
Chaos-mesh 是 PingCAP 于2019 年 12 月 31 日开源的一款云原生的混沌测试平台。Chaos-mesh 按三层架构进行设计,整体非常清晰:
Controller Manager 是 Chaos-mesh 的总控,为 Chaos-mesh 与 Kubernetes 交互模块,主要包括两部分,一部分为 CRD 结构定义,另一部分主要为接收 Kubernetes 事件以及对各类 Chaos 对象的调度与管理。
每个 K8S Node 都会安装一个实例,通过 gRPC 协议接收来自 Controllers 请求进行具体的混沌注入逻辑。
以 sidecar 模式向真实运行的 Pod 注入混沌事件。
Chaos-mesh 的安装很简单,官方文档也有详细说明。简单来说,执行下面命令即可在你的 k8s 集群中进行安装:
curl -sSL [https://mirrors.chaos-mesh.org/v1.0.3/install.sh](https://mirrors.chaos-mesh.org/v1.0.3/install.sh) | bash
安装完成后,执行 kubectl get pod -n chaos-testing
可验证 chaos-mesh 是否正常运行,正常情况下会出现下面的输出:
➜ ~ kubectl get pod -n chaos-testing
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-7c79874597-fdkzr 1/1 Running 0 18m
chaos-daemon-ddgnt 1/1 Running 0 18m
chaos-daemon-sssqv 1/1 Running 0 18m
chaos-daemon-vqnkb 1/1 Running 0 18m
chaos-dashboard-5dc4bfbd8b-sn7k7 1/1 Running 0 18m
接下来为 chaos-mesh dashboard 建立路由服务,具体如下图,在 TKE 控制台里选择 集群 -> 服务与路由 -> Ingress,然后为 chaos-mesh dashboard 建立一个 ingress。建立完成后,会出现下图所示的 Ingress 信息,其中后端服务会展示一个公网URL到 chaos-dashboard 的映射:http://xxx.xxx.xxx.xxx/-->chaos-dashboard:2333
。直接点击该 URL 就可以看到 chaos-dashboard 了。
下图为 chaos-dashboard 界面。
Chaos-mesh 提供了很多故障注入功能,当前支持:
下面通过两个具体的例子 pod-failure,network-delay,来展示下 chaos-mesh 的使用。可在 github chaos-mesh 的 example 目录里找到更多的使用示例。
下面是 pod-failure 的 yaml,在命令行执行 kubectl apply -f pod-failure.yaml
即可。
# pod-failure.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-failure # Pod 故障
namespace: base # 目标 Pod 所在的命名空间
spec:
action: pod-failure # 故障注入类型
mode: one # 一次注入一个 pod
value: ""
duration: "30s" # 故障持续时间
selector:
labelSelectors:
"app": "products" # 注入故障的服务
scheduler:
cron: "@every 1m" # 每 1 分钟注入一次
由于该实验每分钟为 products 注入一次 pod-failure,且每次持续 30s。因而访问商城页面时,会间隔性的看不到任何商品信息。
通过 lens 也可以看到 products 的 pod 出现了告警。
Dashboard 里面可以看到 pod-failure 实验的详细信息。
如果想停止实验的话,直接 kubectl delete 即可。
➜ chaos-mesh kubectl delete -f pod-failure.yaml
podchaos.chaos-mesh.org "pod-failure" deleted
在进行网格相关的混沌实验时,如果出现 networkchaos-controller rpc error
的错误导致失败(本文中使用的是 chaos-mesh 1.0.3 版
出现过该问题),需要在 DaemonSet 的 deployment yaml 中添加以下配置。
spec:
template:
spec:
hostNetwork: true
也可以使用其它方式解决,具体见 chaos-mesh issue #391 中的描述。
下面是网络延迟的 yaml,每15秒为 discount 服务注入1次 100ms 的延迟,持续时间 10s。混沌事件注入后,访问商城页面时,商品信息会有明显的间隔性延迟。
# network-delay.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: network-delay
namespace: base
spec:
action: delay # 故障注入类型
mode: one
selector:
labelSelectors:
"app": ”discount" # 注入故障的服务
delay:
latency: ”100ms“ # 网络延迟 100ms
correlation: "25"
jitter: "90ms"
duration: “10s” # 持续 10s
scheduler:
cron: “@every 15s” # 每15秒注入一次
Dashboard 里也可以创建混沌实验,具体见下图,点击 NEW EXPERMENT 按钮即可。Dashboard 里会看到历史的混沌实验信息,因而可以从历史记录中选择一个,当然也可以全部新建。对于创建步骤中的输入信息不了解的,可参考 官方文档,里面有详细说明,这里不再赘述。
Chaos-mesh 还提供了一个在线的交互式入门教程 Interactive Tutorial,方便新手快速掌握和使用。
在大规模分布式微服环境下,混沌工程有个日常测试无法替代的价值。通过例行的混沌实验可以让重大风险在可控范围内提前暴露,从而避免或降低业务损失;也可以检验系统的容错和容灾能力,以及线上故障应急处理流程等多个方面。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。