跳转到主要内容

Edge Chaos

项目描述

Edge Chaos

Docker Image Version (latest semver) PyPI Version Python 3.7+

此项目旨在在边缘云计算环境中引起混乱。

用户可以启动和停止应干扰协同定位应用的程序。目前实现了以下功能

  • CPU压力测试(使用stress-ng
  • 网络流量整形(使用tc

安装

执行以下步骤安装所有依赖项

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

构建

我们提供了脚本来为所有常见架构(即,amd64arm32v7arm64v8)容器化应用程序

./scripts/docker-build.sh $arch

发布

./scripts/docker-release.sh $repository $version

version参数是可选的,默认为$(git rev-parse --short HEAD)

运行

尽管其主要用例是在容器中运行,但也可以原生启动它

python3 -u -m edgechaos.daemon.run

要作为容器运行

docker run --network=host edgerun/edge-chaos:latest

用法

EdgeChaos作为守护进程(原生、在容器中或在Kubernetes Pod中)运行,并等待接收命令。目前,命令预计将通过Redis Pub/Sub或通过AMQP(即,RabbitMQ)到达。

支持的交互方式

  • Redis:守护进程等待通过edgechaos/$edgechaos_host通道发布的消息。
  • RabbitMq:守护进程等待在edgechaos交换机上发布,路由键为$edgechaos_host的消息。

其中$edgechaos_host设置为环境变量,默认为HOSTNAME

预期的正文在所有不同的交互方法中相同。守护进程期望消息是一个JSON对象,它具有nameparameterskind键。其中name表示攻击类型(例如,cpu)和parameters指定攻击所需的进一步信息。其中kind指定是否是startstop事件。您可以通过查看相应的dataclass ChaosCommand 获取更多详细信息的格式。

重要:正文必须始终相同。这意味着如果您想停止攻击,您必须发送与之前相同的正文,除了将kind设置为stop

以下两个JSON对象示例展示了如何启动和停止CPU攻击(使用1个核心)。

启动攻击

{
  "name": "stress-ng",
  "parameters": {
    "cpu": 1
  },
  "kind": "start"
}

停止攻击

{
  "name": "stress-ng",
  "parameters": {
    "cpu": 1
  },
  "kind": "stop"
}

可用的混沌攻击

以下列出所有可用的攻击,并指定它们的JSON调用对象。

stress-ng

stress-ng 是一个功能强大的压力测试程序,具有280多种不同的攻击类型(压力源)。因此,用户可以指定任何任意组合的参数,这些参数将被传递给 stress-ng。这意味着 parameters 对象中的任何键值对都会被传递给 stress-ng

stress-ng 攻击可以通过两种方式执行

  1. 发送一个startstop事件,在两种情况下,消息的其余内容必须相同。
  2. stress-ng 提供了参数,可以在执行一定数量的操作或一定时间后停止压力测试(即,timeout)。在这种情况下不需要 stop 事件。

请求应如下所示。将 parameter 的内容传递给 stress-ng,尽管不需要在参数(即,JSON对象键)前加上 -- 前缀。

{
  "name": "stress-ng",
  "parameters": {
    "cpu": 0
  },
  "kind": "start"
}

注意,在示例攻击中,0 表示 stress-ng 应该使用所有可用的核心。

tc

tc 是一个 Linux 流量整形工具,可以修改网络接口上的流量。此维基条目 提供了对 tc 功能的快速了解。与 stress-ng 一样,我们不希望限制用户在混沌攻击配置中,因此只需将任何参数传递给 tc

stress-ng 攻击不同,每个攻击都需要手动停止。这意味着 edge-chaos 代理不会修改参数,只需传递参数。要停止修改,需要发送正确的 tc 命令(以下示例),并将 kind 键设置为 stop

重要:手动停止 tc 命令意味着 edge-chaos 代理在关机时不会停止正在执行的命令。每个 tc 规则都必须手动删除。

此外,由于 tc 期望的是参数列表而不是标志,我们期望 parameters 对象只有一个键 (tc),其值是一个字符串列表,这些字符串将被无修改地传递给 tc 命令。

例如,要在 eth0 网络接口的出口添加 100ms 延迟,请发送

{
  "name": "tc",
  "parameters": {
    "tc": [
      "qdisc",
      "add",
      "dev",
      "eth0",
      "root",
      "netem",
      "delay",
      "100ms"
    ]
  },
  "kind": "start"
}

要删除 tc 规则,请发送

{
  "name": "tc",
  "parameters": {
    "tc": [
      "qdisc",
      "del",
      "dev",
      "eth0",
      "root",
      "netem",
      "delay",
      "100ms"
    ]
  },
  "kind": "stop"
}

注意kind 的值对命令没有影响。但是,建议在攻击后分析时适当地设置它。

环境变量

名称 默认值 描述
edgechaos_logging_level INFO 设置 日志记录器级别
edgechaos_redis_host localhost Redis 主机
edgechaos_redis_port 6379 Redis 端口
edgechaos_redis_password N/A Redis 密码
edgechaos_listener_type redis 监听器类型(目前支持:redisrabbitmq
edgechaos_client_type redis 客户端类型(目前支持:redisrabbitmq
edgechaos_host $HOSTNAME 主机名,确定守护进程监听的通道
edgechaos_rabbitmq_url N/A RabbitMq 连接 URL
edgechaos_rabbitmq_exchange edgechaos 用作攻击所使用的交易所名称

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

edgerun-edge-chaos-0.0.4.tar.gz (13.5 kB 查看散列)

上传时间 源代码

构建发行版

edgerun_edge_chaos-0.0.4-py3-none-any.whl (16.0 kB 查看散列)

上传时间 Python 3

由...