Chaosblade Operator 是混沌工程实验工具 ChaosBlade 下的一款面向云原生领域的混沌实验注入工具,可单独部署使用。通过定义 Kubernetes CRD 来管理混沌实验,每个实验都有非常明确的执行状态。工具具有部署简单、执行便捷、标准化实现、场景丰富等特点。将 ChaosBlade 混沌实验模型与 Kubernetes CRD 很好的结合在一起,可以实现基础资源、应用服务、容器等场景在 Kubernetes 平台上场景复用,方便了 Kubernetes 下资源场景的扩展,而且可通过 chaosblade cli 统一执行调用。
目前实验场景涉及到资源包含 Node、Pod、Container,具体支持的场景如下:
- Node:
- CPU: 指定 CPU 使用率
- 网络: 指定网卡、端口、IP 等包延迟、丢包、包阻塞、包重复、包乱序、包损坏等
- 进程:指定进程 Hang、强杀指定进程等
- 磁盘:指定目录磁盘填充、磁盘 IO 读写负载等
- 内存:指定内存使用率
- Pod:
- 网络:指定网卡、端口、IP 等包延迟、丢包、包阻塞、包重复、包乱序、包损坏等
- 磁盘:指定目录磁盘填充、磁盘 IO 读写负载等
- 内存:指定内存使用率
- Pod:杀 Pod
- Container:
- CPU: 指定 CPU 使用率
- 网络: 指定网卡、端口、IP 等包延迟、丢包、包阻塞、包重复、包乱序、包损坏等
- 进程:指定进程 Hang、强杀指定进程等
- 磁盘:指定目录磁盘填充、磁盘 IO 读写负载等
- 内存:指定内存使用率
- Container: 杀 Container
支持的 Kubernetes 最小版本是 v1.12,chaosblade operator 可通过 kubectl 或者 helm 进行安装,安装方式如下:
注意:以下的 VERSION
请使用最新的版本号替代
- 在 Release 地址下载最新的
chaosblade-operator-VERSION-v2.tgz
包 - 使用
helm install --namespace kube-system --name chaosblade-operator chaosblade-operator-VERSION-v2.tgz
命令安装 - 使用
kubectl get pod -l part-of=chaosblade -n kube-system
查看 Pod 的安装状态,如果都是 running 状态,说明安装成功 - 使用以下命令进行卸载,注意执行顺序:
kubectl delete crd chaosblades.chaosblade.io
helm del --purge chaosblade-operator
- 在 Release 地址下载最新的
chaosblade-operator-VERSION-v3.tgz
包 - 使用
helm install chaosblade-operator chaosblade-operator-VERSION-v3.tgz --namespace kube-system
命令安装 - 使用
kubectl get pod -l part-of=chaosblade -n kube-system
查看 Pod 的安装状态,如果都是 running 状态,说明安装成功 - 使用以下命令卸载,注意执行顺序:
kubectl delete crd chaosblades.chaosblade.io
helm uninstall chaosblade-operator -n kube-system
- 在 Release 地址下载最新的
chaosblade-operator-yaml-VERSION.tar.gz
包 - 解压后执行
kubectl apply -f chaosblade-operator-yaml-VERSION/
安装 - 使用
kubectl get pod -l part-of=chaosblade -n kube-system
查看 Pod 的安装状态,如果都是 running 状态,说明安装成功 - 使用以下命令卸载,注意执行顺序:
kubectl delete crd chaosblades.chaosblade.io
kubectl delete -f chaosblade-operator-yaml-VERSION/
安装 chaosblade operator 后即可执行混沌实验,执行方式有以下三种:
- 通过配置 yaml 方式,使用 kubectl 执行
- 使用 chaosblade cli 工具执行
- 通过编写代码调用 Kubernetes API 执行
下面通过一个具体的案例来说明 chaosblade-operator 的使用:模拟 cn-hangzhou.192.168.0.205 节点本地端口 40690 60% 的网络丢包。
apiVersion: chaosblade.io/v1alpha1
kind: ChaosBlade
metadata:
name: loss-node-network-by-names
spec:
experiments:
- scope: node
target: network
action: loss
desc: "node network loss"
matchers:
- name: names
value: ["cn-hangzhou.192.168.0.205"]
- name: percent
value: ["60"]
- name: interface
value: ["eth0"]
- name: local-port
value: ["40690"]
执行实验:
kubectl apply -f loss-node-network-by-names.yaml
查询实验状态,返回信息如下(省略了 spec 等内容):
~ » kubectl get blade loss-node-network-by-names -o json
{
"apiVersion": "chaosblade.io/v1alpha1",
"kind": "ChaosBlade",
"metadata": {
"creationTimestamp": "2019-11-04T09:56:36Z",
"finalizers": [
"finalizer.chaosblade.io"
],
"generation": 1,
"name": "loss-node-network-by-names",
"resourceVersion": "9262302",
"selfLink": "/apis/chaosblade.io/v1alpha1/chaosblades/loss-node-network-by-names",
"uid": "63a926dd-fee9-11e9-b3be-00163e136d88"
},
"status": {
"expStatuses": [
{
"action": "loss",
"resStatuses": [
{
"id": "057acaa47ae69363",
"kind": "node",
"name": "cn-hangzhou.192.168.0.205",
"nodeName": "cn-hangzhou.192.168.0.205",
"state": "Success",
"success": true,
"uid": "e179b30d-df77-11e9-b3be-00163e136d88"
}
],
"scope": "node",
"state": "Success",
"success": true,
"target": "network"
}
],
"phase": "Running"
}
}
通过以上内容可以很清晰的看出混沌实验的运行状态,执行以下命令停止实验:
kubectl delete -f loss-node-network-by-names.yaml
或者直接删除此 blade 资源
kubectl delete blade loss-node-network-by-names
还可以编辑 yaml 文件,更新实验内容执行,chaosblade operator 会完成实验的更新操作。更多案例请查看 Examples
blade create k8s node-network loss --percent 60 --interface eth0 --local-port 40690 --names cn-hangzhou.192.168.0.205 --kubeconfig config
如果执行失败,会返回详细的错误信息;如果执行成功,会返回实验的 UID:
{"code":200,"success":true,"result":"e647064f5f20953c"}
可通过以下命令查询实验状态:
blade query k8s create e647064f5f20953c --kubeconfig config
{
"code": 200,
"success": true,
"result": {
"uid": "e647064f5f20953c",
"success": true,
"error": "",
"statuses": [
{
"id": "fa471a6285ec45f5",
"uid": "e179b30d-df77-11e9-b3be-00163e136d88",
"name": "cn-hangzhou.192.168.0.205",
"state": "Success",
"kind": "node",
"success": true,
"nodeName": "cn-hangzhou.192.168.0.205"
}
]
}
}
销毁实验:
blade destroy e647064f5f20953c
除了上述两种方式调用外,还可以使用 kubernetes client-go 方式执行,具体可参考:executor.go 代码实现。
如果在安装使用过程中遇到问题,或者建议和新功能,所有项目(包含其他项目)的问题都可以提交到Github Issues
你也可以通过以下方式联系我们:
- 钉钉群(推荐):23177705
- Gitter room: chaosblade community
- 邮箱:chaosblade.io.01@gmail.com
- Twitter: chaosblade.io
我们非常欢迎每个 Issue 和 PR,即使一个标点符号,如何参加贡献请阅读 CONTRIBUTING 文档,或者通过上述的方式联系我们。
Chaosblade-operator 遵循 Apache 2.0 许可证,详细内容请阅读 LICENSE