微服务混沌工程场景执行清单
·
微服务混沌工程场景执行清单(K8s环境适配)
本清单聚焦微服务高频故障场景,按“网络/服务/中间件/资源/第三方依赖”分类,每个场景包含“目标→前置条件→执行步骤→回滚方案→验证指标”,确保落地可操作,默认使用开源工具(Chaos Mesh/Blade),适配K8s容器化环境。
一、通用前置条件(所有场景必满足)
- 环境准备:在类生产环境(预发环境,K8s集群、中间件配置与生产一致)执行;若生产测试,需选择业务低峰期(如凌晨2-4点)。
- 可观测性就绪:Prometheus+Grafana(监控指标)、SkyWalking(调用链)、ELK(日志)已部署,且能实时查看目标服务指标(如下单成功率、Pod状态)。
- 业务确认:核心业务(如下单、支付)当前无异常,且已告知相关团队(开发/运维)测试计划,避免误判故障。
- 工具就绪:Chaos Mesh(已部署至K8s集群,命名空间
chaos-testing)或Chaos Blade(已安装至目标节点)。
二、分场景执行清单
场景1:服务间网络延迟(高频场景)
目标
验证“订单服务调用库存服务时,网络延迟500ms”下,订单服务是否能正常降级(如超时重试),核心下单业务不受影响。
前置条件
- 目标服务:订单服务(
order-service,3个Pod)、库存服务(inventory-service,2个Pod); - 业务低峰期:当前下单QPS<50(正常峰值1000);
- 已配置订单服务超时重试(如Feign重试次数=2,超时时间=1s)。
执行步骤
- 检查环境:
# 确认订单/库存服务Pod正常运行 kubectl get pods -n prod | grep -E "order-service|inventory-service" # 确认Chaos Mesh正常 kubectl get pods -n chaos-testing | grep chaos-controller-manager - 注入网络延迟(用Chaos Mesh,仅对1个库存Pod注入延迟):
创建network-delay.yaml配置文件:
执行注入:apiVersion: chaos-mesh.org/v1alpha1 kind: NetworkChaos metadata: name: inventory-delay namespace: chaos-testing spec: action: delay # 故障类型:延迟 mode: one # 仅影响1个Pod selector: namespaces: - prod # 目标服务所在命名空间 labelSelectors: app: inventory-service # 库存服务标签 delay: latency: "500ms" # 延迟时间 duration: "10m" # 故障持续10分钟 direction: to # 仅影响“订单服务→库存服务”的请求 target: selector: namespaces: - prod labelSelectors: app: order-servicekubectl apply -f network-delay.yaml - 实时监控:
- Grafana查看:订单服务→库存服务调用延迟(是否达500ms)、下单成功率、订单P95延迟;
- SkyWalking查看:调用链中“order→inventory”的耗时是否正常重试。
回滚方案
若下单成功率<99.9%或P95延迟>1s,立即停止故障:
kubectl delete -f network-delay.yaml
验证指标
| 指标类型 | 预期结果 | 实际结果 |
|---|---|---|
| 业务指标 | 下单成功率≥99.9%,用户端错误率≤0.1% | |
| 技术指标 | 订单服务→库存服务重试率≤10%,P95延迟≤1s | |
| 基础设施指标 | 库存服务Pod无重启,K8s节点网络正常 |
场景2:服务Pod宕机(核心场景)
目标
验证“库存服务1个Pod宕机”后,K8s是否能自动重启Pod,且订单服务调用库存服务的成功率无明显下降。
前置条件
- 目标服务:库存服务(
inventory-service,3个Pod,K8s Deployment配置replicas=3); - K8s自愈开启:Deployment已配置
restartPolicy=Always,且无状态服务支持自动扩缩容。
执行步骤
- 检查初始状态:
# 记录当前库存服务Pod列表(标记要删除的Pod名) kubectl get pods -n prod -l app=inventory-service -o wide # 示例输出:inventory-service-7f98d7c6b4-2xqzk(待删除)、-5t7k8、-8m2p3 - 手动删除Pod(模拟宕机):
kubectl delete pod inventory-service-7f98d7c6b4-2xqzk -n prod - 实时监控:
- 1分钟内查看Pod是否重启:
kubectl get pods -n prod -l app=inventory-service; - Grafana查看:库存服务可用Pod数(是否从3→2→3)、订单服务调用库存服务成功率。
- 1分钟内查看Pod是否重启:
回滚方案
若Pod重启失败(>5分钟未恢复),手动触发Deployment重启:
kubectl rollout restart deployment inventory-service -n prod
验证指标
| 指标类型 | 预期结果 | 实际结果 |
|---|---|---|
| 业务指标 | 订单调用库存服务成功率≥99.5% | |
| 技术指标 | 库存服务Pod重启时间≤2分钟,服务不可用窗口≤30秒 | |
| 基础设施指标 | K8s Deployment replicas维持3个,无异常事件 |
场景3:Redis主从切换(中间件场景)
目标
验证“Redis缓存主从切换(耗时30秒)”时,商品服务是否能通过本地缓存降级,商品详情页加载成功率≥99.5%。
前置条件
- 中间件:Redis集群(1主2从,部署在
middleware命名空间,商品服务用Redis缓存商品详情); - 商品服务:已实现本地缓存(Caffeine,缓存有效期5分钟)。
执行步骤
- 检查Redis主从状态:
# 进入Redis主节点Pod kubectl exec -it redis-master-0 -n middleware -- redis-cli # 查看主从信息(记录主节点IP:如10.244.1.5) info replication - 手动触发主从切换:
# 在原主节点执行“放弃主身份” redis-cli -h 10.244.1.5 slaveof no one # 在从节点(如10.244.1.6)执行“成为主节点” redis-cli -h 10.244.1.6 slaveof no one # 确认切换结果(新主节点为10.244.1.6) info replication - 实时监控:
- Grafana查看:Redis主从切换耗时、商品服务本地缓存命中率、商品详情页P95加载延迟;
- ELK查看:商品服务是否有“Redis连接超时”日志,是否触发本地缓存降级。
回滚方案
若商品详情页成功率<99.5%,手动恢复Redis主从关系(按初始主从配置重新设置)。
验证指标
| 指标类型 | 预期结果 | 实际结果 |
|---|---|---|
| 业务指标 | 商品详情页加载成功率≥99.5%,错误率≤0.5% | |
| 技术指标 | 商品服务本地缓存命中率≥80%,P95延迟≤300ms | |
| 中间件指标 | Redis主从切换耗时≤60秒,无数据丢失 |
场景4:容器CPU高负载(资源场景)
目标
验证“订单服务1个Pod CPU使用率达90%”时,K8s是否能限制CPU资源,且订单服务核心下单逻辑不受影响。
前置条件
- 目标Pod:订单服务
order-service-7f98d7c6b4-2xqzk(K8s配置CPU请求=1核,限制=2核); - 已确认该Pod非核心实例(当前仅处理10%下单流量)。
执行步骤
- 检查初始CPU使用率:
kubectl top pod order-service-7f98d7c6b4-2xqzk -n prod # 预期初始使用率<30% - 注入CPU压力(用Chaos Mesh):
创建cpu-stress.yaml:
执行注入:apiVersion: chaos-mesh.org/v1alpha1 kind: StressChaos metadata: name: order-cpu-stress namespace: chaos-testing spec: action: stress-cpu # CPU压力 mode: one selector: namespaces: - prod labelSelectors: app: order-service podNames: - order-service-7f98d7c6b4-2xqzk # 指定目标Pod stressors: cpu: cores: 1.8 # 占用1.8核(达90%限制) load: 100 # 满载 duration: "10m"kubectl apply -f cpu-stress.yaml - 实时监控:
- Grafana查看:目标Pod CPU使用率(是否达90%)、订单服务整体下单成功率、其他Pod负载是否正常。
回滚方案
若整体下单成功率<99.8%,立即停止CPU压力:
kubectl delete -f cpu-stress.yaml
验证指标
| 指标类型 | 预期结果 | 实际结果 |
|---|---|---|
| 业务指标 | 整体下单成功率≥99.8%,无批量错误 | |
| 技术指标 | 目标Pod CPU使用率≤90%,其他Pod CPU<50% | |
| 基础设施指标 | K8s未触发Pod驱逐(eviction),资源限制生效 |
三、通用回滚原则
- 优先止损:任何场景下,若核心业务指标(如下单成功率、支付成功率)低于阈值,立即停止故障注入,不纠结“故障未执行完”;
- 快速恢复:回滚操作需1分钟内完成(如删除Chaos Mesh配置、重启Pod),避免故障扩散;
- 事后验证:回滚后需观察5分钟,确认业务指标恢复至正常水平,再结束测试。
四、复盘要点(每个场景执行后必做)
- 记录异常现象:如“Redis切换时,商品服务本地缓存未生效,导致DB QPS飙升至2000”;
- 定位根因:如“本地缓存初始化逻辑错误,Redis连接超时后未触发缓存加载”;
- 输出优化方案:如“修复商品服务本地缓存降级逻辑,添加Redis连接超时监听”;
- 验证优化效果:下次执行相同场景前,先验证优化方案是否生效。
更多推荐

所有评论(0)