一、在云架构上进行可视化故障注入演练
混沌演练是云顾问-云架构中的多款垂直治理应用之一,支持用户基于业务云架构发起可视化的模拟故障注入。以下将以 “MySQL 主节点故障”演练场景为例,介绍如何快速通过云架构-混沌演练创建一个演练任务。
步骤一:新建演练
1. 登录 云顾问 > 云上治理,首先通过目录进入业务架构图。在页面上方选择治理模式,在页面下方点击混沌演练。如何构建云架构,请参考 架构图绘制。

2. 创建演练任务,目前共提供三种演练任务创建方式。
快速创建演练
点击架构大屏上方操作栏中的新建演练,或演练任务页中的新建演练,均可快速创建演练。

通过动作故障库发起演练。
在故障动作库页,选择动作库中的故障动作,点击创建演练。

通过演练经验库发起演练。
在演练经验库页,点击行业经验卡片,在行业经验卡片中点击去使用。



3. 进入新建演练页,进入第一步“基本信息”,选择演练资源所在的地域并填写演练信息和人员组织信息,单击下一步。


4. 进入创建演练第二步。演练编排:首先选择要注入故障的资源对象,然后点击添加动作,最后选择故障注入的模式。
说明:
一个动作组内仅可针对同一种对象类型进行故障注入操作,支持添加多个动作和拖拽编排演练动作。
支持复制、增加多个动作组。


4.1 选择 MySQL 主节点故障动作,单击下一步。


4.2 设置动作参数,支持在通用参数中设置动作前后等待时间,控制演练节奏。


4.3 点击添加实例,选择要注入故障的实例资源,这里选择 MySQL 实例。
支持按实例类型、实例名称等进行搜索;
支持批量添加实例。


5. 全局配置:支持配置和演练动作相对应的监控指标,便于观测演练效果;支持配置护栏策略,触发后演练暂停,保障业务安全。配置完成后点击提交。


6. 完成演练创建后,点击演练详情,可校对演练信息,并实施下一步演练执行工作,如需调整,请点击编辑(演练开始后将无法编辑)。若关闭演练详情页,也可通过点击架构大屏上方操作栏中的总计演练任务,在演练任务页中检索已创建的演练,点击演练名称再次进入演练详情页。




步骤二:执行演练
1. 点击演练场景中动作名称右侧的执行开始演练,亦可点击云架构图上方的快捷操作栏中的开始演练。
说明:
创建演练过程中,执行方式若选自动执行,则此处点击执行后系统将会自动开始执行动作,无需人工介入;执行方式若选手动推进,则点击执行后仍需要在动作组中单击开始。
若某个动作执行失败,则系统自动切换为手动推进方式,需要人工介入手动单击动作组中的执行或者跳过。


2. 演练执行过程中,正在故障注入中的云架构节点将闪烁提示当前的故障注入状态(未开始/注入中/注入成功/注入失败),演练过程中可点击架构图上方暂停演练、结束演练操作。


3. 在演练执行过程中,可在演练场景中点击查看演练日志,及点击演练动作区域,查看动作执行情况。同时在监控指标处可查看演练进行中的过程监控数据,判断系统在故障注入之后的稳态表现。






步骤三:结束演练
1. 故障动作执行成功,点击结束演练。


2. 填写演练结论,记录演练过程中出现的问题、应急预案措施等,便于后续复盘分析。


步骤四:生成演练报告
1. 演练结束后,可以生成本次演练报告。可在演练详情、演练任务及演练报告页面中,点击生成报告,均支持一键生成预览版本的在线报告,内容包括:业务架构、演练结论、演练概况、演练执行信息等。
说明:
1. 在线报告不支持编辑和下载,报告归档至数据资产后支持下载、分享等操作。
2. 演练结论可在演练详情页的演练快捷操作栏进行编辑,内容更新后需重新生成报告,演练报告其他内容暂不支持编辑。






2. 点击报告归档,将报告归档至 数据资产 > 归档报告。


3. 点击前往数字资产,在归档报告页面中可查看演练报告。


4. 报告归档后,支持对报告进行查看、下载、共享、删除操作。

二、(可选)使用混沌演练 API 进行故障注入演练
演练流程如下:


步骤一:创建演练
通过经验创建演练方式如下:
准备经验 ID
方式一:控制台获取
方式二:API 获取
接口请求
POST / HTTP/1.1Host:cfg.tencentcloudapi.comContent-Type:application/jsonX-TC-Action:CreateTaskFromTemplate<公共请求参数>{"TemplateId":626,# 上步查询到的经验 ID"TaskConfig":{"TaskTitle":"这是一个从 API 创建演练的示例",# 演练名称,不填默认取经验名称"TaskGroupsConfig":[{"TaskGroupInstances":["ins-xxxxxxxx"# 动作组关联的实例对象 ID,例如 CVM,CLB 等资源 ID]}]}}
接口输出
{"Response":{"RequestId":"f0aee8ac-2ed3-4a7f-a25b-f0d7d228dd30","TaskId":3256# 演练 ID}}
通过动作创建演练方式如下:
准备资源对象 ID
准备动作 ID
准备动作参数
说明:
这里提供了两个参数,用于创建动作演练:
TaskActionGeneralConfiguration:通用参数,可选择性传入, 为空时则使用动作默认参数。
TaskActionCustomConfiguration:自定义参数。对于可选参数,已设置默认值。对于必选参数,如果默认值为空,则必须显式传递。
参数应以
{"key1": "value1", "key2": "value2"} 的形式表示,并需要序列化后传入,例如:"{\\"domain\\": \\"www.test.com\\"}"。动作参数具体作用,可以参考控制台,比较直观。
此接口返回如下:
{"Response": {"RequestId": "3e7fa74e-9045-4f01-88d4-ee158affe905","Common": [ # 通用参数,对应后面动作创建演练中 TaskActionGeneralConfiguration{"ActionId": 466,"ActionName": "DNS篡改","ConfigDetail": [{"Type": "input","Lable": "动作别名","Field": "AliasTitle", # 动作参数 key"DefaultValue": "", # 动作参数默认值"Config": "{}","Required": 0, # 是否必填 (0 -- 否 1-- 是)"Validate": "{}","Visible": "{}"},{"Type": "number","Lable": "前置等待时间(s)","Field": "PreTimeWait","DefaultValue": "0","Config": "{\\"max\\": 86400, \\"min\\": 0, \\"tooltip\\": \\"仅限用于自动推进模式\\"}","Required": 0,"Validate": "{}","Visible": "{}"},{"Type": "number","Lable": "后置等待时间(s)","Field": "AfterTimeWait","DefaultValue": "0","Config": "{\\"max\\": 86400, \\"min\\": 0, \\"tooltip\\": \\"仅限用于自动推进模式\\"}","Required": 0,"Validate": "{}","Visible": "{}"},{"Type": "number","Lable": "动作超时时间(s)","Field": "ActionTimeout","DefaultValue": "1800","Config": "{\\"max\\": 86400, \\"min\\": 0, \\"tooltip\\": \\"动作的超时时间\\"}","Required": 0,"Validate": "{}","Visible": "{\\"op\\": \\"<\\", \\"type\\": \\"need_insert\\", \\"value\\": 0, \\"relatedField\\": \\"ActionTimeout\\"}"}]}],"Results": [ # 自定义参数,对应后面动作创建演练中 TaskActionCustomConfiguration{"ActionId": 466,"ActionName": "DNS篡改","ConfigDetail": [{"Type": "number","Lable": "持续时间(s)","Field": "duration","DefaultValue": "180","Config": "{\\"max\\": 1800, \\"min\\": 0}","Required": 1,"Validate": "{}","Visible": "{}"},{"Type": "input","Lable": "域名","Field": "domain", # 动作参数 key"DefaultValue": "", # 动作参数默认值"Config": "{}","Required": 1, # 是否必填 (0 -- 否 1-- 是)"Validate": "{}","Visible": "{}"},{"Type": "input","Lable": "IP","Field": "ip","DefaultValue": "","Config": "{}","Required": 1,"Validate": "{}","Visible": "{}"}]}],"ResourceOffline": []}}
接口请求
注意:
对于容器类资源对象,需要 {ClusterId} + {NodeName} + {NameSpace} + {PodName} 四元组才能确定一个唯一的实例。在参数 TaskInstances 传入时,需要将这个 map 序列化。
例如:"{"ClusterId":"cls-xxxx","PodName":"pod-xxxxxx","NodeName":"xxxxxxxx","NameSpace":"default-xxxxxx"}"
POST / HTTP/1.1Host:cfg.tencentcloudapi.comContent-Type:application/jsonX-TC-Action:CreateTaskFromTemplate<公共请求参数>{"TaskActionId": 462, # 动作 ID"TaskInstances": ["ins-xxxxxxxx"], # 资源对象实例 ID"TaskTitle": "网络丢包", # 演练名称"TaskDescription": "这是从openapi创建的演练", # 演练描述"TaskActionCustomConfiguration": "{\\"interfaces\\": \\"eth0\\"}" # 动作自定义参数,需要序列化}
接口输出
{"Response": {"RequestId": "f0aee8ac-2ed3-4a7f-a25b-f0d7d228dd30","TaskId": 150}}
此时,点击控制台演练管理,则可以看到创建好的演练任务,也可以通过接口查询。
说明:
步骤二:查询演练
接口请求
POST / HTTP/1.1Host:cfg.tencentcloudapi.comContent-Type:application/jsonX-TC-Action:DescribeTask<公共请求参数>{”RequestId“:"02185fc4-0e8f-49ed-a8d5-6d0788d0e60c","TaskId":"3256"# 上述创建演练时返回的演练 ID}
接口输出
{"RequestId":"02185fc4-0e8f-49ed-a8d5-6d0788d0e60c","Task":{"TaskId":3256,"TaskTitle":"这是一个从API创建演练的示例","TaskDescription":"测试一个空动作","TaskTag":"","TaskStatus":1002,"TaskStatusType":0,"TaskProtectStrategy":null,"TaskCreateTime":"2023-08-14 11:55:02","TaskUpdateTime":"2023-08-14 14:48:00","TaskStartTime":"2023-08-14 14:48:01","TaskEndTime":null,"TaskExpect":null,"TaskSummary":null,"TaskMode":1,"TaskRegionId":1,"TaskPauseDuration":60,"TaskOwnerUin":"100032429988","TaskPlanId":null,"TaskPlanTitle":null,"TaskGroups":[{"TaskGroupActions":[{"TaskGroupInstances":[{"TaskGroupInstanceId":24375,# 任务动作实例 ID"TaskGroupInstanceObjectId":"ins-bfydnvta",# 资源对象 ID"TaskGroupInstanceStatus":3001,"TaskGroupInstanceStatusType":0,"TaskGroupInstanceExecuteLog":null,"TaskGroupInstanceStartTime":null,"TaskGroupInstanceEndTime":null,"TaskGroupInstanceCreateTime":"2023-08-14 14:48:00","TaskGroupInstanceUpdateTime":"2023-08-14 14:48:00","TaskGroupInstanceIsRedo":false,"TaskGroupInstanceExecuteTime":null},{"TaskGroupInstanceId":24376,# 任务动作实例 ID"TaskGroupInstanceObjectId":"ins-ehxmry76",# 资源对象 ID"TaskGroupInstanceStatus":3001,"TaskGroupInstanceStatusType":0,"TaskGroupInstanceExecuteLog":null,"TaskGroupInstanceStartTime":null,"TaskGroupInstanceEndTime":null,"TaskGroupInstanceCreateTime":"2023-08-14 14:48:00","TaskGroupInstanceUpdateTime":"2023-08-14 14:48:00","TaskGroupInstanceIsRedo":false,"TaskGroupInstanceExecuteTime":null}],"TaskGroupActionId":11395,# 任务动作 ID"ActionId":12,"ActionTitle":"空操作","ActionApiType":1,"ActionType":"平台","ActionRisk":"低风险","ActionAttribute":1,"TaskGroupActionOrder":1,"TaskGroupActionGeneralConfiguration":"{\\"AliasTitle\\": \\"\\", \\"PreTimeWait\\": 0, \\"ActionTimeout\\": 1800, \\"AfterTimeWait\\": 0}","TaskGroupActionCustomConfiguration":"{}","TaskGroupActionStatus":2002,"TaskGroupActionStatusType":0,"TaskGroupActionRandomId":156878,"TaskGroupActionRecoverId":193278,"TaskGroupActionExecuteId":null,"TaskGroupActionCreateTime":"2023-08-14 11:55:02","TaskGroupActionUpdateTime":"2023-08-14 14:48:00","IsExecuteRedo":false,"TaskGroupActionExecuteTime":null},{"TaskGroupInstances":[{"TaskGroupInstanceId":24377,# 任务动作实例 ID"TaskGroupInstanceObjectId":"ins-bfydnvta",# 资源对象 ID"TaskGroupInstanceStatus":3001,"TaskGroupInstanceStatusType":0,"TaskGroupInstanceExecuteLog":null,"TaskGroupInstanceStartTime":null,"TaskGroupInstanceEndTime":null,"TaskGroupInstanceCreateTime":"2023-08-14 14:48:00","TaskGroupInstanceUpdateTime":"2023-08-14 14:48:00","TaskGroupInstanceIsRedo":false,"TaskGroupInstanceExecuteTime":null},{"TaskGroupInstanceId":24378,# 任务动作实例 ID"TaskGroupInstanceObjectId":"ins-ehxmry76",# 资源对象 ID"TaskGroupInstanceStatus":3001,"TaskGroupInstanceStatusType":0,"TaskGroupInstanceExecuteLog":null,"TaskGroupInstanceStartTime":null,"TaskGroupInstanceEndTime":null,"TaskGroupInstanceCreateTime":"2023-08-14 14:48:00","TaskGroupInstanceUpdateTime":"2023-08-14 14:48:00","TaskGroupInstanceIsRedo":false,"TaskGroupInstanceExecuteTime":null}],"TaskGroupActionId":11396,# 任务动作ID"ActionId":13,"ActionTitle":"空操作(回滚)","ActionApiType":1,"ActionType":"平台","ActionRisk":"低风险","ActionAttribute":2,"TaskGroupActionOrder":2,"TaskGroupActionGeneralConfiguration":"{\\"PreTimeWait\\": 0, \\"ActionTimeout\\": 1800, \\"AfterTimeWait\\": 0}","TaskGroupActionCustomConfiguration":"{}","TaskGroupActionStatus":2001,"TaskGroupActionStatusType":0,"TaskGroupActionRandomId":193278,"TaskGroupActionRecoverId":null,"TaskGroupActionExecuteId":156878,"TaskGroupActionCreateTime":"2023-08-14 11:55:02","TaskGroupActionUpdateTime":"2023-08-14 11:55:02","IsExecuteRedo":false,"TaskGroupActionExecuteTime":null}],"TaskGroupId":4684,# 动作组 ID"TaskGroupTitle":"abc","TaskGroupDescription":"abc","TaskGroupOrder":1,"TaskGroupMode":1,"TaskGroupInstanceList":["ins-bfydnvta","ins-ehxmry76"],"ObjectTypeId":1,"TaskGroupCreateTime":"2023-08-14 11:55:02","TaskGroupUpdateTime":"2023-08-14 11:55:02","TaskGroupInstancesExecuteRule":[{"TaskGroupInstancesExecuteMode":1}],"TaskGroupSelectedInstanceList":["ins-bfydnvta","ins-ehxmry76"],"TaskGroupDiscardInstanceList":[]}],"TaskMonitors":[],"TaskPolicy":null,"Tags":[]},"ReportInfo":null}
步骤三:执行演练
接口请求
POST / HTTP/1.1Host:cfg.tencentcloudapi.comContent-Type:application/jsonX-TC-Action:ExecuteTask<公共请求参数>{"TaskId":"3256"}
接口输出
{"Response":{"RequestId":"46924e75-a149-4130-aac0-853dbf0abea9"}}
步骤四:执行动作
接口请求
{"TaskId":"3256","TaskActionId":"11396",# 任务动作 ID(从演练查询返回中获取)"TaskInstanceIds":["xxxxxxxx-01",# 任务动作实例 ID(从演练查询返回中获取)"xxxxxxxx-02"],"IsOperateAll":true,# 是否执行整个任务,这里取 true 的时候,TaskInstanceIds 会被忽略,创建演练时传入的所有实例,都会被执行"ActionType":2,#2--执行 3--跳过 5--重试"TaskGroupId":4684,# 动作组 ID(从演练查询返回中获取)}
接口输出
{"Response":{"RequestId":"6549ed1a-911f-46dd-b6cd-2c02d5bd180f"}}
说明:
这里的动作执行,支持跳过和重试操作,可以通过调整
ActionType 的值来控制:3:跳过。
5:重试。
步骤五:结束演练
接口请求
{"TaskId":3256,# 演练任务 ID"Status":1004,# 结束状态码,不用修改"Summary":"本次演练符合预期",#演习结论"IsExpect":true,#执行结果是否符合预期}
接口输出
{"Response":{"RequestId":"e38eca72-e4ae-4a86-9696-7df399e672bd"}}
说明: