Chaos Mesh网络延迟原理探索

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 在使用Chaos Mesh的过程中发现, 注入网络类故障可以做到对pod的无感知注入,好奇是如何实现的。 所以这里对网络故障注入进行简单的探索,以便更深层的了解故障注入。

背景

在使用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 # 应用的目标

首先获取节点以及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

输出内容如下:

[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

总结

到这里可以发现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

参考文档:

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

相关文章
|
3天前
|
机器学习/深度学习 算法 网络架构
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
27 0
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
|
25天前
|
机器学习/深度学习 存储 算法
深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率
深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率
29 0
|
1天前
|
安全 算法 数据安全/隐私保护
网络原理 - HTTP/HTTPS(5)
网络原理 - HTTP/HTTPS(5)
|
1天前
|
Web App开发 应用服务中间件 nginx
网络原理 - HTTP/HTTPS(4)
网络原理 - HTTP/HTTPS(4)
|
1天前
|
存储 Web App开发 API
网络原理 - HTTP/HTTPS(3)
网络原理 - HTTP/HTTPS(3)
|
1天前
|
缓存 JavaScript 安全
网络原理 - HTTP/HTTPS(2)
网络原理 - HTTP/HTTPS(2)
|
1天前
|
网络协议 Unix API
网络原理-TCP_IP(2)
网络原理-TCP_IP(2)
|
1天前
|
JSON 网络协议 算法
网络原理-TCP/IP(1)
网络原理-TCP/IP(1)
|
1天前
|
网络协议 程序员 API
网络原理-初识(2)
网络原理-初识(2)
网络原理-初识(2)
|
1天前
|
网络协议 网络架构 数据格式
网络原理-初识(1)
网络原理-初识(1)

相关产品

  • 云消息队列 MQ
  • 微服务引擎
  • 云消息队列 Kafka 版