OpenStack系统有几个关键的项目,它们能够独立地安装但是能够在你的云计算*同工作。这些项目包括:OpenStack Compute,OpenStack Object Storage,OpenStack Identity Service,以及OpenStack Image Service。你可以独立地安装这些项目中的任何一个,然后即可以独立也可以把它们作为一个联合体来配置。这个指导手册指导用有用的包(packages)在ubuntu12.10上的一个安装。这个手册也提供了一个与给出的配置文件例子一样好的配置解释。
-
安装OpenStack浏览
OpenStack Compute与Image services共同工作来提供对虚拟机服务(virtual servers)进行访问以及通过REST API对镜象(images)进行访问。身份验证服务(Identity Service)为所有的OpenStack服务提供了一个公共的授权层。你必须使用身份验证服务来安装OpenStack Dashboard,OpenStack Dashboard是为OpenStack组件提供了一个基于web的用户接口。OpenStack对象存储服务(Object Storage service)为虚拟机镜象不仅提供一个存储方法,也提供了一个使用REST API的基于云的对象存储系统,这个对象存储系统来存储与恢复诸如镜象或视频。这个过程是以身份验证开始,然后通过Image以及Compute,也提供有关一个对象存储(Object Storage)安装部署信息。
以下为全部的步骤:
- 回顾主要的支持平台。Red Hat Enterprise Linux,Scientific Linux,CentOS,Fedora,Ubuntu是目前最好的测试平台。
- 安装身份验证服务(Keystone)。
- 配置身份验证服务(Identity Service)。
- 安装镜象服务(Glance)。
- 配置镜象服务。
- 安装Compute(Nova)。
- 回顾在安装Compute时所做的假设。
- 用FlatDHCP来配置Compute,使用192.168.100.0/24网络地址作为我们所有客户机虚机的固定网段,网桥命名为br100。
- 用MySQL创建和初始化Compute数据库。
- 添加镜象。
- 安装OpenStack Object Storage(Swift)。
- 安装OpenStack Dashboard。
- 启动(launch)Dashboard。
- 通过Dashboard添加键值对(keypair)。
- 通过Dashboard启动一个镜象来验证整个的安装过程。
云计算与镜象系统需求(Compute and Image System Requirements)
硬件:OpenStack组件被设计运行在标准的硬件上。
为了最小的产品部署,我们作如下建议,云控制节点,计算节点,镜象服务,对象,帐户,容器以及为了对象存储的代理服务器。
表1.1 硬件配置建议
Server |
Recommended Hardware |
Notes |
Cloud Controller node (runs network, volume, API, scheduler and image services) |
Processor: 64-bit x86 Memory: 12 GB RAM Disk space: 30 GB (SATA or SAS or SSD) Volume storage: two disks with 2 TB (SATA) for volumes attached to the compute nodes Network: one 1 GB Network Interface Card (NIC) |
Two NICS are recommended but not required. A quad core server with 12 GB RAM would be more than sufficient for a cloud controller node. 32-bit processors will work for the cloud controller node. The package repositories referred to in this guide do not contain i386 packages |
Compute nodes (runs Virtual instances) |
Processor: 64-bit x86 Memory: 32 GB RAM Disk space: 30 GB (SATA) Network: two 1 GB NICs |
Note that you cannot run 64-bit VM instances on a 32-bit compute node. A 64-bit compute node can run either 32- or 64-bit VMs, however. With 2 GB RAM you can run one m1.small instance on a node or three m1.tiny instances without memory swapping, so 2 GB RAM would be a minimum for a test-environment compute node. As an example, Rackspace Cloud Builders use 96 GB RAM for compute nodes in OpenStack deployments. Specifically for virtualization on certain hypervisors on the node or nodes running nova-compute, you need a x86 machine with an AMD processor with SVM extensions (also called AMD-V) or an Intel processor with VT (virtualization technology) extensions. For XenServer and XCP refer to the XenServer installation guide and the XenServer harware compatibility list. For LXC, the VT extensions are not required. The packages referred to in this guide do not contain i386 packages. |
注一:在openstack的某些部份工作在各种操作系统期间,最完整的特性、支持的产品主机环境是linux。操作系统:OpenStack对于下列发布的操作系统都有软件包:CentOS,Debian,Fedora,RHEL,以及ubuntu。这些包是由社区成员维护着。额外的链接请参考:http://wiki.openstack.org。
注二:OpenStack Compute的Folsom发行版需要ubuntu12.04或更新版本,ubuntu 11.10携带的libvirt版本没有与OpenStack适当的支持功能,是由于有一个#101183的bug。
数据库:对于OpenStack Compute,你必须使用PostgreSQL和MySQL二种数据的之一,或者把它当做OpenStack Compute安装过程中的一个部份来安装。对于对象存储(Object Storage),容器和帐号服务有SQLite数据库,你也可以把它作为安装过程的一部份进行安装。
许可(Permissions):你可以用root的用户来安装OpenStack Compute,Image Service,或对象存储,如果你配置了sudoer文件使得所有许可能用,也可以用带有sudo许可的用户来安装这些组件。
网络时间协议(Network Time Protocol):你必须安装象NTP一样的时间同步程序(synchronization program)。对于Compute,时间同步能够保持你的云控制器与计算结点花同样的时间服务来避免在计算结点上的启动的虚似机时刻表。对于对象存储(Object Storage),当需要更新内容以便最新的内容去复盖的时候,时间同步确保对象复制是正确无误的。
云计算网络规划(Compute Network Planning)
即要保存网络资源,也要确保网络管理员理解网络的需求,理解为了访问API的公网IP地址,以及必要的虚拟机。这节提供了一些建议以及最小的需求。建议流量(throughput)最小为1000Mbps,这整个过程显示了单个服务器的网络配置。
对于OpenStack Compute,网络配置在多节点安装上,这个安装是在不同的物理机之间的一个子网上。对于虚拟机实例之间的网络,有三个网络操作是可用的:flat,DHCP,以及VLAN。在运行nova-network的服务器上,建议使用两个网卡(NICs –Network Interface Cards)。
网络管理(Management Network(RFC1918 IP Range,没有公共路由)):建议在云基础设施内部,这个网络应用于所有的内部服务器。建议IP地址大小为255(CIDR / 29)。
公共网络(Publicly routable IP range):在基础设施里,网络应用于提供公共的IP,用来对API端点的访问。最小大小为8个IP(CIDR/29)。
虚拟机网络(RFC1918 IO Range,没有公共路由):这个网络应用于给云实例提供主IP地址。建议大小:1024个IPS(CIDR/22)。
浮动IP网络(Publicly routable IP Range):这个网络应用于给选择的云实例提供公共的IP访问。最小16个IP(CIDR/28)
安装网络时间协议(Installing NetWork Time Protocol-NTP)
在同步交叉多个机器中,为了保持所有的服务,你必须安装NTP,如果你想做一个多节点的配置,你将配置一个服务器作为参考服务器。
$ sudo apt-get install –y ntp
在你的控制节点上设置NTP服务以便它接收数据,这是通过修改ntp.conf文件以及重启该服务来完成的。用root用户来操作:
#sed –I 's/server ntp.ubuntu.com/server ntp.ubuntu.com\nserver 127.127.1.0\nfudge 127.127.1.0 stratum 10/g' /etc/ntp.conf
在你的计算节点上设置NTP客户端以便时间在控制节点以及计算节点之间保持同步。在计算节点上按下面的操作做下克龙。
# ntpdate 'controllernode ip'
Hwclock –w
-
OpenStack术语
版本名称(Version Names)
每个openstack版本都有一个名称,按照递增的顺序(例如,在Diablo后面是Essex)。对应于这些版本,也有相应的版本号。但对于OpenStack Compute和OpenStack Object Storage来说,数据策划是不同的。象下面的表所示:
表2.1
Release name |
Release Date |
OpenStack Compute Version number |
OpenStack Object Storage Version number |
Folsom |
September 2012 |
2012.2 |
1.7.2 |
Essex |
April 2012 |
2012.1 |
1.4.6 |
Diablo |
October 2011 |
2011.3 |
1.4.3 |
Cactus |
April 2011 |
2011.2 |
1.3.0 |
Bexar |
March 2011 |
2011.1 |
1.2.0 |
Austin |
October 2010 |
0.9.0 |
1.0.0 |
从Cactus版本开始,OpenStack采取了六个月一个版本的计划表。Folsom是2012年10月的计划产品。
代码名称(Code Names)
每一个OpenStack服务都有一个代码名称。例如,镜象服务命名为Glance。在下面的表格中列出了所有的名称。
表2.2
Service name |
Identity |
Compute |
Image |
Dashboard |
Object Storage |
Volumes |
Networking |
这些代码名称对应于配置文件的名称以及命令行应用程序,例如,身份验证服务有一个名称为keystone.conf配置文件。
OpenStack 服务与Linux服务
在Linux世界,一个服务(也叫守护程序)适用于一个单个的程序,这个程序是运行在后台的,典型的例子是对端口的监听程序来响应服务请求。从另一方面讲,一个OpenStack对应于协调工作的Linux服务的一个集合。
OpenStack服务是被多个Linux服务执行。例如,nova-compute和nova-scheduler(调度)是Linux的两个服务,这两个服务是执行Compute服务的。OpenStack也依赖于几个第三方的服务,象数据(典型的MySQL)以及消息载体(a message broker)(典型的如RabbitMQ 或 Qpid)。
在这篇文档中,我们通常地用术语"服务"来即适用于(refer to)Linux底层服务,又适用于高层OpenStack服务。无论我们提到的高层OpenStack服务(e.g.,Image)或者底层Linux服务(e.g.,glance-api),
存储:对象,块,文件(Storage:objects,blocks,and files)
许多云计算用事例请求持久的(persistent)远程存储。存储解决方案常常被分成三个类型:对象存储(object storage),块存储(block storage),以及文件存储(file storage)。
要注意的是,有些存储解决方案支持多种类型。例如,NexentaSro 既支持块存储,又支持文件存储(with announcements for future support for object storage),预料将来会支持对象存储。GlusterFS 支持文件存储以及对象存储,Ceph Storage 支持对象存储,块存储,以及文件存储。
对象存储(Object storage)
在OpenStack里边:对象存储服务(Swift)
有关的概念:亚马逊(Amazon) S3,Rackspace Cloud File,Ceph Storage
对于对象存储,文件是通过一个HTTP接口被暴露的,典型的是用REST API。所有的客户端数据在用户层是这样做的:操作系统不知道(is unaware of)远程存储系统是怎么出现的。在OpenStack里,对象存储服务提供了这种功能(this type of functionality)。用户通过发出HTTP请求(by making HTTP requests)来访问和修改文件。因为通过一个对象存储系统提供的数据访问口是在抽象的底层(at a low level of abstraction)。人们常常在对象存储的顶端构建一个基于文件的应用程序,这个程序提供一个高级的抽象。例如,可以配置OpenStack镜象服务作为后台去使用对象存储服务。对象存储解决方案的另一个用途是对于主机的静态页面内容来说,是作为一个内容传递网络(a content delivery netwoik(CDN))(例如,镜象,以及媒体文件。image,and medial files)。因为对象存储已经提供了一个HTTP接口。
块存储 Block storage (SAN)
在OpenStack里:Volumes(nova-volume服务)是在OpenStack Compute里,或者cinder作为一个独立的Volume服务。
相关的概念:Amazon Elastci Block Store(EBS),Ceph RADOS Block Device(RBD),iSCSI.
对于块相信,文件是通过底层的计算机公共接口对外暴露的,象SCSI 或 ATA,通过网络这是可访问的。块存储是与SAN(storage area network)同意思的。
客户端是在设备层上通过操作系统来访问数据的:用户访问数据是通过挂载一个远程的设备,就象在本地挂载设备一样,物理硬盘(例如,在Linux中用"mount"命令行)。在OpenStack里,组成云计算服务的一个部份的nova-volume服务提供这类功能。使用iSCSI作为一个依附在网络上的SCSI硬盘一样把远程数据对外暴露。
因为数据是用物理设备的方式对外暴露的,终端用户有负责对暴露的硬盘设备创建分区和格式化。另外,在OpenStack Compute里边,一个设备在同一个时间只能被附加于是一个服务器上。所以块存储不能同时地(concurrently)用于在虚似机实例之间共享数据。
文件存储(File storage)(NAS)
在OpenStack里:没有
相关的概念:NFS,Samba/CIFS,GlusterFS,Dropbox,Google Drive
关于文件存储,文件是通过分布试文件系统协议暴露的,文件系统存储与NAS(network attached storage)同义的(sysnonymous)。在客户端访问数据是通过(through)操作系统来完成的,这个操作系统是在文件系统级的:用户通过挂载一个远程的文件。文件存储的例子包括NFS和GlusterFS。操作系统需要有一个安装适当的客户端软件才能访问远程文件系统。
当前,OpenStack Compute在一个实例内部,对于这类文件存储没有任何本身的支持。然而,对于OpenStack有一个Gluster存储连接器,这个连接器能够使用得GlusterFS文件系统的用法象一个后台用于镜象服务。
-
底层技术
你可以认为OpenStack Compute是一个通过把现存的Linux技术结合在一起,来构建一个云计算环境的工具。
下面的图表展示了这些底层技术如何被集中起来构成一个OpenStack计算云的两个例子。园卷是作为OpenStack Compute的一部份的Linux服务,长方形是扩展(没有被OpenStack包含的)的组件,实线显示了OpenStack组件与扩展组件之间的相互作用,虚线显示了扩展组件之间的相互作用。OpenStack Compute组成的所有服务都与一个队列后端相互作用(e.g,RabbitMQ,Qpid)。以及数据库后端(象MySQL,PostgreSQL);这些联系是没有显示。有些没有明确地依赖外部技术的服务是没有显示。例如,nova-api 服务,身份验证服务,以及镜象服务是没有显示的。
Figure 3.1. Underlying technologies(Scenario 1)(略)
Figure .32 Underlying technologies(Scenario 2)(略)
许多扩展技术可以被其它组件代替(substituted),在下列的表中所示
表3.1 技术和支持的成就
Technology |
Supported implementations |
Message queue |
RabbitMQ, Qpid, ZeroMQ |
Virtualization |
xapi+XCP, xapi+XenServer, libvirt+KVM, libvirt+QEMU, libvirt+LXC, libvirt+VMWare |
iSCSI back-end |
LVM+IET, LVM+tgt, Xen Storage Manager, SAN (Solaris, HP, SolidFire), NexentaStor NetApp, Ceph, Sheepdog |
Database |
MySQL, PostgreSQL, sqlite |
Web server |
Apache, Nginx |
Session cache |
memcache, any Django-supported database backend (e.g., MySQL, PostgreSQL, sqlite) |
计算(nova-compute)
Nova-compute服务依赖于虚拟驱动来管理虚拟机,缺省地,这个驱动是libvirt,它用于驱动KVM。然而,libvirt也可以驱动其它的hypervisor技术,如果配置了用Xen 云台或XenServer,为了驱动基于Xen的虚拟机,也有一个独立的Xen虚拟机驱动。
Open-iscsi用于挂载远程块设备,也象已知的卷一样。Open-iscsi暴露了这些远程设备,就象本地设备文件被附加到实例。
Novo-network
Novo-network依赖于许多Linux网络技术。它用Linux桥去创建网络桥把虚拟机连接到物理网络上。这些桥可以与使用Linux 网络VLAN支持的VLAN联合。如果运行在VLAN网络模型。Iptables 用于执行安全规则以及执行NAT功能。Iptables用于提供实例用访问元数据服务以及支持浮动IP地址。Dnsmasq是用于DHCP服务分发(hand out)IP地址给虚拟机实例,与DNS 服务器一样。
在未来的OpenStack版本,当前被nova-network运行的功能将会通过一个独立的OpenStack 项目代替,代码名称为 Quantum。
Nova-volume
缺省地,nova-volume服务使用LVM来创建以及管理本地卷,采用IET或tgt来通过iSCSI把它们暴露。它也可以配置用于其它的基于iSCSI存储技术。
Openstack-dashboard
OpenStack-dashboard是一个基于Django的应用程序,缺省地,这个程序是运行在Apache web服务的后台。缺省地,为了session cache它使用memcache。基于web的调用novnc的VNC客户端用于提供对VNC控制台的访问。这个VNC控制台是与运行KVM实例联合的。
-
安装假设
OpenStack Compute有大量的配置操作,为了简化(simplify)这个安装手册,关于目标安装,我们作了许多假设。
- 你有一些计算节点,每个节点都安装了Ubuntu Server 12.04或更新版;
- 你已经指定了这些节点中的一个作为云控件节点,这个控制节点将运行除了nova-compute以外的所有服务(RabbitMQ or Qpid,MySQL,Identity,Image,nova-api,nova-network,nova-scheduler,nova-volume)。
- 你的云控制器有一个名称为"nova-volume"的LVM卷组,这个卷组用来对客户VM提供永久的存储。在安装nova服务之前,即可以在安装过程中创建这个卷,也可以留一些*空间来创建这个卷。
- 确保该服务器能决定它自己的主机名,否则,如果你使用RabbitMQ作为消息后端时,你可能出现错误。在Ubuntu上,RabbitMQ是缺省的消息后端(back-end)。
- 在我们主机的eth0上,192.168.206.130是主IP。
- 192.168.100.0/24作为我们的客户虚拟机的固定网段,它通过网桥br100与主机连接。
- flatDHCP与单个网络接口结合。
- KVM 或 Xen(XenServer 或 XCP)作为hypervisor。
- 在ubuntu上,通过增加下面命令行到/etc/apt/sources.list.d/folsom.list,使用得云档案仓库可用。:
- deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main
-
在运行apt-get update和apt-get upgrade之前,安装keyring:
Sudo apt-get install ubuntu-cloud-keyring
- 在安装之前,通过运行apt-get update和apt-get upgrade,确保操作系统更新到当前日期。
在使用已知的相互作用的一套软件包安装时,这个安装过程贯穿云控制节点安装和计算节点安装的整个过程。云控制节点包含所有的nova-service,包括API服务器,以及数据库服务器。计算节点只需要运行nova-compute服务。在运行在多节点的安装里,你只需要一个nova-network服务。对于网络,高可用性是必须的。这里有另外一些操作。
-
安装OpenStack身份验证服务
OpenStack身份验证服务管理着用户,租户(帐号或项目)以及为所有的OpenStack组件提供一个公共的身份验证系统。
基本概念(Basic Concepts)
身份验证服务有两个主要的功能:
- 用户管理:跟踪用户以及给用户授权。
- 服务目录:提供可用的服务目录以及他们的API端点所在的地方。
身份验证服务有几个定义,这些定义对于理解是重要的。
用户(user) 是一个人、系统、或使用OpenStack云服务的服务的数字表示(a digital representation)。身份验证服务将验证那些进来的请求。用户有一个登录号,以及可能被分配一个记号(token)来访问资源。用户可能被直接地分配一个独有的租户和行为。如果他们被包含进那个租户里。
凭证(Credential) 数据属于谁?被谁拥有?通常只被一个用户知道,这个用户能够提出他们是谁(因为没有谁知道这个数据)。
例如
一个相配的用户名称和密码;
一本相配的用户名称和API关键字;
你自己和一个用你自己的图片表示的驱动license;
发给你的记号,除了你没有谁知道;
鉴定(Authentication):在身份验证服务的上下文里,鉴定是确定一个用户的身份或一个需要的真实性的行为。身份验证服务将会确认被用户做出的请求。该用户需要通过一套需求的认证来做出调用,这个需求是用户做出的。这些需求在一套证书(用户名称及密码,或用户名称及API key)的形式里是初始化的。在初始确认一后,身份验证服务将发给用户一个记号。用户然后能够提供一个证明来证明他们的身份已经被验证当他们做出后面请求的时候。
符号(Token)
符号是一个任意位数的文本,它用于访问资源。每个符号范围,它描述了哪些资源对于它是可以访问的。符号在任何时候都可以取消以及对于有限的期限是有效的。
在这个版本中,当身份验证服务支持基于符号的验证(authentication),在未来,对它来说,它的目的是支持另外的协议。对它来说,该目的将会成为一个一流的整体服务,而不是追求成为一个成熟的身份存储,以及管理解决方案。
租户(Tenant)
一个容器用于分组或分离资源,以及或身份验证对象。依赖于服务操作员,一个租户可能对映一个客户,帐户,组织,或项目。
服务(Service)
OpenStack服务,比如Compute(Nova),Object Storage(Swift) ,或者Image Service(Glance)。服务通过能够访问资源的用户来提供一个或多个终端以及执行(可能有用的)操作。
终端(Endpoint)
一个可访问的网络地址,是一个可以被访问的服务,通常用URL描述。如果为了模板使用一个扩展,你就可以创建一个终端模板。这个模板代表了所有可用尽的服务的模板。这个服务在交叉于各个区域是有用的。
角色(Role)
当执行一套具体的操作(a specific set of operations)时一个用户担当的人物。一个角色包括一套权限以及特权(privileges),一个用户取得了那个角色,也就继承了那些权力和特权。
在身份验证服务里,分配给一个用户的符号就包括用户能够取得的角色列表。
用户管理
身份验证用户管理的三个主要的概念是:
用户
租户
角色
一个用户代表一个人,有象(such as)用户名称,密码以及email等有关的资料,下面的例子创建一个名叫"alice"的用户:
$ keystone user-create –name=alice –pass=mypassword123 –email=alice@example.com
一个租户被认为作为一个项目,组,或组织。无论何时,你对openstack发出请求,你必须指定一个租户。例如,如果你查询正在运行实例的列表的计算服务,你将会接收到一个所有正在运行实例的列表。这个列表是在你的查询中指定的租户里。下面的例子创建一个名为acme的租户:
$ keystone tenate-create –name=acme
注:因为在早期的OpenStack Compute中,用术语project用于代替tenant,有些命令行工具用—project_id代替 –tenant-id或 –os-tenatn-id来引用一个tenatn ID。
一个角色捕获操作,这个操作是在给定的租户里,一个用户准许执行的操作。这个例子是创建一个名称为"compute-user"的角色。
$ keystone role-create –name=compute-user
注:
与一个拥有租户及角色的用户有关联的身份验证服务,继续我们以前的例子,我们可能希望在"acme"租户里分配给"alice"这个用户"Compute-user"角色:
$ keystone user-list
+--------+---------+-------------------+--------+
| id | enabled | email | name |
+--------+---------+-------------------+--------+
| 892585 | True | alice@example.com | alice |
+--------+---------+-------------------+--------+
$ keystone role-list
+--------+--------------+
| id | name |
+--------+--------------+
| 9a764e | compute-user |
+--------+--------------+
$ keystone tenant-list
+--------+------+---------+
| id | name | enabled |
+--------+------+---------+
| 6b8fd2 | acme | True |
+--------+------+---------+
$ keystone user-role-add --user=892585 --role=9a764e --tenant-id=6b8fd2
一个用户可能在不同的租户里分配不事的角色,例如,Alice在"Cyberdyne"租户里也有"admin"角色。一个用户在同样的租户里也可以分配多个角色。
/etc/[SERVICE_CODENAME]/policy.json文件控制了用户被允许去做些什么为了给出的服务。例如,/etc/nova/policy.json指明了对于计算服务进行访问的策略。/etc/keystone/policy.json指出了对于身份验证服务指定了访问策略。
在计算服务,身份验证服务,以及镜象服务里,缺省的policy.json只识别admin角色:不请求admin角色的所有操作对于一个租户里的任何角色的用户都是可用的。
如果你希望限制一个用户的执行操作,也就是说,在Compute服务里。你需要在身份验证服务里创建一个角色,然后修改/etc/nova/policy.json文件,以便这个角色对于计算服务操作是需要的。
例如,在/etc/nova/policy.json文件中的这一行,指定了用户在创建圈的时候没有任何限制:如果用户在租户里有任何的角色。他们在租户里能够创建圈。
"volume:create": [],
如果我们限制在特别的租户里具有compute-user角色的用户创建圈,我们将增加"role:compute-user",象这样的:
"volume:create":["role:compute-user"],
如果我们希望限制所有的计算服务请求来请求这个角色,该结果文件将会象下面的一样:
{
"admin_or_owner": [["role:admin"], ["project_id:
%(project_id)s"]],
"default": [["rule:admin_or_owner"]],
"compute:create": ["role":"compute-user"],
"compute:create:attach_network": ["role":"compute-user"],
"compute:create:attach_volume": ["role":"compute-user"],
"compute:get_all": ["role":"compute-user"],
"admin_api": [["role:admin"]],
"compute_extension:accounts": [["rule:admin_api"]],
"compute_extension:admin_actions": [["rule:admin_api"]],
"compute_extension:admin_actions:pause":
[["rule:admin_or_owner"]],
"compute_extension:admin_actions:unpause":
[["rule:admin_or_owner"]],
"compute_extension:admin_actions:suspend":
[["rule:admin_or_owner"]],
"compute_extension:admin_actions:resume":
[["rule:admin_or_owner"]],
"compute_extension:admin_actions:lock": [["rule:admin_api"]],
"compute_extension:admin_actions:unlock":
[["rule:admin_api"]],
"compute_extension:admin_actions:resetNetwork":
[["rule:admin_api"]],
"compute_extension:admin_actions:injectNetworkInfo":
[["rule:admin_api"]],
"compute_extension:admin_actions:createBackup":
[["rule:admin_or_owner"]],
"compute_extension:admin_actions:migrateLive":
[["rule:admin_api"]],
"compute_extension:admin_actions:migrate":
[["rule:admin_api"]],
"compute_extension:aggregates": [["rule:admin_api"]],
"compute_extension:certificates": ["role":"compute-user"],
"compute_extension:cloudpipe": [["rule:admin_api"]],
"compute_extension:console_output": ["role":"compute-user"],
"compute_extension:consoles": ["role":"compute-user"],
"compute_extension:createserverext": ["role":"compute-user"],
"compute_extension:deferred_delete": ["role":"compute-user"],
"compute_extension:disk_config": ["role":"compute-user"],
"compute_extension:extended_server_attributes":
[["rule:admin_api"]],
"compute_extension:extended_status": ["role":"compute-user"],
"compute_extension:flavorextradata": ["role":"compute-user"],
"compute_extension:flavorextraspecs": ["role":"compute-user"],
"compute_extension:flavormanage": [["rule:admin_api"]],
"compute_extension:floating_ip_dns": ["role":"compute-user"],
"compute_extension:floating_ip_pools": ["role":"computeuser"],
"compute_extension:floating_ips": ["role":"compute-user"],
"compute_extension:hosts": [["rule:admin_api"]],
"compute_extension:keypairs": ["role":"compute-user"],
"compute_extension:multinic": ["role":"compute-user"],
"compute_extension:networks": [["rule:admin_api"]],
"compute_extension:quotas": ["role":"compute-user"],
"compute_extension:rescue": ["role":"compute-user"],
"compute_extension:security_groups": ["role":"compute-user"],
"compute_extension:server_action_list": [["rule:admin_api"]],
"compute_extension:server_diagnostics": [["rule:admin_api"]],
"compute_extension:simple_tenant_usage:show":
[["rule:admin_or_owner"]],
"compute_extension:simple_tenant_usage:list":
[["rule:admin_api"]],
"compute_extension:users": [["rule:admin_api"]],
"compute_extension:virtual_interfaces": ["role":"computeuser"],
"compute_extension:virtual_storage_arrays": ["role":"computeuser"],
"compute_extension:volumes": ["role":"compute-user"],
"compute_extension:volumetypes": ["role":"compute-user"],
"volume:create": ["role":"compute-user"],
"volume:get_all": ["role":"compute-user"],
"volume:get_volume_metadata": ["role":"compute-user"],
"volume:get_snapshot": ["role":"compute-user"],
"volume:get_all_snapshots": ["role":"compute-user"],
"network:get_all_networks": ["role":"compute-user"],
"network:get_network": ["role":"compute-user"],
"network:delete_network": ["role":"compute-user"],
"network:disassociate_network": ["role":"compute-user"],
"network:get_vifs_by_instance": ["role":"compute-user"],
"network:allocate_for_instance": ["role":"compute-user"],
"network:deallocate_for_instance": ["role":"compute-user"],
"network:validate_networks": ["role":"compute-user"],
"network:get_instance_uuids_by_ip_filter": ["role":"computeuser"],
"network:get_floating_ip": ["role":"compute-user"],
"network:get_floating_ip_pools": ["role":"compute-user"],
"network:get_floating_ip_by_address": ["role":"compute-user"],
"network:get_floating_ips_by_project": ["role":"computeuser"],
"network:get_floating_ips_by_fixed_address": ["role":"computeuser"],
"network:allocate_floating_ip": ["role":"compute-user"],
"network:deallocate_floating_ip": ["role":"compute-user"],
"network:associate_floating_ip": ["role":"compute-user"],
"network:disassociate_floating_ip": ["role":"compute-user"],
"network:get_fixed_ip": ["role":"compute-user"],
"network:add_fixed_ip_to_instance": ["role":"compute-user"],
"network:remove_fixed_ip_from_instance": ["role":"computeuser"],
"network:add_network_to_project": ["role":"compute-user"],
"network:get_instance_nw_info": ["role":"compute-user"],
"network:get_dns_domains": ["role":"compute-user"],
"network:add_dns_entry": ["role":"compute-user"],
"network:modify_dns_entry": ["role":"compute-user"],
"network:delete_dns_entry": ["role":"compute-user"],
"network:get_dns_entries_by_address": ["role":"compute-user"],
"network:get_dns_entries_by_name": ["role":"compute-user"],
"network:create_private_dns_domain": ["role":"compute-user"],
"network:create_public_dns_domain": ["role":"compute-user"],
"network:delete_dns_domain": ["role":"compute-user"]
}
服务管理
身份验证服务管理的两个主要的概念是:
服务(Services);
端点(Endpoints);
身份验证服务也保持一个用户与每个服务一致。(例如,一个用户名称为:nova,对于compute服务),以及一个专门的服务租户,它也被服务调用。
创建服务的命令以及终端的描述在以后的章节中进行。
安装与配置身份验证服务
在任何与其它可访问的服务器有关的服务器上安装身份验证服务,你打算用于OpenStack服务。以root身份:
# apt-get install keystone。
在安装完之后,你必须删除在安装过程中创建的sqlite数据库,然后改变配置,指向MySQL数据库。这个配置使得缩放脚本很容易,自从当你需要的时候,你能够创建多个keystone前端,以及配置它们,使得它们全部指向同样的数据库。加上一个已经嵌入了数据复制特征的数据库后端,以及与高可用性有紧密关联的文档,以及数据冗余配置。
删除在/var/lib/keystone目录下的keystone.db文件。
# rm /var/lib/keystone/keystone.db
与其配置已经准备好的后端数据存储,还不如使用缺省支持的分类有能力去备份该服务以及终端数据。这个例子表示了MySQL.
以root用户安装MySQL:
# apt-get install python-mysqldb mysql-server
在安装期间,你将会被提示为了mysql的root用户设置密码。输入一个密码并且确认。
使用sed命令修改/etc/mysql/my.cnf文件,更改bind-address地址,由主机地址(localhost:127.0.0.1)更改至任意地址(0.0.0.0),然后重启mysql服务,用root用户:
# sed –I 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
# service mysql restart
下列命令序列将创建一个名称为"keystone"的数据库,以及一个名称为"keystone"的MySQL用户。它拥有访问"keystone"MySQL数据库的所有权限。
为了手动创建数据库,通过运行下面的命令行启动MySQL数据库
$ mysql –u root –p
当出现提示符时输入mysql的root用户密码。
为了配置MySQL数据库,创建keystone数据库。
Mysql> CREATE DATABASE keystone;
注意:
为keystone用户选择一个安全的密码,然后用这处命令替换所有的参考[YOUR_KEYSTONEDB_PASSWORD]
Mysql> GRANT ALL ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '[YOUR_KEYSTONEDB_PASSWORD]';
在mysql>提示符处键入quit退出MySQL。
Mysql>quit
提示:
记得在这个文档中假设(assumes)了云控制节点有一个IP地址:192.168.206.130。
一旦keystone安装了,通过一个主要的配置文件(/etc/keystone/keystone.conf)来配置它。用命令行客户端来初始化数据到keystone数据库中。缺省地,Keystone的数据存储是sqlite。为了数据存储到mysql,在文件/etc/keystone/keystone.conf中更改定义"connection"项,象下这面的一样:
Connection = mysql://keystone:[YOUR_KEYSTONEDB_PASSWORD]@192.168.206.130/keystone
同样,适当的服务token被使用于该keystone.conf文件,在附录里(in appendix)提供了一个例子,或者你可以产生一个随机字符。作为例 子的token如下:
Admin_token= 012345SECRET99TOKEN012345
下一步,重启keystone服务,以便keystone启动(picks up)新的数据库配置。
# sudo service keystone restart
最后,初始化最新的keystone数据库,用 root用户
# keystone-manage db_sync
配置服务与keystone一起工作(Configuring Services to work with keystone)
一旦keystone 安装和运行,你就可以准备(set up)用户和租户,以及服务,配置后与keystone一起工作。
手动准备租户,用户,角色(Setting up tenants,users,roles – manually)
你必须至少定义一个租户,用户,和与租户关联的角色,以及作为最基本的一套详细的获取其它服务身份验证和用身份服务授权的用户。
这里有一个手动的,使用keystone客户端的不用稿子的步骤,在这节的未尾,一个有稿子的方法是可用的。
首先,创建一个缺省的tenant,在这个例子中,我们把它命名为openstackDemo。
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.130:35357/v2.0 tenant-create --name openstackDemo --description "Default Tenant" --enabled true
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Default Tenant |
| enabled | true |
| id | b5815b046cfe47bb891a7b64119e7f80 |
| name | openstackDemo |
+-------------+----------------------------------+
创建一个缺省的名称为admin的用户
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.130:35357/v2.0 user-create --tenant_id b5815b046cfe47bb891a7b64119e7f80 --nameadmin --pass secretword --enabled true
+-------------------------------------------------------------------------------------------------------------------------+
| Property |Value |
+----------------------------------------------------------------------------------------------------------------------------+
| email | None|
| enabled | true
|
| id | a4c2d43f80a549a19864c89d759bb3fe
|
| name | admin
|
| password | $6$rounds=40000$MsFWIgIfbAHnhUH8$vvSK9/Uy3P5BTdH0kn.0MH.
xFHAR2pWQCpTRLTENPs.3w53jb5BbbkIKHnkTbzWW3xVwqsb3W5e./3EIaNPeP0 |
| tenantId | b5815b046cfe47bb891a7b64119e7f80
|
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
创建一个缺省的角色,名称为:admin以及memberRole
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.130:35357/v2.0 role-create --name admin
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| id | e3d9d157cc95410ea45d23bbbc2e5c10 |
| name | admin |
+----------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.130:35357/v2.0 role-create --name memberRole
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| id | cffc2edea9c74b4a8779cc0d7a22fc21 |
| name | memberRole |
+----------+----------------------------------+
用"user-role-add"命令,在角色openstackDemo里,把admin角色授于admin用户。
$ keystone --token 012345SECRET99TOKEN012345 --endpoint
http://192.168.206.130:35357/v2.0 user-role-add --user
a4c2d43f80a549a19864c89d759bb3fe --tenant_id b5815b046cfe47bb891a7b64119e7f80
--role e3d9d157cc95410ea45d23bbbc2e5c10
对于这条命令,没有任何输出。
创建一个服务租户,这个租户包含所有的我们已经表明的服务类别的服务,
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.130:35357/v2.0 tenant-create --name service --description "Service Tenant" --enabled true
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| Property |
Value |
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| email | None
|
| enabled | true
|
| id | 54b3776a8707834d983e0b4037b1345c
|
| name | nova
|
| password | $6$rounds=40000$kf1ENaCoy7wOfRjx
$LKQtsQbBqSBr2ZH7fwToAut0EYYz6M278N16Xg4Va2vTEOFabvTVXCdCP4hA5ikdCQO8Mh1nJvuFMEvGHaht3/
|
| tenantId | eb7e0c10a99446cfa14c244374549e9d
|
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
在service租户里,把admin角色授于nova用户。
$ keystone --token 012345SECRET99TOKEN012345 --endpoint
http://192.168.206.130:35357/v2.0 user-role-add --user
54b3776a8707834d983e0b4037b1345c --tenant_id eb7e0c10a99446cfa14c244374549e9d
--role e3d9d157cc95410ea45d23bbbc2e5c10
对于这个命令也没有任何信息输出。
在service租户里,创建一个EC2服务的用户。
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.
130:35357/v2.0 user-create --tenant_id eb7e0c10a99446cfa14c244374549e9d --name
ec2 --pass ec2 --enabled true
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| Property |
Value |
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| email | None
|
| enabled | true
|
| id | 32e7668b8707834d983e0b4037b1345c
|
| name | ec2
|
| password | $6$rounds=40000$kf1ENaCoy7wOfRjx
$LKQtsQbBqSBr2ZH7fwToAut0EYYz6M278N16Xg4Va2vTEOFabvTVXCdCP4hA5ikdCQO8Mh1nJvuFMEvGHaht3/
|
| tenantId | eb7e0c10a99446cfa14c244374549e9d
|
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
在service租户里,把admin角色授于ec2用户
$ keystone --token 012345SECRET99TOKEN012345 --endpoint
http://192.168.206.130:35357/v2.0 user-role-add --user
32e7668b8707834d983e0b4037b1345c --tenant_id eb7e0c10a99446cfa14c244374549e9d
--role e3d9d157cc95410ea45d23bbbc2e5c10
对于这个命令,也没有任何信息输出。
在service租户里,创建一个对象存储服务用户
$ keystone --token 012345SECRET99TOKEN012345 --endpoint http://192.168.206.
130:35357/v2.0 user-create --tenant_id eb7e0c10a99446cfa14c244374549e9d --name
swift --pass swiftpass --enabled true
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| Property |
Value |
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
| email | None
|
| enabled | true
|
| id | 4346677b8909823e389f0b4037b1246e
|
| name | swift
|
| password | $6$rounds=40000$kf1ENaCoy7wOfRjx
$LKQtsQbBqSBr2ZH7fwToAut0EYYz6M278N16Xg4Va2vTEOFabvTVXCdCP4hA5ikdCQO8Mh1nJvuFMEvGHaht3/
|
| tenantId | eb7e0c10a99446cfa14c244374549e9d
|
+----------
+-------------------------------------------------------------------------------------------------------------------------
+
在service租户里,把admin角色授于swift用户
$ keystone --token 012345SECRET99TOKEN012345 --endpoint
http://192.168.206.130:35357/v2.0 user-role-add --user
4346677b8909823e389f0b4037b1246e --tenant_id eb7e0c10a99446cfa14c244374549e9d
--role e3d9d157cc95410ea45d23bbbc2e5c10
这个命令行也没有信息输出
下一步,你为服务创建一个自定义服务
自定义服务(Defining Services)
Keystone也起着一个服务目录的作用,这个目录让其它的openstack系统知道为了OpenStack服务的相关的API终端存放在哪里。特别地(in particular),OpenStack Dashboard大量地(heavily)使用一个服务目录,对于openstack dashboard的适当的功能,这必须配置。
对于keystone,这个有两个非正式的定义服务的方法。
- 使用模板文件
- 使用数据库后台
在使用一个模板文件是简单的时候,把开发环镜,比如DevStack排除在外,这是不建议的。在服务目录上,通过keystone命令,模板文件无法使得CRUD操作可用。但是,当使用模板目录的时候,你可能使用服务列表命令。一个数据库后台能够提供更好的可靠性(better reliability),可用性(availability),数据冗余性(data redundancy)。这一节描述了使用数据库后台如何生活于keystone服务目录,你的/etc/keystone/keystone.conf文件将包含下列行,如果它被适当的配置去使用数据库后端。
[catalog]
driver = keystone.catalog.backends.sql.Catalog
Keystone服务目录的主要入口
对于在目录里的每个服务,你必须执行两个keystone操作:
-
使用keystone service-create命令来为服务创建一个数据库入口,这个命令带有下面的属性:
--name 服务的名称(例如,nova,ec2,glance,keystone)
--type 服务的类型(e.g.,compute,ec2,image,identity)
--description 该服务的描述(e.g.,"Nova Compute Service")
2.使用 keystone endpoing-create 命令创建一个数据库入口,这个入口描述了客户端的不同类型能够联接到服务,用下面的属性:
--region 你分配给已经部署的OpenStack云的已经给出的区域名称(e.g.,RegionOne)。
--service-id 由keystone service-create返回的ID字段。
--publicurl The URL of the public-facing endpoint for the service(e.g., http://192.168.206.130:9292/v1 or
http://192.168.206.130:8774/v2/%(tenant_id)s)
--internalurl The URL of an internal-facing endpoint for the service.
This typically has the same value as publicurl.
--adminurl The URL for the admin endpoint for the service. The Keystone
and EC2 services use different endpoints for adminurl and
publicurl, but for other services these endpoints will be the same.
Keystone允许一个URLs去包含指定的参数,这些参数在运行的时候会被用正确的值替代。在这个文档中有一些例子,使用tenant_id参数,当指定了卷和Compute service 终端的时候,。参数既可以用%或$来表示指号,在这个文档中,我们总是使用%记号,由于$被Unix shell作为一个特殊的字符。
创建keystone服务以及服务端点(Create Keystone Service and Service Endpoint)
这里我们定义了服务以及它们的端点
定义身份服务(Identity Service)
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \--name=keystone \--type=identity \
--description="Keystone Identity Service"
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Keystone Identity Service |
| id | 15c11a23667e427e91bc31335b45f4bd |
| name | keystone |
| type | identity |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=15c11a23667e427e91bc31335b45f4bd \
--publicurl=http://192.168.206.130:5000/v2.0 \
--internalurl=http://192.168.206.130:5000/v2.0 \
--adminurl=http://192.168.206.130:35357/v2.0
+-------------+-----------------------------------+
| Property | Value |
+-------------+-----------------------------------+
| adminurl | http://192.168.206.130:35357/v2.0 |
| id | 11f9c625a3b94a3f8e66bf4e5de2679f |
| internalurl | http://192.168.206.130:5000/v2.0 |
| publicurl | http://192.168.206.130:5000/v2.0 |
| region | RegionOne |
| service_id | 15c11a23667e427e91bc31335b45f4bd |
+-------------+-----------------------------------+
定义计算服务,该服务对于每个租户都要求一个独立的端点。这里,我们使用前面一节中的service租户。
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=nova \
--type=compute \
--description="Nova Compute Service"
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Nova Compute Service |
| id | abc0f03c02904c24abdcc3b7910e2eed |
| name | nova |
| type | compute |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=abc0f03c02904c24abdcc3b7910e2eed \
--publicurl='http://192.168.206.130:8774/v2/%(tenant_id)s' \
--internalurl='http://192.168.206.130:8774/v2/%(tenant_id)s' \
--adminurl='http://192.168.206.130:8774/v2/%(tenant_id)s'
+-------------+----------------------------------------------+
| Property | Value |
+-------------+----------------------------------------------+
| adminurl | http://192.168.206.130:8774/v2/%(tenant_id)s |
| id | 935fd37b6fa74b2f9fba6d907fa95825 |
| internalurl | http://192.168.206.130:8774/v2/%(tenant_id)s |
| publicurl | http://192.168.206.130:8774/v2/%(tenant_id)s |
| region | RegionOne |
| service_id | abc0f03c02904c24abdcc3b7910e2eed |
+-------------+----------------------------------------------+
定义卷服务,为每个租户,它也需要一个独立的终端。
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=volume \
--type=volume \
--description="Nova Volume Service"
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Nova Volume Service |
| id | 1ff4ece13c3e48d8a6461faebd9cd38f |
| name | volume |
| type | volume |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=1ff4ece13c3e48d8a6461faebd9cd38f \
--publicurl='http://192.168.206.130:8776/v1/%(tenant_id)s' \
--internalurl='http://192.168.206.130:8776/v1/%(tenant_id)s' \
--adminurl='http://192.168.206.130:8776/v1/%(tenant_id)s'
+-------------+----------------------------------------------+
| Property | Value |
+-------------+----------------------------------------------+
| adminurl | http://192.168.206.130:8776/v1/%(tenant_id)s |
| id | 1ff4ece13c3e48d8a6461faebd9cd38f |
| internalurl | http://192.168.206.130:8776/v1/%(tenant_id)s |
| publicurl | http://192.168.206.130:8776/v1/%(tenant_id)s |
| region | RegionOne |
| service_id | 8a70cd235c7d4a05b43b2dffb9942cc0 |
+-------------+----------------------------------------------+
定义一个镜象服务
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=glance \
--type=image \
--description="Glance Image Service"
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Glance Image Service |
| id | 7d5258c490144c8c92505267785327c1 |
| name | glance |
| type | image |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=7d5258c490144c8c92505267785327c1 \
--publicurl=http://192.168.206.130:9292/v1 \
--internalurl=http://192.168.206.130:9292/v1 \
--adminurl=http://192.168.206.130:9292/v1
+-------------+-----------------------------------+
| Property | Value |
+-------------+-----------------------------------+
| adminurl | http://192.168.206.130:9292/v1 |
| id | 3c8c0d749f21490b90163bfaed9befe7 |
| internalurl | http://192.168.206.130:9292/v1 |
| publicurl | http://192.168.206.130:9292/v1 |
| region | RegionOne |
| service_id | 7d5258c490144c8c92505267785327c1 |
+-------------+-----------------------------------+
定义EC2兼容的服务
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=ec2 \
--type=ec2 \
--description="EC2 Compatibility Layer"
+-------------+----------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | EC2 Compatibility Layer |
| id | 181cdad1d1264387bcc411e1c6a6a5fd |
| name | ec2 |
| type | ec2 |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=181cdad1d1264387bcc411e1c6a6a5fd \
--publicurl=http://192.168.206.130:8773/services/Cloud \
--internalurl=http://192.168.206.130:8773/services/Cloud \
--adminurl=http://192.168.206.130:8773/services/Admin
+-------------+--------------------------------------------+
| Property | Value |
+-------------+--------------------------------------------+
| adminurl | http://192.168.206.130:8773/services/Cloud |
| id | d2a3d7490c61442f9b2c8c8a2083c4b6 |
| internalurl | http://192.168.206.130:8773/services/Cloud |
| publicurl | http://192.168.206.130:8773/services/Admin |
| region | RegionOne |
| service_id | 181cdad1d1264387bcc411e1c6a6a5fd |
+-------------+--------------------------------------------+
定义对象存储服务
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=swift \
--type=object-store \
--description="Object Storage Service"
+-------------+---------------------------------+
| Property | Value |
+-------------+----------------------------------+
| description | Object Storage Service |
| id | 272efad2d1234376cbb911c1e5a5a6ed |
| name | swift |
| type | object-store |
+-------------+----------------------------------+
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=272efad2d1234376cbb911c1e5a5a6ed \
--publicurl 'http://192.168.206.130:8888/v1/AUTH_%(tenant_id)s' \
--adminurl 'http://192.168.206.130:8888/v1' \
--internalurl 'http://192.168.206.130:8888/v1/AUTH_%(tenant_id)s'
+-------------+---------------------------------------------------+
| Property | Value |
+-------------+---------------------------------------------------+
| adminurl | http://192.168.206.130:8888/v1 |
| id | e32b3c4780e51332f9c128a8c208a5a4 |
| internalurl | http://192.168.206.130:8888/v1/AUTH_%(tenant_id)s |
| publicurl | http://192.168.206.130:8888/v1/AUTH_%(tenant_id)s |
| region | RegionOne |
| service_id | 272efad2d1234376cbb911c1e5a5a6ed |
+-------------+---------------------------------------------------+
设置租户,用户,角色,以及服务描述
Keystone项目,在https://github.com/openstack/keystone/blob/master/tools/sample_data.sh里有个脚本,这个脚本使用127.0.0.1做为所有的终端IP地址。这个脚本也为你定义了服务。
发现并修改Identity Service(Keystone)
在发现并修改之前,在/var/log/keystone.log文件里查看(日志文件在/etc/keystone/logging.conf文件里有配置)。它显示了的进入WSGI请求的所有的组件,以及预料在log文件里将有一个错误,这个错误解译了为什么一个授权失败。如果你没有查看那些LOG文件中的请求,然后用带有"-debug"运行keystone。
验证身份服务的安装(Verifying the Identity Service Installation)
通过使用你创建用户名称和密码产生一个身份认证的符号,来检验授权是你所期望的。
$ keystone --os-username=admin --os-password=secretword --os-auth-url=
http://192.168.206.130:35357/v2.0 token-get
+----------+----------------------------------+
| Property | Value |
+----------+----------------------------------+
| expires | 2012-10-04T16:08:03Z |
| id | 960ad732a0eb4b2a88516f18384c1fba |
| user_id | a4c2d43f80a549a19864c89d759bb3fe |
+----------+----------------------------------+
在响应里,你会收到一个与你的用户ID配对的符号。
- 安装OpenStack计算(Compute)和镜象服务(Image)
OpenStack Compute和镜象服务共同工作,通过REST APS对虚拟机以及镜象提供访问。
安装和配置镜象服务
以root身份,安装镜象服务
# sudo apt-get install glance glance-api glance-common python-glanceclient glance-registry python-glance
注:当用ubuntu云文档的时候,在按照上面的列表安装完glance 包之后,你需要重新安装python-keystoneclien,否则你会看到一个错误。
在安装完以后,你需要删除安装过程中产生的sqlite数据库,然后改变配置,指向MySQL数据库。
# rm /var/lib/glance/glance.sqlite
配置镜象服务数据库后端(Configuring the Image Service database backend)
为了MySQL,配置后端数据存储,创建一个glance的MySQL数据库和一个glance的MySQL用户。把访问glance所有数据库的权限都分配给glance用户,运行下面的命令启动MySQL数据库:
$ mysql –u root –p
当出现提示符后输入root用户密码。
创建glance数据库,然后配置MySQL数据库。
Mysql> CREATE DATABASE glance;
为新创建的glance数据库创建一个MySQL用户,然后把数据库所有的控制权赋于它。
Mysql > GRANT ALL ON glance.* TO 'glance'@'%' IDENTIFIED BY '[YOUR_GLANCEDB_PASSWORD]';
在mysql > 提示符上输入quit退出MySQL;
Mysql > quit
编辑Glance配置文件以及paste.ini中间件文件。
镜象服务有大量的操作,你可能用来配置Glance API服务,Glance注册服务,以及Glance能够用来存储镜象的各种存储终端。缺省地,存储终端是在文件里,在glance-api.conf配置文件里的[DEFAULT]部份里有规定。
大多数据配置是通过配置文件一配置的,对于Glance API服务以及Glance Registry服务都是用独立的配置文件。当通过一个操作系统包管理系统安装的时候,一个样例配置文件也被安装在/etc/glance目录里。在以组件名-paste.ini的文件里,例如glance-api-paste.ini文件,你配置该PasteDeploy配置,它控制了WSGI应用的部署对于每个组件。
这个完整的指导安装镜象服务使用了一个文件后端以及用于授权的身份识别服务。
更改/etc/glance/glance-api-paste.ini文件以及配置admin_*的值在[filter:authtoken]的下面。
[filter:authtoken]
admin_tenant_name = service
admin_user = glance
admin_password = glance
把admin、服务识别以及flavor=keystone添加到/etc/glance/glance-api.conf文件的尾部。
[keystone_authtoken]
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = admin
admin_password = secretword
[paste_deploy]
# Name of the paste configuration file that defines the available pipelines
config_file = /etc/glance/glance-api-paste.ini
# Partial name of a pipeline in your paste configuration file with the
# service name removed. For example, if your paste section name is
# [pipeline:glance-api-keystone], you would configure the flavor below
# as 'keystone'.
flavor=keystone
重启glance-api 以便得到这些改变了的设置。
Service glance-api restart
更新/etc/glance/glance-registry.conf的最后一节,来映射到你较早时看到的对于admin用户和service租户的数据。加上flavor=keystone配置使得身份服务可用。
[keystone_authtoken]
auth_host = 127.0.0.1
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = admin
admin_password = secretword
[paste_deploy]
# Name of the paste configuration file that defines the available pipelines
config_file = /etc/glance/glance-api-paste.ini
# Partial name of a pipeline in your paste configuration file with the
# service name removed. For example, if your paste section name is
# [pipeline:glance-api-keystone], you would configure the flavor below
# as 'keystone'.
flavor=keystone
更新/etc/glance/glance-registry-paste.ini通过使得身份服务可用。
Keystone:
# Use this pipeline for keystone auth
[pipeline:glance-registry-keystone]
pipeline = authtoken context registryapp
确信/etc/glance/glance-registry.conf指向MySQL数据库而不是(rather than)sqlite。
sql_connection = mysql://glance:[YOUR_GLANCEDB_PASSWORD]@192.168.206.130/glance
重启glance-registry来获取这些改变了的设置。
service glance-registry restart
注:在任何时候,当你改变了.conf文件,就要重启对应的服务。
在ubuntu12.04上面,为数据表都是在版本控制之下,在新的安装时,你必须做以下这些步骤以便防止镜象服务可能中断升级,以root用户操作如下:
# glance-manage version_control 0
现在你可以生成或迁移数据库中的数据
#glance-manage db_sync
重启glance-registry和glance-api服务,以root用户操作如下:
#service glance-registry restart
#service glance-api restart
注:这本指导手册没有配置image caching,配置参考http://docs.openstack.org/developer/glance/以获取更多的知识。
发现并处理故障镜象服务(Troubleshooting the Image Service(Glance))
开始发现并处理问题,要在/var/log/glance/registry.log文件中查找或者在/var/log/glance/api.log中查找。
验证镜象服务安装(Verifying the Image Service Installation)