ONES混沌测试
提示
本文基于混沌工程实践,针对 ONES v6.18.x(K3S HA + Longhorn)的集群环境,通过注入服务中断、网络延迟、资源耗尽等典型故障场景,系统性验证系统容错能力。测试结果已转化为可操作的运维知识库,为日常故障预处置提供现象级参考依据。
故障场景
1. 实例异常退出模拟(宕机Crash、内存不足OOM 、重启、长时间Crash掉线)
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| access(网关) | ≤5s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| project-web | ≤10s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| wiki-web | ≤10s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| devops-api | ≤10s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| oauth-api | ≤5s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| project-api | ≤5s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| wiki-api | ≤5s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| wiz-editor-server | ≤5s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| wiz-convert | ≤10s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| ones-platform-api | ≤5s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| performance-api | ≤5s | ≤1% 几乎无感知 | 是 | 双副本故障转移 |
| plugin-Runtime (某插件运行时) | ≤10s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| kilob-sync | ≤5s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| wiz-editor-gateway | ≤10s | ≤1% 几乎无感知 | 是 | 多副本故障转移 |
| kafka-cdc-connect | ≤10s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| ones-dkron | ≤10s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| camunda-bpm | ≤1m | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建,camunda-bpm在50s内才恢复正常 |
| attachment-index | ≤5s | 涉及功能不可用 | 是 | 单点编排,无故障转移,编排调度重建 |
| K3s-Server | - | 业务不可用100% | 是 | 严重单点故障,当NotReady标记后,驱逐涉及LongHorn instance-manager会连级触发严重不可用, 目前现有架构longhorn仅双节点无法保持业务恢复运行,恢复该节点,业务恢复 |
2.网络异常(掉线、掉包隔离)
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| MySQL | ≤15s | ≤1% 几乎无感知 | 是 | 单主多从节点出现网络异常,当前系统绝大部分能够自愈,无需修改,考虑极端场景当主节点异常,出现脑裂,则手动完成选主 |
| Redis | ≤5s | ≤1% 几乎无感知 | 是 | 单向断开主到从节点网络,模拟主从通信故障。从节点 Redis 实例能感知连接断开,并触发多次重连与完整同步过程(Full Resync) |
| Kafka | ≤5s | ≤1% 几乎无感知 | 是 | Kafka HA 集群具备在 Broker 网络断链场景下的自恢复能力。系统可检测异常节点,自动进行 Leader 重选,并在节点恢复后自动完成副本同步,保障业务连续性和数据一致性 |
| TiKV | ≤30s | ≤1% 几乎无感知 | 是 | tikv-2 节点与其他节点失联,Raft 重选主,Leader 分布重新平衡;业务短暂秒级TPS波动影响,影响面较小 |
| Clickhouse | ≤5m | ≤20% 存在业务功能感知 | 是 | 业务发生异常感知明显,并未长时间前端阻塞等待现象,出现部分功能业务影响现象(审计日志、报表、迭代概览等),各业务组件连接池clickhouse endpoint service异常,发生读写查询中断,审计(安全)操作日志未及时在clickhouse恢复后 5m内完成数据同步更新 |
| devops-api | ≤5s | 涉及功能不可用 | 是 | API Pod因单副本,注入网络中断无法提供外部服务,涉及该功能接口TPS下降以及不可用,极端场景建议扩展Ha多副本 |
| oauth-api | ≤10s | 涉及功能不可用 | 是 | 整体故障注入测试影响达到预期。系统在网络波动情况下能够自动恢复,测试期间部分接口在故障期间出现异常,用户体验有明显感知,k8s异常未感知,异常未发生Crash(实例流量未摘除)建议优化业务逻辑以在Endpoint连接失败时直接Crash程序,可以进一步提高系统的容错能力 |
| project-api | ≤10s | ≤10% 存在一定感知 | 是 | 当注入网络中断故障时,Project-API Pod无 法连接到MySQL Kafka TIDB等中间件 重试机制,过长时间才crash,前端部分请求响应500错误,流量未被及时摘除 |
| wiki-api | ≤5s | ≤1% 几乎无感知 | 是 | 当注入网络中断故障时,Wiki-API Pod无法连接到MySQL Kafka TIDB等中间件,进程会产生Crash,K8S健康探针会有效摘除这部分实例流量,完成有效故障转移,不会导致进一步大面积异常 |
| wiz-editor-server | ≤5s | ≤1% 几乎无感知 | 是 | 由于网络故障,中间件等Endpoint 连接均异常,wiz-editor-server进程有Crash存在,当服务重启时K8s健康探针结果为异常,能够及时感知Pod非健康状态,摘除Service服务Endpoint,后面请求均可以有效完成故障转移,不会造成更大面积影响,注入高丢包率故障时(30%-50%)接口调用时未明显发现请求异常现象, 上游Gateway探针工作正常,摘除丢包率较高实例Pod |
| ones-platform-api | ≤10s | 涉及功能不可用 | 是 | 单实例,在故障注入后,流量不会被摘除; 建议优化业务逻辑以在Endpoint连接失败时直接Crash程序,可以进一步提高系统的容错能力 |
| performance-api | ≤10s | ≤30% 存在一定感知 | 是 | 当注入网络中断故障时,performance-api Pod无法连接到Redis等中间件,进程不会产生Crash中断,K8S健康探针无法感知该异常,无法摘除这部分实例流量进行故障转移,会产生二分之一面积请求异常; 建议优化业务逻辑以在Endpoint连接失败时直接Crash程序,可以进一步提高系统的容错能力 |
| plugin-runtime-manager | ≤1m | 涉及功能不可用 | 是 | 当注入网络中断故障时,pluginRuntimeManager Pod无法连接到Platform-APi上游,进程会直接产生Crash中断,K8S健康探针能够感知该异常,已摘除这部分实例流量,由于单副本实例,无法进行故障转移,涉及该链路请求均异常,插件-安装-停用启用等生命周期管理能力均受到影响, 有概率触发无法自动恢复 |
3.磁盘满(读/写 异常等)
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| MySQL | - | 业务不可用100% | 否 | 本次磁盘填满注入后,主节点崩溃,未能故障转移成主从切换,业务受损。当前集群缺乏对节点存储层异常感知的容错能力 |
| Redis | ≤0s | ≤0% | 是 | 在此次 Redis 主节点磁盘满测试中,模拟 100% 磁盘占用。由于当前 Redis 实例未使用持久化存储卷RDB/AOF(PVC),注入行为未对服务造成实际影响,系统保持正常写入、同步与高可用状态 |
| Kafka | ≤10s | ≤0% | 是 | Kafka HA 集群在单个 Broker 节点磁盘耗尽的情况下,仍可保障其他节点维持分区副本、完成写入与消费任务。Kafka 自动容错能力有效规避了单节点故障对整体服务可用性的影响 |
| TiKV | ≤10s | ≤0% | 是 | TiKV-HA 集群在单节点资源争用导致 Leader 不可用的情况下,PD 能及时完成 Leader 自动调度,保持系统高可用与副本一致性 |
| project-api | ≤5s | ≤20% | 是 | 业务TPS响应状态在故障期间未产生全局大面积异常,由于仅业务附件读写异常,未直接产生进程Crash,也就不会重新调度故障转移,部分上传时异常是有概 率调度到异常节点 |
| wiki-api | ≤5s | ≤1% 几乎无感知 | 是 | 容器组在磁盘读写注入故障的情况下wiki功能,并未受到相关异常影响;,附件等链路非该组件直接完成读写操作 |
| wiz-editor | ≤5s | ≤30% | 是 | 注入磁盘满或读写故障,导致部分请求失败。当流量路由到受影响的Pod时,业务功能(如创建页面、附件读写)无法正常执行,返回错误状态码(如500)。 Kubernetes健康探针无法检测到业务磁盘附件满了或读写异常,因此受影响的Pod不会被自动驱逐或重新调度,导致流量仍然被路由到该Pod,进而影响业务功能 |
| ones-platform-api | ≤5s | 涉及功能不可用 | 是 | 当注入磁盘故障时,Open-Platform-API Pod的磁盘卷 /data/ones/files 和 /data/plugin 读写操作失败,返回错误码 5 (Input/output error),侧重点为插件工作数据目录。 由于磁盘满或读写异常,现状为单副本实例,导致用户明显感知针对插件上传 安装等操作请求失败,返回错误状态码,为预期表现,未主动因为该错误Crash; Kubernetes健康探针无法检测到业务磁盘附件满了或读写异常,因此受影响的Pod不会被自动驱逐或重新调度,导致流量仍然被路由到该Pod |
| performance-api | ≤0s | ≤0% | 是 | 当注入磁盘故障时,performance-api Pod的磁盘卷 /data/ones/files 读写操作失败,返回错误码 5 (Input/output error),侧重点为报表数据展示读写功能是否正常。 业务增删改查,未现异常表现,未返回错误状态码,未依赖存储路径 |
| plugin-runtime(某插件) | ≤0s | ≤0% | 是 | 业务TPS响应状态在故障期间未产生明显异常,插件运行时、插件启动、插件停止、插件功能未出现异常影响,疑似该插件能力无依赖本地文件存储 |
| minio(备份组件) | - | 涉及功能不可用 | 是 | MinIO对象存储Pod因磁盘满会导致部分备份任务失败,无法被主动感知,备份客户端返回错误 |
| k3s worker节点 | - | (长时掉线)业务不可用100% | 是 | 节点能够正确触发 NodeHasDiskPressure 状态,并尝试回收临时存储空间,符合 Kubernetes 的资源压力处理机制。触发清理或GC策略,会带来严重风险,如污点拒绝Pods 调度、清理镜像 GC机制、驱逐 Pod、节点性能下降,甚至驱逐关键组件业务会导致整体业务不可用,引发为集群事故 |
4.异常离线 失联
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| Redis | ≤0s | ≤0% | 是 | 同时杀死三实例节点,数据非持久化会产生数据丢失,Redis在我们业务场景特点,可以接受数据丢失 |
| Kafka(Zookeeper失联) | ≤0s | ≤0% | 是 | Kafka HA 集群在 ZooKeeper 部分节点失联或隔离场景下,依然可以维持 ISR 收缩机制与 Leader 正常迁移机制。集群整体保持高可用,系统业务稳定,验证 Kafka 对 ZooKeeper 异常具备基础的容错能力 |
| TiKV(一实例数据清空) | ≤1% 几乎无感知 | 是 | 是 | tikv-1节点数据清空,Leader 分布重新平衡,标记该节点不可用;业务TPS无影响,且重启不再恢复数据场景下无法自愈, 恢复数据文件后能够完成集群自愈 |
| LongHorn | - | (长 时掉线)业务不可用100% | 是 | LongHorn集群在模拟 instance-manager Pod 崩溃离线后,未能有效触发故障转移机制,导致业务层出现严重单点问题 |
| HA服务器节点重启 | - | (长时掉线)业务不可用100% | 有概率需要干预 | 控制平面节点状态感知延迟、reboot重启过程中出现 umount 阻塞及存储挂载失败导致业务连续性严重受损,未满足三节点高可用的设计目标。强制断电的潜在风险极大,需谨慎处理。后续应重点优化故障检测、存储挂载稳定性和业务容错能力,确保系统在节点异常时能保障业务持续稳定运行 |
5.负载资源跑高
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| MySQL | ≤0s | ≤1% 几乎无感知 | 是 | 在MySQL主实例 注入15G内存压力及负载压力,并未出现明显性能下降及业务不可用中断情况,极端压力场景下会导致Crash OOM,尤为主实例会有切主表现,参考宕机用例 |
| Redis | ≤0s | ≤1% 几乎无感知 | 是 | 本次 Redis 高负载测试模拟主节点资源过高情况,通过 CPU + 内存压力注入j 较平时资源用量50%,并未观察到系统响应耗时明显增加、未触发 Sentinel 切换 |
| Kafka | ≤0s | ≤1% 几乎无感知 | 是 | Kafka HA 集群具备在 Broker 内存耗尽场景下的自恢复能力。系统能检测 Broker 中断,触发分区重选 Leader,并在节点恢复后自动恢复副本同步,确保业务连续性和数据一致性 |
| Coredns | ≤0s | (长时掉线)业务不可用100% | 是 | 目标CoreDNS Pod被注入高负载压力故障,导致服务响应延迟增加,负载压力较高情况下可能触发OOM。 由于当前HA CoreDNS为单副本部署,不存在故障转移机制,业务请求完全依赖于该单个CoreDNS实例,故出现服务发现异常,严重不可用现象,副本数扩容至三副本; 如果有其他CoreDNS实例正常,业务请求将被重定向到健康的实例 |
6.其他类(IO跑高、DNS毒化)
| 涉及组件 | MTTR | 业务整体影响比例 | 是否自愈 | 备注 |
|---|---|---|---|---|
| Coredns(响应毒化) | ≤5s | 涉及域名不可用 | 是 | 由于CoreDNS为单副本部署,不存在故障转移机制,业务请求完全依赖于该单个CoreDNS实例,进行DNS毒化,故出现服务发现异常,严重不可用现象,属于预期表现 |
| k3s worker节点(IO延迟) | ≤5s | ≤1% 几乎无感知 | 是 | kubelet API响应延迟增加,影响节点状态检测和Pod调度效率,如果IO指标及负载进一步加剧,将会标记Notready ,并进行负载资源驱逐会引发业务不可用问题 |
处理建议
1. K3s Server / Worker 节点故障
- 优先级: P0
- 描述:
- K3s Server或Worker节点在重启或长时间磁盘压力后触发NotReady状态,导致业务不可用,进行负载实例驱逐。
- 长时间磁盘压力等会导致节点标记为NotReady,进而触发LongHorn instance-manager级联故障,导致业务完全不可用 kubelet异常处理。
- 原因:
- 磁盘空间不足触发Kubernetes资源压力机制
- 节点重启后存储挂载失败、服务器reboot重启失败,因硬挂载未释放
- kubelet服务异常
- 空间不足镜像驱逐 K3S镜像被驱逐处置
- 能否自愈:
- 视异常原因,一般情况能够,极端场景如"磁盘空间不足"、"服务器重启失败" 等需要人工介入。
- 影响:
- 节点长时下线引起
Longhorn级联故障,导致业务不可用。
- 节点长时下线引起
- 解决方法:
- 立刻处理
- 如磁盘不足,登录到受影响的节点,清理不必要的文件和日志。
ssh ≤node_ip>
sudo rm -rf /var/log/xx
/var/lib/rancher/k3s/占用情况,如系统盘磁盘分配不合理,请完成迁移或采用软连接形式修复 磁盘IO隔离 。- 重启受影响的节点,确保其恢复正常状态。
```bash
sudo systemctl restart k3s
sudo reboot- 增加节点磁盘使用率和资源压力的监控告警,及时发现并处理类似问题。
- 调整节点的资源配置,确保有足够的磁盘空间和资源。
- 如磁盘不足,登录到受影响的节点,清理不必要的文件和日志。
- 立刻处理
2. LongHorn 存储引擎故障
- 优先级: P0
- 描述:
- LongHorn存储引擎在
instance-manager节点实例Pod崩溃后,未能有效触发故障转移机制,导致业务层出现严重单点问题。 - 业务不可用,需要手动恢复节点才能恢复业务。
- LongHorn存储引擎在
- 原因:
- LongHorn集群在模拟
instance-managerPod崩溃后,未能触发故障转移机制。
- LongHorn集群在模拟
- 能否自愈:
- 服务器自愈/重启成功/,极端场景需要人工介入。
- 影响:
- 业务完全不可用,相关引用RWX卷将被驱逐阻塞。
- 解决方法:
- 立刻处理
- 手动删除异常的
longhorn-system命名空间下异常Pod实例,让Kubernetes自动重新调度,恢复instance-managershare-managerPod实例,恢复后再检查对应关联业务Pod PVC挂载状态。kubectl -n longhorn-system get po
kubectl -n longhorn-system delete pod ≤pod_name> - 确认数据是否完整,如有必要,从备 份中恢复数据。
- 评估替换LongHorn 共享存储解决方案,考虑将关键业务数据迁移到S3对象存储,升级最新版本降低RWX共享存储依赖,或选择接入外置NFS Server(参考专项文档)。
- 增加存储相关的监控告警,及时发现并处理类似问题。
- 手动删除异常的
- 立刻处理
3. ClickHouse 主节点故障
- 优先级: P2
- 描述:
- ClickHouse主节点异常后,无故障转移能力,导致部分接口受影响,业务部分功能不可用。
- 主节点实例发生异常后,业务部分接口受阻,如卡片概览、报表、审计日志等。
- 原因:
- 当前HA架构决定,主实例异常后,无故障转移能力。
- 能否自愈:
- 是,恢复主实例即可。
- 影响:
- 业务部分功能不可用,服务中断。
- 解决方法:
- 立刻处理
- 手动恢复主节点,确保其恢复正常状态。
- 业务侧实现真正的双写机制,确保主从节点数据一致性。
- 增加ClickHouse相关的监控告警,及时发现并处理类似问题。
- 立刻处理