OpenStack (neutron 网络服务)
neutron介绍
提供 OpenStack 虚拟网络服务,也是 OpenStack 重要的核心模块之一,该模块最开始是 Nova 的一部分,叫 nova-network,后来从 Nova 中分离出来,开始名字为 Quantum,后来由于商业名权的原因改为了 Neutron。该模块之所以重要是因为如果没有虚拟网络服务,OpenStack 就变为单纯提供虚拟机实例和虚拟存储服务的平台,这就违背了提供分布式虚拟服务的云计算核心价值。该模块不仅提供基本的创建子网、路由和为虚拟机实例分配 IP 地址功能,还提供了
a. 同时支持多种物理网络类型,支持 Linux Bridge、Hyper-V 和 OVS bridge 计算节点共存;
b. 支持防火墙服务;
c. 支持虚拟网络中节点间 VPN 服务;
d. SDN 实现完善和提高。
Neutron 功能
Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 VPN 等。Neutron 提供了一个灵活的框架,通过配置,无论是开源还是商业软件都可以被用来实现这些功能。
二层交换 Switching
Nova 的 Instance 是通过虚拟交换机连接到虚拟二层网络的。
Neutron 支持多种虚拟交换机,包括 Linux 原生的 Linux Bridge 和 Open vSwitch。
Open vSwitch(OVS)是一个开源的虚拟交换机,它支持标准的管理接口和协议。
利用 Linux Bridge 和 OVS,Neutron 除了可以创建传统的 VLAN 网络,还可以创建基于隧道技术的 Overlay 网络,比如 VxLAN 和 GRE(Linux Bridge 目前只支持 VxLAN)。
三层路由 Routing
Instance 可以配置不同网段的 IP,Neutron 的 router(虚拟路由器)实现 instance 跨网段通信。router 通过 IP forwarding,iptables 等技术来实现路由和 NAT。
负载均衡 Load Balancing
Openstack 在 Grizzly 版本第一次引入了 Load-Balancing-as-a-Service(LBaaS),提供了将负载分发到多个 instance 的能力。LBaaS 支持多种负载均衡产品和方案,不同的实现以 Plugin 的形式集成到 Neutron,目前默认的 Plugin 是 HAProxy。
防火墙 Firewalling
Neutron 通过下面两种方式来保障 instance 和网络的安全性。
Security Group
通过 iptables 限制进出 instance 的网络包。
Firewall-as-a-Service
FWaaS,限制进出虚拟路由器的网络包,也是通过 iptables 实现。
neutron架构及组件讲解
Neutron Server
对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理请求。
Plugin
处理 Neutron Server 发来的请求,维护 OpenStack 逻辑网络状态, 并调用 Agent 处理请求。
Agent
处理 Plugin 的请求,负责在 network provider 上真正实现各种网络功能。
+--------------------+------+-------------------+-------+-------+---------------------------+
| Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------+------+-------------------+-------+-------+---------------------------+
| Open vSwitch agent | yun2 | None | True | UP | neutron-openvswitch-agent |
| Metadata agent | yun2 | None | True | UP | neutron-metadata-agent |
| L3 agent | yun2 | nova | True | UP | neutron-l3-agent |
| Open vSwitch agent | yun3 | None | True | UP | neutron-openvswitch-agent |
| Open vSwitch agent | yun4 | None | True | UP | neutron-openvswitch-agent |
| DHCP agent | yun2 | nova | True | UP | neutron-dhcp-agent |
+--------------------+------+-------------------+-------+-------+---------------------------+
network provider
提供网络服务的虚拟或物理网络设备,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交换机。
Queue
Neutron Server,Plugin 和 Agent 之间通过 Messaging Queue 通信和调用。
Database
存放 OpenStack 的网络状态信息,包括 Network, Subnet, Port, Router 等
DHCP
dhcp agent 通过 dnsmasq 为 instance 提供 dhcp 服务。
L3 agent
- Routing
l3 agent 可以为 project(租户)创建 router,提供 Neutron subnet 之间的路由服务。路由功能默认通过 IPtables 实现。 - Firewall
l3 agent 可以在 router 上配置防火墙策略,提供网络安全防护。另一个与安全相关的功能是 Security Group,也是通过 IPtables 实现。
其中:
Firewall 与 Security Group 的区别在于:
- Firewall 安全策略位于 router,保护的是某个 project 的所有 network。
- Security Group 安全策略位于 instance,保护的是单个 instance。
Load Balance
Neutron 默认通过 HAProxy 为 project 中的多个 instance 提供 load balance 服务。
neutron server 详解
![](https://img2018.cnblogs.com/blog/1675881/201908/1675881-20190808193034839-1068945046.jpg)
plugin,agent,provider
- plugin 解决的是 What 的问题,即网络要配置成什么样子?而至于 How 的工作(如何配置)则交由 agent 完成。
- plugin,agent 和 network provider 是配套使用的,比如 network provider 是 linux bridge,那么就得使用 linux bridge 的 plungin 和 agent;如果 network provider 换成了 OVS 或者物理交换机,plugin 和 agent 也得替换。
- plugin 的一个主要的职责是在数据库中维护 Neutron 网络的状态信息,这就造成一个问题:所有 network provider 的 plugin 都要编写一套非常类似的数据库访问代码。为了解决这个问题,Neutron 在 Havana 版本实现了一个 ML2(Modular Layer 2)plugin,对 plgin 的功能进行抽象和封装。有了 ML2 plugin,各种 network provider 无需开发自己的 plugin,只需要针对 ML2 开发相应的 driver 就可以了,工作量和难度都大大减少。
- plugin 按照功能分为两类: core plugin 和 service plugin。core plugin 维护 Neutron 的 netowrk, subnet 和 port 相关资源的信息,与 core plugin 对应的 agent 包括 linux bridge, OVS 等; service plugin 提供 routing, firewall, load balance 等服务,也有相应的 agent。
Ml2 Core Plugin 详解:
- Core Plugin,其功能是维护数据库中 network, subnet 和 port 的状态,并负责调用相应的 agent 在 network provider 上执行相关操作,比如创建 network。
- openstack中有两大常见 Core Plugin: linux bridge plugin 和 open vswitch plugin
![](http://learn.yunwei.edu/openstack-learn/neutron-01_files/Image%20[10].png)
- Type Driver : 网络类型驱动;可以让neutron同时使用不同的网络类型;负责维护网络类型的状态,执行验证,创建网络等
- Mechanism Driver:网络机制驱动;可以让neutron同时支持不同的network provider;负责获取由 type driver 维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现这些状态
VXLAN与VLAN
VXLAN ( Virtual eXtensible Local Area Network)VXLAN 提供与 VLAN 相同的以太网二层服务,但拥有更强的扩展性和灵活性。与 VLAN 相比,VXLAN 有下面几个优势:
- 支持更多的二层网段。
VLAN 使用 12-bit 标记 VLAN ID,最多支持 4094 个 VLAN,这对大型云部署会成为瓶颈。VXLAN 的 ID (VNI 或者 VNID)则用 24-bit 标记,支持 16777216 个二层网段。- 能更好地利用已有的网络路径。
VLAN 使用 Spanning Tree Protocol 避免环路,这会导致有一半的网络路径被 block 掉。VXLAN 的数据包是封装到 UDP 通过三层传输和转发的,可以使用所有的路径。- 避免物理交换机 MAC 表耗尽。
由于采用隧道机制,TOR (Top on Rack) 交换机无需在 MAC 表中记录虚拟机的信息。
vxlan推荐文章:https://www.cnblogs.com/hbgzy/p/5279269.html
ML2 mechanism driver
Linux Bridge :
Open vSwitch:
Open vSwitch 中的网络设备:
- br-ex:连接外部(external)网络的网桥。
- br-int:集成(integration)网桥,所有 instance 的虚拟网卡和其他虚拟网络设备都将连接到该网桥。
- br-tun:隧道(tunnel)网桥,基于隧道技术的 VxLAN 和 GRE 网络将使用该网桥进行通信。
- tap interface:命名为 tapXXXX。
- linux bridge:命名为 qbrXXXX。
- veth pair:命名为 qvbXXXX, qvoXXXX
- OVS integration bridge:命名为 br-int。
- OVS patch ports:命名为 int-br-ethX 和 phy-br-ethX(X 为 interface 的序号)。
- OVS provider bridge:命名为 br-ethX(X 为 interface 的序号)。
- 物理 interface:命名为 ethX(X 为 interface 的序号)。
- OVS tunnel bridge:命名为 br-tun。
注意:eth2没有ip地址
brctl
ovs-vsctl
虚机的网络访问
虚机跨节点访问虚机:东西流向
- 虚机的网卡通过tap设备连到linux bridge。
- linux bridge通过一对veth pair设备连到ovs的集成网桥br-int上,
- 通过patch-tun连接到patch-int,从而连接到br-tun上,
- 通过vxlan网口连接到另一台虚机的vxlan网口,从而连接到另一台虚机的隧道网桥br-tun上,
- 通过patch-int连接到patch-tun,从而连接到br-int上,
- br-int通过一对veth pair设备连到ovs的集成网桥linux bridge上 ,
- 通过tap设备连到虚机的网卡,从而实现通信。
虚机访问外网:南北流向(虚拟机访问外网----SNAT原理:)
- 虚机的网卡通过tap设备连到linux bridge,
- linux bridge 通过一对veth pair设备连到ovs的集成网桥br-int上,
- br-int通过虚拟机网关qr连到路由上,
- 路由通过qg连接到br-ex上。
- qg上的网关有SNAT源地址转发功能,
- 所以虚机可以通过这种方式连接外网。
外网访问虚机——floating ip原理:
- 外网通过浮动ip访问虚机,
- qg上的网关有DNAT目标地址转换功能,
- br-ex通过qg链接到路由上,
- 路由通过qr端链接到ovs的集成网桥br-int,
- br-int通过一对veth pair设备链接到linux bridge,
- linux bridge通过tap连接到虚机的网卡完成通信。
常见日志
问题一:虚拟机获取不到ip
查看dhcp-agent.log 和 openvswitch-agent.log
问题二:虚拟机访问不了外网
查看l3-agent.log
问题三:主服务日志
server.log
neutron配置文件示例:
etc/neutron/neutron.conf
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
dhcp_agent_notification = true
allow_overlapping_ips = True
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://openstack:admin@controller
[agent]
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
[matchmaker_redis]
[nova]
region_name = RegionOne
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
project_name = service
user_domain_name = default
username = nova
password = nova
[oslo_concurrency]
lock_path = $state_path/lock
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_messaging_zmq]
[oslo_middleware]
[oslo_policy]
[qos]
[quotas]
[ssl]
/etc/nova/nova.conf
[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
/etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[ml2]
type_drivers = flat,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
[ml2_type_geneve]
[ml2_type_gre]
[ml2_type_vlan]
[ml2_type_vxlan]
vni_ranges = 1:1000
[securitygroup]
enable_ipset = true
/etc/neutron/plugins/ml2/openvswitch_agent.ini
[DEFAULT]
[agent]
tunnel_types = vxlan
l2_population = True
[ovs]
tunnel_bridge = br-tun
local_ip = 192.168.254.63
bridge_mappings =
[securitygroup]
firewall_driver = iptables_hybrid
enable_security_group = true
[xenapi]
/etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = openvswitch
external_network_bridge = br-ex
[agent]
[ovs]
/etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET
[agent]
[cache]
/etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
[agent]
[ovs]
命令:
##注意:配置完配置文件后,提前准备ovs外网用的网桥,之后同步数据库,启动服务:
yum install openstack-neutron openstack-neutron-ml2 openvswitch openstack-neutron-openvswitch ebtables -y #控制节点
systemctl enable neutron-server.service neutron-dhcp-agent.service openvswitch neutron-openvswitch-agent neutron-metadata-agent.service
systemctl start neutron-server.service neutron-dhcp-agent.service openvswitch neutron-openvswitch-agent neutron-metadata-agent.service
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-ex eth2
systemctl enable neutron-l3-agent.service
systemctl start neutron-l3-agent.service
yum install openvswitch openstack-neutron-openvswitch ebtables ipset #计算节点
systemctl enable openvswitch neutron-openvswitch-agent
systemctl start openvswitch neutron-openvswitch-agent
systemctl stop openvswitch neutron-openvswitch-agent