openstack 的软路由,虚拟机port已经在用internal port来接入ovs bridge,而且在性能上确实比veth-pair有提升
ovs-internal-port 11.1-11.4Gb/s (1 process) 12.9-13.3Gb/s (4 process)
veth-pair-device 10.8-11.0Gb/s (1 process) 11.8-12.2Gb/s (4 process)
但是k8s获取pod ip的方式就是通过 eth0来获取的,这是一个硬编码。
# kubelet's GetPodIPs function()
nsenter --net=/var/run/netns/ ip -o -4 addr show dev eth0 scope global
这样就要求pod内部必须要有一个eth0网卡。
为了使用internal port,
可以先创建port,接入到br-int,(不同pod使用不同的port 名)
然后将该port设备,放入pod ns内部,并进行重命名。
ip link set ‘port-name’ netns ‘pod-net-ns’
# 为了让 GetPodIPs获取到ip,就必须把这个port 重命名为eth0
ip netns exec ‘pod-net-ns’ ip link set dev ‘port-name’ name eth0 up
那么问题来了,当创建新的port的时候,或者重启openvswitch。
已经配置好的port就会从pod ns内部移出。 这样就会导致网络问题。
如果不这样做,就需要采用两个网卡的方案,用原生port名直接放进去,配置好ip,然后弄一个dummy eth0网卡,也配上ip。
但是这个逻辑又过于复杂,pod内部多网卡也不够简洁。
结论: ovs 对internal 网卡的重命名支持的不够好。
网友评论