OpenStack系统有几个关键的项目,它们能够独立地安装但是能够在你的云计算中共同工作。这些项目包括:OpenStack Compute,OpenStack Object Storage,OpenStack Identity Service,以及OpenStack Image Service。你可以独立地安装这些项目中的任何一个,然后即可以独立也可以把它们作为一个联合体来配置。这个指导手册指导用有用的包(packages)在ubuntu12.10上的一个安装。这个手册也提供了一个与给出的配置文件例子一样好的配置解释。
注一:在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
从Cactus版本开始,OpenStack采取了六个月一个版本的计划表。Folsom是2012年10月的计划产品。
代码名称(Code Names) 每一个OpenStack服务都有一个代码名称。例如,镜象服务命名为Glance。在下面的表格中列出了所有的名称。 表2.2
这些代码名称对应于配置文件的名称以及命令行应用程序,例如,身份验证服务有一个名称为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文件系统的用法象一个后台用于镜象服务。
计算(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实例联合的。
$ 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操作:
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和镜象服务共同工作,通过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) (责任编辑:IT) |