全部。我有一个问题。我在 14.04 上使用 tc 和 HTB 进行流量整形。
tc qdisc add dev docker0 root handle 1: htb default 1024
这在装有 docker 1.11 的 ubuntu 14.04 上运行良好。但在我将 ubuntu 从 14.04 升级到 16.04(而不是升级 docker)后。当我执行相同的命令时:
tc qdisc add dev docker0 root handle 1: htb default 1024
所有正在运行的容器都无法访问网络,甚至是默认网关。
/ # ip r l
default via 172.20.0.1 dev eth0
172.20.0.0/16 dev eth0 src 172.20.0.2
/ # ping 172.20.0.1
PING 172.20.0.1 (172.20.0.1): 56 data bytes
^C
--- 172.20.0.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
我在主机上捕获数据包,例如
tcpdump -vvv -nn -i docker0
tcpdump: listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:44:59.611212 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.20.0.1 tell 172.20.0.2, length 28
15:45:00.629100 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.20.0.1 tell 172.20.0.2, length 28
15:45:01.653096 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 172.20.0.1 tell 172.20.0.2, length 28
并检查docker0的tc状态:
tc -s -d qdisc show dev docker0
qdisc htb 1: root refcnt 2 r2q 10 default 1024 direct_packets_stat 0 ver 3.17 direct_qlen 0
Sent 0 bytes 0 pkt (dropped 48, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
有类似的事情,所有包裹都丢失了。有人能给我一些建议吗?谢谢
答案1
我在安装了 docker 1.13 及更高版本的 centos 上看到了同样的行为(我还没有尝试过更早的 docker 版本)。在我的例子中,我能够通过明确将 direct_qlen 设置为非零值来使数据包在附加了 htb qdisc 的情况下移动。例如:
tc qdisc add dev docker0 root handle 1: htb default 1024 direct_qlen 1000