为什么要这么做?

  • 容器化的话,安装和卸载一些网络功能就不至于留下一地狼藉了。想象一下你编译一些稀奇古怪的软件后留下一些自己都不知道的无用依赖。或者用包管理卸载软件但卸载不干净,还是会留下一些无用依赖浪费空间。

  • 更灵活的网络功能编排。我可以轻松地安排一台或多台完全功能的,独立的虚拟路由器,让它们运行在不同的网络命名空间里。

物理规格的展望?

  • 至少两张物理网卡
  • 一张连接到宿主机的网络协议栈的默认网络命名空间,用作带外管理
  • 一张用于业务网络,最好支持 SR-IOV ,不排除用户有一些更疯狂的展望

宿主机上要装什么?

  • Debian 12 这样的主流 Linux 发行版
  • 容器运行时,像 Docker 这样的
  • dnsmasq ,用来给连接带外管理口的管理工作站动态分配地址

怎么实现路由器功能?

在宿主机上创建至少一个业务网络命名空间,并让虚拟路由器功能容器使用它。

我目前想到了两种路线:

  • 路线 A:控制与数据平面运行在同一容器中,使用 Linux 自带的网络协议栈
    • 需要高级路由功能就找 BIRD ,FRR 的容器,不需要就随便拉个原装镜像,自己弄弄路由相关的启动配置
  • 路线 B:控制与数据平面分离,使用高性能用户态网络协议栈作为数据平面(如 VPP )

网络功能如何运行在容器里?

  • 将它们放到业务网络命名空间中
  • 你弄了个 PPPoE 客户端容器,你在上面建立了连接,这个接口也会出现在路由器容器里面
  • 运行一个 dnsmasq 容器,它能够使用路由器容器相同网络空间中的套接字

运行虚拟机?

  • 更改虚拟机网络的命名空间连接路由器容器所在网络
  • SR-IOV VF 附加到虚拟机和路由器容器上,高效交换数据
举报· 618 次点击
登录 注册 站外分享
5 条回复  
465456 小成 3 小时前
openwrt 里面装个 docker
CatCode 小成 3 小时前
想法很好 就差一个程序员来写了
CatCode 小成 3 小时前
@465456 不建议这么做,因为 docker 会影响 openwrt 的 UDP
maybeonly 小成 3 小时前
并不疯狂,我已经用了好多年了,运行良好,方便折腾。 在 netns (容器)之间转发的数据和一般的来自外部网卡的数据,对于内核来说有略微的不同,可能线路 B 会遇到这方面的问题。 我的做法是,直接在母鸡上操作各 netns (容器)的网络设置……比较暴力,但是省事——都在一起了,还折腾什么鸟( bird )事? 以及,只有容器的话不是很需要 SR-IOV 的感觉。 而且我在很多场景下只分了 netns 。 还有一个坑,做这种东西的时候不可避免的会用到 iptables/nft ,特别是 iptables 因为内核版本的差异可能根本不好用,者也是只虚拟化 netns 的一大原因(其实刚开始做这套的时候才是 centos7 ,那时候默认还只是传统的 iptables )
Immunize 初学 2 小时前
挺好的,可以了解下 SONiC ,大厂的自研白盒交换机就是基于 SONiC + 一堆容器服务实现的。
返回顶部