Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] windows support !!! #1059

Open
MandssS opened this issue Jul 26, 2024 · 0 comments
Open

[feature] windows support !!! #1059

MandssS opened this issue Jul 26, 2024 · 0 comments
Labels
type/feature Category issues or prs related to feature request.

Comments

@MandssS
Copy link
Contributor

MandssS commented Jul 26, 2024

Issue Description

Support chaos experiment on windows environment.

Describe what happened (or what feature you want)

Support chaos experiment on windows environment. include windows os and jvm:

  • os:
    • process: kill, stop
    • mem: load
    • network: corrupt, dns, drop, duplicate, loss, occupy, reorder
    • file: add, append, chmod, delete, move
    • disk: burn, fill
  • jvm:
    • Reuse capabilities in chaosbalde-exec-jvm

Tell us your environment

windows

How to do it?

项目背景

随着混沌工程的发展与推广,越来越多的企业进行了落地。落地行业也由互联网行业伸展到各行各业,特别是传统金融领域,其有很大一部分应用是部署在Windows操作系统上的

目前架构分析

ChaosBlade整体架构如下,主要分为三层:Server控制层,Agent探针层和chaosblade演练工具层,其中最后两层均部署在用户侧机器上:
image

方案实现

ChaosBlade输出Windows演练能力,所以按照以上系统架构,需要在三个方面进行Windows能力的补齐:
● 原子能力:补全Windows操作系统原子演练能力
● 探针:完成Windows版本探针的支持
● 控制台:在控制台上完成对Windows探针管控的支持及演练场景编排的兼容

Windows原子能力支持

Windows 原子演练能力,预计于Linux操作系统上支持的演练能力对齐,主要包括两个部分:OS和JVM。具体原子演练能力如下:

分类 支持场景









系统层
Windows内Cpu满载
Windows内磁盘填充
Windows内文件新增
Windows内文件追加
Windows内文件更改属性
Windows内文件删除
Windows内文件移动
Windows内内存负载
Windows内网络损坏
Windows内网络延迟
Windows内网络Dns异常
Windows内网络丢弃
Windows内网络重复
Windows内网络丢包
Windows内网络占用
Windows内网络乱序
Windows内进程杀死
Windows内进程停止















应用层
Windows内Druid连接池
Windows内Druid延迟
Windows内DruidSql
Windows内Druid抛出自定义异常
Windows内Dubbo延迟
Windows内Dubbo线程池满
Windows内Dubbo抛出自定义异常
Windows内Es延迟
Windows内Es抛出自定义异常
Windows内Hbase延迟
Windows内Hbase抛出自定义异常
Windows内Http延迟
Windows内Http抛出自定义异常
Windows内Jedis延迟
Windows内Jedis抛出自定义异常
Windows内JavaCPU满载
Windows内Java延迟
Windows内JavaOutOfMemoryError
Windows内Java返回值修改
Windows内Java脚本
Windows内Java指定线程数
Windows内Java抛出自定义异常
Windows内Java抛出已声明异常
Windows内Kafka延迟
Windows内Kafka抛出自定义异常
Windows内Lettuce延迟
Windows内Lettuce抛出自定义异常
Windows内Lettuceupdate
Windows内Mongodb延迟
Windows内Mongodb抛出自定义异常
Windows内Mysql延迟
Windows内Mysql抛出自定义异常
Windows内Psql延迟
Windows内Psql抛出自定义异常
Windows内Rabbitmq延迟
Windows内Rabbitmq抛出自定义异常
Windows内Redisson延迟
Windows内Redisson抛出自定义异常
Windows内Rocketmq延迟
Windows内Rocketmq抛出自定义异常
Windows内Servlet延迟
Windows内ServletmodifyCode
Windows内Servlet抛出自定义异常
Windows内Win延迟
......

关键点1:网络原子演练能力实现

在Linux操作系统上实现网络延迟、丢包等故障,是通过tc工具实现的,但是在Windows操作系统上是没有tc工具的,所以经调研,通过开源工具windivert来做实现,从而在用户态中扩展丢包、重发、延时等能力。

整体经过如下:
● windivert获取内核态中接收到数据包
● 在windivert用户态上进行功能扩展和开发,实现数据的丢包、重发、延时等能力,
● 最后再将进行延时、乱序的数据重新丢回内核态中,或直接丢弃,实现网络丢包的功能

image

关键点2 - JVM演练能力实现

JVM演练能力指的是,对运行在Windows操作系统上Java应用进行故障注入,由于其底层原理是通过JVM Sandbox实现的,由于存在JVM虚拟机,并不关心底层操作系统,所以直接服用Linux的实现即可。

探针Windows支持

Windows探针指的运行在用户机器上的应用,主要功能为:与server端建联、上报心跳到server端、演练下发的命令通道和基础数据的收集等。
但是由于Windows和Linux的使用习惯不同,所以探针最好有以下几个功能:
● 交互式参数输入的安装方式
● 在Windows意外关机后,开启后能根据配置自动重启探针应用
● 对于探针由于一些兜底策略或意外退出后,能自动被拉起

Windows services实现重启和保活

Windows service:允许用户创建可在其本身Windows会话中长时间运行的可执行应用程序。这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显示任何用户界面。这些功能使服务非常适合在服务器上使用。还可以在与登录用户或默认计算机账号中不同特定用户账号的安全性上下文中运行服务。

整体实现,经调研利用Golang开源工具kardianos/service,使用方便,社区获取度较高,所以选用它将agent在应用启动时注册为Windows service。
image

Advanced Installed实现交互式安装

通过打包工具将 探针agent和工具chaosblade 打成一个msi安装包文件,用于windows安装。通过以下包工具的尝试和调研,最终选用Advanced Installer进行工具打包。

  1. inno setup:工具老旧,且功能支持简单
  2. go-msi: 生成 msi 文件,安装后命令工具后,本地环境不支持
  3. lxn/walk: 主要是帮助构建win 桌面GUI,不满足要求
  4. advanced installed:交互式参数输入的安装要求,且使用简单,功能丰富
    image

控制台Windows支持

控制台对Windows类型探针和演练场景的兼容主要包括几个方面:

  1. 探针管理的兼容:需要在探针安装和展示时增加Windows探针类型的支持,并补全探针安装文档
  2. 演练场景的兼容:需要在演练场景展示时,根据安装探针类型,动态展示Windows相关原子演练场景
  3. 演练编排的兼容:需要在演练编排和执行过程中,需要兼容Windows演练命令的下发
@MandssS MandssS added the type/feature Category issues or prs related to feature request. label Jul 26, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/feature Category issues or prs related to feature request.
Projects
None yet
Development

No branches or pull requests

1 participant