Macvlan路由规则

对macvlan 不熟悉的同学,可以先看下这篇macvlan virtual network简介 默认情况下Linux kernel会阻止(drop)宿主机(host eth0)虚拟出来的 macvlan network(bridge mode) 和宿主机host eth0)之间网络数据包。 调试了一段时间后,我们发现了可以通过路由表来绕过这个限制。 具体实施的方法如下: 在host network namesapces下新增 一个macvlan device,然后添加路由规则即可。 通信的两个方向简单解释如下: eth0(host) -> pod(macvlan) 宿主机host eth0 通过break0 设备 和route table的路由规则 可以访问到pod(在macvlan中) shell调试脚本如下: 1 2 3 4 5 6 ip link add break0 link eth0 type macvlan mode bridge # NOTE: if use /24 CIDR will auto add a route rule # (100.75.30.0/24 dev break0 proto kernel scope link src 100.75.30.1) # which we don't need ifconfig break0 100.75.30.7/32 up ip r a 100.75.30.71 dev break0 # 100.75.30.71 is a pod ip for test 因为kuryr是用python配置网络的,所以也提供对应的python脚本如下: ...

March 11, 2019 · datewu

无法创建macvlan设备

最近给客户调试 macvlan network时,遇到了Linux kernel 报错 SIOCSIFFKAGS: Device or resource busy. 无法创建网络device。 结果长时间的debug分析, 发现问题是高并发压测 创建和释放macvlan device的时候,设备的mac address出现了重复。 ps:这个问题只出现在 macvlannetwork 的设备中。 可以用下面的shell脚本来复现macvlan Device or resource busy的错误: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash function setup { i=$1 ip l a m$i address 00:40:2F:4D:5E:6F link eth0 type macvlan mode bridge ip netns add ns$i ip l set m$i netns ns$i sleep 1 ip netns exec ns$i ifconfig m$i 10.0.0.$((i+1))/24 up echo $? } echo cleaning up ip -all netns d echo creating netsnses for i in `seq $1`; do echo $i.... #setup $i & setup $i done 如果把 macvlan 类型改为 dummy (上面脚本第5行 type macvlan 改为 type dummy) ,即使 MAC address 重复也不会引发kernel 报错。 ...

March 7, 2019 · datewu