背景
在现实生活中, 汽车领域有一套安全, 性能测试平台和机构,在云原生领域PiingCAP公司在2019年12月31日开源了一个云原生的混沌测试平台Chaos Mesh
,Chaos Mesh
提供在 Kubernetes 平台上进行混沌测试的能力.在我们排查问题的过程中经常需要模拟各种场景,例如,podkil,网络延迟,丢包, cpu,内存压测,有了这个工具就可以非常方便的模拟各种场景 本篇文章主要给大家介绍下原理,在TKE中如何部署,以及简单的使用。目前支持以下类型的测试:
原理
Chaos Mesh 中使用 CRD 来定义 chaos 对象,在 Kubernetes 生态中 CRD 是用来实现自定义资源的成熟方案,又有非常成熟的实现案例和工具集供我们使用,这样我们就可以借助于生态的力量,避免重复造轮子。并且可以更好的融合到 Kubernetes 生态中。
目前在 Chaos Mesh 中设计了三个 CRD 对象,分别是 PodChaos、NetworkChaos 以及 IOChaos,从命名上就可以很容易的区分这几个 CRD 对象分别对应的错误注入类型。
以 PodChaos 为例:
代码语言:txt复制spec:
action: pod-kill
mode: one
selector:
namespaces:
- tidb-cluster-demo
labelSelectors:
"app.kubernetes.io/component": "tikv"
scheduler:
cron: "@every 2m"
架构图如下:
ChaosMesh 工作原理
基本工作流程:
- Controller-manager 目前 controller-manager 可以分为两部分,一部分 controllers 用于调度和管理 CRD 对象实例,另一部分为 admission-webhooks 动态的给 Pod 注入 sidecar 容器。
- Chaos-daemon Chaos-daemon 以 daemonset 的方式运行,并具有 Privileged 权限,Chaos-daemon 可以操作具体 Node 节点上网络设备以及 Cgroup 等。
- Sidecar Sidecar contianer 是一类特殊的容器,由 admission-webhooks 动态的注入到目标 Pod 中,目前在 Chaos Mesh 中实现了 chaosfs sidecar 容器,chaosfs 容器内会运行 fuse-daemon,用来劫持应用容器的 I/O 操作。 整体工作流如下:
- 用户通过 YAML 文件或是 Kubernetes 客户端往 Kubernetes API Server 创建或更新 Chaos 对象。
- Chaos-mesh 通过 watch API Server 中的 Chaos 对象创建更新或删除事件,维护具体 Chaos 实验的运行以及生命周期,在这个过程中 controller-manager、chaos-daemon 以及 sidecar 容器协同工作,共同提供错误注入的能力。
- Admission-webhooks 是用来接收准入请求的 HTTP 回调服务,当收到 Pod 创建请求,会动态修改待创建的 Pod 对象,例如注入 sidecar 容器到 Pod 中。第 3 步也可以发生在第 2 步之前,在应用创建的时候运行.
TKE 中部署Chaos Mesh
首先要拥有一套腾讯云TKE环境, 然后获取到kube-config后通过helm或者shell脚本进行部署.
- helm 部署
第一步 添加Chaos Mesh 仓库到helm仓库
helm repo add chaos-mesh https://charts.chaos-mesh.org
成功添加仓库之后, 然后通过命令行查看helm search repo chaos-mesh
第二步 创建自定义类型
curl -sSL https://mirrors.chaos-mesh.org/v1.0.1/crd.yaml | kubectl apply -f -
第三步 安装Chaos Mesh
kubectl create ns chaos-testing
helm install chaos-mesh chaos-mesh/chaos-mesh --namespace=chaos-testing --set dashboard.create=true --set chaosDaemon.hostNetwork=true
注意: 1. dashboard.create=true 开启dashboard, 2. chaosDaemon.hostNetwork=true 如果不开启在执行任务的时候会报tcp连接被拒绝.
- shell脚本部署
curl -sSL https://mirrors.chaos-mesh.org/v1.0.1/install.sh | bash -s -- --host-network
- 查看pod 状态
kubectl get pods --namespace chaos-testing -l app.kubernetes.io/instance=chaos-mesh
预期输出如下:
代码语言:txt复制 ~ kubectl get pods --namespace chaos-testing -l app.kubernetes.io/instance=chaos-mesh 8s 四 11/ 5 12:35:06 2020
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-6f779f755f-kn6tg 1/1 Running 0 52m
chaos-daemon-6rz8m 1/1 Running 0 52m
chaos-daemon-cgktm 1/1 Running 0 52m
chaos-daemon-drvhz 1/1 Running 0 52m
chaos-daemon-llp5h 1/1 Running 0 52m
chaos-dashboard-86d489c8f-fkt66 1/1 Running 0 52m
~
- 在TKE中开启公网访问用于访问WEB页面
端口为:2333
测试
访问service 的公网ip:2333 端口:
- 内存压测案例: 创建实验 image.png
选测命名空间和实例
正在执行
然后可以在TKE控制台或者命令行进入到pod中查看内存状态。
结束
本片文章简单介绍了chaosmesh在TKE中的部署以及基本使用, 接下来的文章会使用这个工具去模拟场景进行测试介绍。
文中的部分图片和内容参考pingcap公司文档。