在Linux系统上Open vSwitch具有网络命名空间的基本支持。允许ovs-vswitchd守护进程,在端口移动到另外的网络命名空间后,仍可继续跟踪其状态和统计信息。
如何工作
守护进程ovs-vswitchd运行在所谓的父辈网络命名空间中。它侦听来自所有网络命名空间(netns)的netlink事件消息,这些网络命名空间需要在父被命名空间中有标识符。每个netlink消息都包含网络命名空间标识符(netnsid)作为辅助数据,用于匹配事件到相应的端口。
ovs-vswitch使用扩展的openvswitch内核API [1]_ 获取指定端口的当前netnsid(存储在结构体 netdev_linux中)和统计信息。在发生更改事件之前,例如,当端口移动到另一个网络命名空间时接收。netnsid一直缓存在用户空间中。
当端口移动到另外的命名空间之后,ovs-vswitchd使用另一个扩展的内核API [2]_,从其命名空间中获取端口的信息,例如,flags、MTU、MAC地址和ifindex。
上游内核4.15以及包含命名空间基本支持的必要改动。如果正在运行的内核不提供上述API,那么守护进程将回滚会之前的行为。
… [1] 请求命令: OVS_VPORT_CMD_GET, 属性: OVS_VPORT_ATTR_NETNSID
… [2] 请求命令: RTM_GETLINK 传入 IFLA_IF_NETNSID 属性.
限制
目前只能获取以上章节列出的端口信息。大多数其它操作,例如查询MII或设置MTU,由于内核中缺少适当的API,因此它们仍然不被支持。
在大多数需要将端口移动到其它网络命名空间的用例中,应该使用veth对来代替,因为它提供了一个更干净和更健壮的无明显性能损失的解决方案。