二、步骤一:新建演练
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 进行故障注入演练
本节主要演示内容为,如何使用混沌演练 API 完成一次演练,混沌演练 API 遵循腾讯云通用API规范,其中公共参数以及请求方式可参考 API 调用方式。
演练流程如下:
七、步骤一:创建演练
通过经验创建演练方式如下:
八、准备经验 ID
方式一:控制台获取
登录 混沌演练平台,单击经验库管理,选择需要创建演练的经验,复制经验 ID 即可。
方式二:API 获取
参照 查询经验库列表 API 说明,获取创建演练所需要的 TemplateId。
九、接口请求
参照 从经验创建演练 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
参照 查询对象类型列表 API 说明,获取需要演练资源对象的 ObjectTypeId。
十二、准备动作 ID
参照 获取动作库列表 API 说明,获取需要演练动作的 ActionId。
十三、准备动作参数
参照 获取动作配置参数 API 说明,获取需要演练动作的参数。
注意:说明:
注意:这里提供了两个参数,用于创建动作演练:
注意:参数应以 {"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": [] }}
十四、接口请求
参照 从动作创建演练 API 说明,请求如下:
注意:对于容器类资源对象,需要 {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 }}
此时,点击控制台演练管理,则可以看到创建好的演练任务,也可以通过接口查询。
注意:说明:
注意:如果需要删除已经创建的演练,可以参考 删除演练 API 说明。
十七、接口请求
参照 查询演练 API 说明,请求如下:
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}
20、接口请求
参照 执行演练 API 说明,请求如下:
POST / HTTP/1.1Host: cfg.tencentcloudapi.comContent-Type: application/jsonX-TC-Action: ExecuteTask<公共请求参数>{ "TaskId": "3256"}
21、接口输出
{ "Response": { "RequestId": "46924e75-a149-4130-aac0-853dbf0abea9" }}
23、接口请求
参照 执行动作 API 说明,请求如下:
{ "TaskId": "3256", "TaskActionId": "11396", # 任务动作 ID(从演练查询返回中获取) "TaskInstanceIds": [ "xxxxxxxx-01", # 任务动作实例 ID(从演练查询返回中获取) "xxxxxxxx-02" ], "IsOperateAll": true, # 是否执行整个任务,这里取 true 的时候,TaskInstanceIds 会被忽略,创建演练时传入的所有实例,都会被执行 "ActionType": 2, # 2–执行 3–跳过 5–重试 "TaskGroupId": 4684, # 动作组 ID(从演练查询返回中获取)}
24、接口输出
{ "Response": { "RequestId": "6549ed1a-911f-46dd-b6cd-2c02d5bd180f" }}
注意:说明:
注意:这里的动作执行,支持跳过和重试操作,可以通过调整ActionType 的值来控制:
26、接口请求
参照 结束演练 API 说明,请求如下:
{ "TaskId": 3256, # 演练任务 ID "Status": 1004, # 结束状态码,不用修改 "Summary": "本次演练符合预期", # 演习结论 "IsExpect": true, # 执行结果是否符合预期}
27、接口输出
{ "Response": { "RequestId": "e38eca72-e4ae-4a86-9696-7df399e672bd" }}
注意:说明:
注意:如果需要查看演练任务的日志,可以参考 获取演练过程日志 API 说明。