Chaos Mesh(上)
Chaos Mesh(上)
1、基本功能
1.1 故障注入
故障注入是混沌实验的核心。Chaos Mesh 充分考虑分布式系统可能出现的故障,提供全面、细粒度的故障类型,分为基础资源类型故障、平台类型故障和应用层故障三大类。
- 基础资源类型故障:
- PodChaos:模拟 Pod 故障,例如 Pod 节点重启、Pod 持续不可用,以及特定 Pod 中的某些容器故障。
- NetworkChaos:模拟网络故障,例如网络延迟、网络丢包、包乱序、各类网络分区。
- DNSChaos:模拟 DNS 故障,例如 DNS 域名解析失败、返回错误 IP 地址。
- HTTPChaos:模拟 HTTP 通信故障,例如 HTTP 通信延迟。
- StressChaos:模拟 CPU 抢占或内存抢占场景。
- IOChaos:模拟具体某个应用的文件 I/O 故障,例如 I/O 延迟、读写失败。
- TimeChaos:模拟时间跳动异常。
- KernelChaos:模拟内核故障,例如应用内存分配异常。
- 平台类型故障:
- AWSChaos:模拟 AWS 平台故障,例如 AWS 节点重启。
- GCPChaos:模拟 GCP 平台故障,例如 GCP 节点重启。
- 应用层故障:
- JVMChaos:模拟 JVM 应用故障,例如函数调用延迟。
1.2 混沌实验场景
混沌实验场景由一组混沌实验和应用状态检查组成,旨在帮助用户在平台上实现混沌工程闭环。
用户运行混沌场景,可以通过一系列的混沌实验,不断地扩大爆炸半径(包括攻击范围)和增加故障类型。运行混沌实验后,用户可以方便地检查当前的应用状态,判断是否需要进行后续混沌实验。同时用户可以不断地迭代混沌实验场景,积累混沌实验场景,以及方便地将已有的混沌实验场景复用到其他应用混沌实验中,大大降低了混沌实验的成本。
- 目前混沌实验场景提供的功能有:
- 编排串行混沌实验
- 编排并行混沌实验
- 支持状态检查步骤
- 支持中途暂停混沌实验
- 支持使用 YAML 文件定义和管理混沌实验场景
- 支持通过 Web UI 定义和管理混沌实验场景
具体的实验场景配置,参考具体创建 Chaos Mesh 工作流。
1.3 可视化操作
Chaos Mesh 为用户提供了单独的 Chaos Dashboard 组件,即可视化支持。Chaos Dashboard 极大地简化了混沌实验,用户可以直接通过可视化界面来管理和监控混沌实验,仅需点一点鼠标就能够定义混沌实验的范围、指定混沌注入的类型、定义调度规则,以及在界面上获取到混沌实验的结果等。
1.4 安全保障
Chaos Mesh 通过 Kubernetes 原生的 RBAC(基于角色的权限控制)功能对权限进行管理。
用户可以根据实际的权限需求自由地创建多种 Role,然后绑定到用户名 Service Account 上,最后生成 Service Account 对应的 Token。用户使用该 Token 登陆 Dashboard,只能在该 Service Account 允许的权限范围内进行 Chaos 实验。
此外 Chaos Mesh 还支持通过设置 Namespace Annotation 的方式开启特定 Namespace 下混沌实验的权限,进一步保障混沌实验的可控性。
2、使用 Helm 安装 Chaos Mesh
2.1 环境准备
在此之前,请先确保环境中已经部署 Kubernetes 集群、安装helm
主机名称 | 物理IP | 服务器版本 | k8s版本 | Helm 版本 | Chaos Mesh 版本 |
---|---|---|---|---|---|
master | 172.16.20.10 | Centos7.9 | v1.31 | v3.16.2 | v2.7.0 |
worker | 172.16.20.11 | Centos7.9 | v1.31 | v3.16.2 | v2.7.0 |
2.2 添加 Chaos Mesh 仓库
[root@master ~]# helm repo add chaos-mesh https://charts.chaos-mesh.org
2.3 查看可以安装的 Chaos Mesh 版本
[root@master ~]# helm search repo chaos-mesh
NAME CHART VERSION APP VERSION DESCRIPTION
chaos-mesh/chaos-mesh 2.7.0 2.7.0 Chaos Mesh is a cloud-native Chaos Engineering ...
# 上述命令会输出最新发布的 chart,如需安装历史版本,请执行如下命令查看所有的版本:
helm search repo chaos-mesh -l
2.4 创建安装 Chaos Mesh 的命名空间
推荐将 Chaos Mesh 安装在 chaos-mesh 命名空间下,也可以指定任意命名空间安装 Chaos Mesh:
[root@master ~]# kubectl create ns chaos-mesh
2.5 使用 Helm 安装 Chaos Mesh
[root@master ~]# helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-mesh --set chaosDaemon.runtime=crio --set chaosDaemon.socketPath=/var/run/crio/crio.sock --set controllerManager.replicaCount=1 --version 2.7.0
# 可以通过 --set controllerManager.replicaCount=1 来将控制器管理器减少到一个副本
2.6 验证安装
[root@master ~]# kubectl get pod -n chaos-mesh
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-66b9fcf4df-h5j2z 1/1 Running 0 5m6s
chaos-daemon-gwggl 1/1 Running 0 5m6s
chaos-dashboard-5795fbfc4d-b4wg5 1/1 Running 0 5m6s
chaos-dns-server-fb4794c4b-6q58c 1/1 Running 0 5m6s
# 如要升级 Chaos Mesh,请执行如下命令:
helm upgrade chaos-mesh chaos-mesh/chaos-mesh
3、Chaos Mesh图形界面的访问
3.1 配置端口转发
# 获取 Chaos mesh Dashbaord 上的容器端口
[root@master ~]# kubectl get deploy chaos-dashboard -n chaos-mesh -o=jsonpath="{.spec.template.spec.containers[0].ports[0].containerPort}{'\n'}"
2333
# 然后紧接着我们把本地IP端口转发到 Pod 上的端口
[root@master ~]# kubectl port-forward -n chaos-mesh chaos-dashboard-5795fbfc4d-b4wg5 --address 172.16.20.10 8888:2333
3.2 访问图形界面
3.3 创建用户并绑定权限
可以直接通过 Chaos Mesh Dashboard 界面创建用户并绑定权限。在访问 Dashboard 时会有登录窗口弹出,点击这里生成
点击后,弹出的窗口如下所示:
需在弹出的窗口上执行如下操作
3.3.1 选择权限范围
如要获取整个 Kubernetes 混沌实验的相应权限,勾选集群范围方框。如果在命名空间下拉选项中指定了 namespace,则只获取该 namespace 下的权限
3.3.2 选择角色
目前 Chaos Mesh 提供了以下角色:
- Manager:拥有混沌实验的创建、查看、更新、删除等所有权限
- Viewer:只拥有混沌实验的查看权限
3.3.3 生成 RBAC 配置
在确定了所创建权限的范围和角色后,Dashboard 页面上会显示对应的 RBAC 配置。例如, default namespace 下 Manager 角色的 RBAC 配置如下所示:
[root@master ~]# vim rbac.yaml
[root@master ~]# cat rbac.yaml
kind: ServiceAccount
apiVersion: v1
metadata:
namespace: default
name: account-cluster-manager-kczxl
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: role-cluster-manager-kczxl
rules:
- apiGroups: [""]
resources: ["pods", "namespaces"]
verbs: ["get", "watch", "list"]
- apiGroups: ["chaos-mesh.org"]
resources: [ "*" ]
verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: bind-cluster-manager-kczxl
subjects:
- kind: ServiceAccount
name: account-cluster-manager-kczxl
namespace: default
roleRef:
kind: ClusterRole
name: role-cluster-manager-kczxl
apiGroup: rbac.authorization.k8s.io
3.3.4 创建用户并绑定权限
[root@master ~]# kubectl apply -f rbac.yaml
3.3.5 生成令牌
# 如果使用的是 Kubernetes 1.24+,则需要手动创建令牌:
[root@master ~]# kubectl create token account-cluster-manager-kczxl
eyJhbGciOiJSUzI1NiIsImtpZCI6InJmNk5pcWlWcmc2VV9sSjhFVjVRR2t5MU8wNWFwVTlYTkhadlNDazhNbjQifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzMxNTAyOTE1LCJpYXQiOjE3MzE0OTkzMTUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiOGU3NWRlMjItYThkYi00NTEyLTg1NTMtNDExMDUxOWRmNjI4Iiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFjY291bnQtZGVmYXVsdC1tYW5hZ2VyLXNxcnl5IiwidWlkIjoiNjRiMWRmZjktMGJjZS00MmQ3LWE3MjctMDA3ZWM2Njg1OTFkIn19LCJuYmYiOjE3MzE0OTkzMTUsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmFjY291bnQtZGVmYXVsdC1tYW5hZ2VyLXNxcnl5In0.NZYunTjuS4lRNfUxMGNTU_uqN81-BhHhj--Bi11GHQfmd66LjWYJAxZPvEVoUDRQvMMTiHivi36G2eQc9mxxjc9W4TuEFCD6pswx_NaOFZPCuH83fA0scd5po3LfAGyEryC8FmRVbEdmViaa52LYEVmLbrUrFv4KmMOBmFr5qQjzaXzQuX_FiM2glPETRcoBdjvsUgZxB0eDbAwhb9Yt2zXt0_Ayis3rjXc-JerRse2-egCPQ_Ls6dpjLrowsgDLcNG8WwGJh9qHs1Ay_dYPetZpU1eknCwaW7l-8BNVevbEddlRl-VwPdj7yQxNxJECIPm-79I_aV1X2qB0iFewlQ
3.3.6 使用创建的用户登录 Chaos Mesh
点击 Dashboard 令牌辅助生成器窗口上的关闭,返回到登录窗口。在令牌输入框中输入上一步复制的 token 数据,并在名称输入框中给该令牌输入一个有意义的名称,建议使用权限的范围和角色,例如 default-manager。输入完成后,点击提交进行登录:
3.3.7 可以在设置
里调整为中文
4、混沌实验入门介绍
4.1 准备工作
# 创建一个测试的空间
[root@master ~]# kubectl create ns ceshi
# 创建一个nginx-pod用作与测试
[root@master ~]# vim nginx.yaml
[root@master ~]# cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: ceshi
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
[root@master ~]# kubectl apply -f nginx.yaml
# 查看
[root@master ~]# kubectl get pod -n ceshi
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 70s
4.2 打开 Chaos Dashboard
4.3 设置工作流基本信息
4.4 配置工作流节点
4.4.1 根据需求选择选择任务类型(本次示例任务类型为“单一”)
4.4.2 填写实验信息
4.5 提交工作流
可以先在预览查看工作流定义。确认无误后,点击提交工作流按钮创建工作流
apiVersion: chaos-mesh.org/v1alpha1
kind: Workflow
metadata:
name: simple-workflow
namespace: default
spec:
entry: entry
templates:
- name: entry
templateType: Serial
deadline: 300s
children:
- kill-nginx
- name: kill-nginx
templateType: PodChaos
deadline: 120s
podChaos:
selector:
namespaces:
- ceshi
mode: all
action: pod-kill
4.6 验证故障注入结果
# 故障注入结果
[root@master ~]# kubectl get pod -n ceshi
No resources found in ceshi namespace.