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

NetworkChaos 介绍

NetworkChaos 是 Chaos Mesh 中的一种故障类型。通过创建 NetworkChaos 类型的混沌实验,你可以模拟集群发生网络故障的场景。目前 NetworkChaos 支持模拟以下故障类型:

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

注意事项

创建 NetworkChaos 实验前,请确保以下事项:

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

使用 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'

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

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

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

字段说明

通过字段说明

参数 类型 说明 默认值 是否必填 示例
action string 指定具体的故障类型,可设置的类型包括:netemdelay(表示网络延迟故障)、loss(表示丢包故障)、duplicate(表示包重复故障)、corrupt(表示包错误故障)、partition(表示网络分区故障)、或bandwidth(表示带宽限制故障)。当指定了 action 字段后,请参考action 相关的字段说明配置其他需要的字段。 partition
target Selector 与 direction 组合使用,使 Chaos 只对部分包生效
direction enum 指定 target 包的方向,可设置的值包括 from (表示来自 target 的包)、to(表示发往 target 的包)、 或 both(表示 target 收到或者发出的包),使 Chaos 只对指定方向的包生效。 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 类型和 Bandwidth 类型的 action,你还可以按照本小节的字段说明进一步设置相关参数。

  • Net Emulation 类型:delaylossduplicatecorrupt
  • Bandwidth 类型:bandwidth

delay

如果将 action 设置为 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

如果将 action 设置为 reorder,表示模拟网络包乱序的故障。此时,你还可以设置以下相关参数。

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

loss

如果将 action 设置为 loss,表示模拟丢包故障。此时,你还可以设置以下相关参数。

参数 类型 说明 默认值 是否必填 示例
loss string 表示丢包发生的概率 0 0.5
correlation string 表示丢包发生的概率与前一次是否发生的相关性 0 0.5

duplicate

如果将 action 设置为 duplicate,表示模拟包重复故障。此时,你还可以设置以下相关参数。

参数 类型 说明 默认值 是否必填 示例
duplicate string 表示包重复发生的概率 0 0.5
correlation string 表示包重复发生的概率与前一次是否发生的相关性 0 0.5

corrupt

如果将 action 设置为 corrupt,表示模拟包错误的情况。此时,你还可以设置以下相关参数。

参数 类型 说明 默认值 是否必填 示例
corrupt string 表示包错误发生的概率 0 0.5
correlation string 表示包错误发生的概率与前一次是否发生的相关性 0 0.5

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

bandwidth

如果将 action 设置为 bandwidth,表示模拟带宽限制的故障。此时,你还需要设置以下相关参数。

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

如果需要进一步了解这些字段的含义,请参阅 tc-tbf 文档