Simulate Network Faults

This document describes how to simulate network faults using NetworkChaos in Chaos Mesh.

NetworkChaos introduction

NetworkChaos is a fault type in Chaos Mesh. By creating a NetworkChaos experiment, you can simulate a network fault scenario for a cluster. Currently, NetworkChaos supports the following fault types:

  • Partition: network disconnection and partition.
  • Net Emulation: poor network conditions, such as high delays, high packet loss rate, packet reordering, and so on.
  • Bandwidth: limit the communication bandwidth between nodes.

Notes

Before creating NetworkChaos experiments, ensure the following:

  1. During the network injection process, make sure that the connection between Controller Manager and Chaos Daemon works, otherwise the NetworkChaos cannot be restored anymore.
  2. If you want to simulate Net Emulation fault, make sure the NET_SCH_NETEM module is installed in the Linux kernel. If you are using CentOS, you can install the module through the kernel-modules-extra package. Most other Linux distributions have installed the module already by default.

Create experiments using Chaos Dashboard

  1. Open Chaos Dashboard, and click NEW EXPERIMENT on the page to create a new experiment:

    Create Experiment

  2. In the Choose a Target area, choose NETWORK ATTACK and select a specific behavior, such as LOSS. Then fill out specific configuration.

    NetworkChaos Experiments

    For details of specific configuration fields, refer to [Field description](#field description).

  3. Fill out the experiment information, and specify the experiment scope and the scheduled experiment duration.

    Experiment Information

  4. Submit the experiment information.

Create experiments using the YAML files

Net emulation example

  1. Write the experiment configuration to the network-delay.yaml file, as shown below:

    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'

    This configuration causes a latency of 10 milliseconds in the network connections of the target Pods. In addition to latency injection, Chaos Mesh supports packet loss and packet reordering injection. For details, see field description.

  2. After the configuration file is prepared, use kubectl to create an experiment:

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

Partition example

  1. Write the experiment configuration to the network-partition.yaml file, as shown below:

    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'

    This configuration blocks the connection created from app1 to app2. The value for the direction field can be to, from or both. For details, refer to Field description.

  2. After the configuration file is prepared, use kubectl to create the experiment:

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

Bandwidth example

  1. Write the experiment configuration to the network-bandwidth.yaml file, as shown below:

    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: 20971520
    16. buffer: 10000

    This configuration limits the bandwidth of app1 to 1 mbps.

  2. After the configuration file is prepared, use kubectl to create the experiment:

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

Field description

ParameterTypeDescriptionDefault valueRequiredExample
actionstringIndicates the specific fault type. Available types include: netem, delay (network delay), loss (packet loss), duplicate (packet duplicating), corrupt (packet corrupt), partition (network partition), and bandwidth (network bandwidth limit).After you specify action field, refer to Description for action-related fields for other necessary field configuration.NoneYesPartition
targetSelectorUsed in combination with direction, making Chaos only effective for some packets.NoneNo
directionenumIndicates the direction of target packets. Available vaules include from (the packets from target), to (the packets to target), and both ( the packets from or to target). This parameter makes Chaos only take effect for a specific direction of packets.toNoboth
modestringSpecifies the mode of the experiment. The mode options include one (selecting a random Pod), all (selecting all eligible Pods), fixed (selecting a specified number of eligible Pods), fixed-percent (selecting a specified percentage of Pods from the eligible Pods), and random-max-percent (selecting the maximum percentage of Pods from the eligible Pods).NoneYesone
valuestringProvides a parameter for the mode configuration, depending on mode. For example, when mode is set to fixed-percent, value specifies the percentage of Pods.NoneNo1
containerNames[]stringSpecifies the name of the container into which the fault is injected.NoneNo[“nginx”]
selectorstructSpecifies the target Pod. For details, refer to Define the experiment scope.NoneYes
externalTargets[]stringIndicates the network targets except for Kubernetes, which can be IPv4 addresses or domains. This parameter only works with direction: to.NoneNo1.1.1.1, www.google.com
devicestringSpecifies the affected network interfaceNoneNo“eth0”

For the Net Emulation and Bandwidth fault types, you can further configure the action related parameters according to the following description.

  • Net Emulation type: delay, loss, duplicated, corrupt
  • Bandwidth type: bandwidth

delay

Setting action to delay means simulating network delay fault. You can also configure the following parameters.

ParameterTypeDescriptionRequiredRequiredExample
latencystringIndicates the network latencyNoNo2ms
correlationstringIndicates the correlation between the current latency and the previous one. Range of value: [0, 100]NoNo50
jitterstringIndicates the range of the network latencyNoNo1ms
reorderReorder(#Reorder)Indicates the status of network packet reorderingNo

The computational model for correlation is as follows:

  1. Generate a random number whose distribution is related to the previous value:

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

    rnd is the random number. corr is the correlation you fill out before.

  2. Use this random number to determine the delay of the current packet:

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

    In the above command, sigma is jitter and mu is latency.

reorder

Setting action to reorder means simulating network packet reordering fault. You can also configure the following parameters.

ParameterTypeDescriptionDefault valueRequiredExample
reorderstringIndicates the probability to reorder0No0.5
correlationstringIndicates the correlation between this time’s length of delay time and the previous time’s length of delay time. Range of value: [0, 100]0No50
gapintIndicates the gap before and after packet reordering0No5

loss

Setting action to loss means simulating packet loss fault. You can also configure the following parameters.

ParameterTypeDescriptionDefault valueRequiredExample
lossstringIndicates the probability of packet loss. Range of value: [0, 100]0No50
correlationstringIndicates the correlation between the probability of current packet loss and the previous time’s packet loss. Range of value: [0, 100]0No50

duplicate

Set action to duplicate, meaning simulating package duplication. At this point, you can also set the following parameters.

ParameterTypeDescriptionDefault valueRequiredExample
duplicatestringIndicates the probability of packet duplicating. Range of value: [0, 100]0No50
correlationstringIndicates the correlation between the probability of current packet duplicating and the previous time’s packet duplicating. Range of value: [0, 100]0No50

corrupt

Setting action to corrupt means simulating package corruption fault. You can also configure the following parameters.

ParameterTypeDescriptionDefault valueRequiredExample
corruptstringIndicates the probability of packet corruption. Range of value: [0, 100]0No50
correlationstringIndicates the correlation between the probability of current packet corruption and the previous time’s packet corruption. Range of value: [0, 100]0No50

For occasional events such as reorder, loss, duplicate, and corrupt, the correlation is more complicated. For specific model description, refer to NetemCLG.

bandwidth

Setting action to bandwidth means simulating bandwidth limit fault. You also need to configure the following parameters.

ParameterTypeDescriptionDefault valueRequiredExample
ratestringIndicates the rate of bandwidth limitYes1mbps
limitstringIndicates the number of bytes waiting in queueYes1
bufferuint32Indicates the maximum number of bytes that can be sent instantaneouslyYes1
peakrateuint64Indicates the maximum consumption of bucket (usually not set)No1
minburstuint32Indicates the size of peakrate bucket (usually not set)No1

For more details of these fields, you can refer to tc-tbf document. The limit is suggested to set to at least 2 * rate * latency, where the latency is the estimated latency between source and target, and it can be estimated through ping command. Too small limit can cause high loss rate and impact the throughput of the tcp connection.