OpenStack云计算快速入门

云计算是一种计算模型,它将诸如运算能力、存储、网络和软件等资源抽象成为服务,以便让用户通过互联网远程享用,付费的形式也如同传统公共服务设施一样。因需而定、提供方便、动态改变和无限的虚拟化扩展能力是云计算的几个重要特征。不同的“云”对应着不同的基础设施。
下面是三种广义的“云”:
l 基础设施即服务(IaaS)
l 平台即服务(PaaS)
l 软件即服务(SaaS)

1、OpenStack概要及其构成

译注:Open为开放之意,Stack则是堆砌,OpenStack合起来如其名,就是许多Open的Softwares堆积的集合,但1 + 1 > 2,系统的功能更为强大。
OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立、运行自己的云计算和存储设施。Rackspace与NASA是最初重要的两个贡献者,前者提供了“云文件”平台代码,该平台增强了OpenStack对象存储部分的功能,而后者带来了“Nebula”平台形成了OpenStack其余的部分。而今,OpenStack基金会已经有150多个会员,包括很多知名公司如“Canonical、DELL、Citrix”等。
以下是5个OpenStack的重要构成部分:
l Nova - 计算服务
l Swift - 存储服务
l Glance - 镜像服务
l Keystone - 认证服务
l Horizon - UI服务

1.1 OpenStack计算设施--Nova

Nova是OpenStack计算的弹性控制器。OpenStack云实例生命期所需的各种动作都将由Nova进行处理和支撑,这就意味着Nova以管理平台的身份登场,负责管理整个云的计算资源、网络、授权及测度。虽然Nova本身并不提供任何虚拟能力,但是它将使用libvirt API与虚拟机的宿主机进行交互。Nova通过Web服务API来对外提供处理接口,而且这些接口与Amazon的Web服务接口是兼容的。
 
功能及特点
l 实例生命周期管理
l 计算资源管理
l 网络与授权管理
l 基于REST的API
l 异步连续通信
l 支持各种宿主:Xen、XenServer/XCP、KVM、UML、VMware vSphere及Hyper-V
  
OpenStack计算部件,Nova弹性云包含以下主要部分:
l API 服务器(nova-api)
l 消息队列(rabbit-mq server)
l 运算工作站(nova-compute)
l 网络控制器(nova-network)
l 卷管理(nova-volume)
l 调度器(nova-scheduler)

API服务器(nova-api)

API服务器提供了云设施与外界交互的接口,它是外界用户对云实施管理的唯一通道。通过使用web服务来调用各种EC2的API,接着API服务器便通过消息队列把请求送达至云内目标设施进行处理。作为对EC2-api的替代,用户也可以使用OpenStack的原生API,我们把它叫做“OpenStack API”。

消息队列(Rabbit MQ Server)

OpenStack内部在遵循AMQP(高级消息队列协议)的基础上采用消息队列进行通信。Nova对请求应答进行异步调用,当请求接收后便则立即触发一个回调。由于使用了异步通信,不会有用户的动作被长置于等待状态。例如,启动一个实例或上传一份镜像的过程较为耗时,API调用就将等待返回结果而不影响其它操作,在此异步通信起到了很大作用,使整个系统变得更加高效。

运算工作站(nova-compute)

运算工作站的主要任务是管理实例的整个生命周期。他们通过消息队列接收请求并执行,从而对实例进行各种操作。在典型实际生产环境下,会架设许多运算工作站,根据调度算法,一个实例可以在可用的任意一台运算工作站上部署。

网络控制器(nova-network)

网络控制器处理主机的网络配置,例如IP地址分配,配置项目VLAN,设定安全群组以及为计算节点配置网络。

卷工作站(nova-volume)

卷工作站管理基于LVM的实例卷,它能够为一个实例创建、删除、附加卷,也可以从一个实例中分离卷。卷管理为何如此重要?因为它提供了一种保持实例持续存储的手段,比如当结束一个实例后,根分区如果是非持续化的,那么对其的任何改变都将丢失。可是,如果从一个实例中将卷分离出来,或者为这个实例附加上卷的话,即使实例被关闭,数据仍然保存其中。这些数据可以通过将卷附加到原实例或其他实例的方式而重新访问。因此,为了日后访问,重要数据务必要写入卷中。这种应用对于数据服务器实例的存储而言,尤为重要。

调度器(nova-scheduler)

调度器负责把nova-API调用送达给目标。调度器以名为“nova-schedule”的守护进程方式运行,并根据调度算法从可用资源池中恰当地选择运算服务器。有很多因素都可以影响调度结果,比如负载、内存、子节点的远近、CPU架构等等。强大的是nova调度器采用的是可插入式架构。
目前nova调度器使用了几种基本的调度算法:
随机化:主机随机选择可用节点;
可用化:与随机相似,只是随机选择的范围被指定;
简单化:应用这种方式,主机选择负载最小者来运行实例。负载数据可以从别处获得,如负载均衡服务器。

1.2 OpenStack镜像服务器--Glance

OpenStack镜像服务器是一套虚拟机镜像发现、注册、检索系统,我们可以将镜像存储到以下任意一种存储中:
本地文件系统(默认)
l OpenStack对象存储
l S3直接存储
l S3对象存储(作为S3访问的中间渠道)
l HTTP(只读)
 
功能及特点
提供镜像相关服务
 
Glance构件
l Glance控制器
l Glance注册器

1.3 OpenStack存储设施--Swift

Swift为OpenStack提供一种分布式、持续虚拟对象存储,它类似于Amazon Web Service的S3简单存储服务。Swift具有跨节点百级对象的存储能力。Swift内建冗余和失效备援管理,也能够处理归档和媒体流,特别是对大数据(千兆字节)和大容量(多对象数量)的测度非常高效。
  
功能及特点
l 海量对象存储
l 大文件(对象)存储
l 数据冗余管理
l 归档能力-----处理大数据集
l 为虚拟机和云应用提供数据容器
l 处理流媒体
l 对象安全存储
l 备份与归档
l 良好的可伸缩性

Swift组件
l Swift账户
l Swift容器
l Swift对象
l Swift代理
l Swift RING  

Swift代理服务器

用户都是通过Swift-API与代理服务器进行交互,代理服务器正是接收外界请求的门卫,它检测合法的实体位置并路由它们的请求。此外,代理服务器也同时处理实体失效而转移时,故障切换的实体重复路由请求。

Swift对象服务器

对象服务器是一种二进制存储,它负责处理本地存储中的对象数据的存储、检索和删除。对象都是文件系统中存放的典型的二进制文件,具有扩展文件属性的元数据(xattr)。
注意:xattr格式被Linux中的ext3/4,XFS,Btrfs,JFS和ReiserFS所支持,但是并没有有效测试证明在XFS,JFS,ReiserFS,Reiser4和ZFS下也同样能运行良好。不过,XFS被认为是当前最好的选择。

Swift容器服务器

容器服务器将列出一个容器中的所有对象,默认对象列表将存储为SQLite文件(译者注:也可以修改为MySQL,安装中就是以MySQL为例)。容器服务器也会统计容器中包含的对象数量及容器的存储空间耗费。

Swift账户服务器

账户服务器与容器服务器类似,将列出容器中的对象。 

Ring(索引环)

Ring容器记录着Swift中物理存储对象的位置信息,它是真实物理存储位置的实体名的虚拟映射,类似于查找及定位不同集群的实体真实物理位置的索引服务。这里所谓的实体指账户、容器、对象,它们都拥有属于自己的不同的Rings。

1.4 OpenStack认证服务--Keystone

Keystone为所有的OpenStack组件提供认证和访问策略服务,它依赖自身REST(基于Identity API)系统进行工作,主要对(但不限于)Swift、Glance、Nova等进行认证与授权。事实上,授权通过对动作消息来源者请求的合法性进行鉴定。

Keystone采用两种授权方式,一种基于用户名/密码,另一种基于令牌(Token)。除此之外,Keystone提供以下三种服务:
l 令牌服务:含有授权用户的授权信息
l 目录服务:含有用户合法操作的可用服务列表
l 策略服务:利用Keystone具体指定用户或群组某些访问权限
 
认证服务组件
服务入口:如Nova、Swift和Glance一样每个OpenStack服务都拥有一个指定的端口和专属的URL,我们称其为入口(endpoints)。
 
l 区位:在某个数据中心,一个区位具体指定了一处物理位置。在典型的云架构中,如果不是所有的服务都访问分布式数据中心或服务器的话,则也称其为区位。
 
l 用户:Keystone授权使用者
译注:代表一个个体,OpenStack以用户的形式来授权服务给它们。用户拥有证书(credentials),且可能分配给一个或多个租户。经过验证后,会为每个单独的租户提供一个特定的令牌。
 
l 服务:总体而言,任何通过Keystone进行连接或管理的组件都被称为服务。举个例子,我们可以称Glance为Keystone的服务。
 
l 角色:为了维护安全限定,就云内特定用户可执行的操作而言,该用户关联的角色是非常重要的。
译注:一个角色是应用于某个租户的使用权限集合,以允许某个指定用户访问或使用特定操作。角色是使用权限的逻辑分组,它使得通用的权限可以简单地分组并绑定到与某个指定租户相关的用户。

l 租间:租间指的是具有全部服务入口并配有特定成员角色的一个项目。
译注:一个租间映射到一个Nova的“project-id”,在对象存储中,一个租间可以有多个容器。根据不同的安装方式,一个租间可以代表一个客户、帐号、组织或项目。

1.5 OpenStack管理的Web接口--Horizon

Horizon是一个用以管理、控制OpenStack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等。除此之外,用户还可以在控制面板中使用终端(console)或VNC直接访问实例。总之,Horizon具有如下一些特点:
l 实例管理:创建、终止实例,查看终端日志,VNC连接,添加卷等
l 访问与安全管理:创建安全群组,管理密匙对,设置浮动IP等
l 偏好设定:对虚拟硬件模板可以进行不同偏好设定
l 镜像管理:编辑或删除镜像
l 查看服务目录
l 管理用户、配额及项目用途
l 用户管理:创建用户等
l 卷管理:创建卷和快照
l 对象存储处理:创建、删除容器和对象
l 为项目下载环境变量

2、OpenStack安装与配置

在3台物理机上搭建最小化云平台,这3台机器分为称为Server1、Server2和Client1,后文也是如此。Server1 承载着Nova、Glance、Swift、Keystone及Horizon(OpenStack的Web UI)服务,Server2 只用来运行实例管理的nova运算工作站,由于OpenStack组件采用分布式结构,其中的任何一部分或几个部分都可以安装在任意服务器上。Client1 并不是安装所必须的,在本例中,它仅用来制作打包镜像,并使用它访问Horizon在Web上管理OpenStack设施。于是就避免了使用服务器来完成镜像打包等诸如此类的任务了,而且在制作桌面系统镜像时如果包含视窗界面的话,我们也只能相应地使用有GUI的电脑来完成,故而最好还是别在服务器上玩火了吧。建议Client1支持虚拟化技术,以便在制作完镜像打包时可以运行KVM。OpenStack安装需要设定主机名、IP地址等,按你实际的环境进行配置。下表是实验用例安装的网络参数清单:
                                      Server1                                                     Server2                                                             Client1
Functionality         包括 nova-compute在内的所有组件        Nova-compute                                              Client
Network                 eth0--Public Net, eth1--Private Net         eth0--Public Net, eth1--Private Net           eth0--Public Net
IP Address            eth0--10.10.10.2, eth1--192.168.3.1      eth0--10.10.10.3, eth1--192.168.3.2         eth0--10.10.10.4
Hostname             Server1.example.com                               Server2.example.com                                Client1.example.com
DNS Server           10.10.10.1
Gateway IP           10.10.10.254

2.1 Server1

Server1包含了所有的Nova服务:nova-compute、nova-api、nova-volume、nova-network以及Glance、Swift、Keystone和Horizon。这台服务器上需要双网卡。

1)安装底层OS

请参照下述说明,记住相关参数,选择64位Ubuntu12.04版,进行安装:
l 创建的第一个用户命名为“localadmin”
l 为eth0和eth1设定IP及其相关参数
l 在安装服务包中,仅选择“Openssh-server”作为预装项
 
Server1上也将安装nova-volume软件,而nova-volume需要一块专用分区,所以在安装Ubuntu Server时请选择手动分区,并另行创建一块合适大小的分区。本文都将以/dev/sda6作为这块分区,可以根据实际情况进行修改。此外,请使用fdisk工具将该分区需要格式化为LVM(8e)格式,这一操作在安装中或刚安装完毕格式化均可。进一步,如果你还计划在这台服务器上再新建一个分区配给Swift的话,那么就新建一块分区并参照后文“安装Swift”节点相关内容进行安装。

待12.04的Ubuntu OS安装完毕后 ,使用下列命令更新系统:
sudo apt-get update
sudo apt-get upgrade

安装网桥工具bridge-utils:
sudo apt-get install bridge-utils

2)配置网络

编辑/etc/network/interfaces文件,如下所示:
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 10.10.10.2
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.254
dns-nameservers 10.10.10.1

auto eth1
iface eth1 inet static
address 192.168.3.1
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255

随后重新启动网络:
sudo /etc/init.d/networking restart

3)NTP服务器

安装NTP软件包,这个时间服务器将为所有节点提供支持。OpenStack所有组件的时间都必须同步,于是我们就在Server1上安装NTP服务并且让其他服务器或节点与之保持同步。
sudo apt-get install ntp
译注:NTP(Network Time Protocol),是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
打开文件/etc/ntp.conf 增加以下三行内容,目的是让本服务器时间与外部服务器时间同步。如果不能访问外网,NTP服务器将使用本机硬件时钟作为第二选择。

server ntp.ubuntu.com
server 127.127.1.0
fudge 127.127.1.0 stratum 10

然后重启NTP使配置生效:
sudo service ntp restart

请确保服务器IP地址可以被DNS解析。如果不能,则在/etc/hosts 文件中加入。

4)数据库

我们有很多选择:MySQL、PostgreSQL 或者SQLite等都能很好地对Nova和Glance提供数据支持。究竟选哪个,自己定吧。本例中采用MySQL。
安装mysql-server和python-mysqldb包:
sudo apt-get install mysql-server python-mysqldb

mysql创建root密码,使用“mysecret”,编辑mysql 配置文件 /etc/mysql/my.cnf,将绑定地址从 127.0.0.1 改为 0.0.0.0,如下所示:
bind-address = 0.0.0.0

重启MySQL服务器让其开始监听所有端口:
sudo restart mysql

创建数据库
为nova、glance和keystone创建各种数据库、表及用户:
创建名为“nova”的数据库:
sudo mysql -uroot -pmysecret -e 'CREATE DATABASE nova;'
新建一个用户,名为“novadbadmin”:
sudo mysql -uroot -pmysecret -e 'CREATE USER novadbadmin;'
授予novadbadmin用户nova数据库全部权限:
sudo mysql -uroot -pmysecret -e "GRANT ALL PRIVILEGES ON nova.* TO 'novadbadmin'@'%';"
为novadbadmin 创建密码(译者注:密码是novasecret,后文类似之处不多言,请详见命令):
sudo mysql -uroot -pmysecret -e "SET PASSWORD FOR 'novadbadmin'@'%' = PASSWORD('novasecret');"

重复刚才的步骤,创建设定glance数据库:
sudo mysql -uroot -pmysecret -e 'CREATE DATABASE glance;'
sudo mysql -uroot -pmysecret -e 'CREATE USER glancedbadmin;'
sudo mysql -uroot -pmysecret -e "GRANT ALL PRIVILEGES ON glance.* TO 'glancedbadmin'@'%';"
sudo mysql -uroot -pmysecret -e "SET PASSWORD FOR 'glancedbadmin'@'%' = PASSWORD('glancesecret');"

继续创建设定 keystone数据库:
sudo mysql -uroot -pmysecret -e 'CREATE DATABASE keystone;'
sudo mysql -uroot -pmysecret -e 'CREATE USER keystonedbadmin;'
sudo mysql -uroot -pmysecret -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystonedbadmin'@'%';"
sudo mysql -uroot -pmysecret -e "SET PASSWORD FOR 'keystonedbadmin'@'%' = PASSWORD('keystonesecret')"

现在,MySQL部分的工作结束。

5)Keystone

Keystone是OpenStack的认证服务,使用以下命令进行安装:
sudo apt-get install keystone python-keystone python-keystoneclient

打开/etc/keystone/keystone.conf 文件,将这一行:
admin_token = ADMIN
改为:
admin_token = admin

本例中将一直使用admin作为令牌;
本例中,使用MySQL来存储keystone配置,则将 /etc/keystone/keystone.conf 中的这句配置:
connection = sqlite:var/lib/keystone/keystone.db
换成:
connection = mysql://keystonedbadmin:keystonesecret@10.10.10.2/keystone

然后,重启Keystone:
sudo service keystone restart
接着,执行以下命令同步数据库:
sudo keystone-manage db_sync
最后,有些环境变量是OpenStack运行所必须的:
export SERVICE_ENDPOINT="http://localhost:35357/v2.0"
export SERVICE_TOKEN=admin
当然为了避免下次系统重启后,还得将这些变量再次export,最稳妥的办法就是将其写入~/.bashrc中。

创建租间
使用以下命令创建两个租间,admin和service:
keystone tenant-create --name admin
keystone tenant-create --name service

创建用户
执行以下命令,创建四个用户admin、nova、glance及swift:
keystone user-create --name admin --pass admin --email admin@foobar.com
keystone user-create --name nova --pass nova --email nova@foobar.com
keystone user-create --name glance --pass glance --email glance@foobar.com
keystone user-create --name swift --pass swift --email swift@foobar.com
 
创建角色
使用命令创建两个角色,admin和Member(译者注:注意是大写M):
keystone role-create --name admin
keystone role-create --name Member

查看租间、用户和角色
刚才建立的租间、用户和角色可以通过如下命令进行查看:
租间列表:keystone tenant-list
+----------------------------------+--------------------+---------+
| id | name | enabled |
+----------------------------------+--------------------+---------+
| 7f95ae9617cd496888bc412efdceabfd | admin | True |
| c7970080576646c6959ee35970cf3199 | service | True |
+----------------------------------+--------------------+---------+
用户列表:keystone user-list
+----------------------------------+---------+-------------------+--------+
| id | enabled | email | name |
+----------------------------------+---------+-------------------+--------+
| 1b986cca67e242f38cd6aa4bdec587ca | True | swift@foobar.com | swift |
| 518b51ea133c4facadae42c328d6b77b | True | glance@foobar.com | glance |
| b3de3aeec2544f0f90b9cbfe8b8b7acd | True | admin@foobar.com | admin |
| ce8cd56ca8824f5d845ba6ed015e9494 | True | nova@foobar.com | nova |
+----------------------------------+---------+-------------------+--------+
角色列表:keystone role-list
+----------------------------------+----------------------+
| id | name |
+----------------------------------+----------------------+
| 2bbe305ad531434991d4281aaaebb700 | admin |
| d983800dd6d54ee3a1b1eb9f2ae3291f | Member |
+----------------------------------+----------------------+
请大家格外注意id列中的值,虽然很长,但随后为用户绑定角色,继而把用户配入租间中时可全靠它们了。
 
为特定租间中的用户绑定角色
现在我们先为刚刚创建的用户绑定角色,通过如下命令格式可以为特定租间中的特定用户增加角色:
keystone user-role-add --user $USER_ID --role $ROLE_ID --tenant_id $TENANT_ID
译者注:仅是命令格式,随后才是真正执行的命令。
其中id字段可以通过keystone user-list,keystone role-list和keystone tenant-list命令获得。
下面开始为“admin”租间中的“admin”用户绑定“admin”角色:
keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role 2bbe305ad531434991d4281aaaebb700 --tenant_id 7f95ae9617cd496888bc412efdceabfd
接着执行如下命令,为“service”租间中的“nova”、“glance”、“swift”用户绑定“admin”角色:
keystone user-role-add --user ce8cd56ca8824f5d845ba6ed015e9494 --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199
keystone user-role-add --user 518b51ea133c4facadae42c328d6b77b --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199
keystone user-role-add --user 1b986cca67e242f38cd6aa4bdec587ca --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199

Horizon和Swift 只“Member”角色即可,所以相应地执行如下命令:
keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role d983800dd6d54ee3a1b1eb9f2ae3291f --tenant_id 7f95ae9617cd496888bc412efdceabfd

注意,在执行自己的安装时,请千万按照实际安装中的id进行设置,照抄本文id必将出错!

创建服务
至此,该创建授权用户可以享用的服务了,命令格式如下:
keystone service-create --name service_name --type service_type --description 'Description of the service'
创建nova-compute、nova-volume、glance、swift、keystone及ec2服务:
keystone service-create --name nova --type compute --description 'OpenStack Compute Service'
keystone service-create --name volume --type volume --description 'OpenStack Volume Service'
keystone service-create --name glance --type image --description 'OpenStack Image Service'
keystone service-create --name swift --type object-store --description 'OpenStack Storage Service'
keystone service-create --name keystone --type identity --description 'OpenStack Identity Service'
keystone service-create --name ec2 --type ec2 --description 'EC2 Service'

刚才创建的每个服务都拥有唯一的id,要查看服务id,使用如下命令即可:
keystone service-list
+----------------------------------+----------+--------------+----------------------------+
| id | name | type | description |
+----------------------------------+----------+--------------+----------------------------+
| 1e93ee6c70f8468c88a5cb1b106753f3   | nova | compute | OpenStack Compute Service |
| 28fd92ffe3824004996a3e04e059d875   | ec2 | ec2 | EC2 Service |
| 7d4ec192dfa1456996f0f4c47415c7a7    | keystone | identity | OpenStack Identity Service |
| 96f35e1112b143e59d5cd5d0e6a8b22d | swift | object-store | OpenStack Storage Service |
| f38f4564ff7b4e43a52b2f5c1b75e5fa      | volume | volume | OpenStack Volume Service |
| fbafab6edcab467bb734380ce6be3561  | glance | image | OpenStack Image Service |
+----------------------------------+----------+--------------+----------------------------+
这些id将被用于定义所属服务的入口(endpoint)。

创建入口
创建服务入口的命令格式是:
keystone endpoint-create --region region_name --service_id service_id --publicurl public_url --adminurl admin_url --internalurl internal_url
使用如下命令创建nova-compute入口:
keystone endpoint-create --region myregion --service_id 1e93ee6c70f8468c88a5cb1b106753f3 --publicurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --adminurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --internalurl 'http://10.10.10.2:8774/v2/$(tenant_id)s'

使用如下命令创建nova-volume入口:
keystone endpoint-create --region myregion --service_id f38f4564ff7b4e43a52b2f5c1b75e5fa --publicurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --adminurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --internalurl 'http://10.10.10.2:8776/v1/$(tenant_id)s'

使用如下命令创建glance入口:
keystone endpoint-create --region myregion --service_id fbafab6edcab467bb734380ce6be3561 --publicurl 'http://10.10.10.2:9292/v1' --adminurl 'http://10.10.10.2:9292/v1' --internalurl 'http://10.10.10.2:9292/v1'

使用如下命令创建swift入口:
keystone endpoint-create --region myregion --service_id 96f35e1112b143e59d5cd5d0e6a8b22d --publicurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s' --adminurl 'http://10.10.10.2:8080/v1' --internalurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s'

使用如下命令创建keystone入口:
keystone endpoint-create --region myregion --service_id 7d4ec192dfa1456996f0f4c47415c7a7 --publicurl http://10.10.10.2:5000/v2.0 --adminurl http://10.10.10.2:35357/v2.0 --internalurl http://10.10.10.2:5000/v2.0

使用如下命令创建ec2入口:
keystone endpoint-create --region myregion --service_id 28fd92ffe3824004996a3e04e059d875 --publicurl  http://10.10.10.2:8773/services/Cloud --adminurl http://10.10.10.2:8773/services/Admin --internalurl http://10.10.10.2:8773/services/Cloud

6)Glance

使用以下命令安装glance:
sudo apt-get install glance glance-api glance-client glance-common glance-registry python-glance

配置Glance服务
Glance默认使用SQLite,MySQL或PostgreSQL也可以很好地与Glance工作,
打开 /etc/glance/glance-api-paste.ini 文件并在末尾编辑如下内容:
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%

这些值需要用刚才我们安装中的实际值进行替换,admin_tenant_name应该是“service”,admin_user这里是“glance”、admin_password是“glance”。编辑完这三行应该是如下的样子:
admin_tenant_name = service
admin_user = glance
admin_password = glance

接着再打开 /etc/glance/glance-registry-paste.ini 文件,也如上述操作一样在文件尾部进行同样的编辑。
然后,修改glance 数据库连接为MySQL,编辑 /etc/glance/glance-registry.conf,找到“sql_connection =”这句作如下修改:
sql_connection = mysql://glancedbadmin:glancesecret@10.10.10.2/glance

紧接着还是这份文件,在底部增加如下设置,目的是让glance使用keystone授权:
[paste_deploy]
flavor = keystone 

打开 /etc/glance/glance-api.conf 文件,在文件末尾增加如下配置:
[paste_deploy]
flavor = keystone 

在MySQL数据库中创建 glance schema,进行同步:
sudo glance-manage version_control 0
sudo glance-manage db_sync 

上述改动全部完成后,重启glance-api和glance-registry服务:
sudo restart glance-api
sudo restart glance-registry

设置如下环境变量,你也可以将其写入 ~/.bashrc中:
export SERVICE_TOKEN=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://localhost:5000/v2.0/"
export SERVICE_ENDPOINT=http://localhost:35357/v2.0

现在我们可以使用这个命令来测试 glance 是否正确安装:
glance index

如果这条命令没有返回任何结果,则说明glance已经正确安装完毕,并与Keystone正常通信。若是稍微探究一下的话,上述命令其实有返回值,正确安装情况下的返回值是0,可以使用echo $?进行查看。
在Glance正确配置且使用keystone作为授权机制后,我们便可以上传镜像到glance了,相关内容详见后文中的“镜像管理(Image Management)”。

7)Nova

先使用如下命令安装nova及其相关组件:
sudo apt-get install nova-api nova-cert nova-compute nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler nova-volume rabbitmq-server novnc nova-consoleauth

配置Nova
以如下配置为例,编辑nova主配文件 /etc/nova/nova.conf:
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/run/lock/nova
--allow_admin_api=true
--use_deprecated_auth=false
--auth_strategy=keystone
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--s3_host=10.10.10.2
--ec2_host=10.10.10.2
--rabbit_host=10.10.10.2
--cc_host=10.10.10.2
--nova_url=http://10.10.10.2:8774/v1.1/
--routing_source_ip=10.10.10.2
--glance_api_servers=10.10.10.2:9292
--image_service=nova.image.glance.GlanceImageService
--iscsi_ip_prefix=192.168.4
--sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova
--ec2_url=http://10.10.10.2:8773/services/Cloud
--keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens
--api_paste_config=/etc/nova/api-paste.ini
--libvirt_type=kvm
--libvirt_use_virtio_for_bridges=true
--start_guests_on_host_boot=true
--resume_guests_state_on_host_boot=true

# vnc specific configuration
--novnc_enabled=true
--novncproxy_base_url=http://10.10.10.2:60
--vncserver_proxyclient_address=10.10.10.2
--vncserver_listen=10.10.10.2

# network specific settings
--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth1
--flat_network_bridge=br100
--fixed_range=192.168.4.1/27
--floating_range=10.10.10.2/27
--network_size=32
--flat_network_dhcp_start=192.168.4.33
--flat_injected=False
--force_dhcp_release
--iscsi_helper=tgtadm
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--verbose

创建一个物理卷:
sudo pvcreate /dev/sda6

创建一个名为“nova-volumnes”的卷组:
sudo vgcreate nova-volumes /dev/sda6

修改 /etc/nova 文件夹的属主及 /etc/nova/nova.conf 文件的访问权限:
sudo chown -R nova:nova /etc/nova
sudo chmod 644 /etc/nova/nova.conf

进入 /etc/nova/api-paste.ini 文件,找到末尾三行:
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%

用之前创建的名字进行替换(译者注:和Glance如出一辙,只是这次是nova),编辑完毕如下所示:
admin_tenant_name = service
admin_user = nova
admin_password = nova

仍然在MySQL数据库进行同步:
sudo nova-manage db sync

为实例提供IP池:
sudo nova-manage network create private --fixed_range_v4=192.168.4.32/27 --num_networks=1 --bridge=br100 --bridge_interface=eth1 --network_size=32

输出环境变量:
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://localhost:5000/v2.0/"

重启nova服务:
sudo restart libvirt-bin; sudo restart nova-network; sudo restart nova-compute; sudo restart nova-api; sudo restart nova-objectstore; sudo restart nova-scheduler; sudo restart nova-volume; sudo restart nova-consoleauth;

执行下列命令测试 nova 是否正确安装:
sudo nova-manage service list

Binary Host Zone Status State Updated_At
nova-network server1 nova enabled :-) 2012-04-20 08:58:43
nova-scheduler server1 nova enabled :-) 2012-04-20 08:58:44
nova-volume server1 nova enabled :-) 2012-04-20 08:58:44
nova-compute server1 nova enabled :-) 2012-04-20 08:58:45
nova-cert server1 nova enabled :-) 2012-04-20 08:58:43

若所有组件都是微笑,说明nova已经正确安装完毕。

8)OpenStack管理面板

执行下列命令安装管理面板:
sudo apt-get install openstack-dashboard

重启Apache:
sudo service apache2 restart

现在打开浏览器输入server1的IP地址,就可以看到OpenStack的管理面板登陆界面了。默认用户名和密码都是“admin”。在管理面板中,可以进行创建密匙对,创建、编辑安全群组,新建实例,添加卷等操作。具体内容详见后文“OpenStack Dashboard”章节。

9)Swift

安装Swift
最重要的部分是swift的代理、账户、容器及对象服务器:
sudo apt-get install swift swift-proxy swift-account swift-container swift-object

随后安装一些支持组件,xfsprogs(支持XFS文件系统)、python.pastedeploy(访问keystone)和curl(测试swift):
sudo apt-get install xfsprogs curl python-pastedeploy

Swift存储端
有两种方法来创建或制备存储端,一种是采用现有的分区或卷作为存储设备,另一种是创建环回文件(Loopback file)并将当做存储设备。安装时,两种方式自选:

A. 分区作为存储设备
如果在安装OS时为Swift预留了一个分区,你就可以直接使用它。如果该分区没有使用过或仍是空闲空间(比如 /dev/sdb3),就应该把它格式化为xfs文件系统,接着编辑 /etc/fstab中该分区的挂载点(注意:请根据实际情况选择你自定的设备,本教程假定手头未使用也没分区的空闲空间在 /dev/sdb上):
sudo fdisk /dev/sdb

Type n for new partition
Type e for extended partion
Choose appropriate partition number ( or go with the default )
Choose first and last sectors to set the hard disk size (or go with defaults)
Note that 83 is the partition type number for Linux
Type w to write changes to the disk

上述命令将创建一个譬如 /dev/sdb3的分区,接着将其格式化为XFS。记得格式化前要先使用命令“sudo fdisk -l”查看当前分区表,确定系统列出的分区含有你即将格式化的目标分区。最后,如果刚才 xfsprogs 成功安装的话,我们才能够使用以下命令:
sudo mkfs.xfs -i size=1024 /dev/sdb3
sudo tune2fs -l /dev/sdb3 |grep -i inode 

创建一个该分区的挂载点,并命名为“swift_backend”:
sudo mkdir /mnt/swift_backend
紧接着编辑 /etc/fstab 文件写入如下内容以便系统启动时自动加载这个分区:
/dev/sdb3 /mnt/swift_backend xfs noatime,nodiratime,nobarrier,logbufs=8 0 0

B. 环回文件作为存储设备
创建一个空文件作为Swift存储的环回设备,在这里我们使用disk copy命令创建它并命名为swift-disk,还将为其分配1G的磁盘空间。如果空间不够,可以通过改变seek值来增加空间。随后格式化为XFS:
sudo dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=1000000
sudo mkfs.xfs -i size=1024 /srv/swift-disk

file /srv/swift-disk
swift-disk1: SGI XFS filesystem data (blksz 4096, inosz 1024, v2 dirs)

创建挂载点:
sudo mkdir /mnt/swift_backend
写入 /etc/fstab:
/srv/swift-disk /mnt/swift_backend xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0

使用存储
挂载存储分区前,需要创建一些设备节点并设置其属主和主群为“Swift”:
sudo mount /mnt/swift_backend
pushd /mnt/swift_backend
sudo mkdir node1 node2 node3 node4
popd
sudo chown swift.swift /mnt/swift_backend/*
for i in {1..4}; do sudo ln -s /mnt/swift_backend/node$i /srv/node$i; done;
sudo mkdir -p /etc/swift/account-server /etc/swift/container-server /etc/swift/object-server /srv/node1/device /srv/node2/device /srv/node3/device /srv/node4/device
sudo mkdir /run/swift
sudo chown -L -R swift.swift /etc/swift /srv/node[1-4]/ /run/swift

为了在系统启动时启动Swift服务,需要把如下两行命令写入 /etc/rc.local里,位置在“exit 0;”之前:
sudo mkdir /run/swift
sudo chown swift.swift /run/swift

配置远程备份
Rsync用来维护对象副本,许多swift服务都使用它保持对象一致性及进行更新操作。所有存储节点都将享用此配置:
首先编辑 /etc/default/rsync 文件:
Set RSYNC_ENABLE=true
然后编辑 /etc/rsyncd.conf 配置文件,如下所示:
# General stuff
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /run/rsyncd.pid
address = 127.0.0.1

# Account Server replication settings
[account6012]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/account6012.lock

[account6022]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/account6022.lock

[account6032]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/account6032.lock

[account6042]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/account6042.lock


# Container server replication settings
[container6011]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/container6011.lock

[container6021]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/container6021.lock

[container6031]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/container6031.lock

[container6041]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/container6041.lock

# Object Server replication settings
[object6010]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/object6010.lock

[object6020]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/object6020.lock

[object6030]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/object6030.lock

[object6040]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/object6040.lock

最后重新启动服务完成rsync配置:
sudo service rsync restart

配置Swift组件
详细的配置选项参见 http://swift.openstack.org/deployment_guide.html。如果安装了swift-doc包的话,则可以在/usr/share/doc/swift-doc/html目录下直接查看。Python使用paste.deploy管理配置。默认配置选项在[DEFAULT]段中,后面配置其它特殊项会覆盖默认段中的相关内容。格式如下:
THE SYNTAX set option_name = value

以下是一份paste.deploy的配置样例,仅供参考:
[DEFAULT]
name1 = globalvalue
name2 = globalvalue
name3 = globalvalue
set name4 = globalvalue

[pipeline:main]
pipeline = myapp

[app:myapp]
use = egg:mypkg#myapp
name2 = localvalue
set name3 = localvalue
set name5 = localvalue
name6 = localvalue

创建并编辑 /etc/swift/swift.conf 文件,并写入如下配置:
[swift-hash]
# random unique string that can never change (DO NOT LOSE). I'm using 03c9f48da2229770.
# od -t x8 -N 8 -A n < /dev/random
# The above command can be used to generate random a string.
swift_hash_path_suffix = 03c9f48da2229770

特别的,当建立更多的节点时,你需要记住随机串。不要照抄本例,请通过以下命令生成自己的随机字符串:
od -t x8 -N 8 -A n < /dev/random

配置Swift代理服务器
代理服务器是swift的门卫,它的职责是检测合法性。它将审查:
一、请求是否伪造,
二、请求使用资源的用户身份。
具体操作由keystone之类的认证服务器来协助完成。
创建并编辑 /etc/swift/proxy-server.conf并增加如下内容:
[DEFAULT]
bind_port = 8080
user = swift
swift_dir = /etc/swift

[pipeline:main]
# Order of execution of modules defined below
pipeline = catch_errors healthcheck cache authtoken keystone proxy-server

[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true
set log_name = swift-proxy
set log_facility = LOG_LOCAL0
set log_level = INFO
set access_log_name = swift-proxy
set access_log_facility = SYSLOG
set access_log_level = INFO
set log_headers = True
account_autocreate = True

[filter:healthcheck]
use = egg:swift#healthcheck

[filter:catch_errors]
use = egg:swift#catch_errors

[filter:cache]
use = egg:swift#memcache
set log_name = cache

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_protocol = http
auth_host = 127.0.0.1
auth_port = 35357
auth_token = admin
service_protocol = http
service_host = 127.0.0.1
service_port = 5000
admin_token = admin
admin_tenant_name = service
admin_user = swift
admin_password = swift
delay_auth_decision = 0

[filter:keystone]
paste.filter_factory = keystone.middleware.swift_auth:filter_factory
operator_roles = admin, swiftoperator
is_admin = true

注意:可以使用apt-get安装swift-doc软件包,安装后许多文档都收录在/usr/share/doc/swift-doc/html下,本配置样例也是如此。

配置Swift账户服务器
默认swift容器服务配置文件为 /etc/swift/account-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = account-server

[app:account-server]
use = egg:swift#account

[account-replicator]

[account-auditor]

[account-reaper]

所有的account server配置文件都在 /etc/swift/account-server目录中。与 /srv里的设备相对应,我们创建1.conf、2.conf等等文件,并将它们放到/etc/swift/account-server/下。以下是/etc/swift/account-server/1.conf配置文件的内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6012
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = account-server

[app:account-server]
use = egg:swift#account

[account-replicator]
vm_test_mode = no

[account-auditor]

[account-reaper]

对其它设备也是如此,比如/srv/node2、/srv/node3、/srv/node4等,我们分别创建2.conf,3.conf和4.conf与之对应。现在利用1.conf进行复制生成其余文件,并一一设置唯一的绑定端口及本地日志值:
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/2.conf
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/3.conf
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/4.conf
sudo sed -i 's/6012/6022/g;s/LOCAL2/LOCAL3/g;s/node1/node2/g' /etc/swift/account-server/2.conf
sudo sed -i 's/6012/6032/g;s/LOCAL2/LOCAL4/g;s/node1/node3/g' /etc/swift/account-server/3.conf
sudo sed -i 's/6012/6042/g;s/LOCAL2/LOCAL5/g;s/node1/node4/g' /etc/swift/account-server/4.conf

配置Swift容器服务器
默认swift容器服务配置文件为 /etc/swift/container-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = container-server

[app:container-server]
use = egg:swift#container

[container-replicator]

[container-updater]

[container-auditor]

[container-sync]

与account-server类似,我们同样创建 /etc/swift/container-server/1.conf等等文件与 /srv设备匹配,这是1.conf文件内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6011
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = container-server

[app:container-server]
use = egg:swift#container

[container-replicator]
vm_test_mode = no

[container-updater]

接着利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6021、6031和6041)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和LOG_LOCAL5)。

配置Swift对象服务器
默认swift容器服务配置文件为 /etc/swift/object-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = object-server

[app:object-server]
use = egg:swift#object

[object-replicator]

[object-updater]

[object-auditor]

与account-server和container-server一样,我们同样创建 /etc/swift/object-server/1.conf等等文件与 /srv设备匹配,这是1.conf文件内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6010
user = swift
log_facility = LOG_LOCAL2

[pipeline:main]
pipeline = object-server

[app:object-server]
use = egg:swift#object

[object-replicator]
vm_test_mode = no

[object-updater]

[object-auditor]

继而利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6020、6030和6040)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和LOG_LOCAL5)。

配置Swift Ring服务器
Ring是swift的一个极为重要的组件,它维护着对象的真实物理位置信息,对象的副本及多种设备。创建与对象服务、容器服务和账户服务相对应的ring-builder文件:
pushd /etc/swift
sudo swift-ring-builder object.builder create 18 3 1
sudo swift-ring-builder container.builder create 18 3 1
sudo swift-ring-builder account.builder create 18 3 1

注意:执行以上命令时需要在 /etc/swift目录下。
命令中的参数指定了分区、副本和小时的数量,用来限制分区多次移动。可以参考man页面中的swift-ring-builder获取更多信息。

现在添加区域以均衡ring服务。命令格式如下:
swift-ring-builder <builder_file> add <zone>-<ip_address>:<port>/<device><weight>

执行下列命令:
sudo swift-ring-builder object.builder add z1-127.0.0.1:6010/device 1
sudo swift-ring-builder object.builder add z2-127.0.0.1:6020/device 1
sudo swift-ring-builder object.builder add z3-127.0.0.1:6030/device 1
sudo swift-ring-builder object.builder add z4-127.0.0.1:6040/device 1
sudo swift-ring-builder object.builder rebalance
sudo swift-ring-builder container.builder add z1-127.0.0.1:6011/device 1
sudo swift-ring-builder container.builder add z2-127.0.0.1:6021/device 1
sudo swift-ring-builder container.builder add z3-127.0.0.1:6031/device 1
sudo swift-ring-builder container.builder add z4-127.0.0.1:6041/device 1
sudo swift-ring-builder container.builder rebalance
sudo swift-ring-builder account.builder add z1-127.0.0.1:6012/device 1
sudo swift-ring-builder account.builder add z2-127.0.0.1:6022/device 1
sudo swift-ring-builder account.builder add z3-127.0.0.1:6032/device 1
sudo swift-ring-builder account.builder add z4-127.0.0.1:6042/device 1
sudo swift-ring-builder account.builder rebalance 

启动Swift服务
使用以下命令启动 swift 和 REST API:
sudo swift-init main start
sudo swift-init rest start

测试Swift
可以通过Swift命令或Horizon提供的Web管理面板测试Swift是否正确运行。
首先,将 /etc/swift目录的属主设为swift.swift:
sudo chown -R swift.swift /etc/swift

执行以下命令查看是否能得到正确的account、容器数量和存储的对象信息:
swift -v -V 2.0 -A http://127.0.0.1:5000/v2.0/ -U service:swift -K swift stat

StorageURL: http://127.0.0.1:8080/v1/AUTH_c7970080576646c6959ee35970cf3199
Auth Token: ba9df200a92d4a5088dcd6b7dcc19c0d
Account: AUTH_c7970080576646c6959ee35970cf3199
Containers: 1
Objects: 1
Bytes: 77
Accept-Ranges: bytes
X-Trans-Id: tx11c64e218f984749bc3ec37ea46280ee

至此,Server1终于安装完毕!

2.2 Server2

Server2仅运行nova的运算服务。

1)安装底层OS

安装64位Ubuntu12.04服务器。

2)配置网络

安装网桥软件:
sudo apt-get install bridge-utils
编辑 /etc/network/interfaces文件,如下所示:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.10.10.3
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.254
dns-nameservers 10.10.10.1
auto eth1
iface eth1 inet static
address 192.168.3.2
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255

重启网络:
sudo /etc/init.d/networking restart

3)NTP客户端

安装NTP软件包:
sudo apt-get install ntp

编辑 /etc/ntp.conf文件,增加如下内容以同步至server1:
server 10.10.10.2

重启NTP服务使配置生效:
sudo service ntp restart

4)Nova组件(仅nova-compute)

安装Nova及其依赖包:
sudo apt-get install nova-compute

如下所示,编辑 /etc/nova/nova.conf文件。该文件与Server1中的一致:
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/run/lock/nova
--allow_admin_api=true
--use_deprecated_auth=false
--auth_strategy=keystone
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--s3_host=10.10.10.2
--ec2_host=10.10.10.2
--rabbit_host=10.10.10.2
--cc_host=10.10.10.2
--nova_url=http://10.10.10.2:8774/v1.1/
--routing_source_ip=10.10.10.2
--glance_api_servers=10.10.10.2:9292
--image_service=nova.image.glance.GlanceImageService
--iscsi_ip_prefix=192.168.4
--sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova
--ec2_url=http://10.10.10.2:8773/services/Cloud
--keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens
--api_paste_config=/etc/nova/api-paste.ini
--libvirt_type=kvm
--libvirt_use_virtio_for_bridges=true
--start_guests_on_host_boot=true
--resume_guests_state_on_host_boot=true

# vnc specific configuration
--novnc_enabled=true
--novncproxy_base_url=http://10.10.10.2:6080/vnc_auto.html
--vncserver_proxyclient_address=10.10.10.2
--vncserver_listen=10.10.10.2

# network specific settings
--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth1
--flat_network_bridge=br100
--fixed_range=192.168.4.1/27
--floating_range=10.10.10.2/27
--network_size=32
--flat_network_dhcp_start=192.168.4.33
--flat_injected=False
--force_dhcp_release
--iscsi_helper=tgtadm
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--verbose

重新启动Server2上的nova-compute服务:
sudo service restart nova-compute

利用如下命令测试云中第二个运算节点(即Server2)是否正常运行:
sudo nova-manage service list

Binary Host Zone Status State Updated_At
nova-network server1 nova enabled :-) 2012-04-20 08:58:43
nova-scheduler server1 nova enabled :-) 2012-04-20 08:58:44
nova-volume server1 nova enabled :-) 2012-04-20 08:58:44
nova-compute server1 nova enabled :-) 2012-04-20 08:58:45
nova-cert server1 nova enabled :-) 2012-04-20 08:58:43
nova-compute server2 nova enabled :-) 2012-04-21 10:22:27

如果看到类似结果,则说明安装已经成功可以使用。至此,Server2安装完毕!

2.3 Client1

1)安装OS

安装64位Ubuntu12.04桌面版。

2)配置网络

如下所示,编辑 /etc/nova/nova.conf文件:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.10.10.4
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.254
dns-nameservers 10.10.10.1

3)NTP客户端

安装NTP软件包:
sudo apt-get install -y ntp

编辑 /etc/ntp.conf文件,增加如下内容以同步至server1:
server 10.10.10.2

重启NTP服务使配置生效:
sudo service ntp restart

4)客户端工具

如前所述,Ubuntu12.04桌面版用来制作镜像,同样它也可以使用nvoa、glance和swift命令行工具管理云。
使用下列命令安装我们需要的命令行工具:
sudo apt-get install python-novaclient glance-client swift

接着安装qemu-kvm:
sudo apt-get install qemu-kvm

输入环境变量,并将其添加进 ~/.bashrc脚本中:
export SERVICE_TOKEN=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://10.10.10.2:5000/v2.0/"
export SERVICE_ENDPOINT=http://10.10.10.2:35357/v2.0

运行nova和glance命令查看是否与OpenStack正常连接:
nova list
+--------------------------------------+------------+--------+----------------------+
| ID | Name | Status | Networks
+--------------------------------------+------------+--------+----------------------+
| 25ee9230-6bb5-4eca-8808-e6b4e0348362 | myinstance | ACTIVE | private=192.168.4.35 |
| c939cb2c-e662-46e5-bc31-453007442cf9 | myinstance1| ACTIVE | private=192.168.4.36 |
+--------------------------------------+------------+--------+----------------------+

glance index
ID Name Disk Container Size Format Format
------------------------------------ ----------------------------------------------
65b9f8e1-cde8-40e7-93e3-0866becfb9d4 windows    qcow2 ovf 7580745728
f147e666-990c-47e2-9caa-a5a21470cc4e  debian       qcow2 ovf 932904960
f3a8e689-02ed-460f-a587-dc868576228f  openSUSE  qcow2 ovf 1072300032
aa362fd9-7c28-480b-845c-85a5c38ccd86 CentOScli   qcow2 ovf 1611530240
49f0ec2b-26dd-4644-adcc-2ce047e281c5 ubuntuimage qcow2 ovf 1471807488

5)管理面板

打开浏览器输入Server1的IP地址,如:http://10.10.10.2,便进入管理面板的登陆页面。使用用户名“admin”和密码“admin”进行登陆来管理您刚建好的OpenStack吧。

OpenStack镜像管理 

很多源都有为OpenStack已经编译好的各种镜像了,您可以直接下载并通过使用这些镜像来熟悉OpenStack。不过如果是为生产环境进行部署的话,您一定需要构建含有定制软件或配置的镜像文件。本节将引领完成几种较为流行的Linux发行版镜像,最后也将制作一份Windows的镜像。
由不同的Linux发行版制作镜像时,过程几乎一样,仅有微小的差别而已。由于含有cloud-ini软件包,人们用Ubuntu系统制作镜像文件变得非常容易。Cloud-init软件在实例运行时能够自动维护实例配置,也将为无密码登陆完成密匙导入以及完成设置主机名等任务。每个实例都将通过169.254.169.254的元数据接口,从nova运算中读取特定的配置。
如果您制作发行版不含有诸如cloud-init此类的软件包,您就需要自行完成密匙导入等操作了。说来也简单,只需向rc.local文件中添加相关命令即可。
如前所述,创建Linux不同发行版的过程除了几细微之处外,其余完全一致。不同点将在后文阐述。
本文所有的例子,都是在KVM基础上完成的。正像前两章说道的那样,现在我正在使用client1。接下来的操作将制作很多镜像,这些镜像代表一个没有分区的硬盘。 

创建Linux镜像

首先是在Client1上创建一块空镜像,这块镜像用作虚拟机的硬盘,所以请保证留出你所需的空间的大小:
kvm-img create -f qcow2 server.img 5G

1)安装准备

下载你所需的Linux发行版iso原镜像文件,比如您想安装Ubuntu,您可以使用wget或浏览器从网站“http://releases.ubuntu.com”获得iso文件。
将下载的iso文件置入虚拟机的CD-ROM后,启动KVM一个虚拟机实例。您将看到安装过程的开始。键入如下命令,它将在端口0开放VNC服务:
sudo kvm -m 256 -cdrom ubuntu-12.04-server-amd64.iso -drive file=server.img,if=virtio,index=0 -boot d -net nic -net user -nographic -vnc :0

使用0这个展示端口连入虚拟机的VNC,并完成安装。举例如下,client1的IP地址是10.10.10.4,则通过下列命令访问vnc:
vncviewer 10.10.10.4 :0
注意,在制作Linux镜像过程中,请创建一个单独的ext4格式分区并将其挂在swap分区下。
安装结束后,通过执行下列命令重新载入虚拟机:
sudo kvm -m 256 -drive file=server.img,if=virtio,index=0 -boot c -net nic -net user -nographic -vnc :0

此时,您可以在这个系统上安装定制的软件包,进行系统更新,添加用户或更改配置了。

2)Ubuntu 

执行以下命令:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install openssh-server cloud-init

清除 /etc/udev/rules.d 文件的网络设备命名规则,因为这些规则将从实例的网卡获得。
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

3)Fedfora 

运行如下命令:
yum update
yum install openssh-server
chkconfig sshd on

然后编辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文件如下所示:
DEVICE="eth0"
BOOTPROTO=dhcp
NM_CONTROLLED="yes"
ONBOOT="yes"

清除 /etc/udev/rules.d 文件的网络设备命名规则,因为这些规则将从实例的网卡获得。
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

关闭虚拟机。由于Fedora没有cloud-init或类似软件,您需要亲自进行几步配置使实例可以得到诸如ssh key这样的元数据。
编辑 /etc/rc.local 文件并且把以下内容粘贴到“touch /var/lock/subsys/local”行前:
depmod -a
modprobe acpiphp

# simple attempt to get the user ssh key using the meta-data service
mkdir -p /root/.ssh
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key| grep 'ssh-rsa' >> /root/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "************************"
cat /root/.ssh/authorized_keys
echo "************************"

4)OpenSUSE

选择ssh服务,curl以及其他需要的包。
安装ssh服务器:
zypper install openssh

安装crul:
zypper install curl

使用如下步骤将Ssh Key注入实例中:
首先,创建文件 /etc/init.d/sshkey 并且写入下列内容:
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "************************"
cat /root/.ssh/authorized_keys
echo "************************"

然后,为该文件设置权限:
chmod 755 /etc/init.d/sshkey

将sshkey服务设置为开机自动启动:
chkconfig sshkey on

使用下列命令设置防火墙(而非iptables),令其允许ssh服务:
yast2

最后同样地,清除 /etc/udev/rules.d 文件的网络设备命名规则,因为这些规则将从实例的网卡获得。
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

5)Debian 

安装时选择SSH服务器,Curl及相关软件。
然后进行必要的设置,为key注入而编辑 /etc/rc.local文件并增加如下内容:
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "************************"
cat /root/.ssh/authorized_keys
echo "************************"

同样地,清除 /etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

6)CentOS6及RHEL6 

安装时选择SSH服务器,Curl及相关软件。
然后进行必要的设置,为key注入而编辑 /etc/rc.local文件并增加如下内容:
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "************************"
cat /root/.ssh/authorized_keys
echo "************************"

编辑 /etc/sysconfig/network-scripts/ifcfg-eth0文件如下所示:
DEVICE="eth0"
BOOTPROTO=dhcp
NM_CONTROLLED="yes"
ONBOOT="yes"

同样地,清除 /etc/udev/rules.d文件的网络设备命名规则,因为这些规则将从实例的网卡获得。
sudo rm -rf /etc/udev/rules.d/70-persistent-net.rules

7)上传Linux镜像 

使用如下命令上传镜像:
glance add name="<Image name>" is_public=true container_format=ovf disk_format=qcow2 < <filename>.img

创建Windows镜像 

第一步,仍然是在Client1上创建一块空镜像,这块镜像用作虚拟机的硬盘,所以请保证留出你所需的空间的大小:
kvm-img create -f qcow2 windowsserver.img 20G

1)安装操作系统 

当实例运行时,OpenStack利用virtio接口来使用镜像,于是镜像中的操作系统需要装有virtio驱动。不巧的是,默认Windows Server 2008是没有virtio驱动的。
您可以在如下网址:http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin 下载装有该驱动的iso镜像并使用该镜像进行安装。
译注1:Virtio 是半虚拟化 hypervisor 中位于设备之上的抽象层。virtio 由 Rusty Russell 开发,virtio 是对半虚拟化 hypervisor 中的一组通用模拟设备的抽象。该设置还允许 hypervisor 导出一组通用的模拟设备,并通过一个通用的应用编程接口API让它们变得可用。
译注2:该链接的virtio-win是0.1-22版,不能用,请选择下载用1.1.16新版即可。

执行此命令开始安装:
sudo kvm -m 1024 -cdrom windows2008.iso -drive file=windowsserver1.img,if=virtio -boot d -drive file=virtio-win-0.1-22.iso,index=3,media=cdrom -device virtio-net-pci -net nic -net user -nographic -vnc :5

当安装提示您选择一块硬盘设备步骤时,您并不能看到当前有可用设备。点击左下方的“载入设备(Load drivers)”按钮,选择第二 CDROM后,含有virtio驱动的硬盘便被加载了。在安装结束之前,您需要重启系统一次,此时您可以安装其它您所需的软件或执行任何需要的配置更改。除此之外,请务必开放实例中的远程桌面,因为远程桌面将是您连接并使用该实例的唯一途径。同时,Windows防火墙应该相应地设置为对ICMP和RDP开放。

2)上传Windows镜像

关闭虚拟机并将该镜像使用如下命令上传至OpenStack中:
glance add name="windows" is_public=true container_format=ovf disk_format=qcow2 < windowsserver.img

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值