云原生下的混沌工程 - Chaos Mesh

Posted 云原生兴趣小组

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生下的混沌工程 - Chaos Mesh相关的知识,希望对你有一定的参考价值。

(一Chaos Mesh 介绍


Chaos Mesh 是一个云原生的混沌工程(Chaos Engineering)平台。

现实世界中,各类故障可能会随时随地的发生,其中有很多故障我们无法避免,例如磁盘突然写坏,或者机房突然断网断电等等。这些故障可能会给公司造成巨大损失,因此提升系统对于故障的容忍度成为很多工程师努力的目标。


(二Chaos Mesh 核心功能模块


Chaos Mesh 主要包含两大组件:

  • Chaos Operator:核心组件

  • Chaos Dashboard:可视化面板,显示混沌实验对系统在线服务的影响

云原生下的混沌工程 - Chaos Mesh

Chaos Operator 以一种可管理的方式将故障注入到应用程序和 Kubernetes 基础结构中,从而为混沌实验和自动编排提供了简单的自定义场景。主要包含三个组成部分:

  • Controller-manager:用于计划和管理 CRD 对象的生命周期

  • Chaos-daemon:在特定节点上以特权系统权限作为守护进程运行网络与 Cgroup 等

  • Sidecar:一种特殊类型的容器,它由 webhook-server 动态注入到目标 Pod 中,可用于劫持应用程序容器的 I/O。

Chaos Operator 使用自定义资源定义(Custom Resource Definition,CRD)定义混沌对象。当前实现支持用于故障注入的 CRD 对象 PodChaos、NetworkChaos、IOChaos 和 TimeChaos,它们对应于以下主要操作:

  • pod-kill:模拟Kubernetes Pod被杀死

  • pod-failure:模拟Kubernetes Pod长时间不可用

  • 网络延迟:模拟网络延迟

  • 网络丢失:模拟网络数据包丢失

  • 网络复制:模拟网络数据包复制

  • 网络损坏:模拟网络数据包损坏

  • 网络分区:模拟网络分区

  • I/O延迟:模拟文件系统I/O延迟

  • I/O 错误:模拟文件系统I/O错误


(三Chaos Mesh 架构实现


Chaos Mesh 中使用 CRD 来定义 chaos 对象,在 Kubernetes 生态中 CRD 是用来实现自定义资源的成熟方案,又有非常成熟的实现案例和工具集供我们使用,这样我们就可以借助于生态的力量,避免重复造轮子。并且可以更好的融合到 Kubernetes 生态中。

最初的想法是把所有的错误注入类型定义到统一的 CRD 对象中,但在实际设计的时候发现,这样的设计行不通,因为不同的错误注入类型差别太大,你没办法预料到后面可能会增加什么类型的错误注入,很难能有一个结构去很好的覆盖到所有场景。又或者最后这个结构变得异常复杂和庞大,很容易引入潜在的 bug。

所以在 Chaos Mesh 中 CRD 的定义可以自由发挥,根据不同的错误注入类型,定义单独的 CRD 对象。如果新添加的错误注入符合已有的 CRD 对象定义,就可以拓展这个 CRD 对象;如果是一个完全不同的错误注入类型,也可以自己重新增加一个 CRD 对象。这样的设计可以将不同的错误注入类型的定义以及逻辑实现从最顶层就抽离开,让代码结构看起来更加清晰,并且降低了耦合度,降低出错的几率。另一方面 controller-runtime 提供了很好的 controller 实现的封装,不用去对每一个 CRD 对象去自己实现一套 controller 的逻辑,避免了大量的重复劳动。

目前在 Chaos Mesh 中设计了三个 CRD 对象,分别是 PodChaos、NetworkChaos 以及 IOChaos,从命名上就可以很容易的区分这几个 CRD 对象分别对应的错误注入类型。

云原生下的混沌工程 - Chaos Mesh


(四Chaos Mesh 使用


直接在 Kubernetes 集群上很方便地安装 Chaos Mesh,这里我们使用轻量级的 Kind 搭建的 Kubernetes 集群。当然在部署之前,先确保 Docker 已在本地机器上安装并运行。

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

上面的命令会安装所有的 CRD、ServiceAccount 和所有组件,如果你使用的是 k3s 或 k3d,需要指定 kind 参数。

$ curl -sSL https://mirrors.chaos-mesh.org/v1.0.1/install.sh | bash -s —-local kind

如果你已经安装了大于 0.7 版本的Kind,那么脚本将继续,否则将安装一个新的版本。脚本运行后的输出结果如下所示:

Install kubectl client
kubectl Version 1.18.8 has been installed
Install Kind tool
Kind Version 0.8.1 has been installed
Install local Kubernetes kind
No kind clusters found.
Clean data dir: /Users/rbanka/kind/kind/data
start to create kubernetes cluster kindCreating cluster "kind" ...
DEBUG: docker/images.go:58] Image: kindest/node:v1.17.2 present locally
✓ Ensuring node image (kindest/node:v1.17.2) ?
✓ Preparing nodes ? ? ? ?
✓ Writing configuration ?
✓ Starting control-plane ?
✓ Installing CNI ?
✓ Installing StorageClass ?
✓ Joining worker nodes ?
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Thanks for using kind! ?
Install Chaos Mesh chaos-mesh
customresourcedefinition.apiextensions.k8s.io/iochaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/kernelchaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/networkchaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/podchaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/podiochaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/podnetworkchaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/stresschaos.chaos-mesh.org created
customresourcedefinition.apiextensions.k8s.io/timechaos.chaos-mesh.org created
namespace/chaos-testing created
serviceaccount/chaos-controller-manager created
secret/chaos-mesh-webhook-certs created
clusterrole.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-target-namespace created
clusterrole.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-cluster-level created
clusterrolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-cluster-level created
clusterrolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-target-namespace created
role.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-control-plane created
rolebinding.rbac.authorization.k8s.io/chaos-mesh:chaos-controller-manager-control-plane created
service/chaos-dashboard created
service/chaos-mesh-controller-manager created
daemonset.apps/chaos-daemon created
deployment.apps/chaos-dashboard created
deployment.apps/chaos-controller-manager created
mutatingwebhookconfiguration.admissionregistration.k8s.io/chaos-mesh-mutation created
validatingwebhookconfiguration.admissionregistration.k8s.io/chaos-mesh-validation created
Waiting for pod running
chaos-controller-manager-754d4f7585-h9p4c 0/1 ContainerCreating 0 10s
Waiting for pod running
chaos-controller-manager-754d4f7585-h9p4c 0/1 ContainerCreating 0 21s
Waiting for pod running
chaos-controller-manager-754d4f7585-h9p4c 0/1 ContainerCreating 0 31s
Waiting for pod running
Chaos Mesh chaos-mesh is installed successfully

要验证组件是否在 Kubernetes Cluster 上运行成功,可以使用以下方法检查。

$ kubectl get pods -n chaos-testing
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-754d4f7585-h9p4c 1/1 Running 0 7h9m
chaos-daemon-94687 1/1 Running 0 7h9m
chaos-daemon-k7pnj 1/1 Running 0 7h9m
chaos-daemon-tfgp6 1/1 Running 0 7h9m
chaos-dashboard-6fdb79c549-vmvtp 1/1 Running 0 7h9m

我们可以看到有3个组件处于运行状态,controller、dashboard 以及作为 Daemonset 的运行混沌 daemon 进程。接着检查下 CRD 是否在集群上创建成功。

$ kubectl get crds
NAME CREATED AT
iochaos.chaos-mesh.org 2020-10-22T09:15:05Z
kernelchaos.chaos-mesh.org 2020-10-22T09:15:05Z
networkchaos.chaos-mesh.org 2020-10-22T09:15:05Z
podchaos.chaos-mesh.org 2020-10-22T09:15:05Z
podiochaos.chaos-mesh.org 2020-10-22T09:15:05Z
podnetworkchaos.chaos-mesh.org 2020-10-22T09:15:05Z
stresschaos.chaos-mesh.org 2020-10-22T09:15:05Z
timechaos.chaos-mesh.org 2020-10-22T09:15:05Z

这些 CRD 就代表了上面详细提到的各种故障注入的使用对象。

要访问 Dashboard,我们将使用 kube-proxy,或者你可以直接在Loadbalancer 上暴露它。显示获取 Chaos mesh Dashbaord 上的容器端口。

$ kubectl get deploy chaos-dashboard -n chaos-testing -o=jsonpath="{.spec.template.spec.containers[0].ports[0].containerPort}{'
'}"
2333

输出显示 Dashboard 正在监听的端口。然后紧接着我们把本地端口转发到 Pod 上的端口,我们可以从上面得到 pod 名称得到 pod 输出。

$ kubectl port-forward -n chaos-testing chaos-dashboard-6fdb79c549-vmvtp 8888:2333

现在我们可以通过 http://localhost:8888 访问 Dashboard 了。从 Dashboard 上可以看到,目前我们还没有创建任何实验。






以上是关于云原生下的混沌工程 - Chaos Mesh的主要内容,如果未能解决你的问题,请参考以下文章

Chaos Mesh® 在腾讯——腾讯互娱混沌工程实践

Chaos Mesh® X GitHub Actions —— 把混沌工程集成到你的 CI 中

迈向混沌工程闭环生态的 Chaos Mesh® 2.0

使用 KubeSphere 快速部署 Chaos Mesh

在 Kubernetes 实施混沌工程—— Chaos Mesh® 原理分析与控制面开发

Chaos Mesh 实战分享丨通过混沌工程验证 GreatDB 分布式部署模式的稳定性