热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenStack网络组件Neutron的研究

本文将会涵盖如下几个部分:-Openstack网络组件的发展历程-Neutron的结构-NeutronServer的结构-Neutron的配置1.1nova-networkOpenstack在2010年正式发布它的第一个版本Austin的时候,nova-network作为它的核心组件被包含其中。nova-network

本文将会涵盖如下几个部分:

- Openstack网络组件的发展历程

- Neutron的结构

- Neutron Server的结构

- Neutron的配置

1.1 nova-network

Openstack在2010年正式发布它的第一个版本Austin的时候,nova-network作为它的核心组件被包含其中。nova-network的功能主要有:

IP地址分配包含为虚拟主机分配私有(固定)和浮动IP地址。

网络模型与管理提供了虚拟网络使虚拟主机之间以及与外部网络通信。网络模型分为以下三种。这三种模型可以共存在一个云系统中,但是在一个计算节点上只能配备一种模型。

扁平网络 (Flat Network):在创建虚拟主机时,nova-network会从指定子网中取一个空闲IP并将它写入此虚拟主机的配置文件。在一个子网内的虚拟主机可以通过创建Linux桥实现互通。

带DHCP功能的扁平网络 (Flat DHCP Network):顾名思义,此种模式相对于扁平网络加入了DHCP功能。在创建虚拟主机时,nova-network会在指定的子网中为此虚拟主机分配IP和物理地址,并将这些信息告知DHCP服务器(默认是dnsmasq)。DHCP服务器会监听虚拟主机所在的桥。当有虚拟主机启动时,会自动从DHCP服务器获得IP。可以看到DHCP服务器只是按照nova-network给定的列表(IP和物理地址)分发IP,如何分配还是nova-network说了算。

VLAN网络 (VLAN Network):这是nova-network的默认模型。针对每个项目(Project,如今Openstack把项目改称租户 -- Tenant),都会对应一个vlan。每个项目里的私有IP地址只能在本项目的vlan里访问。与项目对应的vlan需要子网,这个子网是由管理员动态分配给项目的。与带DHCP功能的扁平网络类似,子网内的IP地址也是通过DHCP服务器分发的。所有在一个子网内的虚拟主机都通过网桥互通。

安全控制主要通过ebtables和iptables来实现。

1.2 Quantum

Quantum是随Openstack的Folsom版本正式发布的,其实它已经作为试用组件包含在之前的Essex版本中。在Grizzly里功能得到了增强。

为什么引入Quantum?答案非常简单,Quantum功能更强大,满足更多需求。下面列几条主要功能。

- 提供面向租户的API,以便控制2层网络和管理IP地址

- 支持插件式网络组件,像Open vSwitch,Cisco,Linux Bridge,Nicira NVP等等

- 支持位于不同的2层网络的IP地址重叠

- 支持基本的3层转发和多路由器

- 支持隧道技术(Tunneling)

- 支持3层代理和DHCP代理的多节点部署,增强了扩展性和可靠性

- 提供负载均衡API (试用版本)

1.3 Neutron

因为商标侵权的原因,Openstack在Havana版本上将Quantum更名为Neutron,所以Neutron并不是什么新的东西。在Havana版里,Neutron也只增加和增强了少数功能。

- 提供稳定的负载均衡API

- 支持端到端的IPSec VPN

- 面向租户的防火墙服务

- 提供一个新的插件ML2,这个插件可以作为一个框架同时支持不同的2层网络

现在很多已部署的Openstack云还在继续使用nova-network,因为它简单,稳定,尤其是多节点部署的可扩展性和可靠性让人不愿割舍。但是我们必须考虑往Neutron上迁移了,最新版Icehouse(还未发布)中的nova-network将会被列为过期组件,虽然系统还支持,但不建议使用了。

接下来我们一起来看看Neutron,本人精力在咨询、架构和部署,所以对源码实现我们不会涉及。

Openstack的设计理念是把所有的组件当做服务来注册的。 Neutron就是网络服务。它将网络、子网、端口和路由器抽象化,之后启动的虚拟主机就可以连接到这个虚拟网络上,最大的好处是这些都可视化的在Horizon里得到了实现,部署或者改变一个SDN变得非常简单,没有专业知识的人稍经培训也可以做到。

我们先通过如下一个简单的流程来了解客户机如何连接到网络上。

- 租户创建了一个网络,比方说mynet

- 租户为此网络分配一个子网,比如192.168.122.0/24

- 租户启动一个客户机,并指明一个网口连接到mynet

- Nova通知Neutron并在mynet上创建一个端口,如port1

- Neutron选择并分配一个IP给port1

- 客户机通过port1就连接到了mynet上

Neutron主要有以下几部分组成。

Neutron Server: 这一部分包含守护进程neutron-server和各种插件neutron-*-plugin,它们既可以安装在控制节点也可以安装在网络节点。neutron-server提供API接口,并把对API的调用请求传给已经配置好的插件进行后续处理。插件需要访问数据库来维护各种配置数据和对应关系,例如路由器、网络、子网、端口、浮动IP、安全组等等。

插件代理 (Plugin Agent): 虚拟网络上的数据包的处理则是由这些插件代理来完成的。名字为neutron-*-agent。在每个计算节点和网络节点上运行。一般来说你选择了什么插件,就需要选择相应的代理。代理与Neutron Server及其插件的交互就通过消息队列来支持。

DHCP代理(DHCP Agent): 名字为neutron-dhcp-agent,为各个租户网络提供DHCP服务,部署在网络节点上,各个插件也是使用这一个代理。

3层代理 (L3 Agent): 名字为neutron-l3-agent, 为客户机访问外部网络提供3层转发服务。也部署在网络节点上。

下面这张图取自官网,很好的反映了Neutron内部各部分之间的关系。(SDN服务在这里是额外的外部功能,可以暂时略过。)

下面我们来细看一下Neutron Server的结构。

这张图中我们只看Quantum-common和Quantum Plugin部分,其实就是Neutron Server。

上面我们已提到,Neutron最重要的就是两部分:API和插件

3.1 API

API又分为两个部分。

API Core:暂且称之为API核。它可以看做是插件功能的最小集合,即每个插件都必须有的功能,也就是对网络、子网和端口的查询、加删和更新操作等。

API Extensions:暂称之为API扩展。它们一般是针对具体插件实现的,这样租户就可以利用这些插件独特的功能,比方说访问控制(ACL)和QoS。

需要提一下的是,现在API核具备的功能还都很简单,随着Neturon的不断成熟,它可能就会纳入一些API扩展中的功能。

当然API部分也负责Neutron服务的启动、客户请求和相应回复的打包和派发以及验证数据格式及其正确性。也有一些安全和稳定机制,比方说对API请求的限制以防止DOS攻击来保证服务在大负载下的可用性。

至于验证和授权功能,相信大家都已了解,就是与Keystone结合,进行用户或租户级的使用控制。

3.2 插件

下面我们再来看一下插件。

从功能上说,插件一般有以下内容。

- 存储当前逻辑网络的配置信息,这就需要一个数据库,比方说MySQL

- 判断和存储逻辑网络和物理网络的对应关系,比方说为一个逻辑网络选择一个vlan

- 与一种或多种交换机通信来实现这种对应关系。这一般通过宿主机上的插件代理来实现这种操作,或者远程登录到交换机上来配置。

以Open vSwitch为例,下面列出了插件需要访问的数据表。

+---------------------------+
| Tables_in_neutron         |
+---------------------------+
| agents                    |
| allowedaddresspairs       |
| dnsnameservers            |
| externalnetworks          |
| extradhcpopts             |
| floatingips               |
| ipallocationpools         |
| ipallocations             |
| ipavailabilityranges      |
| networkdhcpagentbindings  |
| networks                  |
| ovs_network_bindings      |
| ovs_tunnel_allocations    |
| ovs_tunnel_endpoints      |
| ovs_vlan_allocations      |
| portbindingports          |
| ports                     |
| quotas                    |
| routerl3agentbindings     |
| routerroutes              |
| routers                   |
| securitygroupportbindings |
| securitygrouprules        |
| securitygroups            |
| subnetroutes              |
| subnets                   |
+---------------------------+

Neutron的配置应该说是比Openstack的其他组件复杂一点。

常用的配置模型有两种,

 把Neutron Server放在控制节点上,DHCP和L3代理放在网络节点上,可参考一下官图。

 把Neutron的所有部分放在单独的网络节点上。这种方式就是把上图部署在控制节点中的neutron-server放到网络节点上。

因为网络配置不像网络使用那么频繁,所以通常建议使用第一种方案,没有必要单独把neutron-server拿出来。因为neutron-server是可单独部署的,我们就拿第二种方案作为例子。

系统使用ubuntu12.04,软件的安装我们就不说了,这里我们采用Open vSwitch插件。(针对虚拟交换机Open vSwitch,Neutron建议是使用ML2插件的,但这里我们为了加深对插件和插件代理的理解,还是沿用了OpenvSwitch插件)。

4.1 计算节点的配置

安装完软件包以后,计算节点应该就有OpenvSwitch的代理在运行,使用ps命令可以看到如下进程。

/usr/bin/python /usr/bin/neutron-openvswitch-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
这里我们可以看到代理读取了2个配置文件。

neutron.conf主要需要设置如下几项:

core_plugin = neutron.plugins.openvswitch.ovs_neutron_plugin.OVSNeutronPluginV2 //插件类型
auth_strategy = keystone  // 授权方式
rabbit_host = 192.168.122.1       //处理消息队列的主机地址
[keystone_authtoken]      //keystone信息,这里只是我的例子信息
auth_host = 192.168.122.1
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = neutron
auth_url = http://192.168.122.1:35357/v2.0
connection = mysql://neutron:neutron@192.168.122.100/neutron      //DB信息

neutron.conf会默认包含另一个配置文件api-paste.ini,对它只需添加keystone信息。

auth_host=192.168.122.1
admin_user=neutron
admin_tenant_name=service
admin_password=neutron
ovs_neutron_plugin.init主要需要设置以下几项,以vlan为例:
tenant_network_type = vlan       //网络类型,例如vlan,gre
network_vlan_ranges = physnet1:1000:2999  //vlanID
bridge_mappings = physnet1:br-int //用于计算节点上客户机内部网络的网桥
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
4.2 网络节点的配置

安装完软件后,网络节点应该会有如下进程在运行。

/usr/bin/python /usr/bin/neutron-dhcp-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/dhcp_agent.ini /usr/bin/python /usr/bin/neutron-metadata-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/metadata_agent.ini /usr/bin/python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini /usr/bin/python /usr/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
/usr/bin/python /usr/bin/neutron-openvswitch-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
你会看到每个部分会用到哪个配置文件。

neutron.conf和api-paste.ini的配置与计算节点上是一样的。

dhcp_agent.ini的主要设置以下几项。看内容可理解其意义。

interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
metadata_agent.ini的设置主要是keystone相关的。
auth_url = http://192.168.122.1:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = neutron
nova_metadata_ip = 192.168.122.1
metadata_proxy_shared_secret = meta       //proxy的密码,个人设置
l3_agent.init的设置。
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver

ovs_neutron_plugin.ini的配置和计算节点上的一样。

4.3 节点上OVS的配置

计算节点和网络节点的NIC配置非常相似,我们都是用第二个NIC(eth1)作为内部网络的通讯。以网络节点为例。eth1不能设置IP地址,而是把IP地址给虚拟桥。

auto eth1
iface eth1 inet manual
        up ifconfig $IFACE 0.0.0.0 up
        down ip link set $IFACE down
auto br-int
iface br-int inet static
        address 10.100.1.2
        netmask 255.255.255.0
OVS中把eth1放到虚拟桥上。
    Bridge br-int
        Port "eth1"
            Interface "eth1"
        Port br-int
            Interface br-int
                type: internal

Neutron是openstack的方向,我们有必要花点时间研究一下它。目前对它的担心还是有的,比方说稳定性、可用性,还有性能(以后有机会探讨),但它的灵活性、多功能性是无可比拟的。

因为工作原因,断断续续花了很长时间写这篇博客,只为抛砖引玉,内容也有不全面和错误的地方,希望与大家交流。
推荐阅读
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
灬毋黑色灬_447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有