云原生混沌工程——Chaos Mesh详解

1、简介

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

2、特点

核心能力稳固: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 的方式干扰具体的网络设备、文件系统、内核等。

图片

Chaos Mesh 的整体架构如上图所展示,可以自上而下分为三个部分:

用户输入和观测的部分。用户输入以用户操作 (User) 为起点到达 Kubernetes API Server。用户不直接和 Chaos Mesh 的 Controller 交互,一切用户操作最终都将反映为某个 Chaos 资源的变更(比如 NetworkChaos 资源的变更)。

监听资源变化、调度 Workflow 和开展混沌实验的部分。Chaos Mesh 的 Controller 只接受来自 Kubernetes API Server 的事件,这种事件描述某个 Chaos 资源的变更,例如新的 Workflow 对象或者 Chaos 对象被创建。

具体节点故障的注入部分。该部分主要由 Chaos Daemon 组件负责,接受来自 Chaos Controller Manager 组件的指令,侵入到目标 Pod 的 Namespace 下,执行具体的故障注入。例如设置 TC 网络规则,启动 stress-ng 进程抢占 CPU 或内存资源等。

4、部署

添加 Chaos Mesh 仓库

[root@k8s-mast linux-amd64]# helm repo add chaos-mesh https://charts.chaos-mesh.org
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
“chaos-mesh” has been added to your repositories
查看可以安装的 Chaos Mesh 版本

[root@k8s-mast linux-amd64]# helm search repo chaos-mesh
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
NAME CHART VERSIONAPP VERSIONDESCRIPTION
chaos-mesh/chaos-mesh2.6.3 2.6.3 Chaos Mesh is a cloud-native Chaos Engineering …

如需安装历史版本,请执行如下命令查看所有的版本

[root@k8s-mast linux-amd64]# helm search repo chaos-mesh -l
创建安装 Chaos Mesh 的命名空间

[root@k8s-mast linux-amd64]# kubectl create ns chaos-testing
namespace/chaos-testing created
安装

[root@k8s-mast linux-amd64]# helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-testing
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
NAME: chaos-mesh
LAST DEPLOYED: Tue Mar 26 14:57:09 2024
NAMESPACE: chaos-testing
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:

  1. Make sure chaos-mesh components are running
    kubectl get pods –namespace chaos-testing -l app.kubernetes.io/instance=chaos-mesh
    验证

[root@mast01 linux-amd64]# kubectl get po -n chaos-testing
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-54f9685d45-m2f57 1/1 Running 0 40s
chaos-controller-manager-54f9685d45-r88m2 1/1 Running 0 40s
chaos-controller-manager-54f9685d45-vgq5g 1/1 Running 0 40s
chaos-daemon-2n8z2 1/1 Running 0 40s
chaos-daemon-65cnw 1/1 Running 0 40s
chaos-dashboard-747d9dfd65-dbddh 1/1 Running 0 40s
chaos-dns-server-654cb99f5b-6lfb7 1/1 Running 0 40s
卸载

helm uninstall chaos-mesh -n chaos-testing
5、添加用户权限

创建权限

按照操作进行执行

添加令牌信息

登录页面

6、创建测试pod

[root@mast01 ~]# cat tomcat.yaml
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:

  • name: tomcat
    image: “tomcat”
    env:
  • name: aliyun_logs_catalina
    value: “stdout” # 告诉 log-pilot 这个容器要收集 stdout 日志。
  • name: aliyun_logs_access value: “/usr/local/tomcat/logs/catalina..log” # 则表示要收集容器内 /usr/local/tomcat/logs/ 目录下所有名字匹配 catalina..log的文件日志。 volumeMounts:
    • name: accesslogs
      mountPath: /usr/local/tomcat/logs
      volumes:
  • name: accesslogs
    emptyDir: {}

[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 28m
7、混沌测试

新建实验

演示pod故障

提交

完成实验

8、查看pod状态

[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 28m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 33m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 1/1 Running 0 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (17s ago) 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (17s ago) 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (18s ago) 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (19s ago) 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (19s ago) 34m
[root@mast01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat 0/1 ErrImagePull 0 (19s ago) 34m

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/414296.html

联系我们
联系我们
分享本页
返回顶部