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

OpenStackQuantum+OVS+VLAN安装过程

Quantum是Openstack里面负责网络的项目。不过,Quantum这个名字似乎是已经被别的公司注册了,社区还在讨论新的名字。这篇文档写的比较早,所以还是延用Quantum这个名字。整个安装过程的实现是在Ubuntu12.04上,12.04现在直接安装的就是Openstack的Folsom版

Quantum 是Openstack里面负责网络的项目。不过,Quantum这个名字似乎是已经被别的公司注册了,社区还在讨论新的名字。这篇文档写的比较早,所以还是延用Quantum这个名字。

整个安装过程的实现是在Ubuntu 12.04上,12.04现在直接安装的就是Openstack的Folsom版本,所以只要保证你的机器可以运行apt-get install 命令,软件的安装是非常容易的。对于Grizzly,只要给Grizzly增加特定的源,也是直接运行apt-get install就行。但是在试验的时候,如果在已经安装了Folsom的机器上直接增加更新源,在更新nova的时候会出现错误,怎么折腾也没搞定。Quantum不知道会不会也这样。

安装完了以后的结构是这样子的:

从图上我们可以看到,与openstack里面的其他服务一样,首先quantum需要一个自己的WSGI server来接收所有来自客户的REST请求,这就是quantum-server。由于需要兼容多种不同的实际虚拟网络的实现,所以quantum采用了一种plugin的方式,来满足不同用户的需求。quantum支持的plugin有很多,基本的有linux bridge以及我们这边实现的openvswitch.

quantum里面所有剩下的服务都称为agent。所谓一个agent,我的理解就是实现特定功能的一个服务进程。在Folsom版本里面,基本的agent有三种, plugin agent, dhcp agent,以及l3 agent。在最新的G版本上,在quantum-server中增加了多agent的调度(好像是针对dhcp和l3的)和metadata proxy等功能,这个暂时还没有搞清楚,先省略了。

Quantum里面的各个服务进程通过message queue进行通讯,我们这里message queue用rabbitmq实现。agent会不会直接访问数据库?我的理解是不会的,所有的信息应该通过message queue交换了,不过没有确认过。

因为所有的虚拟机的网络流量都会经过openvswitch,所有需要和被创建的虚拟网络通讯的机器,都必须安装openvswitch以及它的agent。

2.1       安装

apt-get install quantum-server quantum-plugin-openvswitch

2.2       配置quantum使用openvswitch

修改/etc/quantum/quantum.conf,告诉quantum我们现在使用的plugin是openvswitch:

core_plugin = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2

2.3       配置openvswitch plugin 2.3.1             数据库

因为不同的plugin可能会在数据库中创建不同的table,所以数据库的相关配置是在plugin的配置文件中的。这里我们使用mysql作为我们的数据库。

首先,新建一个名字叫做”quantum”的数据库,因为是全新的安装,先保证数据库里面没有重名的,把之前的数据先清除掉:

mysql> drop database quantum;

mysql> create database quantum;

然后,我们设置”quantum”数据库可以用户“quantum”以密码“quantum”进行访问:

mysql> grant all privileges on quantum.* to quantum @'%' identified by 'quantum';

设置好数据库后,就需要把连接数据库的相关信息写入quantum plugin的相应配置文件中。我们使用的是openvswitch,所以修改/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini:

[DATABASE] *1

sql_cOnnection= mysql://quantum:quantum@${host-db}/quantum*2

*1/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini 被分成几个部分,分别为[DATABASE], [OVS], [AGETN]以及[SECURITYGROUP]。各个模块对应的设置都需要写在各自的模块名字的下面,不然的话它是不会工作的。我们这里,首先要找到 [DATABASE],然后把sql_connection直接写在它后面。

*2  mysql的连接信息的格式是mysql://用户名:密码@数据库ip/数据库名。

2.3.2           设置provider network为vlan

所谓的provider network, 我的理解就是你所拥有的物理网络,也就是说,虚拟网络的建立是基于原物理网络的。在基于物理网络的基础上创建虚拟网络,可以使得你的虚拟机有能力和原来网络中的其他物理机实现直接的网络互连。

举个例子,我在Quantum中创建了一个vlan 2000,IP子网设置为192.168.0.0/16,IP范围被限制在192.168.12.1~192.168.12.254。而此时,我有另一台物理机被设置为192.168.13.2/16,同样运行在vlan 2000,在网络连通的情况下,这个时候我所创建的虚拟机都是可以直接和我的物理机通讯的,而不需要通过floating IP。

Provider network 是一个plugin的固有属性,也就是对于一个plugin来说,如果他支持provider network, 那么在创建虚拟网络时,就必须提供一个物理网络信息给它。openvswitch支持provider network, 所以我们必须在配置文件中对它进行设置。 修改/etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini:

[OVS]

tenant_network_type=vlan

network_vlan_ranges = default:2000:4094

bridge_mappings = default:br-eth0

首先,告诉quantum我们的物理目前运行在vlan模式,然后把vlan的tag范围限定在我们的物理网络可支持的范围。最后将这个vlan范围对应到一个ovs的bridge上。这个bridge将和一个真正的物理网口相连,在安装openvswitch的部分我们会讲到。

用户可以定义多个vlan段对应到不同的ovs的bridge,但是必须设置default,因为在用户没有提供provider network参数的情况下创建网络时,quantum会选择default的内容作为缺省值。

*  如果是全部安装在一台机器上做试验的话应该选择local模式,应该是不需要其他配置的。我没有试验过。

2.4       quantum-server的其他配置 2.4.1             message queue

在整体结构中我们知道,quantum的各个服务之间通过rabbitmq进行通讯,所以要在配置文件里面写上rabbitmq的IP:

rabbit_host = ${host-ampq}

对于rabbitmq,在完成apt-get install之后,我们没有进行任何的配置,所以只要写一个ip就应该可以工作了。具体rabbitmq的其他参数,我没有研究过,反正默认的都可以工作。

2.4.2             添加keystone验证信息

和Openstack中的其他服务一样,quantum也需要和keystone进行交互,完成用户的验证,所以,首先需要在keystone里为quantum创建具有admin属性的用户。这里我们创建的用户为quantum,密码也为quantum,属于一个名为service的tenant。然后,把这些信息写入/etc/quantum/api-paste.ini:

 [filter:authtoken]

paste.filter_factory = keystone.middleware.auth_token:filter_factory

auth_host = ${host-keystone}

auth_port = 35357

auth_protocol = http

admin_tenant_name = service

admin_user = quantum

admin_password = quantum

2.5       启动quantum-server

service quantum-server restart

所有需要和虚拟网络进行通讯的机器都需要安装ovs和ovs agent。

3.1       删除libvirt默认的虚拟网络

这步不做也是可以的,但是有的时候会出现一些很诡异的问题,因为对它和openvswicth都不是非常了解,所以,简便起见:

virsh net-destroy default

virsh net-undefine default

可以用virsh的命令来确认确实被移除了:.

virsh -c qemu:///system list

3.2       安装OVS和OVS agent

apt-get install openvswitch-controller openvswitch-switch openvswitch-datapath-source

apt-get -y install quantum-plugin-openvswitch-agent

注意,这里quantum的配置文件里面的内容必须是和quantum-server的完全一直的,所以如果是有多台机器的话,把之前修改完的配置文件拷贝到对应的机器上。

3.3       创建OVS bridge

什么是OVS bridge? 简单的可以直接把他理解为一个虚拟的交换机,虚拟交换机上有许多的虚拟端口,逐级形成不同的网络结构。

首先,创建两个bridge:

ovs-vsctl add-br br-int

ovs-vsctl add-br br-eth0

这里,br-int是nova在默认情况下会使用的bridge的名字,如果你想要用别的名字,在配置nova的时候也要进行相应的修改。而br-eth0,我们之前在修改quantum ovs配置文件的时候已经提过。这个bridge的名字必须和配置文件中的一致。

然后,将你的物理端口加在 bridge br-eth0上,我们这里是eth0, 它连接在一台支持2000~4094的vlan的交换机上 :

ovs-vsctl add-port br-eth0 eth0*

* 注意:

1. 如果你是在一台机器上做试验,并且没有使用local的网络的话,这个步骤可以跳过不做,因为物理端口是为了让虚拟网络是物理网络相连,都在一台机器上的时候,实际上是不存在物理网络的。

2. openvswitch的一个重要的FAQ:

Q: I created a bridge and added my Ethernet port to it, using commands like these:

       ovs-vsctl add-br br0

       ovs-vsctl add-port br0 eth0

and as soon as I ran the "add-port" command I lost all connectivity through eth0.  Help!

A: A physical Ethernet device that is part of an Open vSwitch bridge should not have an IP address. If one does, then that IP address will not be fully functional.

You can restore functionality by moving the IP address to an OpenvSwitch "internal" device, such as the network device named after the bridge itself. For example, assuming that eth0's IP address is 192.168.128.5, you could run the commands below to fix up the situation:

       ifconfig eth0 0.0.0.0

       ifconfig br0 192.168.128.5

(If your only connection to the machine running OVS is through the IP address in question, then you would want to run all of these commands on a single command line, or put them into a script.)  If there were any additional routes assigned to eth0, then you would also want to use commands to adjust these routes to go through br0.

If you use DHCP to obtain an IP address, then you should kill the DHCP client that was listening on the physical Ethernet interface(e.g. eth0) and start one listening on the internal interface(e.g. br0).  You might still need to manually clear the IP address from the physical interface (e.g. with "ifconfig eth0 0.0.0.0").

There is no compelling reason why Open vSwitch must work this way. However, this is the way that the Linux kernel bridge module has always worked, so it's a model that those accustomed to Linux bridging are already used to.  Also, the model that most people expect is not implementable without kernel changes on all the versions of Linux that Open vSwitch supports.

By the way, this issue is not specific to physical Ethernet devices.  It applies to all network devices except Open vswitch "internal" devices.

在我们进行下一步之前,我们可以看一下,在完成安装之后的网络连接路径。如下图所表示:

在quantum-plugin-openvswitch启动之后,phy-br-eth0和int-br-eth0会被自动创建并相连,实现两个bridge的连接。

apt-get -y install quantum-dhcp-agent

修改它的配置文件/etc/quantum/dhcp_agent.ini:

interface_driver = quantum.agent.linux.interface.OVSInterfaceDriver

在完成以上全部的安装以后,quantum的基本安装就完成了。但这个时候,它还不能被访问。我们知道,在openstack中的任意一个用户都需要首先向keystone进行验证,keystone会在验证的过程中告诉用户所有服务的endpoint,然后用户访问endpoint,真正执行用户想要执行的命令。

所以,不要忘记在keystone中为quantum创建endpoint。

nova需要和quantum协同工作,所以必然要进行相关的配置:

network_api_class=nova.network.quantumv2.api.API

# only in compute node

quantum_url=http://${host-quantum}:9696

quantum_auth_strategy=keystone

quantum_admin_tenant_name=service 

quantum_admin_username=quantum

quantum_admin_password=quantum

quantum_admin_auth_url=http://${host-keystone}:35357/v2.0 

# libvirt

libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchVirtualPortDriver

# same bridge name as your created in ovs.

# you can jump this configuration, because the default value is already “br-int”.

libvirt_ovs_bridge="br-int"

注意:你需要根据你所使用的libvirt版本的不同的选择不同的 libvirt_vif_driver :

When using libvirt (any version) with Nova security filtering:

      libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtHybirdOVSBridgeDriver

When using libvirt (version <0.9.11) without Nova security filtering:

      libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchDriver

When using libvirt (version >= 0.9.11) without Nova security groups:

      libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchVirtualPortDriver

8.1       创建一个新的网络

现在我们可以创建一个网络并在启动虚拟机的时候使用了:

 quantum net-create --tenant-id ${tenant_id} ${net_name} --provider:network_type vlan --provider:physical_network default --provider:segmentation_id ${vlan_tag}

还要为这个网络创建一个subnet,指定DHCP分配的IP范围:

quantum subnet-create --tenant-id ${tenant_id} ${net_name} 10.1.100.0/24

subnet也有一些其他的网络参数可以设置,我们这里就简单的设置一个dns:

quantum subnet-update {subnet-id}  --dns_nameservers list=true 10.248.2.5 10.239.27.228 172.17.6.9

8.2       启动虚拟机并检查网络连接

用nova boot 命令启动一个虚拟机,你可以在boot的参数中指定虚拟机使用的网络ID。当然,如果现在用户网络中只有一个网络的话,默认就是用这唯一的一个,等待虚拟机启动。

有几种方式可以检查你的虚拟机是否获得了可用的ip并正常工作了。

1. 用VNC(或者HORIZON)查看虚拟机启动,并检查是否得到IP.

2. 在网络结点,也就是安装DHCP的机器上运行命令“ip netns”,你应该会看到:

qdhcp-xxx (xxx表示你的subnet id)

在这个name space下ping你的虚拟机的IP:

ip netns exec qdhcp-xxx ping ${ip} 


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了通过mysql命令查看mysql的安装路径的方法,提供了相应的sql语句,并希望对读者有参考价值。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
author-avatar
小鱼儿r6K2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有