腾讯云TKE-混沌测试 部署chaos-mesh (一)

2020-11-05 20:49:35 浏览数 (1)

背景

在现实生活中, 汽车领域有一套安全, 性能测试平台和机构,在云原生领域PiingCAP公司在2019年12月31日开源了一个云原生的混沌测试平台Chaos MeshChaos Mesh 提供在 Kubernetes 平台上进行混沌测试的能力.在我们排查问题的过程中经常需要模拟各种场景,例如,podkil,网络延迟,丢包, cpu,内存压测,有了这个工具就可以非常方便的模拟各种场景 本篇文章主要给大家介绍下原理,在TKE中如何部署,以及简单的使用。目前支持以下类型的测试:

image.pngimage.png

原理

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"

架构图如下:

image.pngimage.png

ChaosMesh 工作原理

image.pngimage.png

基本工作流程:

  • 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脚本进行部署.

  1. 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连接被拒绝.

  1. shell脚本部署

curl -sSL https://mirrors.chaos-mesh.org/v1.0.1/install.sh | bash -s -- --host-network

  1. 查看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
 ~ 
  1. 在TKE中开启公网访问用于访问WEB页面
image.pngimage.png
image.pngimage.png

端口为:2333

测试

访问service 的公网ip:2333 端口:

image.pngimage.png
  1. 内存压测案例: 创建实验 image.pngimage.png

选测命名空间和实例

image.pngimage.png
image.pngimage.png
image.pngimage.png
image.pngimage.png

正在执行

image.pngimage.png

然后可以在TKE控制台或者命令行进入到pod中查看内存状态。

结束

本片文章简单介绍了chaosmesh在TKE中的部署以及基本使用, 接下来的文章会使用这个工具去模拟场景进行测试介绍。

文中的部分图片和内容参考pingcap公司文档。

0 人点赞