跳到主要内容
版本:Next

模拟网络故障

本文档介绍如何在 Chaos Mesh 中利用 NetworkChaos 模拟网络故障。

NetworkChaos 介绍

NetworkChaos 用于模拟集群中网络故障的场景,目前支持以下几种类型:

  1. Partition:网络断开、分区。
  2. Net Emulation:用于模拟网络状态不良的情况,比如高延迟、高丢包率、包乱序等情况。
  3. Bandwidth:用于限制节点之间通信的带宽。

注意事项

  1. 请在进行网络注入的过程中保证 Controller Manager 与 Chaos Daemon 之间的连接通畅,否则将无法恢复。
  2. 如果使用 Net Emulation 功能,请确保 Linux 内核拥有 NET_SCH_NETEM 模块。对于 CentOS 可以通过 kernel-modules-extra 包安装,大部分其他发行版已默认安装相应模块。

使用 Dashboard 方式创建实验

  1. 单击实验页面中的新的实验按钮创建实验:

    创建实验
    创建实验

  2. 在“选择目标”处选择 “网络攻击”,然后选择具体行为,例如 LOSS,最后填写具体配置:

    NetworkChaos 实验
    NetworkChaos 实验

    具体配置的填写方式,参考字段说明

  3. 填写实验信息,指定实验范围以及实验计划运行时间:

    实验信息
    实验信息

  4. 提交实验。

使用 YAML 方式创建实验

Net Emulation 示例

  1. 将实验配置写入到文件中 network-delay.yaml,内容示例如下:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: NetworkChaos
    metadata:
    name: delay
    spec:
    action: delay
    mode: one
    selector:
    namespaces:
    - default
    labelSelectors:
    'app': 'web-show'
    delay:
    latency: '10ms'
    correlation: '100'
    jitter: '0ms'

    该配置将令选中 Pod 内的网络连接产生 10 毫秒的延迟。除了注入延迟以外,Chaos Mesh 还支持注入丢包、乱序等功能,详见字段说明

  2. 使用 kubectl 创建实验,命令如下:

    kubectl apply -f ./network-delay.yaml

Partition 示例

  1. 将实验配置写入到文件中 network-partition.yaml,内容示例如下:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: NetworkChaos
    metadata:
    name: partition
    spec:
    action: partition
    mode: all
    selector:
    namespaces:
    - default
    labelSelectors:
    'app': 'app1'
    direction: to
    target:
    mode: all
    selector:
    namespaces:
    - default
    labelSelectors:
    'app': 'app2'

    该配置将阻止从 app1app2 建立的连接。direction 字段的值可以选择 tofromboth,详见字段说明

  2. 使用 kubectl 创建实验,命令如下:

    kubectl apply -f ./network-partition.yaml

Bandwidth 示例

  1. 将实验配置写入到文件中 network-bandwidth.yaml,内容示例如下:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: NetworkChaos
    metadata:
    name: bandwidth
    spec:
    action: bandwidth
    mode: all
    selector:
    namespaces:
    - default
    labelSelectors:
    'app': 'app1'
    bandwidth:
    rate: '1mbps'
    limit: 20971520
    buffer: 10000

    该配置将限制 app1 的带宽为 1 mbps。

  2. 使用 kubectl 创建实验,命令如下:

    kubectl apply -f ./network-bandwidth.yaml

字段说明

参数类型说明默认值是否必填示例
actionstring表示具体的故障类型。netem,delay,loss,duplicate,corrupt 对应 net emulation 类型;partition 表示网络分区;bandwidth 表示限制带宽partition
targetSelector与 direction 组合使用,使得 Chaos 只对部分包生效
directionenum值为 fromtoboth。用于指定选出“来自 target 的包”,“发往 target 的包”,或者“全部选中”toboth
modestring指定实验的运行方式,可选择的方式包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod)one
valuestring取决与 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比1
selectorstruct指定注入故障的目标 Pod,详情请参考定义实验范围
externalTargets[]string表示 Kubernetes 之外的网络目标, 可以是 IPv4 地址或者域名。只能与 direction: to 一起工作。1.1.1.1, google.com
devicestring指定影响的网络设备"eth0"

不同 action 的配置项

Net Emulation

参数类型说明是否必填
delayDelay描述网络的延迟状态
lossLoss描述网络的丢包状态
duplicateDuplicate描述网络重复包的状态
corruptCorrupt描述网络包出现错误的状态

Delay

参数类型说明默认值是否必填示例
latencystring表示延迟的时间长度02ms
correlationstring表示延迟时间的时间长度与前一次延迟时长的相关性。取值范围:[0, 100]050
jitterstring表示延迟时间的变化范围01ms
reorderReorder(#Reorder)表示网络包乱序的状态

correlation 的计算模型如下:

  1. 首先生成一个分布与上一个值有关的随机数:

    rnd = value * (1-corr) + last_rnd * corr

    其中 rnd 为这一随机数。corr 为填写的 correlation

  2. 使用这一随机数决定当前包的延迟:

    ((rnd % (2 * sigma)) + mu) - sigma

    其中 sigmajittermulatency

Reorder

参数类型说明默认值是否必填示例
reorderstring表示发生重新排序的概率。取值范围:[0, 100]050
correlationstring表示发生重新排序的概率与前一次的相关性。取值范围:[0, 100]050
gapint表示乱序将包推后的距离05

Loss

参数类型说明默认值是否必填示例
lossstring表示丢包发生的概率。取值范围:[0, 100]050
correlationstring表示丢包发生的概率与前一次是否发生的相关性。取值范围:[0, 100]050

Duplicate

参数类型说明默认值是否必填示例
duplicatestring表示包重复发生的概率。取值范围:[0, 100]050
correlationstring表示包重复发生的概率与前一次是否发生的相关性。取值范围:[0, 100]050

Corrupt

参数类型说明默认值是否必填示例
corruptstring表示包错误发生的概率。取值范围:[0, 100]050
correlationstring表示包错误发生的概率与前一次是否发生的相关性。取值范围:[0, 100]050

对于 reorderlossduplicatecorrupt 这些偶发事件,correlation 则更为复杂。具体模型描述参考 NetemCLG

Bandwidth

参数类型说明默认值是否必填示例
ratestring表示带宽限制的速率1mbps
limituint32表示在队列中等待的字节数1
bufferuint32能够瞬间发送的最大字节数1
peakrateuint64bucket 的最大消耗率1
minburstuint32peakrate bucket 的大小1

其中 peakrateminburst 通常情况下不需要设置。如果需要进一步了解这些字段的含义,可以参考 tc-tbf 文档.limit 建议至少设置为 2 * rate * latency,其中 latency 为发送者到目标的延迟,可以通过 ping 命令估算。过小的 limit 会造成高丢包率,从而影响 TCP 连接的吞吐。