利用 Chaos Mesh 构建 TiDB 数据库高可用架构增强稳定性探索一

网友投稿 492 2024-04-01



一、简介

本文主要介绍chaos-mesh相关的知识包括混沌工程Chaos-Mesh的简介、核心功能、架构预览以及相关实验的功能,为后边构建tidb容器化数据库做准备。

利用 Chaos Mesh 构建 TiDB 数据库高可用架构增强稳定性探索一

1、Chaos-Mesh简介

Chaos Mesh 是一个开源的云原生混沌工程平台,提供丰富的故障模拟类型,具有强大的故障场景编排能力,方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常,帮助用户发现系统潜在的问题。Chaos Mesh 提供完善的可视化操作,旨在降低用户进行混沌工程的门槛。用户可以方便地在 Web UI 界面上设计自己的混沌场景,以及监控混沌实验的运行状态。

2、Chaos Mesh核心功能

Chaos Mesh 作为业内领先的混沌测试平台,具备以下核心优势:

核心能力稳固:Chaos Mesh 起源于 TiDB 的核心测试平台,发布初期即继承了大量 TiDB 已有的测试经验。

被充分验证:Chaos Mesh 被众多公司以及组织所使用,例如***和美团等;同时被用于众多知名分布式系统的测试体系中,例如 Apache APISIX 和 RabbitMQ 等。

系统易用性强:图形化操作和基于 Kubernetes 的使用方式,充分利用了自动化能力。

云原生:Chaos Mesh 原生支持 Kubernetes 环境,提供了强悍的自动化能力。

丰富的故障模拟场景:Chaos Mesh 几乎涵盖了分布式测试体系中基础故障模拟的绝大多数场景。

灵活的实验编排能力:用户可以通过平台设计自己的混沌实验场景,场景可包含多个混沌实验编排,以及应用状态检查等。

安全性高:Chaos Mesh 具有多层次安全控制设计,提供高安全性。

活跃的社区:Chaos Mesh 为全球知名开源混沌测试平台,CNCF 开源基金会孵化项目。

强大的扩展能力:Chaos Mesh 为故障测试类型扩展和功能扩展提供了充分的扩展能力。

3、架构概览

Chaos Mesh 基于 Kubernetes CRD (Custom Resource Definition) 构建,根据不同的故障类型定义多个 CRD 类型,并为不同的 CRD 对象实现单独的 Controller 以管理不同的混沌实验。Chaos Mesh 主要包含以下三个组件:

Chaos Dashboard:Chaos Mesh 的可视化组件,提供了一套用户友好的 Web 界面,用户可通过该界面对混沌实验进行操作和观测。同时,Chaos Dashboard 还提供了 RBAC 权限管理机制。

Chaos Controller Manager:Chaos Mesh 的核心逻辑组件,主要负责混沌实验的调度与管理。该组件包含多个 CRD Controller,例如 Workflow Controller、Scheduler Controller 以及各类故障类型的 Controller。

Chaos Daemon:Chaos Mesh 的主要执行组件。Chaos Daemon 以 DaemonSet 的方式运行,默认拥有 Privileged 权限(可以关闭)。该组件主要通过侵入目标 Pod Namespace 的方式干扰具体的网络设备、文件系统、内核等。

二、安装部署

1.环境准备

1.在安装之前,请先确保环境中已经安装 Helm。 [root@k8s-master chaos-mesh]# helm version version.BuildInfo{Version:"ving NAME                                       READY   STATUS   RESTARTS   AGE chaos-controller-manager-856bc96c68-6mppc   1/1     Running   0         6h49m chaos-controller-manager-856bc96c68-hk6nl   1/1     Running   0         6h50m chaos-controller-manager-856bc96c68-q99vm   1/1     Running   0         6h50m chaos-daemon-ng4vx                         1/1     Running   0         6h49m chaos-daemon-w2w7h                         1/1     Running   0         6h50m chaos-dashboard-5fdf8b8bb-nnnhz             1/1     Running   0         6h50m 备注为了保证高可用性,Chaos Mesh 默认开启了 leader-election 特性。如果不需要这个特性,请通过 --set controllerManager.leaderElection.enabled=false 手动关闭该特性。

2.管理用户权限

2.1、通过token进行登陆1、创建用户并绑定权限。访问dashboard点击这里生成 2、创建令牌辅助生成器: 2.1:选择权限的范围 2.2:选择角色 2.3:生成rbac配置 2.4:点击复制 3、创建用户并绑定权限 [root@k8s-master chaos-mesh]# cat /chaosMesh/rbac.yml kind: ServiceAccount apiVersion: v1 metadata: namespace: tidb name: account-tme: role-tidb-manager-aypth rules: - apiGroups: [""] resources: ["pods", "namespaces"] verbs: ["get", "watch", "list"] - apiGroups: kind: RoleBinding metadata: name: bind-tidb-manager-aypth namespace: tidb subjects: - kind: ServiceAccount name: account-tidb-manager-aypth namespace: tidb roleRef: kind: Role name: role-tidb-manager-aypth apiGroup: rbac.authorization.k8s.io Namespace:   tidb Labels:       <none> Annotations: kubernetes.io/service-account.name: account-tidb-manager-aypth             kubernetes.io/service-account.uid: 98910f01-64b1-489c-be76-ab9241c6M1FIeFJPVzFvOXA2aGp6RS0xSjQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJ0aWRiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFjY291bnQtdGlkYi1tYW5hZ2VyLWF5cHRoLXRva2VuLXo0a3ZjIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFjY291bnQtdGlkYi1tYW5hZ2VyLWF5cHRoIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTg5MTBmMDEtNjRiMS00ODljLWJlNzYtYWI5MjQxYzY1MTRhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OnRpZGI6YWNjb3VudC10aWRiLW1hbmFnZXItYXlwdGgifQ.qZoomZT5ncAxCuRZ6R5hspa5tmqWMUHaNjjnM_Psa3HeShSYlcM-0ruVjtVj1-g-I2vCyLKYAUCuu4MHCEaULBBonwDwUHM1kqGH6EhrfBBKeLJ1H8EedsDA65RDoiBoYlJqnUi0NGrSbWHYVOEuPcoHTpRAS0gLvwtT77qkc4favMkwB0cX-wxgeBlgLqCq-i98PlOTs4-jQel6gO0j6kE38_sB1o8Bqk4my4NNv95SNZCIuiiwzipYTz7b9bmK3lF4A2s9BK6R6_7kBT5SPZ_YnIIb-C2rHZy0zUvZUsLBjPG32Wi0TDD1LF9A1lQz5lXwTZlyzrWeq02.2、关闭token登陆(不安全)

使用 Helm 安装 Chaos Mesh 时,默认开启权限验证功能。对于生产环境及其他安全要求较高的场景,建议都保持权限验证功能开启。如果只是想体验 Chaos Mesh 的功能,希望关闭权限验证从而快速创建混沌实验,可以在 Helm 命令中设置--set dashboard.securityMode=false,命令如下所示:

注,如果想重新开启权限验证功能,再重新设置 --set dashboard.securityMode=true 即可。

三、混沌工程的实验的类型

(一)、实验环境的准备

创建对应的pod的deployment

1、创建通过deployment创建相关的pod服务 #cat web-show.yml apiVersion: apps/v1 kind: Deployment metadata: name: webshow-deployment labels: app: webshow-deployment spec: replicas: 1 selector: matchLabels:   app: webshow-deployment template: metadata:   labels:     app: webshow-deployment spec:   containers:        - name: webshow-deployment          image: pingcap/web-show          imagePullPolicy: Always          command:            - /usr/local/bin/web-show            - --target-ip=${TARGET_IP}          ports:            - name: web-port              containerPort: 8081              hostPort: 8081

(二)、实验

3.2.1、创建pod类型的POD FAILURE测试1.点击实验--新建实验2.依次选择实验类型:KUBERNETES 、POD故障3.填写实验信息选项卡

备注:mode的相关信息有:

指定实验的运行方式,可选择的方式包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)

4.提交相关的信息。5.通过k8s的master节点监控查看pod 的相关情况#watch kubectl get pod,PodChaos, NAME                                         AGE podchaos.chaos-mesh.org/pod-containers-kill   7h13m podchaos.chaos-mesh.org/pod-failure-01       20m podchaos.chaos-mesh.org/pod-kill             8h 02 delay   5m networkchaos.chaos-mesh.org/pod-network-delay     delay   70s networkchaos.chaos-mesh.org/pod-network-loss loss     120s networkchaos.chaos-mesh.org/pod-network-loss-01   loss     2m6.当执行任务是出现相关的问题,如截图7. 通过kubectl检查实验结果可以使用 kubectl describe 命令查看此混沌实验对象的 StatusEvents,从而确定实验结果# kubectl describe networkchaos.chaos-mesh.org/network-delay -nchaosmesh-test Name:         network-delay Namespace:   chaosmesh-test Labels:       <none> Annotations: experiment.chaos-mesh.org/pause: false API Version: chaos-mesh.org/v1alpha1 Kind:         NetworkChaos Metadata: Creation Timestamp: 2022-04-01T08:06:54Z Finalizers:   chaos-mesh/records Generation: 24 Managed Fields:   API Version: chaos-mesh.org/v1alpha1   Fields Type: FieldsV1   fieldsV1:     f:metadata:       f:finalizers:         .:         v:"chaos-mesh/records":     f:status:       f:conditions:       f:experiment:         f:containerRecords:         f:desiredPhase:       f:instances:         .:         f:chaosmesh-test/webshow-deployment-6cbdcc4cd4-ljbtk:   Manager:     chaos-controller-manager   Operation:   Update   Time:         2022-04-01T08:06:54Z   API Version: chaos-mesh.org/v1alpha1   Fields Type: FieldsV1   fieldsV1:     f:metadata:       f:annotations:         .:         f:experiment.chaos-mesh.org/pause:     f:spec:       .:       f:action:       f:direction:       f:duration:       f:loss:         .:         f:loss:       f:mode:       f:selector:         .:         f:labelSelectors:           .:           f:app:         f:namespaces:     f:status:       .:       f:experiment:   Manager:         chaos-dashboard   Operation:       Update   Time:           2022-04-01T08:11:11Z Resource Version: 1305926 UID:               ee609703-aa48-4b55-9ff2-88b4aab967b5 Spec: Action:     loss Direction: to Duration:   5m Loss:   Correlation: 0   Loss:         80 Mode:           all Selector:   Label Selectors:     App: webshow-deployment   Namespaces:     chaosmesh-test Status: Conditions:   Reason:     Status: False   Type:   AllInjected   Reason:     Status: True   Type:   AllRecovered   Reason:     Status: False   Type:   Paused   Reason:     Status: True   Type:   Selected Experiment:   Container Records:     Id:           chaosmesh-test/webshow-deployment-6cbdcc4cd4-ljbtk     Phase:         Not Injected     Selector Key: .   Desired Phase:   Stop Instances:   chaosmesh-test/webshow-deployment-6cbdcc4cd4-ljbtk: 11 Events:                                                 <none>

上述输出中,主要包含两部分:

Status

依据混沌实验的执行流程,Status 提供了以下四类状态记录:

Paused: 代表混沌实验正处于暂停阶段。

Selected: 代表混沌实验已经正确选择出待测试目标。

AllInjected:代表所有测试目标都已经被成功注入故障。

AllRecoverd:代表所有测试目标的故障都已经被成功恢复。

可以通过这四类状态记录推断出当前混沌实验的真实运行情况。例如:

PausedSelectedAllRecoverd 的状态是 TrueAllInjected 的状态是 False时,说明当前实验处在暂停状态。

PausedTrue 的时,说明当前实验处在暂停状态,但是如果此时的 Selected 值为 False,那么可以进一步得出此混沌实验无法选出待测试目标。

注意

你可以从上述的四类实验记录组合中可以推导出更多的信息,例如当 PausedTrue 的时候,说明混沌实验处在暂停状态,但是如果此时的 Selected 值为 False,那么可以进一步得出此混沌实验无法选出待测试目标。

Events

事件列表中包含混沌实验整个生命周期中的操作记录,可以帮助确定混沌实验状态并排除问题。

8.查看dashboard界面9.实验结束,查看pod的服务是否正常地10.把实验步骤进行归档

如果你想要在 Dashboard 上删除混沌实验并归档到历史记录汇总,可以点击对应混沌实验的归档按钮。

3.3.3、模拟网络故障

请在进行网络注入的过程中保证 Controller Manager 与 Chaos Daemon 之间的连接通畅,否则将无法恢复。

如果使用 Net Emulation 功能,请确保 Linux 内核拥有 NET_SCH_NETEM 模块。对于 CentOS 可以通过 kernel-modules-extra 包安装,大部分其他发行版已默认安装相应模块。

(一)模拟LOSS1.依次选择新建--网络攻击--LOSS

loss:表示丢包发生的概率。取值范围:[0, 100]

correlation:表示延迟时间的时间长度与前一次延迟时长的相关性。取值范围:[0, 100]

direction: 值为 fromtoboth。用于指定选出“来自 target 的包”,“发往 target 的包”,或者“全部选中”

externalTargets: 表示 Kubernetes 之外的网络目标, 可以是 IPv4 地址或者域名。只能与 direction: to一起工作。 如8.8.8.8 baidu.com

2.填写实验信息,并提交。3.进入该容器内部进行相关的ping操作,会出现丢包现象。[root@k8s-master ~]# kubectl exec -it   pod/webshow-deployment-6cbdcc4cd4-ljbtk -nchaosmesh-test /bin/sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] in --- 8.8.8.8 ping statistics --- 67 packets transmitted, 1 received, 98% packet loss, time 67604ms rtt min/avg/max/mdev = 53.598/53.598/53.598/0.000 ms sh-4.2# ping 8.8.8.8 PING 8.8.8.8 ((二)、模拟delay场景1.创建相关的配置2.查看相关的实验信息,并点击开始3.验证相关结果,通过进入pod,master节点和pod对应的work节点进行ping测试1.进入容器进行ping外网 # kubectl exec -it   pod/webshow-deployment-6cbdcc4cd4-ljbtk -nchaosmesh-test /bin/sh

备注:

字段说明

参数类型说明默认值是否必填示例actionstring表示具体的故障类型。netem,delay,loss,duplicate,corrupt 对应 net emulation 类型;partition 表示网络分区;bandwidth 表示限制带宽partitiontargetSelector与 direction 组合使用,使得 Chaos 只对部分包生效directionenum值为 fromtoboth。用于指定选出“来自 target 的包”,“发往 target 的包”,或者“全部选中”tobothmodestring指定实验的运行方式,可选择的方式包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)onevaluestring取决与 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比1containerNames[]string指定注入的容器名称["nginx"]selectorstruct指定注入故障的目标 Pod,详情请参考定义实验范围externalTargets[]string表示 Kubernetes 之外的网络目标, 可以是 IPv4 地址或者域名。只能与 direction: to 一起工作。1.1.1.1, www.google.comdevicestring指定影响的网络设备"eth0"参数类型说明默认值是否必填示例latencystring表示延迟的时间长度02mscorrelationstring表示延迟时间的时间长度与前一次延迟时长的相关性。取值范围:[0, 100]0

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:初次体验云数据库 TiDB 的感受
下一篇:利用 Generative AI 打造定制化用户助理
相关文章