1. 先搞清楚 OpenStack 网络配置到底在解决什么问题
OpenStack 的网络配置,是很多人在搭建私有云时最容易卡住、也最影响后续使用体验的环节。它解决的远不止是“让虚拟机通网”这么简单,核心是在物理服务器集群上,虚拟化出一套可以按需创建、隔离、互联、并连接到外网的复杂网络环境。
如果你只是自己学习,或者想快速验证某个功能,网络配置的复杂性可能会让你觉得无从下手。但如果你要搭建一个能用的、甚至准备用于生产测试的环境,那么理解 Neutron(OpenStack 的网络组件)的模型就至关重要。它决定了你的虚拟机如何互相访问、如何上外网、不同租户(项目)的网络如何隔离,以及如何实现负载均衡、防火墙等高级服务。
很多人照着教程一步步做,虚拟机创建出来了,但就是 ping 不通网关或者外网,问题十有八九出在网络配置这一步的理解偏差上。所以,这篇文章不会只给你一堆命令,我会结合最常见的部署场景(比如在几台物理机或虚拟机上用 Kolla-Ansible 或手动安装),带你理清从物理网卡到虚拟网络的完整数据流向。最关键的是,我会告诉你每一步配置背后的意图,以及配置后如何验证,这样出了问题你才知道该看哪里。
2. 部署前必须明确的物理与逻辑网络规划
在敲下任何安装命令之前,规划是避免后期混乱和排错痛苦的最好方法。OpenStack 的网络模型是分层的,你需要根据你的硬件和需求,决定这些网络层如何映射到物理网卡上。
2.1 理解三种核心网络类型
在典型的 OpenStack 部署中,我们主要关注三类网络:
- 管理网络(Management Network):这是 OpenStack 各个服务组件(如 Nova、Neutron、Glance 等)之间相互通信的网络。比如 Nova 需要告诉 Neutron 为虚拟机创建端口。这个网络要求低延迟、高可靠,通常部署在一个独立的、安全的局域网段内。在实验环境中,它经常和“内部”网络共用一张网卡。
- 租户网络(Tenant/Project Network):这是虚拟机之间通信的网络,也是 Neutron 主要管理的对象。它可以是纯虚拟的(VXLAN, GRE),也可以是基于 VLAN 的。这是配置的重点和难点,因为它直接关系到虚拟机的连通性。
- 外部网络(External/Provider Network):这是虚拟机访问 OpenStack 集群外部(如互联网)的通道。它需要绑定到有外部路由的物理网卡上。创建浮动 IP(Floating IP)并将其关联到虚拟机,就是让虚拟机通过这个网络与外界通信。
对于学习或 PoC(概念验证)环境,常见的一种简化模型是“三合一”或“二合一”,即把管理、租户隧道(VXLAN)、外部网络流量通过不同的 VLAN 或 IP 子网,复用到同一对物理网卡(做 Bonding)或单个网卡上。但对于追求性能和隔离的生产环境,建议用独立的物理网卡。
2.2 物理节点角色与网络需求
你的集群里通常有三种节点:
- 控制节点(Controller):运行核心 API 服务和 Neutron Server。它需要接入管理网络,如果使用集中式路由(传统模式),它可能还需要接入外部网络。
- 计算节点(Compute):运行虚拟机。它必须接入管理网络(与控制器通信)和租户网络隧道(承载虚拟机数据流量)。如果使用分布式虚拟路由(DVR)模式,它也需要接入外部网络。
- 网络节点(Network):运行 Neutron 的 L3 Agent(路由器)、DHCP Agent、Metadata Agent 等。在传统架构中,它负责连接租户网络和外部网络,因此需要接入管理网络、租户隧道网络和外部网络。在 DVR 架构中,这个节点的角色可以弱化。
对于初学者,我强烈建议从“单节点”或“控制+计算双节点”的 All-in-One 部署开始。这样网络配置最简单,所有流量都在同一台机器内部流转,便于理解基本概念和排查问题。Kolla-Ansible 或 DevStack 等工具非常适合这种场景。
2.3 记录你的规划表
动手前,画个简单的表格填好,这能救命:
| 网络类型 | 物理网卡 | VLAN ID (如使用) | IP 网段示例 | 用途说明 |
|---|---|---|---|---|
| 管理网络 | eth0或bond0 | 无或特定 VLAN | 172.16.0.0/24 | OpenStack 服务间通信 |
| 租户隧道网络 | eth1或bond0(VLAN) | 如101 | 192.168.100.0/24 | 虚拟机间 VXLAN/GRE 隧道流量 |
| 外部网络 | eth2或bond0(VLAN) | 如102 | 使用物理网络现有段,如10.10.10.0/24 | 虚拟机访问外网 |
注意:示例 IP 段请根据你的实际环境修改,务必避免与现有网络冲突。
3. 底层系统网络配置(以 CentOS 7/8 为例)
无论你用哪种方式部署 OpenStack(手动、Kolla-Ansible、RDO),底层的 Linux 系统网络必须是正确配置的。这里以 CentOS 7 为例,Ubuntu 的思路类似,只是配置文件路径和工具(netplan)不同。
3.1 配置静态 IP 与管理网络
假设你规划管理网卡是eth0,IP 是172.16.0.10。
编辑网络配置文件:
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0配置文件内容示例:
TYPE=Ethernet BOOTPROTO=none # 静态配置 NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=172.16.0.10 NETMASK=255.255.255.0 # 或使用 PREFIX=24 GATEWAY=172.16.0.1 # 你的管理网络网关 DNS1=8.8.8.8 # 你的 DNS 服务器对于 CentOS Stream 9/RHEL 9,可能使用
nmcli或/etc/NetworkManager/system-connections/下的 keyfile 配置,但原理相通:设置静态 IP、网关、DNS。重启网络服务:
sudo systemctl restart network # CentOS 7 # 或 sudo nmcli connection reload && sudo nmcli connection up eth0验证:
ip addr show eth0 # 查看 IP 是否配置正确 ping -c 4 172.16.0.1 # 测试网关连通性 ping -c 4 8.8.8.8 # 测试外网连通性(如果网关允许)
3.2 配置网卡 Bonding(可选但推荐)
如果服务器有多块网卡,为了冗余和带宽,建议配置 Bonding。这里以 mode=4 (802.3ad LACP) 为例,需要交换机配合。
安装必要工具(通常已内置):
sudo yum install -y teamd创建 Bonding 接口配置文件
/etc/sysconfig/network-scripts/ifcfg-bond0:TYPE=Bond BOOTPROTO=none NAME=bond0 DEVICE=bond0 ONBOOT=yes BONDING_MASTER=yes BONDING_OPTS="mode=4 miimon=100 lacp_rate=1" IPADDR=172.16.0.10 NETMASK=255.255.255.0 GATEWAY=172.16.0.1配置从属网卡,如
eth0和eth1,修改其配置文件,内容类似:TYPE=Ethernet BOOTPROTO=none NAME=eth0 DEVICE=eth0 ONBOOT=yes MASTER=bond0 SLAVE=yes重启网络并验证:
sudo systemctl restart network cat /proc/net/bonding/bond0 # 查看 Bonding 状态,确认 slave 接口已激活
3.3 配置 VLAN 子接口(如果需要)
如果你的租户隧道或外部网络通过 VLAN 承载在同一个物理/Bonding 接口上,需要配置 VLAN 子接口。例如,在bond0上配置 VLAN 101 用于 VXLAN 隧道。
创建配置文件/etc/sysconfig/network-scripts/ifcfg-bond0.101:
TYPE=Vlan BOOTPROTO=none NAME=bond0.101 DEVICE=bond0.101 ONBOOT=yes VLAN=yes VLAN_ID=101 PHYSDEV=bond0 IPADDR=192.168.100.10 # 隧道端点 IP,计算节点间需能互通 NETMASK=255.255.255.0配置后同样需要重启网络服务。
关键验证点:确保所有节点间的管理网络 IP和隧道网络 IP(如果配置了)能够互相 ping 通。这是 OpenStack 集群通信的基础。
4. OpenStack Neutron 核心配置详解
系统底层网络通了,接下来是 OpenStack 层面的配置。这里以手动安装或通过 Kolla-Ansible 部署为例,讲解核心概念和配置文件。
4.1 选择 Neutron 的虚拟网络类型
这是最重要的选择之一,决定了数据平面的实现方式。
- VLAN:性能最好,最接近物理网络,但需要交换机支持且 VLAN 资源有限(4096个)。适合对性能要求高、网络结构清晰的场景。
- VXLAN:目前最流行的选择。通过 UDP 封装创建大量虚拟网络(约1600万个),无需交换机特殊配置,纯软件实现。性能稍低于 VLAN,但灵活性强。对于大多数学习和测试环境,我建议首选 VXLAN。
- GRE:另一种隧道协议,比 VXLAN 头部开销小,但某些网络设备可能不支持 GRE 穿透。
在 Neutron 配置中,这对应于ml2_conf.ini文件中的[ml2]部分:
[ml2] type_drivers = flat,vlan,vxlan,gre # 启用的类型驱动 tenant_network_types = vxlan # 租户网络默认创建的类型 mechanism_drivers = openvswitch,l2population # 机制驱动,常用 OVS4.2 配置 Open vSwitch (OVS) 与物理网卡映射
Neutron 通过 OVS 或 Linux Bridge 来创建虚拟交换机。OVS 功能更强大,是主流选择。
你需要告诉 Neutron,哪个物理网卡(或 Bridge)用于连接外部网络。这是在ml2_conf.ini和计算/网络节点的openvswitch_agent.ini中配置。
在计算节点和网络节点上,配置/etc/neutron/plugins/ml2/openvswitch_agent.ini:
[ovs] bridge_mappings = external:br-ex # 映射名:网桥名 # local_ip 是 VXLAN 隧道端点的 IP,必须填写正确! local_ip = 192.168.100.10 # 这是前面配置的隧道网络 IP [agent] tunnel_types = vxlan # 隧道类型 l2_population = true # 启用 L2 Population,优化广播流量bridge_mappings是关键。external是一个逻辑标签,br-ex是你在节点上创建的 OVS 网桥。你需要手动创建这个网桥,并把对应的物理网卡(比如eth2或bond0.102)加进去。
创建 br-ex 并绑定物理接口的命令示例:
sudo ovs-vsctl add-br br-ex sudo ovs-vsctl add-port br-ex eth2 # 将物理网卡 eth2 加入 br-ex # 注意:将物理网卡加入 OVS 桥后,该网卡的原 IP 配置会失效,IP 需要配置到 br-ex 上。 sudo ip addr add 10.10.10.10/24 dev br-ex # 为 br-ex 配置外部网络 IP sudo ip link set br-ex up4.3 配置 L3 Agent 与外部网络连接
L3 Agent 运行在网络节点(或开启了 DVR 的计算节点)上,负责路由和 NAT,让租户网络能访问外网。
配置/etc/neutron/l3_agent.ini:
[DEFAULT] interface_driver = openvswitch external_network_bridge = br-ex # 这里填写映射的外部网桥 gateway_external_network_id = # 通常留空,自动处理4.4 配置 DHCP 与 Metadata Agent
DHCP Agent 为租户网络内的虚拟机分配 IP。Metadata Agent 提供 cloud-init 获取元数据的通道。
/etc/neutron/dhcp_agent.ini:
[DEFAULT] interface_driver = openvswitch dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq enable_isolated_metadata = true/etc/neutron/metadata_agent.ini:
[DEFAULT] nova_metadata_host = 172.16.0.10 # 控制节点的管理 IP metadata_proxy_shared_secret = your_secret_key # 需要与 Nova 配置一致4.5 使用 Kolla-Ansible 的简化配置
如果你使用 Kolla-Ansible,上述大部分细节被封装在了 Ansible 变量中。你主要需要关注全局配置文件/etc/kolla/globals.yml:
kolla_internal_vip_address: "172.16.0.100" # 内部 VIP,用于高可用 network_interface: "eth0" # 管理网络接口 neutron_external_interface: "eth2" # 外部网络物理接口 # Kolla 会自动帮你创建 br-ex 并绑定 eth2 neutron_plugin_agent: "openvswitch" # 使用 OVS enable_neutron_provider_networks: "yes" # 启用外部网络 neutron_type_drivers: "flat,vlan,vxlan" # 网络类型 neutron_tenant_network_types: "vxlan" # 租户网络类型然后通过kolla-ansible deploy运行,工具会自动生成并应用所有配置。这是最推荐给新手的部署方式,能避免大量手动配置错误。
5. 创建与验证 OpenStack 网络资源
服务配置好并启动后,需要通过 OpenStack CLI 或 Dashboard 创建网络资源。这是检验配置是否成功的最终步骤。
5.1 创建 Provider(外部)网络
外部网络映射到底层的物理网络。在控制节点上操作:
source /path/to/your/admin-openrc.sh # 加载管理员权限环境变量 # 创建外部网络,类型为 flat,对应物理网络标签 ‘external’ openstack network create --external --provider-network-type flat --provider-physical-network external ext-net # 创建外部子网,指定网关、DHCP 池范围 openstack subnet create --network ext-net --subnet-range 10.10.10.0/24 --gateway 10.10.10.1 --allocation-pool start=10.10.10.100,end=10.10.10.200 --no-dhcp ext-subnet--provider-physical-network external必须与bridge_mappings = external:br-ex中的external标签一致。--no-dhcp是因为外部网络通常由物理网络中的路由器提供 DHCP。
5.2 创建租户网络与路由器
创建租户网络(类型为 VXLAN):
openstack network create private-net openstack subnet create --network private-net --subnet-range 192.168.200.0/24 --gateway 192.168.200.1 private-subnet这会在 Neutron 内部创建一个 VXLAN 网络
private-net,并分配子网192.168.200.0/24。创建路由器并连接内外网:
openstack router create my-router # 将路由器内部接口连接到租户子网 openstack router add subnet my-router private-subnet # 将路由器外部网关设置为外部网络 openstack router set --external-gateway ext-net my-router这个操作触发了 L3 Agent 在网络节点(或计算节点)上创建了一个命名空间(如
qrouter-xxx),并在其中配置了路由和 NAT。
5.3 启动虚拟机并验证连通性
创建虚拟机,将其网络连接到
private-net。openstack server create --flavor m1.small --image cirros --nic net-id=$(openstack network show private-net -c id -f value) test-vm-1获取虚拟机 IP:
openstack server show test-vm-1 -c addresses -f value输出类似
private-net=192.168.200.2。验证网络连通性:
- 从外部网络 ping 虚拟机(需要浮动 IP):先创建浮动 IP 并关联。
然后从你的办公电脑(能访问openstack floating ip create ext-net # 假设分配的浮动 IP 是 10.10.10.101 openstack server add floating ip test-vm-1 10.10.10.10110.10.10.0/24网络)ping10.10.10.101。 - 从虚拟机 ping 外网:这需要虚拟机内部操作。你可以通过 VNC 登录,或者如果镜像支持,使用
openstack console log查看启动日志获取密码,然后通过浮动 IP SSH 登录。# 在虚拟机内部执行 ping -c 4 8.8.8.8
- 从外部网络 ping 虚拟机(需要浮动 IP):先创建浮动 IP 并关联。
5.4 关键排错检查点
如果网络不通,按以下顺序排查:
- 虚拟机状态:
openstack server list查看虚拟机是否处于ACTIVE状态。 - 虚拟机端口:
openstack port list --server <vm-id>查看端口状态是否为ACTIVE,IP 是否正确。 - Neutron 代理状态:
openstack network agent list确保所有相关 Agent(OVS, L3, DHCP)都是UP状态。 - OVS 流表与网桥:
确认计算节点上,虚拟机的 tap 设备(如sudo ovs-vsctl show # 查看网桥和端口绑定 sudo ovs-ofctl dump-flows br-int # 查看集成网桥流表(较复杂)tap12345678-xx)是否正确地连接到了br-int网桥。 - 路由器命名空间:在网络节点上(如果使用集中式路由):
sudo ip netns list # 查看命名空间,应有 qrouter-xxx sudo ip netns exec qrouter-xxx ip addr # 查看路由器内部接口 IP sudo ip netns exec qrouter-xxx ping 192.168.200.2 # 从路由器 ping 虚拟机 - 安全组规则:默认安全组禁止所有入站流量。确保你添加了允许 ICMP 和 SSH 的规则。
openstack security group rule create --proto icmp default openstack security group rule create --proto tcp --dst-port 22 default - 物理连接与防火墙:检查物理网线、交换机 VLAN 配置、以及宿主机防火墙(
firewalld或iptables)。OpenStack(尤其是 OVS)会管理自己的 iptables 规则,不建议在宿主机上启用过于严格的防火墙,可能会阻断 VXLAN 隧道(UDP 4789 端口)或 Geneve 端口。
6. 高级话题与生产环境考量
当基础网络跑通后,你可能会遇到更复杂的需求。
6.1 分布式虚拟路由 (DVR)
传统架构中,所有东西向和南北向流量都经过网络节点,容易形成瓶颈。DVR 将路由功能分散到各个计算节点,大幅提升性能。
启用 DVR需要在ml2_conf.ini中配置:
[ml2] mechanism_drivers = openvswitch,l2population [ml2_ovs] enable_distributed_routing = true [l3_agent] agent_mode = dvr_snat # 在计算节点上设为 dvr,在网络节点上设为 dvr_snat启用后,计算节点上也会出现qrouter-xxx命名空间,负责本节点虚拟机的路由。外部网络 SNAT 仍可能由网络节点负责(dvr_snat模式)。
6.2 负载均衡即服务 (LBaaS)
OpenStack Neutron 可以通过 Octavia 项目提供负载均衡服务。它允许你在租户网络内创建负载均衡器,将流量分发到后端的多个虚拟机。配置涉及octavia组件的安装、Amphora 虚拟机镜像的配置等,比较复杂,通常由部署工具(如 Kolla-Ansible)集成完成。
6.3 网络高可用 (HA)
生产环境要求网络服务高可用。
- 控制节点高可用:通过 MariaDB Galera、RabbitMQ 镜像队列、HTTP 服务负载均衡(HAProxy + Keepalived)实现。
- 网络节点高可用:使用 VRRP(如 Keepalived)实现 L3 Agent 的故障转移。多个网络节点同时运行 L3 Agent,通过 VRRP 协议选举 Master,对外共享一个虚拟 IP。当 Master 宕机时,Backup 接管。
- 计算节点网络高可用:主要通过 Bonding 多网卡聚合实现链路冗余。
6.4 性能调优与监控
- MTU 设置:如果使用 VXLAN/GRE 隧道,需要调整物理网络和虚拟网络的 MTU(通常减少 50-100 字节以容纳隧道头部),避免分片影响性能。
- OVS-DPDK:对网络性能有极致要求时,可以使用 OVS-DPDK 绕过内核协议栈,但配置复杂,对 CPU 亲和性、大页内存有要求。
- 监控:监控 Neutron 各个 Agent 的状态、消息队列深度、OVS 流表数量、网络命名空间内的连接数等。集成 Prometheus 和 Grafana 是常见做法。
OpenStack 网络配置是一个系统工程,从底层物理连线到上层虚拟资源创建,环环相扣。我的建议是,第一次部署时,严格遵循一个经过验证的、简单的部署指南(如 Kolla-Ansible 的 All-in-One),先把整个流程跑通。在成功创建出能上网的虚拟机后,再回头去研究每一步的配置文件,并尝试修改参数(如将 VXLAN 改为 VLAN)来观察变化。遇到问题时,善用openstack命令、ovs-vsctl/ovs-ofctl命令和ip netns命令,结合日志文件(/var/log/neutron/*.log),从虚拟机端口 -> 虚拟交换机 -> 虚拟路由器 -> 物理网桥的路径逐层排查,思路会清晰很多。