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

  1. Routing
    l3 agent 可以为 project(租户)创建 router,提供 Neutron subnet 之间的路由服务。路由功能默认通过 IPtables 实现。
  2. 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 详解

plugin,agent,provider

  1. plugin 解决的是 What 的问题,即网络要配置成什么样子?而至于 How 的工作(如何配置)则交由 agent 完成。
  2. plugin,agent 和 network provider 是配套使用的,比如 network provider 是 linux bridge,那么就得使用 linux bridge 的 plungin 和 agent;如果 network provider 换成了 OVS 或者物理交换机,plugin 和 agent 也得替换。
  3. plugin 的一个主要的职责是在数据库中维护 Neutron 网络的状态信息,这就造成一个问题:所有 network provider 的 plugin 都要编写一套非常类似的数据库访问代码。为了解决这个问题,Neutron 在 Havana 版本实现了一个 ML2(Modular Layer 2)plugin,对 plgin 的功能进行抽象和封装。有了 ML2 plugin,各种 network provider 无需开发自己的 plugin,只需要针对 ML2 开发相应的 driver 就可以了,工作量和难度都大大减少。
  4. 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
  • Type Driver : 网络类型驱动;可以让neutron同时使用不同的网络类型;负责维护网络类型的状态,执行验证,创建网络等
  • Mechanism Driver:网络机制驱动;可以让neutron同时支持不同的network provider;负责获取由 type driver 维护的网络状态,并确保在相应的网络设备(物理或虚拟)上正确实现这些状态

VXLAN与VLAN

VXLAN ( Virtual eXtensible Local Area Network)VXLAN 提供与 VLAN 相同的以太网二层服务,但拥有更强的扩展性和灵活性。与 VLAN 相比,VXLAN 有下面几个优势:

  1. 支持更多的二层网段。
    VLAN 使用 12-bit 标记 VLAN ID,最多支持 4094 个 VLAN,这对大型云部署会成为瓶颈。VXLAN 的 ID (VNI 或者 VNID)则用 24-bit 标记,支持 16777216 个二层网段。
  2. 能更好地利用已有的网络路径。
    VLAN 使用 Spanning Tree Protocol 避免环路,这会导致有一半的网络路径被 block 掉。VXLAN 的数据包是封装到 UDP 通过三层传输和转发的,可以使用所有的路径。
  3. 避免物理交换机 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

虚机的网络访问

虚机跨节点访问虚机:东西流向

  1. 虚机的网卡通过tap设备连到linux bridge。
  2. linux bridge通过一对veth pair设备连到ovs的集成网桥br-int上,
  3. 通过patch-tun连接到patch-int,从而连接到br-tun上,
  4. 通过vxlan网口连接到另一台虚机的vxlan网口,从而连接到另一台虚机的隧道网桥br-tun上,
  5. 通过patch-int连接到patch-tun,从而连接到br-int上,
  6. br-int通过一对veth pair设备连到ovs的集成网桥linux bridge上 ,
  7. 通过tap设备连到虚机的网卡,从而实现通信。

虚机访问外网:南北流向(虚拟机访问外网----SNAT原理:)

  1. 虚机的网卡通过tap设备连到linux bridge,
  2. linux bridge 通过一对veth pair设备连到ovs的集成网桥br-int上,
  3. br-int通过虚拟机网关qr连到路由上,
  4. 路由通过qg连接到br-ex上。
  5. qg上的网关有SNAT源地址转发功能,
  6. 所以虚机可以通过这种方式连接外网。

外网访问虚机——floating ip原理:

  1. 外网通过浮动ip访问虚机,
  2. qg上的网关有DNAT目标地址转换功能,
  3. br-ex通过qg链接到路由上,
  4. 路由通过qr端链接到ovs的集成网桥br-int,
  5. br-int通过一对veth pair设备链接到linux bridge,
  6. 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

posted @ 2019-08-02 18:31  du-z  阅读(1370)  评论(0编辑  收藏  举报