• Chaos Mesh网络延迟原理探索


    背景

    在使用Chaos Mesh的过程中发现, 注入网络类故障可以做到对pod的无感知注入,好奇是如何实现的。 所以这里对网络故障注入进行简单的探索,以便更深层的了解故障注入。

    分析步骤

    故障注入

    首先需要准备好Chaos MeshKubernetes环境,使用平台或yaml的方式来注入一个网络延迟的故障。故障注入配置如下:

    kind: NetworkChaos
    apiVersion: chaos-mesh.org/v1alpha1
    metadata:
      namespace: default
      name: ceshi-delay-3
      annotations:
        experiment.chaos-mesh.org/pause: 'false'
    spec:
      selector:
        namespaces:
          - default
        labelSelectors:
          app: ceshi # 通过label匹配需要注入的pod
      mode: all
      action: delay # 网络故障类型,延迟
      duration: 120m # 持续时间, 这个为了持续观察,所以配置的时间较长
      delay:
        latency: 50ms # 延迟时间
        correlation: '0.5' # 表示延迟时间的时间长度与前一次延迟时长的相关性	
        jitter: 1ms # 表示延迟时间的变化范围	
      direction: to
      externalTargets:
        - baidu.com # 应用的目标
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    首先获取节点以及pod的相关信息。

    # 获取容器ID 
    export DOCKER_NAME=ceshi
    export DOCKER_ID=`docker ps | grep $DOCKER_NAME| grep -v pause | awk '{print $1}'`
    # 获取容器的进程ID
    export DOCKER_PID=`docker inspect $DOCKER_ID -f {{.State.Pid}}`
    # 进入容器的网络命名空间
    nsenter -n -t $DOCKER_PID
    
    # 查看容器的网络相关的配置
    iptables-save -c
    ipset save
    tc qdisc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出内容如下:

    [root@iZbp1elafds24y0y49tf03Z ~]# iptables-save -c
    # Generated by iptables-save v1.4.21 on Thu Jul 27 16:56:15 2023
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    COMMIT
    # Completed on Thu Jul 27 16:56:15 2023
    # Generated by iptables-save v1.4.21 on Thu Jul 27 16:56:15 2023
    *mangle
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    COMMIT
    # Completed on Thu Jul 27 16:56:15 2023
    # Generated by iptables-save v1.4.21 on Thu Jul 27 16:56:15 2023
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    COMMIT
    # Completed on Thu Jul 27 16:56:15 2023
    # Generated by iptables-save v1.4.21 on Thu Jul 27 16:56:15 2023
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :CHAOS-INPUT - [0:0]
    :CHAOS-OUTPUT - [0:0]
    :TC-TABLES-0 - [0:0]
    [0:0] -A INPUT -j CHAOS-INPUT
    [0:0] -A OUTPUT -j CHAOS-OUTPUT
    [0:0] -A CHAOS-OUTPUT -j TC-TABLES-0
    [0:0] -A TC-TABLES-0 -o eth0 -m set --match-set ceshi_84ad17d35da_set_netgt dst,dst -j CLASSIFY --set-class 0001:0004
    COMMIT
    # Completed on Thu Jul 27 16:56:15 2023
    [root@iZbp1elafds24y0y49tf03Z ~]# ipset save
    create ceshi_84ad17d35da_net_netgt hash:net family inet hashsize 1024 maxelem 65536
    add ceshi_84ad17d35da_net_netgt 110.242.68.66
    add ceshi_84ad17d35da_net_netgt 39.156.66.10
    create ceshi_84ad17d_netport_netgt hash:net,port family inet hashsize 1024 maxelem 65536
    create ceshi_84ad17d35da_set_netgt list:set size 8
    add ceshi_84ad17d35da_set_netgt ceshi_84ad17d35da_net_netgt
    add ceshi_84ad17d35da_set_netgt ceshi_84ad17d_netport_netgt
    [root@iZbp1elafds24y0y49tf03Z ~]# tc qdisc
    qdisc noqueue 0: dev lo root refcnt 2
    qdisc prio 1: dev eth0 root refcnt 2 bands 4 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc netem 5: dev eth0 parent 1:4 limit 1000 delay 50.0ms  1.0ms 0.5%
    qdisc sfq 4: dev eth0 parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
    qdisc sfq 3: dev eth0 parent 1:2 limit 127p quantum 1514b depth 127 divisor 1024
    qdisc sfq 2: dev eth0 parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    总结

    到这里可以发现Chaos Mesh通过 iptables + tc的方式, 对流量进行拦截后处理。 实现网络故障的目录, 其他网络类型故障也是基于该原理实现。

    
    tc qdisc del dev eth0 root
    tc qdisc add dev eth0 root handle 1: netem delay 50000
    tc qdisc add dev eth0 parent 1: handle 2: netem delay 100000
    tc qdisc add dev eth0 parent 2: handle 3: prio bands 5 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    tc qdisc add dev eth0 parent 3:1 handle 4: sfq
    tc qdisc add dev eth0 parent 3:2 handle 5: sfq
    tc qdisc add dev eth0 parent 3:3 handle 6: sfq
    tc qdisc add dev eth0 parent 3:4 handle 7: netem delay 50000
    iptables -A TC-TABLES-0 -o eth0 -m set --match-set A dst -j CLASSIFY --set-class 3:4 -w 5
    tc qdisc add dev eth0 parent 3:5 handle 8: netem delay 100000
    iptables -A TC-TABLES-1 -o eth0 -m set --match-set B dst -j CLASSIFY --set-class 3:5 -w 5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    参考文档:

    故障注入源码:https://github.com/chaos-mesh/chaos-mesh/blob/master/pkg/chaosdaemon/tc_server.go#L112

  • 相关阅读:
    java计算机毕业设计web考试资料交易系统设计与实现源码+mysql数据库+系统+lw文档+部署
    【数据可视化】数据可视化入门前的了解
    【考研复习】union有关的输出问题
    聊聊我的试用期总结(不知名公司算法工程师
    2022年“新一代”设备管理系统——支持低代码平台
    vue中定义属性和方法,响应式定义
    3. 测度论-随机变量
    大厂Java面试必备面试题:基础语法-数据类型-编码-注释-运算符-关键字-流程控制语句
    网络安全-端口信息收集
    前端 CSS 经典:SVG 描边动画
  • 原文地址:https://blog.csdn.net/u012881331/article/details/132169550