背景
在使用Chaos Mesh的过程中发现, 注入网络类故障可以做到对pod的无感知注入,好奇是如何实现的。 所以这里对网络故障注入进行简单的探索,以便更深层的了解故障注入。
分析步骤
故障注入
首先需要准备好Chaos Mesh
和Kubernetes
环境,使用平台或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