title: 模拟网络故障

sidebar_label: 模拟网络故障

本文档介绍如何在 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 还支持注入丢包、乱序等功能,详见字段说明

  1. 使用 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,详见字段说明

  1. 使用 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。

  1. 使用 kubectl 创建实验,命令如下:
  1. kubectl apply -f ./network-bandwidth.yaml

字段说明

参数 类型 说明 默认值 是否必填 示例
action string 表示具体的故障类型。netem,delay,loss,duplicate,corrupt 对应 net emulation 类型;partition 表示网络分区;bandwidth 表示限制带宽 partition
target Selector 与 direction 组合使用,使得 Chaos 只对部分包生效
direction enum 值为 fromtoboth。用于指定选出“来自 target 的包”,“发往 target 的包”,或者“全部选中” to both
mode string 指定实验的运行方式,可选择的方式包括:one(表示随机选出一个符合条件的 Pod)、all(表示选出所有符合条件的 Pod)、fixed(表示选出指定数量且符合条件的 Pod)、fixed-percent(表示选出占符合条件的 Pod 中指定百分比的 Pod)、random-max-percent(表示选出占符合条件的 Pod 中不超过指定百分比的 Pod) one
value string 取决与 mode 的配置,为 mode 提供对应的参数。例如,当你将 mode 配置为 fixed-percent 时,value 用于指定 Pod 的百分比 2
containerNames []string 指定注入的容器名称 [“nginx”]
selector struct 指定注入故障的目标 Pod,详情请参考定义实验范围

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

Net Emulation

参数 类型 说明 是否必填
delay Delay 描述网络的延迟状态
loss Loss 描述网络的丢包状态
duplicate Duplicate 描述网络重复包的状态
corrupt Corrupt 描述网络包出现错误的状态
Delay
参数 类型 说明 默认值 是否必填 示例
latency string 表示延迟的时间长度 0 2ms
correlation string 表示延迟时间的时间长度与前一次延迟时长的相关性 0 0.5
jitter string 表示延迟时间的变化范围 0 1ms
reorder Reorder(#Reorder) 表示网络包乱序的状态

correlation 的计算模型如下:

  1. 首先生成一个分布与上一个值有关的随机数:
  1. rnd = value * (1-corr) + last_rnd * corr

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

  1. 使用这一随机数决定当前包的延迟:
  1. ((rnd % (2 * sigma)) + mu) - sigma

其中 sigmajittermulatency

Reorder
参数 类型 说明 默认值 是否必填 示例
reorder string 表示发生重新排序的概率 0 0.5
correlation string 表示发生重新排序的概率与前一次的相关性 0 0.5
gap int 表示乱序将包推后的距离 0 5
Loss
参数 类型 说明 默认值 是否必填 示例
loss string 表示丢包发生的概率 0 0.5
correlation string 表示丢包发生的概率与前一次是否发生的相关性 0 0.5
Duplicate
参数 类型 说明 默认值 是否必填 示例
duplicate string 表示包重复发生的概率 0 0.5
correlation string 表示包重复发生的概率与前一次是否发生的相关性 0 0.5
Corrupt
参数 类型 说明 默认值 是否必填 示例
corrupt string 表示包错误发生的概率 0 0.5
correlation string 表示包错误发生的概率与前一次是否发生的相关性 0 0.5

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

Bandwidth

参数 类型 说明 默认值 是否必填 示例
rate string 表示带宽限制的速率 1mbps
limit uint32 表示在队列中等待的字节数 1
buffer uint32 能够瞬间发送的最大字节数 1
peakrate uint64 bucket 的最大消耗率 1
minburst uint32 peakrate bucket 的大小 1

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