工具介绍
- crictl工具:用于查询k8s pod和容器信息
- nsenter工具:用于进入容器的网络命名空间
- tc工具:注入网络故障
实现k8s pod级别网络故障
- 首先查找故障注入的pod的宿主机,并ssh登陆进去
bash
kubectl get pod -n <namespace> -owide
- 使用 kubectl 获取 Pod 的容器 ID,例如第1个
bash
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[0].containerID}' | cut -d'/' -f3
- 使用
crictl
获取容器的 PID
bash
crictl inspect --output=go-template --template="{{.info.pid}}" <pod_container_id>
- 使用
nsenter
进入网络命名空间
bash
nsenter -n -t $pod_pid
进入网络空间前后对比,进入网络空间后,eth0的ip应为pod ip
。
bash
(tob_env) root@n73-001-014:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.72.3.100 netmask 255.255.255.0 broadcast 10.72.3.250
inet6 fe50::216:3eff:fe50:fe50 prefixlen 64 scopeid 0x20<link>
ether 00:36:3e:36:5b:36 txqueuelen 1000 (Ethernet)
RX packets 38875633274 bytes 15496787166310 (14.0 TiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31492296646 bytes 17143859349471 (15.5 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
(tob_env) root@n73-001-014:~# nsenter -n -t 501532
(tob_env) root@n73-001-014:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 172.26.25.6 netmask 255.255.255.255 broadcast 172.26.25.6
inet6 fe80::b322:e9ff:fe7e:b322 prefixlen 64 scopeid 0x20<link>
ether ba:22:e9:22:b3:22 txqueuelen 0 (Ethernet)
RX packets 8077026811 bytes 1361131463473 (1.2 TiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6472821861 bytes 1134318477480 (1.0 TiB)
TX errors 0 dropped 1 overruns 0 carrier 0 collisions 0
-
进入网络命名空间后,你就可以在该命名空间中执行各种网络相关的命令了
- 通过
tc
工具注入网络故障
- 通过
bash
tc qdisc add dev eth0 root netem loss 100%
sleep 300
tc qdisc del dev eth0 root