Ubuntu Overlay 虚拟机搭建指南
一、目标与架构选择
- 常见“Overlay”有两类:一类是容器跨主机通信的Docker Overlay 网络,另一类是虚拟化/SDN中的二层/三层 Overlay 网络(如基于Open vSwitch OVN)。前者运行在容器引擎之上,后者运行在宿主机/虚拟机网络栈之上。
- 典型架构对比:
- Docker Overlay:依赖键值存储(如Consul)或内置集群,创建VXLAN隧道承载容器跨主机流量,适合容器工作负载。
- OVN/OVS Overlay:在宿主机上用OVN编排OVS流表,通过Geneve/VXLAN封装,适合虚拟机或裸金属的多租户网络。
二、方案一 Docker Overlay 在虚拟机中的搭建
- 适用场景:多台运行 Ubuntu 的虚拟机,需要在其上运行的容器实现跨主机互联。
- 步骤
- 环境准备(两台以上 Ubuntu 虚拟机)
- 安装 Docker:sudo apt-get update && sudo apt-get install -y docker.io
- 允许管理流量通过本地端口(示例用端口2375;生产建议启用 TLS):
- /etc/docker/daemon.json 增加:
{
“cluster-store”: “consul://<KV_IP>:8500”,
“cluster-advertise”: “<本机管理IP>:2375”
}
- 重启:sudo systemctl daemon-reload && sudo systemctl restart docker
- 部署键值存储(Consul)
- 在其中一台虚拟机启动 Consul(单机演示):
nohup consul agent -server -bootstrap -ui -client=0.0.0.0 -bind=<本机IP> -data-dir=/opt/consul >/var/log/consul.log 2>&1 &
- 浏览器访问 http://<KV_IP>:8500 检查成员与健康状态。
- 创建 Overlay 网络
- 在任一节点执行:
docker network create -d overlay --subnet 10.22.1.0/24 --gateway 10.22.1.1 my_overlay_network
- 启动容器并验证
- 在不同虚拟机上分别运行容器并接入同一 Overlay 网络:
docker run -d --name c1 --net my_overlay_network ubuntu:24.04 sleep infinity
docker run -it --rm --net my_overlay_network ubuntu:24.04 ping <另一容器的IP>
- 如需固定 IP:docker run -d --name c2 --net my_overlay_network --ip 10.22.1.10 ubuntu:24.04
- 常见问题
- 管理端口未开放或防火墙阻断(放行2375/8500等)。
- 各节点时间不同步(建议安装并启用 chrony/ntp)。
- 使用自签名证书或启用 TLS 时,需正确配置 Docker 客户端证书。
三、方案二 基于 OVS/OVN 的虚拟机 Overlay 搭建
- 适用场景:需要在虚拟机层面提供二层/三层隔离与跨主机互联,可叠加安全组、ACL 等能力。
- 步骤(两台以上 Ubuntu 宿主机/虚拟机)
- 安装基础组件
- sudo apt-get update
- sudo apt-get install -y openvswitch-switch qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
- 部署 OVN(简化路径)
- 安装 OVN(Ubuntu 22.04/24.04 常见可用版本):
sudo apt-get install -y ovn-central ovn-host
- 初始化北向/南向数据库(在“Central”节点):
sudo ovn-nbctl set-connection ptcp:6641:0.0.0.0
sudo ovn-sbctl set-connection ptcp:6642:0.0.0.0
- 配置 OVN 逻辑网络
- 在 Central 节点创建逻辑交换机与端口(示例):
sudo ovn-nbctl ls-add ls1
sudo ovn-nbctl lsp-add ls1 vm1-port
sudo ovn-nbctl lsp-set-addresses vm1-port 00:00:00:00:00:01
sudo ovn-nbctl lsp-set-port-security vm1-port 00:00:00:00:00:01
- 将宿主机接入(在每台宿主机执行,<本机IP> 为管理 IP):
sudo ovs-vsctl set open . external-ids:ovn-remote=tcp:<Central_IP>:6642
sudo ovs-vsctl set open . external-ids:ovn-encap-type=geneve,vxlan
sudo ovs-vsctl set open . external-ids:ovn-encap-ip=<本机IP>
sudo systemctl restart ovn-controller
- 在虚拟机中接入
- 使用 libvirt 创建 VM,将网卡连接到由 OVS 管理的网桥(如 br-int 或自定义桥),并在 OVN 中将对应端口加入逻辑交换机 ls1。
- 为 VM 配置静态 MAC(如上 00:00:00:00:00:01),便于 OVN 学习转发。
- 验证
- 在 VM 内互 ping;在 Central 节点查看逻辑拓扑与端口绑定:
sudo ovn-nbctl show
sudo ovn-sbctl show
- 说明
- OVN 支持 Geneve/VXLAN 封装、分布式逻辑路由、ACL 等;生产可结合 OVSDB 高可用与证书认证。
四、快速对比与选型建议
| 维度 |
Docker Overlay |
OVS/OVN Overlay |
| 工作层级 |
容器网络之上 |
宿主机/虚拟机网络之上 |
| 依赖组件 |
Docker + KV(如 Consul) |
OVS + OVN |
| 封装协议 |
常见为 VXLAN |
Geneve/VXLAN |
| 适用对象 |
容器跨主机互联 |
虚拟机/裸金属多租户网络 |
| 配置复杂度 |
低-中 |
中-高 |
| 典型场景 |
微服务、开发测试 |
NFV、多租户云、复杂网络策略 |
五、常见问题与排障要点
- 端口与连通性
- Docker Overlay:放行 2375/8500(或启用 TLS 的相关端口);Consul UI 端口 8500 用于健康检查。
- OVN:放行 6641/6642(OVN NB/SB),以及 Geneve(6081)/VXLAN(4789) 等封装端口;确保管理网络互通。
- 时间同步
- 多节点环境务必启用 chrony/ntp,否则 KV/数据库一致性会受影响。
- 防火墙与安全
- 生产环境不要长期开放未加密的管理端口;Docker 建议启用 TLS;OVN 可结合 RBAC/证书。
- 虚拟化网络模式
- 若使用 libvirt/KVM,优先使用桥接到 OVS 的方式接入 Overlay,而非 NAT,以避免额外 NAT 影响与策略复杂性。
- 日志与诊断
- Docker:journalctl -u docker;Consul:/var/log/consul.log;OVN:ovn-nbctl/ovn-sbctl show、ovs-vsctl show、journalctl -u ovn-controller。