1
2
3
4
5
6
7
作者:李晓辉

联系方式:

微信:Lxh_Chat

邮箱:939958092@qq.com

前言

在云计算环境中,网络服务是实现虚拟机之间以及虚拟机与外部网络通信的关键组件。OpenStack作为一个功能强大的开源云平台,提供了灵活的网络管理解决方案。Open vSwitch(OVS)作为一种高性能的虚拟交换技术,支持复杂的网络拓扑和高级特性,如VLAN、VXLAN等,适用于需要高可扩展性和灵活性的网络环境。本文将详细介绍如何在OpenStack环境中安装和配置Open vSwitch网络机制,帮助你实现虚拟网络的高效管理和灵活配置。

Open vSwitch网络机制概述

Open vSwitch的作用

Open vSwitch(OVS)是一种生产级的、多层虚拟交换机,专为虚拟化环境设计,支持多种网络拓扑和高级特性。其主要功能包括:

  1. 高性能虚拟交换:提供高性能的虚拟网络连接,支持大规模虚拟机部署。

  2. VLAN和VXLAN支持:支持VLAN和VXLAN技术,实现网络隔离和扩展。

  3. 灵活的网络拓扑:支持复杂的网络拓扑,满足不同场景下的网络需求。

  4. 安全组管理:通过安全组规则控制虚拟机之间的流量,保障虚拟机的安全。

  5. 与计算服务集成:与Nova服务紧密集成,为虚拟机提供网络连接,确保虚拟机能够正常访问网络资源。

Open vSwitch的工作原理

Open vSwitch通过以下机制实现虚拟网络的管理:

  1. 虚拟接口绑定:将虚拟机的虚拟接口绑定到虚拟交换机上,实现虚拟机之间的网络连接。

  2. 数据包转发:根据流表(flow table)进行数据包转发,支持复杂的流量工程。

  3. VLAN和VXLAN封装:支持VLAN和VXLAN封装,实现网络隔离和扩展。

  4. 安全组规则:通过安全组规则控制虚拟机之间的流量,确保网络通信的安全性。

Open vSwitch的架构

Open vSwitch的架构包括以下几个主要组件:

  1. ovs-vswitchd:核心守护进程,负责管理虚拟交换机和数据包转发。

  2. ovsdb-server:数据库服务,存储虚拟交换机的配置信息。

  3. ovs-ofctl:命令行工具,用于管理和配置OpenFlow流表。

  4. ovs-dpctl:命令行工具,用于管理和配置数据路径。

通过以上机制和组件,Open vSwitch能够为OpenStack环境中的虚拟机提供高性能、灵活且安全的虚拟网络连接。接下来我将详细介绍如何在OpenStack环境中安装和配置Open vSwitch网络机制。

安装配置OpenvSwitch网络机制

在OpenStack环境中,选择合适的网络后端对于构建高效、灵活的虚拟网络至关重要。Open vSwitch(OVS)作为一种高性能的虚拟交换技术,支持复杂的网络拓扑和高级特性,如VLAN、VXLAN等,适用于需要高可扩展性和灵活性的网络环境。本文将详细介绍如何在OpenStack环境中安装和配置Open vSwitch网络机制,帮助你实现虚拟网络的高效管理和灵活配置。此处选择了Open vSwitch网络以及Option 2,即支持租户自建网络、路由器的模式,而不是直连外网的模式。

安装Open vSwitch相关软件包

1
2
yum install -y openstack-neutron openstack-neutron-ml2 \
openstack-neutron-openvswitch ebtables

准备配置文件

/etc/neutron/neutron.conf 是网络服务的主配置文件,用于定义核心插件、服务插件、消息队列、数据库连接以及身份认证等基本信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
crudini --set /etc/neutron/neutron.conf DEFAULT core_plugin ml2
crudini --set /etc/neutron/neutron.conf DEFAULT service_plugins router
crudini --set /etc/neutron/neutron.conf DEFAULT transport_url rabbit://openstack:LiXiaohui@controller
crudini --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone
crudini --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_status_changes true
crudini --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_data_changes true
crudini --set /etc/neutron/neutron.conf DEFAULT allow_overlapping_ips true
crudini --set /etc/neutron/neutron.conf DEFAULT rpc_backend rabbit
crudini --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_host controller
crudini --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_userid openstack
crudini --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_password LiXiaohui
crudini --set /etc/neutron/neutron.conf database connection mysql+pymysql://neutron:LiXiaohui@controller/neutron
crudini --set /etc/neutron/neutron.conf keystone_authtoken www_authenticate_uri http://controller:5000
crudini --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:5000
crudini --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000
crudini --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211
crudini --set /etc/neutron/neutron.conf keystone_authtoken auth_type password
crudini --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name Default
crudini --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name Default
crudini --set /etc/neutron/neutron.conf keystone_authtoken project_name service
crudini --set /etc/neutron/neutron.conf keystone_authtoken username neutron
crudini --set /etc/neutron/neutron.conf keystone_authtoken password LiXiaohui
crudini --set /etc/neutron/neutron.conf nova region_name RegionOne
crudini --set /etc/neutron/neutron.conf nova project_domain_name Default
crudini --set /etc/neutron/neutron.conf nova project_name service
crudini --set /etc/neutron/neutron.conf nova auth_type password
crudini --set /etc/neutron/neutron.conf nova user_domain_name Default
crudini --set /etc/neutron/neutron.conf nova auth_url http://controller:5000
crudini --set /etc/neutron/neutron.conf nova username nova
crudini --set /etc/neutron/neutron.conf nova password LiXiaohui
crudini --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp

或者

1
2
3
4
5
6
7
8
9
10
[DEFAULT]
...
core_plugin = ml2
service_plugins = router
transport_url = rabbit://openstack:LiXiaohui@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
allow_overlapping_ips = True
rpc_backend = rabbit
  • core_plugin = ml2
    指定 Neutron 的核心插件为 ml2(Modular Layer 2),这是一个模块化的网络服务插件,支持多种网络类型(如 VLAN、VXLAN 等)和后端驱动。

  • service_plugins = router
    指定 Neutron 的服务插件为 router,用于支持网络的路由功能。

  • transport_url = rabbit://openstack:LiXiaohui@controller
    指定 Neutron 服务使用的消息队列(RabbitMQ)的连接地址。用户名为 openstack,密码为 LiXiaohui,服务器地址为 controller

  • auth_strategy = keystone
    指定 Neutron 使用 Keystone 进行身份验证。

  • notify_nova_on_port_status_changes = true
    当端口状态发生变化时,通知 Nova 服务。

  • notify_nova_on_port_data_changes = true
    当端口数据发生变化时,通知 Nova 服务。

  • allow_overlapping_ips = True
    允许 IP 地址重叠(例如在不同网络中使用相同的 IP 地址范围)。

  • rpc_backend = rabbit
    指定 RPC 后端为 RabbitMQ。

1
2
3
4
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = LiXiaohui
  • rabbit_host = controller
    RabbitMQ 服务器的主机名或 IP 地址。

  • rabbit_userid = openstack
    RabbitMQ 用户名。

  • rabbit_password = LiXiaohui
    RabbitMQ 用户密码。

1
2
3
[database]
...
connection = mysql+pymysql://neutron:LiXiaohui@controller/neutron

connection = mysql+pymysql://neutron:LiXiaohui@controller/neutron
指定 Neutron 数据库的连接字符串。使用 MySQL 数据库,用户名为 neutron,密码为 LiXiaohui,数据库名为 neutron,数据库服务器地址为 controller

以下是keystone和nova的连接信息

1
2
3
4
5
6
7
8
9
10
11
12
[keystone_authtoken]
...
www_authenticate_uri = http://controller:5000
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = LiXiaohui
1
2
3
4
5
6
7
8
9
10
[nova]
...
auth_url = http://controller:5000
auth_type = password
project_domain_name = Default
user_domain_name = Default
region_name = RegionOne
project_name = service
username = nova
password = LiXiaohui
1
2
3
[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp

配置ML2插件

ML2插件是Neutron的核心组件之一,它使用Open vSwitch机制为实例创建Layer-2虚拟网络基础设施。/etc/neutron/plugins/ml2/ml2_conf.ini 是ML2插件的配置文件,用于定义支持的网络类型、机制驱动程序、安全组功能等。

1
2
3
4
5
6
7
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers flat,vlan,vxlan
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types vxlan
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers openvswitch,l2population
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_flat flat_networks provider
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_vxlan vni_ranges 1:1000
crudini --set /etc/neutron/plugins/ml2/ml2_conf.ini securitygroup enable_ipset True

或者

1
2
3
4
5
6
[ml2]
...
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
  • type_drivers = flat,vlan,vxlan
    指定支持的网络类型驱动。这里支持三种网络类型:

    • flat:平面网络,不使用 VLAN 或 VXLAN 封装。

    • vlan:VLAN 网络,使用 VLAN 标签进行隔离。

    • vxlan:VXLAN 网络,使用 VXLAN 封装进行隔离。

  • tenant_network_types = vxlan
    指定租户网络的默认类型。这里设置为 vxlan,表示租户网络将使用 VXLAN 封装。

  • mechanism_drivers = openvswitch,l2population
    指定机制驱动,用于处理网络的创建和管理:

    • openvswitch:使用 Open vSwitch 作为虚拟交换机。

    • l2population:启用 L2 人口机制驱动,用于优化网络流量转发。

  • extension_drivers = port_security
    指定扩展驱动,用于启用额外的功能。这里启用了 port_security,用于提供端口安全功能,例如防止 MAC/IP 欺骗。

1
2
3
[ml2_type_flat]
...
flat_networks = provider
  • flat_networks = provider
    指定平面网络的名称。这里定义了一个名为 provider 的平面网络。平面网络通常用于提供外部网络访问。
1
2
3
[ml2_type_vxlan]
...
vni_ranges = 1:1000
  • vni_ranges = 1:1000
    指定 VXLAN 网络的 VNI(VXLAN Network Identifier)范围。这里设置 VNI 范围为 1 到 1000。VNI 是用于区分不同 VXLAN 隧道的标识符。
1
2
[securitygroup]
enable_ipset = True
  • enable_ipset = True
    启用 IP 集合(IPSet)功能。IPSet 是一种高效的 IP 地址管理工具,可以用于安全组规则的优化。启用 IPSet 可以提高安全组规则的处理效率,尤其是在规则数量较多时。

准备OVS网桥

后续的配置中,会用到br-int和br-ex网桥,提前创建出来。

1
systemctl enable neutron-openvswitch-agent.service --now

检查br-int网桥是否创建出来,如果没有,那就自己创建br-int网桥用于虚拟机内部通信,一般来说,启动服务会自动创建

可以看到我的br-int已经自动创建

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@controller ~]# ovs-vsctl show
1b37f8e1-ef53-46f1-8d0e-ce60268a0346
Manager "ptcp:6640:127.0.0.1"
is_connected: true
Bridge br-int
Controller "tcp:127.0.0.1:6633"
is_connected: true
fail_mode: secure
datapath_type: system
Port br-int
Interface br-int
type: internal
ovs_version: "3.3.1"

如果没有创建,就执行以下命令即可

1
[root@controller ~]# ovs-vsctl add-br br-int

确认了br-int之后,需要创建br-ex用于外部网络通信,并添加具有外部通信的网卡进来

1
2
[root@controller ~]# ovs-vsctl add-br br-ex
[root@controller ~]# ovs-vsctl add-port br-ex ens224

配置Open vSwitch代理

Open vSwitch代理为实例建立Layer-2虚拟网络并且处理安全组规则。/etc/neutron/plugins/ml2/openvswitch_agent.ini 是Open vSwitch代理的配置文件。

1
2
3
4
5
6
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs bridge_mappings provider:br-ex
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs local_ip 192.168.8.10
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent tunnel_types vxlan
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent l2_population true
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini securitygroup enable_security_group True
crudini --set /etc/neutron/plugins/ml2/openvswitch_agent.ini securitygroup firewall_driver openvswitch

或者

1
2
3
4
[ovs]
bridge_mappings = provider:ens160
local_ip = 192.168.8.10
...
  • bridge_mappings = provider:ens160
    指定 Open vSwitch 的桥接映射关系。这里将 provider 网络映射到物理网卡 ens160。这意味着所有属于 provider 网络的流量将通过 ens160 进行转发。

  • local_ip = 192.168.8.10
    指定 OVS 代理(agent)的本地 IP 地址。这个 IP 地址用于 VXLAN 隧道的通信。在 VXLAN 网络中,每个 OVS 代理需要一个本地 IP 地址来建立隧道。

1
2
3
[agent]
tunnel_types = vxlan
l2_population = true
  • tunnel_types = vxlan
    指定支持的隧道类型。这里设置为 vxlan,表示 OVS 代理将使用 VXLAN 隧道来转发租户网络的流量。

  • l2_population = true
    启用 L2 机制。这个选项与 ML2 插件中的 l2population 机制驱动配合使用,用于优化网络流量的转发。启用后,OVS 代理可以更高效地处理多租户环境中的网络流量。

1
2
3
4
[securitygroup]
...
enable_security_group = True
firewall_driver = openvswitch
  • enable_security_group = True
    启用安全组功能。安全组是 OpenStack 中用于控制虚拟机网络流量的防火墙规则集合。

  • firewall_driver = openvswitch
    指定安全组的防火墙驱动为 openvswitch。这意味着 OVS 将负责处理安全组规则的实施,确保虚拟机的网络流量符合安全组策略。

配置Layer-3代理

  • Layer-3 代理 是 OpenStack Neutron 的一个组件,主要负责为私有虚拟网络提供 路由和 NAT(网络地址转换)服务。它允许虚拟机实例通过私有网络访问外部网络,例如互联网。

配置文件:/etc/neutron/l3_agent.ini

1
crudini --set /etc/neutron/l3_agent.ini DEFAULT interface_driver openvswitch

或者

interface_driver = openvswitch
指定 L3 代理使用的接口驱动为 Open vSwitch。这意味着 L3 代理将通过 Open vSwitch 来管理网络接口,确保网络流量正确地在不同网络之间路由。

1
2
3
[DEFAULT]
...
interface_driver = openvswitch

配置DHCP代理

DHCP 代理 是 Neutron 的另一个组件,负责为虚拟机实例提供 DHCP(动态主机配置协议)服务。它为虚拟机分配 IP 地址、子网掩码、网关等网络配置信息。

/etc/neutron/dhcp_agent.ini 的DHCP配置文件

1
2
3
crudini --set /etc/neutron/dhcp_agent.ini DEFAULT interface_driver openvswitch
crudini --set /etc/neutron/dhcp_agent.ini DEFAULT dhcp_driver neutron.agent.linux.dhcp.Dnsmasq
crudini --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True

或者

  • interface_driver = openvswitch
    指定 DHCP 代理使用的接口驱动为 Open vSwitch,确保 DHCP 流量通过 OVS 进行管理。

  • dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
    指定 DHCP 服务的驱动为 dnsmasq,这是 OpenStack 默认的 DHCP 服务工具,用于管理 DHCP 租约。

  • enable_isolated_metadata = True
    启用 隔离的元数据服务,允许虚拟机在隔离网络中访问元数据服务。这对于在私有网络中运行的虚拟机非常重要,确保它们能够获取配置信息。

1
2
3
4
5
[DEFAULT]
...
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True

配置元数据代理

元数据代理 是 Neutron 的一个组件,负责为虚拟机提供 配置信息,例如访问实例的凭证、网络配置等。这些信息对于虚拟机的初始化和运行至关重要。

/etc/neutron/metadata_agent.ini是主配置文件

1
2
crudini --set /etc/neutron/metadata_agent.ini DEFAULT nova_metadata_host controller
crudini --set /etc/neutron/metadata_agent.ini DEFAULT metadata_proxy_shared_secret LiXiaohui

或者

  • nova_metadata_host = controller
    指定 Nova 元数据服务的主机地址。这里设置为 controller,表示元数据服务运行在控制节点上。

  • metadata_proxy_shared_secret = LiXiaohui
    设置 元数据代理的共享密钥,用于身份验证。请确保此密钥与 Nova 配置中的密钥一致,以保证安全性。

1
2
3
4
[DEFAULT]
...
nova_metadata_host = controller
metadata_proxy_shared_secret = LiXiaohui

为nova配置网络服务

Nova 配置文件 /etc/nova/nova.conf 需要与 Neutron 集成,以确保 Nova 能够正确地管理虚拟机的网络。

1
2
3
4
5
6
7
8
9
10
11
crudini --set /etc/nova/nova.conf neutron url http://controller:9696
crudini --set /etc/nova/nova.conf neutron auth_url http://controller:5000
crudini --set /etc/nova/nova.conf neutron auth_type password
crudini --set /etc/nova/nova.conf neutron project_domain_name default
crudini --set /etc/nova/nova.conf neutron user_domain_name default
crudini --set /etc/nova/nova.conf neutron region_name RegionOne
crudini --set /etc/nova/nova.conf neutron project_name service
crudini --set /etc/nova/nova.conf neutron username neutron
crudini --set /etc/nova/nova.conf neutron password LiXiaohui
crudini --set /etc/nova/nova.conf neutron service_metadata_proxy True
crudini --set /etc/nova/nova.conf neutron metadata_proxy_shared_secret LiXiaohui

或者

1
2
3
4
5
6
7
8
9
10
11
12
13
[neutron]
...
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = LiXiaohui
service_metadata_proxy = True
metadata_proxy_shared_secret = LiXiaohui
  • url = http://controller:9696
    指定 Neutron 服务的 API 地址,用于 Nova 与 Neutron 之间的通信。

  • auth_url = http://controller:5000
    指定 Keystone 认证服务的地址,用于身份验证。

  • auth_type = password
    指定认证类型为 密码认证

  • project_domain_name = defaultuser_domain_name = default
    指定项目和用户所属的域名为 default

  • region_name = RegionOne
    指定区域名为 RegionOne

  • project_name = service
    指定项目名为 service

  • username = neutronpassword = LiXiaohui
    指定 Neutron 服务的用户名和密码。

  • service_metadata_proxy = True
    启用元数据代理服务,确保虚拟机能够通过元数据代理获取配置信息。

  • metadata_proxy_shared_secret = LiXiaohui
    设置元数据代理的共享密钥,与 Neutron 配置中的密钥一致。

初始化数据库

网络服务初始化脚本需要一个超链接,以确保 Neutron 数据库正确初始化。

1
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
1
2
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
--config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

重启相关服务

重启计算 API 服务和网络服务,以确保所有配置生效。

1
systemctl restart openstack-nova-api.service

网络服务

1
2
3
systemctl enable neutron-server.service \
neutron-openvswitch-agent.service neutron-dhcp-agent.service \
neutron-metadata-agent.service --now

对于网络选项2,同样启用layer-3服务并设置其随系统自启动

1
systemctl enable neutron-l3-agent.service --now
  • systemctl restart openstack-nova-api.service
    重启 Nova API 服务,确保计算服务的配置更新生效。

  • systemctl enable neutron-server.service --now
    启用并启动 Neutron 服务,负责管理网络资源。

  • systemctl enable neutron-openvswitch-agent.service --now
    启用并启动 Open vSwitch 代理服务,负责管理虚拟网络接口。

  • systemctl enable neutron-dhcp-agent.service --now
    启用并启动 DHCP 代理服务,为虚拟机分配 IP 地址。

  • systemctl enable neutron-metadata-agent.service --now
    启用并启动元数据代理服务,为虚拟机提供配置信息。

  • systemctl enable neutron-l3-agent.service --now
    启用并启动 Layer-3 代理服务,负责私有网络的路由和 NAT 功能。