模拟网络故障

本文档介绍如何在 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 实验

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

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

    实验信息

  4. 提交实验。

使用 YAML 方式创建实验

Net Emulation 示例

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

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: NetworkChaos
    3. metadata:
    4. name: delay
    5. spec:
    6. action: delay
    7. mode: one
    8. selector:
    9. namespaces:
    10. - default
    11. labelSelectors:
    12. 'app': 'web-show'
    13. delay:
    14. latency: '10ms'
    15. correlation: '100'
    16. jitter: '0ms'

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

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

    1. kubectl apply -f ./network-delay.yaml

Partition 示例

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

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: NetworkChaos
    3. metadata:
    4. name: partition
    5. spec:
    6. action: partition
    7. mode: all
    8. selector:
    9. namespaces:
    10. - default
    11. labelSelectors:
    12. 'app': 'app1'
    13. direction: to
    14. target:
    15. mode: all
    16. selector:
    17. namespaces:
    18. - default
    19. labelSelectors:
    20. 'app': 'app2'

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

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

    1. kubectl apply -f ./network-partition.yaml

Bandwidth 示例

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

    1. apiVersion: chaos-mesh.org/v1alpha1
    2. kind: NetworkChaos
    3. metadata:
    4. name: bandwidth
    5. spec:
    6. action: bandwidth
    7. mode: all
    8. selector:
    9. namespaces:
    10. - default
    11. labelSelectors:
    12. 'app': 'app1'
    13. bandwidth:
    14. rate: '1mbps'
    15. limit: 100
    16. buffer: 10000

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

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

    1. 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
containerNames[]string指定注入的容器名称[“nginx”]
selectorstruct指定注入故障的目标 Pod,详情请参考定义实验范围

针对不同的 action,还有不同的配置项可以填写。

Net Emulation

参数类型说明是否必填
delayDelay描述网络的延迟状态
lossLoss描述网络的丢包状态
duplicateDuplicate描述网络重复包的状态
corruptCorrupt描述网络包出现错误的状态
Delay
参数类型说明默认值是否必填示例
latencystring表示延迟的时间长度02ms
correlationstring表示延迟时间的时间长度与前一次延迟时长的相关性00.5
jitterstring表示延迟时间的变化范围01ms
reorderReorder(#Reorder)表示网络包乱序的状态

correlation 的计算模型如下:

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

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

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

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

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

    其中 sigmajittermulatency

Reorder
参数类型说明默认值是否必填示例
reorderstring表示发生重新排序的概率00.5
correlationstring表示发生重新排序的概率与前一次的相关性00.5
gapint表示乱序将包推后的距离05
Loss
参数类型说明默认值是否必填示例
lossstring表示丢包发生的概率00.5
correlationstring表示丢包发生的概率与前一次是否发生的相关性00.5
Duplicate
参数类型说明默认值是否必填示例
duplicatestring表示包重复发生的概率00.5
correlationstring表示包重复发生的概率与前一次是否发生的相关性00.5
Corrupt
参数类型说明默认值是否必填示例
corruptstring表示包错误发生的概率00.5
correlationstring表示包错误发生的概率与前一次是否发生的相关性00.5

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

Bandwidth

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

其中 peakrateminburst 通常情况下不需要设置。如果需要进一步了解这些字段的含义,可以参考 tc-tbf 文档