模拟Docker中的网络故障

时间:2017-09-12 19:37:34

标签: docker iproute

我正在尝试模拟docker中的部分/全部网络/容器故障,以便了解我的应用程序在故障情况下的行为方式。我已经开始使用pumba,但它不能正常工作。更具体地说,这个命令在运行时失败,无论是通过pumba还是直接在带有docker exec的容器上运行:

tc qdisc add dev eth0 root netem delay 2000ms 10ms 20.00

使用以下输出:

RTNETLINK answers: Operation not permitted

现在这里变得更加陌生。 在我的服务容器中运行时它起作用实际上,它仅在通过pumba运行时有效,而不是直接运行时(rabbitmq:3.6.10,redis:4.0.1,mongo:3.5.11),之后安装iproute2包。它在我的应用程序容器中不起作用,所有这些容器都使用node:8.2.1作为基本映像,已经安装了iproute2。没有任何容器有任何add_caps应用。

在其中一个应用程序容器上输出ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default qlen 1
    link/gre 0.0.0.0 brd 0.0.0.0
4: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
5: ip_vti0@NONE: <NOARP> mtu 1332 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
6: ip6_vti0@NONE: <NOARP> mtu 1500 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
7: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/sit 0.0.0.0 brd 0.0.0.0
8: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
9: ip6gre0@NONE: <NOARP> mtu 1448 qdisc noop state DOWN group default qlen 1
    link/gre6 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 brd 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
113: eth0@if114: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:06 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.6/16 scope global eth0
       valid_lft forever preferred_lft forever

3 个答案:

答案 0 :(得分:0)

好的,我找到了部分答案。事实证明,直接在服务容器上运行时,tc命令无法正常工作。很抱歉原始问题中的信息不正确。 Pumba处理服务容器而不是应用程序容器。 tc命令在任何容器中都不起作用。

事实证明,作为无特权用户运行是一个问题。我用pumba解决了这个问题。

当以root身份运行时,tc命令仍然不起作用,我仍然不知道原因。但是,我只是使用该命令进行调试,所以虽然我很好奇它为什么不起作用,但我的主要问题已经解决了。

答案 1 :(得分:0)

您应该使用root用户在容器上调用exec:-u = 0

喜欢:

sudo docker exec-u=0 myContainer tc qdisc add dev eth0 root netem delay 2000ms 10ms 20.00

答案 2 :(得分:0)

我在 Windows 上遇到了类似的问题,最终能够通过在 Docker 设置中关闭基于 WSL 2 的引擎来解决。现在我所有的 tc qdisc... 命令都可以工作了。