OpenStack快速入门

第一部分:OpenStack及其构成简介

    一、云计算

    云计算是一种计算模型,它将诸如运算能力、存储、网络和软件等资源抽象成为服务,以便让用户通过互联网远程享用,付费的形式也如同传统公共服务设施一样。因需而定、提供方便、动态改变和无限的虚拟化扩展能力是云计算的几个重要特征。
    不同的“云”对应着不同的基础设施。下面是三种广义的“云”:
    (1)基础设施即服务(IaaS)
    (2)平台即服务(PaaS)
    (3)软件即服务(SaaS)
    译者注:Open为开放之意,Stack则是堆栈,OpenStack合起来如其名,就是许多Open的Softwares堆积的集合,但1 + 1 > 2,系统的功能更为强大。

    二、OpenStack概述
    OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立、运行自己的云计算和存储设施。Rackspace与NASA是最初重要的两个贡献者,前者提供了“云文件”平台代码,该平台增强了OpenStack对象存储部分的功能,而后者带来了“Nebula”平台形成了OpenStack其余的部分。而今,OpenStack基金会已经有150多个会员,包括很多知名公司。目前8个白金会员包括AT&T、Canonical、HP、IBM、Nebula、Rackspace、Red Hat和SUSE。黄金会员包括思科、戴尔、NetApp、Piston云计算、雅虎、英特尔、NEC、VMware,等等。
    以下是5个OpenStack的重要构成部分:
    (1)Nova - 计算服务
    (2)Swift - 存储服务
    (3)Glance - 镜像服务
    (4)Keystone - 认证服务
    (5)Horizon - UI服务

    OpenStack的基本架构如下图:


图1 OpenStack基本构架

    下图展示了Keystone、Dashboard二者与其它OpenStack部分的交互。

图2 OpenStack各组件的交互

    三、OpenStack计算设施----Nova
    Nova是OpenStack计算的弹性控制器。OpenStack云实例生命期所需的各种动作都将由Nova进行处理和支撑,这就意味着Nova以管理平台的身份登场,负责管理整个云的计算资源、网络、授权及测度。虽然Nova本身并不提供任何虚拟能力,但是它将使用libvirt API与虚拟机的宿主机进行交互。Nova通过Web服务API来对外提供处理接口,而且这些接口与Amazon的Web服务接口是兼容的。
    功能及特点:实例生命周期管理、计算资源管理、网络与授权管理、基于REST的API、异步连续通信、支持各种宿主:Xen、XenServer/XCP、KVM、UML、VMware vSphere及Hyper-V。
    Nova弹性云包含以下主要部分:API Server(nova-api)、消息队列(rabbit-mq server)、运算工作站(nova-compute)、网络控制器(nova-network)、卷管理(nova-volume)、调度器(nova-scheduler)。
    (1)API服务器(nova-api)
    API服务器提供了云设施与外界交互的接口,它是外界用户对云实施管理的唯一通道。通过使用web服务来调用各种EC2的API,接着API服务器便通过消息队列把请求送达至云内目标设施进行处理。作为对EC2-api的替代,用户也可以使用OpenStack的原生API,我们把它叫做“OpenStack API”。
    (2)消息队列(Rabbit MQ Server)
    OpenStack内部在遵循AMQP(高级消息队列协议)的基础上采用消息队列进行通信。Nova对请求应答进行异步调用,当请求接收后便则立即触发一个回调。由于使用了异步通信,不会有用户的动作被长置于等待状态。例如,启动一个实例或上传一份镜像的过程较为耗时,API调用就将等待返回结果而不影响其它操作,在此异步通信起到了很大作用,使整个系统变得更加高效。
    (3)运算工作站(nova-compute)
    运算工作站的主要任务是管理实例的整个生命周期。他们通过消息队列接收请求并执行,从而对实例进行各种操作。在典型实际生产环境下,会架设许多运算工作站,根据调度算法,一个实例可以在可用的任意一台运算工作站上部署。
    (4)网络控制器(nova-network)
    网络控制器处理主机的网络配置,例如IP地址分配,配置项目VLAN,设定安全群组以及为计算节点配置网络。
    (5)卷工作站(nova-volume)
    卷工作站管理基于LVM的实例卷,它能够为一个实例创建、删除、附加卷,也可以从一个实例中分离卷。卷管理为何如此重要?因为它提供了一种保持实例持续存储的手段,比如当结束一个实例后,根分区如果是非持续化的,那么对其的任何改变都将丢失。可是,如果从一个实例中将卷分离出来,或者为这个实例附加上卷的话,即使实例被关闭,数据仍然保存其中。这些数据可以通过将卷附加到原实例或其他实例的方式而重新访问。
    因此,为了日后访问,重要数据务必要写入卷中。这种应用对于数据服务器实例的存储而言,尤为重要。
    (6)调度器(nova-scheduler)
    调度器负责把nova-API调用送达给目标。调度器以名为“nova-schedule”的守护进程方式运行,并根据调度算法从可用资源池中恰当地选择运算服务器。有很多因素都可以影响调度结果,比如负载、内存、子节点的远近、CPU架构等等。强大的是nova调度器采用的是可插入式架构。
    目前nova调度器使用了几种基本的调度算法:
    随机化:主机随机选择可用节点;
    可用化:与随机相似,只是随机选择的范围被指定;
    简单化:应用这种方式,主机选择负载最小者来运行实例。负载数据可以从别处获得,如负载均衡服务器。

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

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

    Swift组件:Swift代理、Swift对象、Swift容器、Swift账户、Swift RING。
    (1)Swift代理服务器
    用户都是通过Swift-API与代理服务器进行交互,代理服务器正是接收外界请求的门卫,它检测合法的实体位置并路由它们的请求。此外,代理服务器也同时处理实体失效而转移时,故障切换的实体重复路由请求。
    (2)Swift对象服务器
    对象服务器是一种二进制存储,它负责处理本地存储中的对象数据的存储、检索和删除。对象都是文件系统中存放的典型的二进制文件,具有扩展文件属性的元数据(xattr)。
    注意:xattr格式被Linux中的ext3/4,XFS,Btrfs,JFS和ReiserFS所支持,但是并没有有效测试证明在XFS,JFS,ReiserFS,Reiser4和ZFS下也同样能运行良好。不过,XFS被认为是当前最好的选择。
    (3)Swift容器服务器
    容器服务器将列出一个容器中的所有对象,默认对象列表将存储为SQLite文件(译者注:也可以修改为MySQL,安装中就是以MySQL为例)。容器服务器也会统计容器中包含的对象数量及容器的存储空间耗费。
    (4)Swift账户服务器
    账户服务器与容器服务器类似,将列出容器中的对象。
    (5)Swift Ring(索引环)
    Ring容器记录着Swift中物理存储对象的位置信息,它是真实物理存储位置的实体名的虚拟映射,类似于查找及定位不同集群的实体真实物理位置的索引服务。这里所谓的实体指账户、容器、对象,它们都拥有属于自己的不同的Rings。

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

图3 Keystone的认证管理

    Keystone采用两种授权方式,一种基于用户名/密码,另一种基于令牌(Token)。除此之外,Keystone提供以下三种服务:
    (1)令牌服务:含有授权用户的授权信息
    (2)目录服务:含有用户合法操作的可用服务列表
    (3)策略服务:利用Keystone具体指定用户或群组某些访问权限
    认证服务组件:
    (1)服务入口:如Nova、Swift和Glance一样每个OpenStack服务都拥有一个指定的端口和专属的URL,我们称其为入口(endpoints)。
    (2)区位:在某个数据中心,一个区位具体指定了一处物理位置。在典型的云架构中,如果不是所有的服务都访问分布式数据中心或服务器的话,则也称其为区位。
    (3)用户:Keystone授权使用者。
    译者注:代表一个个体,OpenStack以用户的形式来授权服务给它们。用户拥有证书(credentials),且可能分配给一个或多个租户。经过验证后,会为每个单独的租户提供一个特定的令牌。[来源:http://blog.sina.com.cn/s/blog_70064f190100undy.html]
    (4)服务:总体而言,任何通过Keystone进行连接或管理的组件都被称为服务。举个例子,我们可以称Glance为Keystone的服务。
    (5)角色:为了维护安全限定,就云内特定用户可执行的操作而言,该用户关联的角色是非常重要的。
    译者注:一个角色是应用于某个租户的使用权限集合,以允许某个指定用户访问或使用特定操作。角色是使用权限的逻辑分组,它使得通用的权限可以简单地分组并绑定到与某个指定租户相关的用户。
    (6)租间:租间指的是具有全部服务入口并配有特定成员角色的一个项目。
    译者注:一个租间映射到一个Nova的“project-id”,在对象存储中,一个租间可以有多个容器。根据不同的安装方式,一个租间可以代表一个客户、帐号、组织或项目。
    七、OpenStack管理的Web接口----Horizon
    Horizon是一个用以管理、控制OpenStack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等。除此之外,用户还可以在控制面板中使用终端(console)或VNC直接访问实例。总之,Horizon具有如下一些特点:
    (1)实例管理:创建、终止实例,查看终端日志,VNC连接,添加卷等
    (2)访问与安全管理:创建安全群组,管理密匙对,设置浮动IP等
    (3)偏好设定:对虚拟硬件模板可以进行不同偏好设定
    (4)镜像管理:编辑或删除镜像
    (5)查看服务目录
    (6)管理用户、配额及项目用途
    (7)用户管理:创建用户等
    (8)卷管理:创建卷和快照
    (9)对象存储处理:创建、删除容器和对象
    (10)为项目下载环境变量

第二部分: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。

图4 OpenStack安装规划

    OpenStack安装需要设定主机名、IP地址等,按你实际的环境进行配置。下表是译者安装的网络参数清单:

图5 网络参数清单

    以下是教程中网络设置参数,本教程均采用这些参数,但在实际安装中请参照上表进行设置。

图6 本教程网络设置参数

    二、Server1
    正如上表所示,Server1包含了所有的Nova服务:nova-compute、nova-api、nova-volume、nova-network以及Glance、Swift、Keystone和Horizon。这台服务器上需要双网卡。
    1、安装底层OS
    不必多想,请参照下述说明,记住相关参数,选择64位Ubuntu12.04版,进行安装。
    (1)创建的第一个用户命名为“localadmin”
    (2)为eth0和eth1设定IP及其相关参数
    (3)在安装服务包中,仅选择“Openssh-server”作为预装项
    因为Server1上也将安装nova-volume软件,而nova-volume需要一块专用分区,所以在安装Ubuntu Server时请选择手动分区,并另行创建一块合适大小的分区。从本章起,教程都将以/dev/sda6作为这块分区。你可以根据自己分区的实际情况进行修改。此外,请使用fdisk工具将该分区需要格式化为LVM(8e)格式,这一操作在安装中或刚安装完毕格式化均可。进一步,如果你还计划在这台服务器上再新建一个分区配给Swift的话,那么就新建一块分区并参照本章后文“安装Swift”一节相关内容进行安装。
    待12.04的UbuntuOS安装完毕后 ,使用下列命令更新系统:

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

    2、配置网络
    编辑/etc/network/interfaces文件,如下所示:

[plain]  view plain copy
  1. auto lo  
  2. iface lo inet loopback  
  3. auto eth0  
  4. iface eth0 inet static  
  5.   address 10.10.10.2  
  6.   netmask 255.255.255.0  
  7.   broadcast 10.10.10.255  
  8.   gateway 10.10.10.1  
  9.   dns-nameservers 10.10.8.3  
  10. auto eth1  
  11. iface eth1 inet static  
  12.   address 192.168.3.1  
  13.   netmask 255.255.255.0  
  14.   network 192.168.3.0  
  15.   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服务器将使用本机硬件时钟作为第二选择。

[plain]  view plain copy
  1. server ntp.ubuntu.com  
  2. server 127.127.1.0  
  3. 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密码,在此使用“mygreatsecret”。随后编辑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创建很多东东,各种数据库、表及用户。话音未落,这就开始了:
     (1)创建名为“nova”的数据库:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE nova;'
    新建一个用户,名为“novadbadmin”:
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER novadbadmin;'
    授予novadbadmin用户nova数据库全部权限:
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON nova.* TO 'novadbadmin'@'%';"
    为novadbadmin同志创建密码(译者注:密码是novasecret,后文类似之处不多言,请详见命令):
sudo mysql -uroot -pmygreatsecret -e "SET PASSWORD FOR 'novadbadmin'@'%' = PASSWORD('novasecret');"
     (2)Glance登场, 还是重复刚才的道道,首先创建一个名为glance的数据库:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE glance;'
    然后为这个新建的数据库添加一个用户“glancedbadmin”:
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER glancedbadmin;'
    接着,光荣授予他本数据库的全部权限:
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON glance.* TO 'glancedbadmin'@'%';"
    是的,最后一步,为该用户分配密码:
sudo mysql -uroot -pmygreatsecret -e "SET PASSWORD FOR 'glancedbadmin'@'%' = PASSWORD('glancesecret');"
     (3)很烦的,keystone出场了。 刚才的大循环,至此开始演绎第三遍:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE keystone;'
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER keystonedbadmin;'
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystonedbadmin'@'%';"
sudo mysql -uroot -pmygreatsecret -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中。
    (1)创建租间
    使用以下命令创建两个租间,admin和service:
keystone tenant-create --name admin
keystone tenant-create --name service
    (2)创建用户
    执行以下命令,创建四个用户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
    (3)创建角色
    使用命令创建两个角色,admin和Member(译者注:注意是大写M):
keystone role-create --name admin
keystone role-create --name Member
    (4)查看租间、用户和角色
    刚才建立的租间、用户和角色可以通过如下命令进行查看:
    租间列表:

[plain]  view plain copy
  1. keystone tenant-list  
  2.   
  3. +----------------------------------+--------------------+---------+  
  4.   
  5. |                id                |        name        | enabled |  
  6.   
  7. +----------------------------------+--------------------+---------+  
  8.   
  9. | 7f95ae9617cd496888bc412efdceabfd | admin              | True    |  
  10.   
  11. | c7970080576646c6959ee35970cf3199 | service            | True    |  
  12.   
  13. +----------------------------------+--------------------+---------+  
    用户列表:

[plain]  view plain copy
  1. keystone user-list  
  2.   
  3. +----------------------------------+---------+-------------------+--------+  
  4.   
  5. |                id                | enabled |       email       |  name  |  
  6.   
  7. +----------------------------------+---------+-------------------+--------+  
  8.   
  9. | 1b986cca67e242f38cd6aa4bdec587ca | True    | swift@foobar.com  | swift  |  
  10.   
  11. | 518b51ea133c4facadae42c328d6b77b | True    | glance@foobar.com | glance |  
  12.   
  13. | b3de3aeec2544f0f90b9cbfe8b8b7acd | True    | admin@foobar.com  | admin  |  
  14.   
  15. | ce8cd56ca8824f5d845ba6ed015e9494 | True    | nova@foobar.com   | nova   |  
  16.   
  17. +----------------------------------+---------+-------------------+--------+  

    角色列表:

[plain]  view plain copy
  1. keystone role-list  
  2.   
  3. +----------------------------------+----------------------+  
  4.   
  5. |                id                |         name         |  
  6.   
  7. +----------------------------------+----------------------+  
  8.   
  9. | 2bbe305ad531434991d4281aaaebb700 | admin                |  
  10.   
  11. | d983800dd6d54ee3a1b1eb9f2ae3291f | Member               |  
  12.   
  13. +----------------------------------+----------------------+  
    请大家格外注意id列中的值,虽然很长,但随后为用户绑定角色,继而把用户配入租间中时可全靠它们了。
     (5)为特定租间中的用户绑定角色
    现在我们先为刚刚创建的用户绑定角色,通过如下命令格式可以将特定租间中的特定用户增加角色(译者注:仅是命令格式,随后才是真正执行的命令):
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必将出错!
    (6)创建服务
    至此,我们该创建授权用户可以享用的服务了,命令格式如下:
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,使用如下命令即可:
[plain]  view plain copy
  1. keystone service-list  
  2.   
  3. +----------------------------------+----------+--------------+----------------------------+  
  4.   
  5. |                id                |   name   |     type     |      description         |  
  6.   
  7. +----------------------------------+----------+--------------+----------------------------+  
  8.   
  9. | 1e93ee6c70f8468c88a5cb1b106753f3 | nova     | compute      | OpenStack Compute Service  |  
  10.   
  11. | 28fd92ffe3824004996a3e04e059d875 | ec2      | ec2          | EC2 Service                |  
  12.   
  13. | 7d4ec192dfa1456996f0f4c47415c7a7 | keystone | identity     | OpenStack Identity Service |  
  14.   
  15. | 96f35e1112b143e59d5cd5d0e6a8b22d | swift    | object-store | OpenStack Storage Service  |  
  16.   
  17. | f38f4564ff7b4e43a52b2f5c1b75e5fa | volume   | volume       | OpenStack Volume Service   |  
  18.   
  19. | fbafab6edcab467bb734380ce6be3561 | glance   | image        | OpenStack Image Service    |  
  20.   
  21. +----------------------------------+----------+--------------+----------------------------+  
    这些id将被用于定义所属服务的入口(endpoint)。
     (7)创建入口
    创建服务入口的命令格式是:
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默认使用SQLite,MySQL或PostgreSQL也可以很好地与Glance工作。
   打开 /etc/glance/glance-api-paste.ini文件并在末尾编辑如下内容:
[plain]  view plain copy
  1. admin_tenant_name = %SERVICE_TENANT_NAME%  
  2. admin_user = %SERVICE_USER%  
  3. admin_password = %SERVICE_PASSWORD%  
    这些值需要用刚才我们安装中的实际值进行替换,admin_tenant_name应该是“service”,admin_user这里是“glance”、admin_password是“glance”。编辑完这三行应该是如下的样子:
[plain]  view plain copy
  1. admin_tenant_name = service  
  2. admin_user = glance  
  3. 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授权:
[plain]  view plain copy
  1. [paste_deploy]  
  2. flavor = keystone  
    打开 /etc/glance/glance-api.conf文件,在文件末尾增加如下配置:

[plain]  view plain copy
  1. [paste_deploy]  
  2. 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中:
[plain]  view plain copy
  1. export SERVICE_TOKEN=admin  
  2. export OS_TENANT_NAME=admin  
  3. export OS_USERNAME=admin  
  4. export OS_PASSWORD=admin  
  5. export OS_AUTH_URL="http://localhost:5000/v2.0/"  
  6. 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主配文件 /etc/nova/nova.conf:

[plain]  view plain copy
  1. --dhcpbridge_flagfile=/etc/nova/nova.conf  
  2. --dhcpbridge=/usr/bin/nova-dhcpbridge  
  3. --logdir=/var/log/nova  
  4. --state_path=/var/lib/nova  
  5. --lock_path=/run/lock/nova  
  6. --allow_admin_api=true  
  7. --use_deprecated_auth=false  
  8. --auth_strategy=keystone  
  9. --scheduler_driver=nova.scheduler.simple.SimpleScheduler  
  10. --s3_host=10.10.10.2  
  11. --ec2_host=10.10.10.2  
  12. --rabbit_host=10.10.10.2  
  13. --cc_host=10.10.10.2  
  14. --nova_url=http://10.10.10.2:8774/v1.1/  
  15. --routing_source_ip=10.10.10.2  
  16. --glance_api_servers=10.10.10.2:9292  
  17. --image_service=nova.image.glance.GlanceImageService  
  18. --iscsi_ip_prefix=192.168.4  
  19. --sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova  
  20. --ec2_url=http://10.10.10.2:8773/services/Cloud  
  21. --keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens  
  22. --api_paste_config=/etc/nova/api-paste.ini  
  23. --libvirt_type=kvm  
  24. --libvirt_use_virtio_for_bridges=true  
  25. --start_guests_on_host_boot=true  
  26. --resume_guests_state_on_host_boot=true  
  27.   
  28. # vnc specific configuration  
  29. --novnc_enabled=true  
  30. --novncproxy_base_url=http://10.10.10.2:60  
  31. --vncserver_proxyclient_address=10.10.10.2  
  32. --vncserver_listen=10.10.10.2  
  33.   
  34. # network specific settings  
  35. --network_manager=nova.network.manager.FlatDHCPManager  
  36. --public_interface=eth0  
  37. --flat_interface=eth1  
  38. --flat_network_bridge=br100  
  39. --fixed_range=192.168.4.1/27  
  40. --floating_range=10.10.10.2/27  
  41. --network_size=32  
  42. --flat_network_dhcp_start=192.168.4.33  
  43. --flat_injected=False  
  44. --force_dhcp_release  
  45. --iscsi_helper=tgtadm  
  46. --connection_type=libvirt  
  47. --root_helper=sudo nova-rootwrap  
  48. --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文件,找到末尾三行:
[plain]  view plain copy
  1. admin_tenant_name = %SERVICE_TENANT_NAME%  
  2. admin_user = %SERVICE_USER%  
  3. admin_password = %SERVICE_PASSWORD%  
    用之前创建的名字进行替换(译者注:和Glance如出一辙,只是这次是nova),编辑完毕如下所示:
[plain]  view plain copy
  1. admin_tenant_name = service  
  2. admin_user = nova  
  3. 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
    输出环境变量:
[plain]  view plain copy
  1. export OS_TENANT_NAME=admin  
  2. export OS_USERNAME=admin  
  3. export OS_PASSWORD=admin  
  4. 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是否正确安装:

[plain]  view plain copy
  1. sudo nova-manage service list  
  2.   
  3. Binary           Host          Zone         Status     State    Updated_At  
  4. nova-network     server1       nova         enabled    :-)   2012-04-20 08:58:43  
  5. nova-scheduler   server1       nova         enabled    :-)   2012-04-20 08:58:44  
  6. nova-volume      server1       nova         enabled    :-)   2012-04-20 08:58:44  
  7. nova-compute     server1       nova         enabled    :-)   2012-04-20 08:58:45  
  8. 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

    (1)安装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

    (2)Swift存储端
    有两种方法来创建或制备存储端,一种是采用现有的分区或卷作为存储设备,另一种是创建环回文件(Loopback file)并将当做存储设备。安装时,两种方式自选。
    1)分区作为存储设备
    如果在安装OS时为Swift预留了一个分区,你就可以直接使用它。如果该分区没有使用过或仍是空闲空间(比如/dev/sdb3),就应该把它格式化为xfs文件系统,接着编辑 /etc/fstab中该分区的挂载点(注意:请根据实际情况选择你自定的设备,本教程假定手头未使用也没分区的空闲空间在/dev/sdb上):

[plain]  view plain copy
  1. sudo fdisk /dev/sdb  
  2.     Type n for new partition  
  3.     Type e for extended partion  
  4.     Choose appropriate partition number ( or go with the default )  
  5.     Choose first and last sectors to set the hard disk size (or go with defaults)  
  6.     Note that 83 is the partition type number for Linux  
  7.     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
    2)环回文件作为存储设备
    创建一个空文件作为Swift存储的环回设备,在这里我们使用disk copy命令创建它并命名为swift-disk,还将为其分配1G的磁盘空间。如果空间不够,可以通过改变seek值来增加空间。随后格式化为XFS:
[plain]  view plain copy
  1. sudo dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=1000000  
  2. sudo mkfs.xfs -i size=1024 /srv/swift-disk  
  3. file /srv/swift-disk  
  4. 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
    3)使用存储
    挂载存储分区前,需要创建一些设备节点并设置其属主和主群为“Swift”:
[plain]  view plain copy
  1. sudo mount /mnt/swift_backend  
  2. pushd /mnt/swift_backend  
  3. sudo mkdir node1 node2 node3 node4  
  4. popd  
  5. sudo chown swift.swift /mnt/swift_backend/*  
  6. for i in {1..4}; do sudo ln -s /mnt/swift_backend/node$i /srv/node$i; done;  
  7. sudo mkdir -p /etc/swift/account-server /etc/swift/container-server /etc/  
  8. swift/object-server /srv/node1/device /srv/node2/device /srv/node3/device /srv/node4/device  
  9. sudo mkdir /run/swift  
  10. 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
     (3)配置远程备份
     Rsync用来维护对象副本,许多swift服务都使用它保持对象一致性及进行更新操作。 所有存储节点都将享用此配置:
    首先编辑/etc/default/rsync文件:
Set RSYNC_ENABLE=true
    然后编辑/etc/rsyncd.conf配置文件,如下所示:
[plain]  view plain copy
  1. # General stuff  
  2.   
  3. uid = swift  
  4. gid = swift  
  5. log file = /var/log/rsyncd.log  
  6. pid file = /run/rsyncd.pid  
  7. address = 127.0.0.1  
  8.   
  9. # Account Server replication settings  
  10. [account6012]  
  11. max connections = 25  
  12. path = /srv/node1/  
  13. read only = false  
  14. lock file = /run/lock/account6012.lock  
  15.   
  16. [account6022]  
  17. max connections = 25  
  18. path = /srv/node2/  
  19. read only = false  
  20. lock file = /run/lock/account6022.lock  
  21.   
  22. [account6032]  
  23. max connections = 25  
  24. path = /srv/node3/  
  25. read only = false  
  26. lock file = /run/lock/account6032.lock  
  27.   
  28. [account6042]  
  29. max connections = 25  
  30. path = /srv/node4/  
  31. read only = false  
  32. lock file = /run/lock/account6042.lock  
  33.   
  34. # Container server replication settings  
  35. [container6011]  
  36. max connections = 25  
  37. path = /srv/node1/  
  38. read only = false  
  39. lock file = /run/lock/container6011.lock  
  40.   
  41. [container6021]  
  42. max connections = 25  
  43. path = /srv/node2/  
  44. read only = false  
  45. lock file = /run/lock/container6021.lock  
  46.   
  47. [container6031]  
  48. max connections = 25  
  49. path = /srv/node3/  
  50. read only = false  
  51. lock file = /run/lock/container6031.lock  
  52.   
  53. [container6041]  
  54. max connections = 25  
  55. path = /srv/node4/  
  56. read only = false  
  57. lock file = /run/lock/container6041.lock  
  58.   
  59. # Object Server replication settings  
  60. [object6010]  
  61. max connections = 25  
  62. path = /srv/node1/  
  63. read only = false  
  64. lock file = /run/lock/object6010.lock  
  65.   
  66. [object6020]  
  67. max connections = 25  
  68. path = /srv/node2/  
  69. read only = false  
  70. lock file = /run/lock/object6020.lock  
  71.   
  72. [object6030]  
  73. max connections = 25  
  74. path = /srv/node3/  
  75. read only = false  
  76. lock file = /run/lock/object6030.lock  
  77.   
  78. [object6040]  
  79. max connections = 25  
  80. path = /srv/node4/  
  81. read only = false  
  82. lock file = /run/lock/object6040.lock  
    最后重新启动服务完成rsync配置:
sudo service rsync restart
     (4)配置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的配置样例,仅供参考:
[plain]  view plain copy
  1. [DEFAULT]  
  2. name1 = globalvalue  
  3. name2 = globalvalue  
  4. name3 = globalvalue  
  5. set name4 = globalvalue  
  6.   
  7. [pipeline:main]  
  8. pipeline = myapp  
  9.   
  10. [app:myapp]  
  11. use = egg:mypkg#myapp  
  12. name2 = localvalue  
  13. set name3 = localvalue  
  14. set name5 = localvalue  
  15. name6 = localvalue  
    创建并编辑/etc/swift/swift.conf文件,并写入如下配置:
[plain]  view plain copy
  1. [swift-hash]  
  2. # random unique string that can never change (DO NOT LOSE). I'm using 03c9f48da2229770.   
  3. # od -t x8 -N 8 -A n < /dev/random  
  4. # The above command can be used to generate random a string.  
  5. swift_hash_path_suffix = 03c9f48da2229770  
    特别的,当建立更多的节点时,你需要记住随机串。不要照抄本例,请通过以下命令生成自己的随机字符串:
od -t x8 -N 8 -A n < /dev/random
     1)配置Swift代理服务器
    代理服务器是swift的门卫,它的职责是检测合法性。它将审查:一、请求是否伪造,二、请求使用资源的用户身份。
具体操作由keystone之类的认证服务器来协助完成。
    创建并编辑/etc/swift/proxy-server.conf并增加如下内容:
[plain]  view plain copy
  1. [DEFAULT]  
  2. bind_port = 8080  
  3. user = swift  
  4. swift_dir = /etc/swift  
  5.   
  6. [pipeline:main]  
  7. # Order of execution of modules defined below  
  8. pipeline = catch_errors healthcheck cache authtoken keystone proxy-server  
  9.   
  10. [app:proxy-server]  
  11. use = egg:swift#proxy  
  12. allow_account_management = true  
  13. account_autocreate = true  
  14. set log_name = swift-proxy  
  15. set log_facility = LOG_LOCAL0  
  16. set log_level = INFO  
  17. set access_log_name = swift-proxy  
  18. set access_log_facility = SYSLOG  
  19. set access_log_level = INFO  
  20. set log_headers = True  
  21. account_autocreate = True  
  22.   
  23. [filter:healthcheck]  
  24. use = egg:swift#healthcheck  
  25.   
  26. [filter:catch_errors]  
  27. use = egg:swift#catch_errors  
  28.   
  29. [filter:cache]  
  30. use = egg:swift#memcache  
  31. set log_name = cache  
  32.   
  33. [filter:authtoken]  
  34. paste.filter_factory = keystone.middleware.auth_token:filter_factory  
  35. auth_protocol = http  
  36. auth_host = 127.0.0.1  
  37. auth_port = 35357  
  38. auth_token = admin  
  39. service_protocol = http  
  40. service_host = 127.0.0.1  
  41. service_port = 5000  
  42. admin_token = admin  
  43. admin_tenant_name = service  
  44. admin_user = swift  
  45. admin_password = swift  
  46. delay_auth_decision = 0  
  47.   
  48. [filter:keystone]  
  49. paste.filter_factory = keystone.middleware.swift_auth:filter_factory  
  50. operator_roles = admin, swiftoperator  
  51. is_admin = true  
    注意:可以使用apt-get安装swift-doc软件包,安装后许多文档都收录在/usr/share/doc/swift-doc/html下,本配置样例也是如此。
     2)配置Swift账户服务器
    默认swift容器服务配置文件为/etc/swift/account-server.conf:
[plain]  view plain copy
  1. [DEFAULT]  
  2. bind_ip = 0.0.0.0  
  3. workers = 2  
  4.   
  5. [pipeline:main]  
  6. pipeline = account-server  
  7.   
  8. [app:account-server]  
  9. use = egg:swift#account  
  10.   
  11. [account-replicator]  
  12.   
  13. [account-auditor]  
  14.   
  15. [account-reaper]  
    所有的account server配置文件都在/etc/swift/account-server目录中。与/srv里的设备相对应,我们创建1.conf、2.conf等等文件,并将它们放到/etc/swift/account-server/下。以下是/etc/swift/account-server/1.conf配置文件的内容:
[plain]  view plain copy
  1. [DEFAULT]  
  2. devices = /srv/node1  
  3. mount_check = false  
  4. bind_port = 6012  
  5. user = swift  
  6. log_facility = LOG_LOCAL2  
  7.   
  8. [pipeline:main]  
  9. pipeline = account-server  
  10.   
  11. [app:account-server]  
  12. use = egg:swift#account  
  13.   
  14. [account-replicator]  
  15. vm_test_mode = no  
  16.   
  17. [account-auditor]  
  18.   
  19. [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
     3)配置Swift容器服务器
    默认swift容器服务配置文件为/etc/swift/container-server.conf:
[plain]  view plain copy
  1. [DEFAULT]  
  2. bind_ip = 0.0.0.0  
  3. workers = 2  
  4.   
  5. [pipeline:main]  
  6. pipeline = container-server  
  7.   
  8. [app:container-server]  
  9. use = egg:swift#container  
  10.   
  11. [container-replicator]  
  12.   
  13. [container-updater]  
  14.   
  15. [container-auditor]  
  16.   
  17. [container-sync]  
    与account-server类似,我们同样创建/etc/swift/container-server/1.conf等等文件与 /srv设备匹配,这是1.conf文件内容:
[plain]  view plain copy
  1. [DEFAULT]  
  2. devices = /srv/node1  
  3. mount_check = false  
  4. bind_port = 6011  
  5. user = swift  
  6. log_facility = LOG_LOCAL2  
  7.   
  8. [pipeline:main]  
  9. pipeline = container-server  
  10.   
  11. [app:container-server]  
  12. use = egg:swift#container  
  13.   
  14. [container-replicator]  
  15. vm_test_mode = no  
  16.   
  17. [container-updater]  
    接着利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6021、6031和6041)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和 LOG_LOCAL5)。
     4)配置Swift对象服务器
    默认swift容器服务配置文件为/etc/swift/object-server.conf:
[plain]  view plain copy
  1. [DEFAULT]  
  2. bind_ip = 0.0.0.0  
  3. workers = 2  
  4.   
  5. [pipeline:main]  
  6. pipeline = object-server  
  7.   
  8. [app:object-server]  
  9. use = egg:swift#object  
  10.   
  11. [object-replicator]  
  12.   
  13. [object-updater]  
  14.   
  15. [object-auditor]  
    与account-server和container-server一样,我们同样创建/etc/swift/object-server/1.conf等等文件与/srv设备匹配,这是1.conf文件内容:
[plain]  view plain copy
  1. [DEFAULT]  
  2. devices = /srv/node1  
  3. mount_check = false  
  4. bind_port = 6010  
  5. user = swift  
  6. log_facility = LOG_LOCAL2  
  7.   
  8. [pipeline:main]  
  9. pipeline = object-server  
  10.   
  11. [app:object-server]  
  12. use = egg:swift#object  
  13.   
  14. [object-replicator]  
  15. vm_test_mode = no  
  16.   
  17. [object-updater]  
  18.   
  19. [object-auditor]  
    继而利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6020、6030和6040)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和 LOG_LOCAL5)。
     5)配置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>
    执行下列命令:
[plain]  view plain copy
  1. sudo swift-ring-builder object.builder add z1-127.0.0.1:6010/device 1  
  2. sudo swift-ring-builder object.builder add z2-127.0.0.1:6020/device 1  
  3. sudo swift-ring-builder object.builder add z3-127.0.0.1:6030/device 1  
  4. sudo swift-ring-builder object.builder add z4-127.0.0.1:6040/device 1  
  5. sudo swift-ring-builder object.builder rebalance  
  6. sudo swift-ring-builder container.builder add z1-127.0.0.1:6011/device 1  
  7. sudo swift-ring-builder container.builder add z2-127.0.0.1:6021/device 1  
  8. sudo swift-ring-builder container.builder add z3-127.0.0.1:6031/device 1  
  9. sudo swift-ring-builder container.builder add z4-127.0.0.1:6041/device 1  
  10. sudo swift-ring-builder container.builder rebalance  
  11. sudo swift-ring-builder account.builder add z1-127.0.0.1:6012/device 1  
  12. sudo swift-ring-builder account.builder add z2-127.0.0.1:6022/device 1  
  13. sudo swift-ring-builder account.builder add z3-127.0.0.1:6032/device 1  
  14. sudo swift-ring-builder account.builder add z4-127.0.0.1:6042/device 1  
  15. 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、容器数量和存储的对象信息:
[plain]  view plain copy
  1. swift -v -V 2.0 -A http://127.0.0.1:5000/v2.0/ -U service:swift -K swift stat  
  2. StorageURL: http://127.0.0.1:8080/v1/AUTH_c7970080576646c6959ee35970cf3199  
  3. Auth Token: ba9df200a92d4a5088dcd6b7dcc19c0d  
  4.    Account: AUTH_c7970080576646c6959ee35970cf3199  
  5. Containers: 1  
  6.    Objects: 1  
  7.      Bytes: 77  
  8. Accept-Ranges: bytes  
  9. X-Trans-Id: tx11c64e218f984749bc3ec37ea46280ee  
    至此,Server1终于安装完毕!
     三、Server2
    
Server2仅运行nova的运算服务。
     1、安装底层OS
    安装64位Ubuntu12.04服务器。
     2、配置网络
    安装网桥软件:
sudo apt-get install bridge-utils
    编辑/etc/network/interfaces文件,如下所示:
[plain]  view plain copy
  1. auto lo  
  2. iface lo inet loopback  
  3. auto eth0  
  4. iface eth0 inet static  
  5.   address 10.10.10.3  
  6.   netmask 255.255.255.0  
  7.   broadcast 10.10.10.255  
  8.   gateway 10.10.10.1  
  9.   dns-nameservers 10.10.8.3  
  10. auto eth1  
  11. iface eth1 inet static  
  12.   address 192.168.3.2  
  13.   netmask 255.255.255.0  
  14.   network 192.168.3.0  
  15.   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中的一致:
[plain]  view plain copy
  1. --dhcpbridge_flagfile=/etc/nova/nova.conf  
  2. --dhcpbridge=/usr/bin/nova-dhcpbridge  
  3. --logdir=/var/log/nova  
  4. --state_path=/var/lib/nova  
  5. --lock_path=/run/lock/nova  
  6. --allow_admin_api=true  
  7. --use_deprecated_auth=false  
  8. --auth_strategy=keystone  
  9. --scheduler_driver=nova.scheduler.simple.SimpleScheduler  
  10. --s3_host=10.10.10.2  
  11. --ec2_host=10.10.10.2  
  12. --rabbit_host=10.10.10.2  
  13. --cc_host=10.10.10.2  
  14. --nova_url=http://10.10.10.2:8774/v1.1/  
  15. --routing_source_ip=10.10.10.2  
  16. --glance_api_servers=10.10.10.2:9292  
  17. --image_service=nova.image.glance.GlanceImageService  
  18. --iscsi_ip_prefix=192.168.4  
  19. --sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova  
  20. --ec2_url=http://10.10.10.2:8773/services/Cloud  
  21. --keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens  
  22. --api_paste_config=/etc/nova/api-paste.ini  
  23. --libvirt_type=kvm  
  24. --libvirt_use_virtio_for_bridges=true  
  25. --start_guests_on_host_boot=true  
  26. --resume_guests_state_on_host_boot=true  
  27.   
  28. # vnc specific configuration  
  29. --novnc_enabled=true  
  30. --novncproxy_base_url=http://10.10.10.2:6080/vnc_auto.html  
  31. --vncserver_proxyclient_address=10.10.10.2  
  32. --vncserver_listen=10.10.10.2  
  33.   
  34. # network specific settings  
  35. --network_manager=nova.network.manager.FlatDHCPManager  
  36. --public_interface=eth0  
  37. --flat_interface=eth1  
  38. --flat_network_bridge=br100  
  39. --fixed_range=192.168.4.1/27  
  40. --floating_range=10.10.10.2/27  
  41. --network_size=32  
  42. --flat_network_dhcp_start=192.168.4.33  
  43. --flat_injected=False  
  44. --force_dhcp_release  
  45. --iscsi_helper=tgtadm  
  46. --connection_type=libvirt  
  47. --root_helper=sudo nova-rootwrap  
  48. --verbose  
    重新启动Server2上的nova-compute服务:
sudo service restart nova-compute
    利用如下命令测试云中第二个运算节点(即Server2)是否正常运行:
[plain]  view plain copy
  1. sudo nova-manage service list  
  2.   
  3. Binary           Host          Zone         Status     State   Updated_At  
  4. nova-network     server1       nova         enabled    :-)   2012-04-20 08:58:43  
  5. nova-scheduler   server1       nova         enabled    :-)   2012-04-20 08:58:44  
  6. nova-volume      server1       nova         enabled    :-)   2012-04-20 08:58:44  
  7. nova-compute     server1       nova         enabled    :-)   2012-04-20 08:58:45  
  8. nova-cert        server1       nova         enabled    :-)   2012-04-20 08:58:43  
  9. nova-compute     server2       nova         enabled    :-)   2012-04-21 10:22:27  
    如果看到类似结果,则说明安装已经成功可以使用。
    至此,Server2安装完毕!
     四、Client1
    1、安装OS

    安装64位Ubuntu12.04桌面版。
     2、配置网络
    如下所示,编辑/etc/nova/nova.conf文件:
[plain]  view plain copy
  1. auto lo  
  2.  iface lo inet loopback  
  3. auto eth0  
  4.  iface eth0 inet static  
  5.  address 10.10.10.4  
  6.  netmask 255.255.255.0  
  7.  broadcast 10.10.10.255  
  8.  gateway 10.10.10.1  
  9.  dns-nameservers 10.10.8.3  
     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脚本中:
[plain]  view plain copy
  1. export SERVICE_TOKEN=admin  
  2. export OS_TENANT_NAME=admin  
  3. export OS_USERNAME=admin  
  4. export OS_PASSWORD=admin  
  5. export OS_AUTH_URL="http://10.10.10.2:5000/v2.0/"  
  6. export SERVICE_ENDPOINT=http://10.10.10.2:35357/v2.0  
    运行nova和glance命令查看是否与OpenStack正常连接:
[plain]  view plain copy
  1. nova list  
  2.   
  3. +--------------------------------------+------------+--------+----------------------+  
  4.   
  5. |                  ID                  |    Name    | Status |      Networks    
  6.   
  7.       |  
  8.   
  9. +--------------------------------------+------------+--------+----------------------+  
  10.   
  11. | 25ee9230-6bb5-4eca-8808-e6b4e0348362 | myinstance | ACTIVE | private=192.  
  12.   
  13. 168.4.35 |  
  14.   
  15. | c939cb2c-e662-46e5-bc31-453007442cf9 | myinstance1| ACTIVE | private=192.  
  16.   
  17. 168.4.36 |  
  18.   
  19. +--------------------------------------+------------+--------+----------------------+  
  20.   
  21. glance index  
  22.   
  23. ID                                   Name          Disk     Container Size  
  24.   
  25.                                                    Format   Format  
  26.   
  27. ------------------------------------ ------------------------------  
  28.   
  29.  ----------------  
  30.   
  31. 65b9f8e1-cde8-40e7-93e3-0866becfb9d4 windows       qcow2    ovf        
  32.   
  33.  7580745728  
  34.   
  35. f147e666-990c-47e2-9caa-a5a21470cc4e debian        qcow2    ovf        
  36.   
  37.  932904960  
  38.   
  39. f3a8e689-02ed-460f-a587-dc868576228f opensuse      qcow2    ovf        
  40.   
  41.  1072300032  
  42.   
  43. aa362fd9-7c28-480b-845c-85a5c38ccd86 centoscli     qcow2    ovf        
  44.   
  45.  1611530240  
  46.   
  47. 49f0ec2b-26dd-4644-adcc-2ce047e281c5 ubuntuimage   qcow2    ovf        
  48.   
  49.  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、Fefora
    运行如下命令:
yum update
yum install openssh-server
chkconfig sshd on
    然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件如下所示:

[plain]  view plain copy
  1. DEVICE="eth0"  
  2. BOOTPROTO=dhcp  
  3. NM_CONTROLLED="yes"  
  4. 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”行前:

[plain]  view plain copy
  1. depmod -a  
  2. modprobe acpiphp  
  3. # simple attempt to get the user ssh key using the meta-data service  
  4. mkdir -p /root/.ssh  
  5. echo >> /root/.ssh/authorized_keys  
  6. curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key| grep 'ssh-rsa' >> /root/.ssh/authorized_keys  
  7. echo "AUTHORIZED_KEYS:"  
  8. echo "************************"  
  9. cat /root/.ssh/authorized_keys  
  10. echo "************************"  
     4、OpenSUSE
    选择ssh服务,curl以及其他需要的包。
    安装ssh服务器:
zypper install openssh
    安装crul:
zypper install curl
    使用如下步骤将Ssh Key注入实例中:
    首先,创建文件/etc/init.d/sshkey并且写入下列内容:

[plain]  view plain copy
  1. echo >> /root/.ssh/authorized_keys  
  2. curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys  
  3. echo "AUTHORIZED_KEYS:"  
  4. echo "************************"  
  5. cat /root/.ssh/authorized_keys  
  6. 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文件并增加如下内容:

[plain]  view plain copy
  1. echo >> /root/.ssh/authorized_keys  
  2. curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys  
  3. echo "AUTHORIZED_KEYS:"  
  4. echo "************************"  
  5. cat /root/.ssh/authorized_keys  
  6. 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文件并增加如下内容:
[plain]  view plain copy
  1. echo >> /root/.ssh/authorized_keys  
  2. curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key | grep 'ssh-rsa' >> /root/.ssh/authorized_keys  
  3. echo "AUTHORIZED_KEYS:"  
  4. echo "************************"  
  5. cat /root/.ssh/authorized_keys  
  6. echo "************************"  
    编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件如下所示:

[plain]  view plain copy
  1. DEVICE="eth0"  
  2. BOOTPROTO=dhcp  
  3. NM_CONTROLLED="yes"  
  4. 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)让它们变得可用。[来源:开源中国http://www.oschina.net/p/virtio]
    译者注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

    结束!


   本文整理自:

    OpenStack Compute Administration Guide:http://docs.openstack.org/trunk/openstack-compute/admin/content/

    [官版翻译ing]OpenStack云计算快速入门之一:OpenStack及其构成简介:http://blog.chinaunix.net/uid-22414998-id-3263551.html

    [官版翻译ing]OpenStack云计算快速入门之二:OpenStack安装与配置:http://blog.chinaunix.net/uid-22414998-id-3265685.html

    [官版翻译ing]OpenStack云计算快速入门之三:OpenStack镜像管理:http://blog.chinaunix.net/uid-22414998-id-3272059.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值