云原生下的混沌工程 - Chaos Mesh
Posted 云原生兴趣小组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生下的混沌工程 - Chaos Mesh相关的知识,希望对你有一定的参考价值。
(一)Chaos Mesh 介绍
Chaos Mesh 是一个云原生的混沌工程(Chaos Engineering)平台。
现实世界中,各类故障可能会随时随地的发生,其中有很多故障我们无法避免,例如磁盘突然写坏,或者机房突然断网断电等等。这些故障可能会给公司造成巨大损失,因此提升系统对于故障的容忍度成为很多工程师努力的目标。
(二)Chaos Mesh 核心功能模块
Chaos Mesh 主要包含两大组件:
Chaos Operator:核心组件
Chaos Dashboard:可视化面板,显示混沌实验对系统在线服务的影响
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 使用
直接在 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® X GitHub Actions —— 把混沌工程集成到你的 CI 中