2013年6月18日星期二

淘宝 。CDN技术简介

背景

Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越 高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因数的影响,响应速度慢还是经常抱怨和困扰。解决方案就是在网络传输上利 用缓存技术使得Web服务数据流能就近访问,是优化网络数据传输非常有效的技术,从而获得高速的体验和品质保 证。
网络缓存技术,其目的就是减少网络中冗余数据的重复传输,使之最小化,将广域传输转为本地或就近访问。互联网上传递的内容,大部分为重复的Web/FTP数据,Cache服 务器及应用Caching技术的网络设备,可大大优化数据链路性能,消除数据峰值访问造成的结点设备阻塞。Cache服务器具有缓存功能,所以大部分网页 对象(Web page object),如html, htm, php等页面文件,gif,tif,png,bmp等图片文件,以及其他格式的文件,在有效期(TTL)内,对于重复的访问,不必从原始网站重新传送文件 实体, 只需通过简单的认证(Freshness Validation)- 传送几十字节的Header,即可将本地的副本直接传送给访问者。由于缓存服务器通常部署在靠近用户端,所以能获得近似局域网的响应速度,并有效减少广域 带宽的消耗。据统计,Internet上超过80%的用户重复访问20%的信息资源,给缓存技术的应用提供了先决的条件。缓存服务器的体系结构与Web服 务器不同,缓存服务器能比Web服务器获得更高的性能,缓存服务器不仅能提高响应速度,节约带宽,对于加速Web服务器,有效减轻源服务器的负荷是非常有 效的。
高速缓存服务器(Cache Server)是软硬件高度集成的专业功能服务器,主要做高速缓存加速服务,一般部署在网络边缘。根据加速对象不同,分为客户端加速和服务器加速,客户端 加速Cache部署在网络出口处,把常访问的内容缓存在本地,提高响应速度和节约带宽;服务器加速,Cache部署在服务器前端,作为Web服务器的前置 机,提高Web服务器的性能,加速访问速度。如果多台Cache加速服务器且分布在不同地域,需要通过有效地机制管理Cache网络,引导用户就近访问, 全局负载均衡流量,这就是CDN内容传输网络的基本思想。

什么是CDN?

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”,使用户可 以就近取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等 原因,解决用户访问网站的响应速度慢的根本原因。
狭义地讲,内容分发布网络(CDN)是一种新型的网络构建方式,它是为能在传统的IP 网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。简单地说,内容发布网(CDN)是一个经策 略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理(Traffic Management)是CDN的核心所在。通过用户就近性和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务。总的来说,内 容服务基于缓存服务器,也称作代理缓存(Surrogate),它位于网络的边缘,距用户仅有”一跳”(Single Hop)之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们 客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN技术,能处理整个网站页面的 70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。
与目前现有的内容发布模式相比较,CDN强调了网络在内 容发布中的重要性。通过引入主动的内容管理层的和全局负载均衡,CDN从根本上区别于传统的内容发布模式。在传统的内容发布模式中,内容的发布由ICP的 应用服务器完成,而网络只表现为一个透明的数据传输通道,这种透明性表现在网络的质量保证仅仅停留在数据包的层面,而不能根据内容对象的不同区分服务质 量。此外,由于IP网的”尽力而为”的特性使得其质量保证是依靠在用户和应用服务器之间端到端地提供充分的、远大于实际所需的带宽通量来实现的。在这样的 内容发布模式下,不仅大量宝贵的骨干带宽被占用,同时ICP的应用服务器的负载也变得非常重,而且不可预计。当发生一些热点事件和出现浪涌流量时,会产生 局部热点效应,从而使应用服务器过载退出服务。这种基于中心的应用服务器的内容发布模式的另外一个缺陷在于个性化服务的缺失和对宽带服务价值链的扭曲,内 容提供商承担了他们不该干也干不好的内容发布服务。
纵观整个宽带服务的价值链,内容提供商和用户位于整个价值链的两端,中间依靠网络服务提供商将其串接起来。随着互联网工业的成熟和商业模式的变革, 在这条价值链上的角色越来越多也越来越细分。比如内容/应用的运营商、托管服务提供商、骨干网络服务提供商、接入服务提供商等等。在这一条价值链上的每一 个角色都要分工合作、各司其职才能为客户提供良好的服务,从而带来多赢的局面。从内容与网络的结合模式上看,内容的发布已经走过了ICP的内容(应用)服 务器和IDC这两个阶段。IDC的热潮也催生了托管服务提供商这一角色。但是,IDC并不能解决内容的有效发布问题。内容位于网络的中心并不能解决骨干带 宽的占用和建立IP网络上的流量秩序。因此将内容推到网络的边缘,为用户提供就近性的边缘服务,从而保证服务的质量和整个网络上的访问秩序就成了一种显而 易见的选择。而这就是内容发布网(CDN)服务模式。CDN的建立解决了困扰内容运营商的内容”集中与分散”的两难选择。无疑对于构建良好的互联网价值链 是有价值的,也是不可或缺的。

CDN新应用和客户

目前的CDN服务主要应用于证券、金融保险、ISP、ICP、 网上交易、门户网站、大中型公司、网络教学等领域。另外在行业专网、互联网中都可以用到,甚至可以对局域网进行网络优化。利用CDN,这些网站无需投资昂 贵的各类服务器、设立分站点,特别是流媒体信息的广泛应用、远程教学课件等消耗带宽资源多的媒体信息,应用CDN网络,把内容复制到网络的最边缘,使内容 请求点和交付点之间的距离缩至最小,从而促进Web站点性能的提高,具有重要的意义。CDN网络的建设主要有企业建设的CDN网络,为企业服务;IDC的 CDN网络,主要服务于IDC和增值服务;网络运营上主建的CDN网络,主要提供内容推送服务;CDN网络服务商,专门建设的CDN用于做服务,用户通过 与CDN机构进行合作,CDN负责信息传递工作,保证信息正常传输,维护传送网络,而网站只需要内容维护,不再需要考虑流量问题。
CDN能够为网络的快速、安全、稳定、可扩展等方面提供保障。
IDC建立CDN网络,IDC运营商一般需要有分部各地的多个 IDC中心,服务对象是托管在IDC中心的客户,利用现有的网络资源,投资较少,容易建设。例如某IDC全国有10个机房,加入IDC的CDN网络,托管 在一个节点的Web服务器,相当于有了10个镜像服务器,就近供客户访问。宽带城域网,域内网络速度很快,出城带宽一般就会瓶颈,为了体现城域网的高速体 验,解决方案就是将Internet网上内容高速缓存到本地,将Cache部署在城域网各POP点上,这样形成高效有序的网络,用户仅一跳就能访问大部分 的内容,这也是一种加速所有网站CDN的应用。

CDN 的工作原理

在描述CDN的实现原理,让我们先看传统的未加缓存服务的访问过程,以便了解CDN缓存访问方式与未加缓存访问方式的差别:
由上图可见,用户访问未使用CDN缓存网站的过程为:
  1. 用户向浏览器提供要访问的域名;
  2. 浏览器调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址;
  3. 浏览器使用所得到的IP地址,域名的服务主机发出数据访问请求;
  4. 浏览器根据域名主机返回的数据显示网页的内容。
通过以上四个步骤,浏览器完成从用户处接收用户要访问的域名到从域名服务主机处获取数据的整个过程。CDN网络是在用户和服务器之间增加Cache层, 如何将用户的请求引导到Cache上获得源服务器的数据,主要是通过接管DNS实现,下面让我们看看访问使用CDN缓存后的网站的过程:
通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为:
  1. 用户向浏览器提供要访问的域名;
  2. 浏览器调用域名解析库对域名进行解析,由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,为了得到实 际IP地址,浏览器需要再次对获得的CNAME域名进行解析以得到实际的IP地址;在此过程中,使用的全局负载均衡DNS解析,如根据地理位置信息解析对 应的IP地址,使得用户能就近访问。
  3. 此次解析得到CDN缓存服务器的IP地址,浏览器在得到实际的IP地址以后,向缓存服务器发出访问请求;
  4. 缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用DNS解析得到此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;
  5. 缓存服务器从实际IP地址得得到内容以后,一方面在本地进行保存,以备以后使用,二方面把获取的数据返回给客户端,完成数据服务过程;
  6. 客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。
通过以上的分析我们可以得到,为了实现既要对普通用户透明(即加入缓存以后用户客户端无需进行任何设置,直接使用被加速网站原有的域名即可访问),又要 在为指定的网站提供加速服务的同时降低对ICP的影响,只要修改整个访问过程中的域名解析部分,以实现透明的加速服务,下面是CDN网络实现的具体操作过程。
  1. 作为ICP,只需要把域名解释权交给CDN运营商,其他方面不需要进行任何的修改;操作时,ICP修改自己域名的解析记录,一般用cname方式指向CDN网络Cache服务器的地址。
  2. 作为CDN运营商,首先需要为ICP的域名提供公开的解析,为了实现sortlist,一般是把ICP的域名解释结果指向一个CNAME记录;
  3. 当需要进行sorlist时,CDN运营商可以利用DNS对CNAME指向的域名解析过程进行特殊处理,使DNS服务器在接收到客户端请求时可以根据客户端的IP地址,返回相同域名的不同IP地址;
  4. 由于从cname获得的IP地址,并且带有hostname信息,请求到达Cache之后,Cache必须知道源服务器的IP地址,所以在CDN运营商内部维护一个内部DNS服务器,用于解释用户所访问的域名的真实IP地址;
  5. 在维护内部DNS服务器时,还需要维护一台授权服务器,控制哪些域名可以进行缓存,而哪些又不进行缓存,以免发生开放代理的情况。

CDN的技术手段

实现CDN的主要技术手段是高速缓存、镜像服务器。可工作于DNS解析或HTTP重定向两种方式,通过Cache服务器,或异地的镜像站点 完成内容的传送与同步更新。DNS方式用户位置判断准确率大于85%,HTTP方式准确率为99%以上;一般情况,各Cache服务器群的用户访问流入数 据量与Cache服务器到原始网站取内容的数据量之比在2:1到3:1之间,即分担50%到70%的到原始网站重复访问数据量(主要是图片,流媒体文件等 内容);对于镜像,除数据同步的流量,其余均在本地完成,不访问原始服务器。
镜像站点(Mirror Site)服务器是我们经常可以看到的,它让内容直截了当地进行分布,适用于静态和准动态的数据同步。但是购买和维护新服务器的费用较高,另外还必须在各 个地区设置镜像服务器,配备专业技术人员进行管理与维护。大型网站在随时更新各地服务器的同时,对带宽的需求也会显著增加,因此一般的互联网公司不会建立 太多的镜像服务器。
高速缓存手段的成本较低,适用于静态内容。Internet的统计表明,超过80%的用户经常访问的是20%的网站 的内容,在这个规律下,缓存服务器可以处理大部分客户的静态请求,而原始的WWW服务器只需处理约20%左右的非缓存请求和动态请求,于是大大加快了客户 请求的响应时间,并降低了原始WWW服务器的负载。根据美国IDC公司的调查,作为CDN的一项重要指标-缓存的市场正在以每年近100%的速度增长,全 球的营业额在2004年将达到45亿美元。网络流媒体的发展还将剌激这个市场的需求。

CDN的网络架构

CDN网络架构主要由两大部分,分为中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡,设备系统安装在管理中心机房,边缘主要指异地节点,CDN分发的载体,主要由Cache和负载均衡器等组成。
当用户访问加入CDN服务的网站时,域名解析请求将最终交给全局负载均衡DNS进行处理。全局负载均衡DNS通过一组预先定义好的策略,将当时最接近用 户的节点地址提供给用户,使用户能够得到快速的服务。同时,它还与分布在世界各地的所有CDNC节点保持通信,搜集各节点的通信状态,确保不将用户的请求 分配到不可用的CDN节点上,实际上是通过DNS做全局负载均衡。
对于普通的Internet用户来讲,每个CDN节点就相当于一个放置在它周围的WEB。通过全局负载均衡DNS的控制,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求。由于它离用户更近,因而响应时间必然更快。
每个CDN节点由两部分组成:负载均衡设备和高速缓存服务器
负载均衡设备负责每个节点中各个Cache的负载均衡,保证节点的工作效率;同时,负载均衡设备还负责收集节点与周围环境的信息,保持与全局负载DNS的通信,实现整个系统的负载均衡。
高速缓存服务器(Cache)负责存储客户网站的大量信息,就像一个靠近用户的网站服务器一样响应本地用户的访问请求。
CDN的管理系统是整个系统能够正常运转的保证。它不仅能对系统中的各个子系统和设备进行实时监控,对各种故障产生相应的告警,还可以实时监测到系统中 总的流量和各节点的流量,并保存在系统的数据库中,使网管人员能够方便地进行进一步分析。通过完善的网管系统,用户可以对系统配置进行修改。
理论上,最简单的CDN网络有一个负责全局负载均衡的DNS和各节点一台Cache,即可运行。DNS支持根据用户源IP地址解析不同的IP,实现 就近访问。为了保证高可用性等,需要监视各节点的流量、健康状况等。一个节点的单台Cache承载数量不够时,才需要多台Cache,多台Cache同时 工作,才需要负载均衡器,使Cache群协同工作。

简析云计算的几个误区

  尽管OpenStack正在变成一种坚实的云计算标准,但在OpenStack供应商分销商之间也并没有非常明确的兼容性承诺。谁也不知道未来是怎样的,如果你认为你编写的在自己的OpenStack私有云上运行良好的应用程序能够不经任何修改就能良好的运行在OpenStack公有云上,那你简直就是在做梦。投入OpenStack是因为这项技术的潜力,而非为了让他们互相可移植。

    虽然云计算应用已经从概念成为现实并且有相当长时间了,但是仍然有一些人对云计算持有误解。以下是关于云计算的3个误区,是时候来认清事实让我们来真正认识云计算了。

    误区1:私有云天然安全

    许多企业部署私有云都是出于认为其是私有所以安全的假设,但事实未必如此。

    安全是来自于你合理的设计和云解决方案,而非天然的属性。因此,私有云并非天然就安全,公有云也并非天然就不安全。

    你仍然需要设计和部署合理的云安全解决方案,因为即便是你能看得到摸得到你数据中心里的服务器那也不能代表什么。

    误区2:如果我加入OpenStack, 那么我就必须保证与其他OpenStack供应商具备兼容性和可移植性

    误区3:公有云供应商会在我不知情的情况下访问和分析我的数据

    公有云供应商并不关心你的数据,他们关心的是你能不能成功的用他们的云服务,以及你为你消耗的云服务交的钱。说他们会把你的数据卖给第三方的流言是不靠谱的,当然他们也不会用你的数据来搞自己的市场情报。

    如果你实在担心这种事情发生,你可以把你的数据进行加密,如此一来那任何人都不能看到或者利用你的数据了。如果你再偏执一点,那就别用公有云好了。

丁丁历险:OpenStack云

OpenStack云第一天
OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目。
OpenStack是一个云平台管理的项目,这个项目由几个主要的组件组合起来完成一些具体的工作。
OpenStack作为基础设施即服务(简称IaaS)资源的通用前端。OpenStack项目的首要任务是简化云的部署过程并为其带来良好的可扩展性。
本文翻译自OpenStack官方网页的介绍:http://www.openstack.org/,后期有时间会在第二天文档中翻译安装与部署指南。
1. 关于OpenStack
OpenStack是通过数据中心控制大量的计算,存储与网络资源的云操作系统,管理员通过控制台进行所有的管理,通过Web接口为授权用户提供资源。
接下来我们分别了解一下compute(计算),storage(存储),networking(网络)与dashborad(控制台)。
2. OpenStack Compute
OpenStack Compute提供与管理大量网络虚拟机实例。
OpenStack云操作系统允许企业和服务供应商通过提供与管理大量网络虚拟机来定制灵活的计算资源,你可以开发自己的云应用程序并通过APIs访问这些计算资源,或是管理员简单地通过Web接口访问。计算架构被设计与标准硬件之上。
架构灵活
OpenStack为用户设计自己的云提供了足够的灵活性,OpenStack不需要专门的硬件与软件,并且可以与传统的系统或第三方技术相结合。它被设计用来自动化管理计算资源群组并可以与大多数虚拟化技术协同工作,比如HPC。
在虚拟化环境中,管理员经常会使用一个或多个hypervisor来部署OpenStack Compute。KVM和XenServer就是hypervisor非常流行的选择,建议大多数人选择这种解决方案。如果用户需要减小虚拟化开销来达到 更高的效果与性能的话,Linux容器技术LXC也是被支持的一种解决方案。另外对于不同的hypervisor,OpenStack支持ARM或其他替 换架构。
使用案例:
服务提供商可以提供IaaS给客户
IT部门可以为公司或项目组提供云服务
配合hadoop之类的工具进行大数据运算
矩阵运算,满足web与应用程序从高到低的不同需求
高性能运算处理大量、集中的工作负载
3. OpenStack Storage
OpenStack Storage为服务器或应用程序提供对象与块存储功能。
除了传统企业级存储技术外,现在很多公司为了满足不同的性能与价格需求,他们需要更多样的存储技术。OpenStack支持对象记忆块存储技术,来满足不同的开发需求。
对象存储是性价比很高、可扩展的存储技术。它为我们提供了完全分布式的,可通过API访问的存储平台,这种存储平台可以直接整合到应用中去,或是用 来备份,打包与保留数据。块存储为外部存储提供对计算实例公开并与之连接,可与企业存储平台更好的集成提供更高的性能,如NetApp,Nexenta或 SolidFire。
对象存储功能
OpenStack提供了冗余、可扩展的对象存储,满足云计算存储PE级别数据的要求。
对象存储不是传统的分解系统,它是用来存储像虚拟机镜像,图片,邮件,打包或备份之类的静态数据。没有主控点使得对象存储可以提供更好的扩展性、冗余性和巩固性。
对象与文件在数据中心服务器中被写入到多个磁盘中,通过OpenStack软件确保数据的响应与完整性。
可以简单地通过添加服务器横向扩展云存储。当服务器或磁盘损坏时,OpenStack会从云中的其他活动节点响应数据请求。由于OpenStack通过软件确保数据的响应与分布,你可以用便宜的磁盘与服务器来替代昂贵的设备。
对象存储功能
OpenStack仍然为计算实例提供块级别存储设备。
块存储系统负责管理服务器块设备的创建、添加与删除。块存储卷完全整合于OpenStack Compute并且在控制面板中云用户可以管理他们自己的存储。
使用Linux存储服务器,这种统一的存储结构被大多数存储平台所支持包括Ceph,NetApp,Nexenta以及SolidFire。
块存储适合于对性能敏感的解决方案,如存储数据库、可扩展的文件系统,或为服务器提供原始数据块访问的存储。
快照管理为块存储提供了强大的数据备份功能。快照可以用来还原或创建一个新的块存储卷。
4. OpenStack Networking
OpenStack Networking:可插入的、可扩展的、通过API驱动的网络与IP网络系统。
如今数据中心的网络所包含的设备比以往任何时候否多,网络设备、存储设备、安全设备更进一步划分为虚拟机与虚拟网络。IP地址、路由配置与安全策略 会快速地增长至百万级别。传统的网络管理技术不再适合与下一代网络的扩展性以及自动管理属性。与此同时用户则希望获得更多的控制以及快速服务的灵活性。
OpenStack Networking是一个可插入、可扩展并使用API驱动的网络与IP地址管理系统,像其他云操作系统一样,它可以被管理员或用户用来提升现有数据中心资产的价值。OpenStack Networking确保部署云时网络不会出现瓶颈或某些限制因素,还可以为用户提供真正意义上的自助服务,用户可以通过他们自己的网络配置管理网络。
Networking功能
OpenStack为不同的应用与用户组织提供了足够灵活的网络模型。标准模型包括服务器与通讯分离的平面网络或VLAN。
OpenStack Networking可以通过静态或动态的方式管理IP地址。浮动IP使得与任何计算机资源的通讯可以被动态地重新路由,即允许你在维护设备或设备损坏时重定向通讯流量。
用户可以创建自己的网络,进行通讯控制以及连接服务器与设备。
可插入式架构设计让用户可以从厂商那里获得高级网络服务功能。
管理员可以使用像OpenFlow这样的SDN技术(software-defined networking)
OpenStack Networking的可扩展架构设计可以附加其他网络服务,如入侵检测,负载均衡,防火墙以及VPN等技术。
5. Dashboard
OpenStack dashboard为管理员与用户提供了图形接口的访问方式,基于云的自动化资源。它的可扩展性设计使得加载第三方产品与服务非常容易,比如计费、监控以及额外的管理工具。对于那些想要使用它的服务供应商以及其他的商业厂商而言,控制面板同样很具有吸引力。
Dashboard是与OpenStack资源交互的一种方式。开发者可以使用OpenStack API或EC2兼容API构建自己的工具去管理我们的资源。
Dashboard功能
Dashboard是允许云管理员和用户控制他们计算、存储与网络等资源的可扩展web应用。
作为一名云管理员,dashboard使你可以了解云环境的整体大小与状态。你可以创建用户与项目,并赋予权利给用户以及设置项目资源限制。
Dashboard在管理员给定的限制内可以自主地提供自己的资源。
6. Shared Services
OpenStack提供了众多的共享服务,这些共享服务分别在 compute,storage,networking三大支柱组件中,使你可以更轻松地部署与操控你的云。这些共享服务包括身份认证,镜像管理和供外部 其他系统与OpenStack组件交互的一个Web集成接口。
身份认证服务
OpenStack提供了用户目录与他们能访问的OpenStack服务之间的映射。在整个云操作系统中它扮演了通用型认证系统,并且它可以与现有的后端目录服务如LDAP集成。它提供了多种格式的认证,包括标准的用户名、密码认证,基于令牌系统以及AWS类型的登录。
另外,在OpenStack云中提供了一个可以查询所有已部署服务的目录列表。用户与第三方工具可以规划他们可以访问哪些资源。
作为管理员,OpenStack可以使你:
集中地配置用户与系统策略
使用基于角色控制(RBAC)的特性创建用户以及定义compute,storage,networking资源的权限
与现有LDAP集成,实现单点登录、统一身份认证功能
作为用户,OpenStack可以使你:
获得一份你可以访问资源的列表
通过API请求或登录web控制台去创建属于自己的资源
镜像服务
OpenStack镜像服务可以用来查找、注册与部署服务器镜像。它提供了对镜像的拷贝、快照以及快速存储功能。
多镜像格式的支持,镜像服务允许上传私有或公钥镜像格式,包括:
Raw
Machine(kernel/ramdisk outside of image)
VHD(Hyper-v)
VDI(VirtualBox)
qcow2(Qemu/KVM)
VMDK(VMware)
7. 路线图
OpenStack致力于开放设计与开发进程。社区基于六个月的开发周期运转。
OpenStack项目列表:
OpenStack Compute(代码名称:Nova)
OpenStack Networking(代码名称:Quantum)
OpenStack Object Storage(代码名称:Swift)
OpenStack Block Storage(代码名称:Cinder)
OpenStack Identity(代码名称:Keystone)
OpenStack Image Service(代码名称:Glance)
OpenStack Dashboard(代码名称:Horizon)

OpenStack云第二天
在OpenStack第一天文档翻译后,丁丁努力坚持每晚抽时间翻译OpenStack官方网站提供的安装与部署指南,本文翻译自官方安装与部署指南的前四章内容,前四章内容主要是对OpenStack整体安装步骤以及设计搭建环境进行概述,并未提及具体安装步骤,但对环境的设计与构思以及安装需求还是需要大家了解的。希望尽快写完第三天文档(安装认证服务)。
目录:
一、安装步骤概述
二、OpenStack术语
三、OpenStack结构
四、安装环境构思
一、走马看花-安装OpenStack预览
OpenStack Compute与Image服务结合就可以通过REST APIs访问虚拟服务器与镜像,Identity服务为OpenStack所有服务提供通用认证服务。如果你需要安装控制面板就必须有Identity服务的支持。OpenStack Object Storage服务不就提供了虚拟镜像的存储方式,更是一种基于云的存储系统,通过REST API我们可以保存、还原对象数据比如镜像或视频等等。我们先从Identity开始然后是Image与Compute服务,同时会有部署对象存储的话题。
主要有这么一些步骤:
1.OpenStack目前支持平台预览:Red Hat Enterprise Linux, Scientific Linux, CentOS, Fedora, Debian, Ubuntu。
2.安装Identity服务。
3.配置Identity服务。
4.安装镜像服务(Glance)。
5.配置镜像服务
6.安装Compute(Nova)。
7.安装环境假设。
8.配置Compute。
9.使用MySQL创建并初始化Compute数据库。
10.添加镜像。
11.安装对象存储(Swift)。
12.安装OpenStack控制面板(Dashboard)。
13.通过控制面板添加密钥对。
14.通过控制面板启动镜像并检验整个安装过程。
Compute与Image安装需求
硬件:OpenStack组件适用于标准的硬件设备。以下为满足Compute、Image、Object Storage服务所需最低配置要求:
2
操作系统:OpenStack当前有以下操作系统发行版本的软件包,CentOS,Debian,Fedora,RHEL,Ubuntu。软件由社区维护,可参考http://wiki.openstack.org/Packaging.
数据库:OpenStack Compute需要访问PostgreSQL或MySQL数据库,在安装OpenStack Compute的过程中你需要安装这样的数据库。Object Storage,容器与账户服务需要使用SQLite。
权限:需要使用root或拥有sudo权限的用户去安装OpenStack Compute,Image Service以及Object Storage。
NTP协议:你必须安装一个时间同步程序如NTP,在云环境中服务器节点间保持时间同步非常重要。
Compute网络规划:
为了是管理员了解访问APIs与虚拟机所需网络资源与IP规划,本节将为大家提供网络规划的建议。至少千兆网络是必须的。这里展示一下单个服务器的网络配置。
OpenStack Compute网络可以使用扁平式网络,DHCP以及VLAN,运行nova-network的服务器建议配置双网卡。
管理类网络设计:这个网络用来在云架构中不同服务器直接相互通讯,建议可以容纳255台主机的IP规划(CIDR/24)。
公共网络设计:这个网络为外网提供连接使用,互联网用户可以通过这些IP访问云服务。建议设计8个IP。
虚拟网络设计:为虚拟机设计私有IP地址。建议CIDR/24。
安装NTP
保持云中多台主机的时间同步,你需要安装NTP软件,在云环境的多节点中,以下为服务器配置的参考模版。
1.安装软件
$ sudo yum install –y ntp
2.配置服务端:在云控制节点上通过修改ntp.conf配置NTP服务器,然后启动服务。(原文中未设置服务端的具体设置,可google参考相关资料)
$ sudo service ntpd start
$ sudo chkconfig ntpd on
3.配置NTP客户端,是compute节点与云控制节点同步时间,并将以下命令作为计划任务定期执行。
# ntpdate‘服务器IP’
# hwclock  -w
二、OpenStack术语
版本名
每一份OpenStack发行版本都有一个版本名称,版本名称按字母顺序增加(如:Diablo的下一个版本是Essex)。这些发行版本也有相应的版本号,但这个版本号不同于OpenStack Compute,OpenStack Object Storage的版本号,以下为版本名称列表:
OpenStack发行版本
从Cactus开始,OpenStack修改为六个月的开发周期,Folsom预计在2012年10月发布。
代码名称
每个OpenStack服务有一个代码名称,如镜像服务(Image Service)代码名称为Glance。以下为全部代码名称列表:
OpenStack Compute(代码名称:Nova)
OpenStack Networking(代码名称:Quantum)
OpenStack Object Storage(代码名称:Swift)
OpenStack Block Storage(代码名称:Cinder)
OpenStack Identity(代码名称:Keystone)
OpenStack Image Service(代码名称:Glance)
OpenStack Dashboard(代码名称:Horizon)
代码名称可以用来反应配置文件与命令工具的名称,如:认证服务(Identity Service)的配置文件名称为keystone.conf。
OpenStack服务与Linux服务
在Linux概念中,一个服务(也被称为守护进程)表示运行在后台监听特定端口并响应服务请求的单个程序。而OpenStack服务则表示的是若干Linux服务的集合,一个OpenStack服务需要开启多个Linux服务。如nova-compute与nova-scheduler两个Linux服务负责实施Compute服务。OpenStack还需要依赖与第三方的服务,如数据库(MySQL)以及消息服务(RabbitMQ、Qpid)。
本文档中,我们使用服务来表示底层的Linux服务以及高层的OpenStack服务。你需要通过上下文判断我们所说的服务是OpenStack服务(如:Image)还是Linux服务(如:glance-api)。
存储:对象,块,文件
许多云计算解决方案都要求使用远程存储。而存储的解决方案一般分为三类:对象存储、块存储以及文件存储。
当然有些存储解决方案同时支持多中类型。如:NexentaStor支持块存储与文件存储,GlusterFS支持文件存储与对象存储,Ceph Storage支持对象存储、块存储以及文件存储。
对象存储
在OpenStack中对象存储服务为Swif。
相关的概念:Amazon S3,Rackspace Cloud Files,Ceph Storage。
对于对象存储,所有的文件通过均HTTP接口展现。客户端在用户层上访问对象存储,操作系统并不清楚用户在使用的是远程存储。在OpenStack中,Object Storage提供了对象存储的功能。用户通过HTTP请求访问和修改文件。由于对象存储提供的数据访问接口是一种底层的抽象,所以人们常常会在对象存储的基础上构建基于文件的应用程序。例如,OpenStack Image Server就可以配置使用Object Storage作为后端存储。从对象存储提供HTTP接口后,它的另一个应用是作为静态网站内容(如:图片、多媒体文件等)的内容分发网络(CDN)解决方案。
块存储(SAN)
在OpenStack中提供块存储的是nova-volume。
相关概念:Amazon Elastic Block Store(EBS),Ceph RADOS Block Device(RBD),iSCSI
对于块存储,文件通过计算机底层总线展现如SCSI或ATA接口,这些接口可接入网络。块存储是SAN(存储区域网络)的同义词。客户端通过操作系统设备层访问数据:用户像挂载本地磁盘一样挂载远程设备(Linux中挂载命令为mount)。在OpenStack中,nova-volume服务提供了该项功能。
因为是作为本地磁盘加载,所以终端用户需要创建分区并格式化这些设备。这种设备同时仅可被单个用户挂载使用,所以块存储无法用来在虚拟机实例间作为共享数据之用。
文件存储(NAS)
OpenStack不提供文件存储的支持。
相关概念:NFS,Samba/CIFS,GlusterFS,Dropbox,Google Drive
对应文件存储,文件通过分布式的文件系统协议展现。文件存储与NAS(网络附加存储)是同义词。客户端通过操作系统中的文件系统层面访问数据:用户需要挂载远程文件系统访问数据。文件存储的例子有NFS与GlusterFS。操作系统需要安装适当的软件来访问远程文件系统。
目前,OpenStack不支持该类型的存储。但Gluster Storage connector for OpenStack可以使得OpenStack镜像服务使用GlusterFs文件系统作为后端存储。感兴趣的朋友可以参考:http://gluster.org/community/documentation//index.php/OSConnect
三、OpenStack结构
你可以把OpenStack Compute理解为结合现有Linux技术构建云计算环境的工具箱。
以下我们通过图例说明构建OpenStack Compute云环境的基础技术。圆形表示构成OpenStack Compute的Linux服务,矩形表示外部组件(不属于OpenStack项目),实线表示OpenStack组件与外部组件间的交互,虚线表示外部组件之间的交互。所有组成OpenStack Compute的服务都与后端消息队列(如:RabbitMQ,Qpid)以及后端数据库(如:MySQL)交互,这种交互图中没有连线。同时其他的一些非必须的外部组件技术同样不在该图示中展示,如:nova-api,OpenStack Identity以及OpenStack Image服务。
方案1:
方案2:
如图所示,多数外部组件可以有很多替代产品。
技术与软件:
技术与软件
nova-compute
nova-compute服务依靠虚拟化驱动管理虚拟机。默认驱动为libvirt,可以驱动KVM,但libvirt同样可以驱动其他hypervisor技术。如果你需要使用Xen云平台或XenServer,则Xen虚拟化技术使用单独的驱动。Open-iscsi用来挂载远程块设备,也被称为卷。Open-iscsi将远程设备当作与本地设备一样使用。
nova-network
nova-network服务依赖于一些Linux网络技术,它使用Linux桥接技术来连接虚拟机与物理主机。如果是运行在VLAN网络模式,这些桥设备可以通过Linux VLAN技术相关联。iptables负责安全策略实施与NAT功能。DNSmasq用来快速部署DNS服务器并为虚拟机实例分配IP地址、DNS等网络参数。
在未来的OpenStack发行版本中,nova-network的功能将被独立称为OpenStack的一个独立项目,代码名称为Quantum。
译者再次备注一下,OpenStack提供的手册文档是2012年4月31日,而目前根据OpenStack官网信息显示OpenStack Networking已经是一个独立的项目了。
nova-volume
默认,nova-volume服务使用LVM创建和管理本地卷,并使用IET或tgt通过iSCSI方式发布出去。nova-volume同样可以配置使用其他基于iSCSI的存储技术。
未来的OpenStack发行版本中,nova-volume的功能将被独立为OpenStack项目,代码名称为Cinder。
openstack-dashboard
openstack-dashboard是基于Django的应用程序,它默认运行在Apache Web服务器上。你可以使用memcache来改善它的性能。一个基于web的VNC客户端-novnc,使用novnc连接VNC控制台与KVM实例连接。
四、安装环境构思
OpenStack Compute有大量的配置选项,为了简化本安装指南,我们对需要部署的环境做了一些假设。
  • 你已经有了一些安装有Fedora17,RHEL6.2,Scientific Linux6.1或CentOS6发行版的compute节点。备注OpenStack同样支持Ubuntu,但本文档不做说明。
  • 你已经选定了一台作为云控制节点,它将除nova-compute外的所有服务(RabbitMQ,MySQL,Identity,Image,nova-api,nova-network,nova-scheduler,nova-volume)。
  • 云控制器的磁盘分区使用的是LVM。
  • 你的云控制器有一个LVM卷组(VG)名为”nova-volumes”共VM使用,你可以安装系统的使用创建,也可以在安装nova服务前使用剩余空间创建。
  • 确保你的主机名可以被正确的解析,另外如果你使用RabbitMQ作为后端消息队列或许会遇到些麻烦,Fedora默认使用Qpid作为消息队列。
  • 192.168.206.130是主机上eth0网卡的主IP地址。
  • 192.168.100.0/24作为虚拟主机的网络范围,通过桥接br100连接宿主主机。
  • FlatDHCP with a single network interface.
  • 使用KVM或Xen(XenServer or XCP)作为hypervisor。
  • 在RHEL上启用EPEL软件仓库,方法: $ sudo rpm -Uvhhttp://download.fedoraproject.org/pub/epel/6/i386/epelrelease-6-5.noarch.rpm
OpenStack云第三天
部署OpenStack Identity服务。 
继OpenStack云第二天,本文翻译自OpenStack安装与部署指南第五章内容,内容主要是安装OpenStack Identity Service(身份认证服务) 。OpenStack Identity服务负责管理用户与客户,项目以及提供为其他OpenStack组件提供通用身份认证系统。 
目录: 
一、基本概念 
二、安装与配置Identity服务 
三、验证
一、基本概念身份认证服务包括两个主要功能:
用户管理:时时跟踪用户以及用户被赋予了什么权限。
服务编录:提供一份可用服务的目录并可以定位这些服务的API。
1.1 用户管理Identity用户管理包括三个主要概念:
  • 用户(Users)
  • 租户(Tenants)
  • 角色(Roles)
用户表示拥有用户名,密码,邮箱等帐号信息的自然人。这里给出创建用户名为”alice”的用户:
$ keystone  user-create  –name=alice  –pass=mypassword123  –mail=alice@example.com
租户可以被理解为一个项目,团队或组织。你必须指定一个相应的租户(tenant)才可以申请OpenStack服务,例如你指定以某租户申请Compute服务来查询当前运行的实例列表,则你将收到的是该租户的运行实例列表。这里是创建一个名为”acme”租户的例子:
$ keystone  tenant-create  –name=acme
注意事项:由于在早期的版本中使用项目术语来表示租户,所以有些命令行工具使用–project_id替代–tenant_id给客户分配一个ID号。
角色代表特定的租户中的用户用户操作权限,可以使用如下命令创建角色:
$ keystone  role-create  –name=compute-user 
译者批注:你可以理解租户为那些使用你云环境的客户,这些客户可以是一个项目组、工作组、公司,这些客户中会建立不同的帐号(用户)及其对应的权限(角色).
Identity服务将用户与租户及角色结合在一起,继续刚才的例子,我们也许希望在acme租户中为alice用户分配compute-user角色。
$ keystone user-list                         
  1. +———————————+———-+——+——-+
  2. |id                                | enabled | email | name |
  3. +———————————-+———-+——+——-+
  4. | 96a6ebba0d4c441887aceaeced892585 | True  |  … | alice  |
  5. +———————————-+———-+——+——-+
$ keystone role-list                     
  1. +———————————-+——————+
  2. |id                                | name             |
  3. +———————————-+——————+
  4. | f8dd5a2e4dc64a41b96add562d9a764e | compute-user     |
  5. +———————————-+——————+
$ keystone tenant-list                 
  1. +———————————-+——-+———-+
  2. | id                               | name  | enabled  |
  3. +———————————-+——-+———-+
  4. | 2395953419144b67955ac4bab96b8fd2 | acme  | True     |
  5. +———————————-+——-+———-+
$ keystone user-role-add \
–user=96a6ebba0d4c441887aceaeced892585 \
–role=f8dd5a2e4dc64a41b96add562d9a764e \
–tenant_id=2395953419144b67955ac4bab96b8fd2
一个用户可以在不同的租户中被分配不同的角色,例如Alice也可以在Cyberdyne租户中用户admin角色。一个用户也可以在同一个租户中分配多个角色。
/etc/[服务代码名称]/policy.json控制着哪些用户可以拥有什么样的服务,如:/etc/nova/policy.json定义了Compute服务的访问策略,/etc/glance/policy.json定义Image服务的访问策略,以及/etc/keystone/policy.json定义Identity服务的访问策略。
Compute,Identity,Image服务的默认policy.json文件仅识别admin角色:所有的操作无需admin角色即可被租户中拥有任何角色的用户均可以访问。
如果你希望限制用户在Compute服务中所执行的操作,你需要在Identity服务中创建一个角色并修改/etc/nova/policy.json,实现仅提供该角色才可以执行Compute操作。
实例,以下在/etc/nova/policy.json中的配置设定卷创建的操作对用户无任何限制,在租户中的用户用户任何角色均可以创建卷。
“volume:create”: [],如果你需要仅拥有compute-user角色的用户才可以创建卷,你就需要添加一行”role:compute-user”,具体配置如下:
“volume:create”: ["role:compute-user"],           
如我们需要对所有Compute服务的请求均需要指定的角色,你的配置文件应该作类似于如下这样的配置:
  1. {
  2. “admin_or_owner”: [["role:admin"], ["project_id:%(project_id)s"]],
  3. “default”: [["rule:admin_or_owner"]],
  4. “compute:create”: ["role":"compute-user"],
  5. “compute:create:attach_network”: ["role":"compute-user"],
  6. “compute:create:attach_volume”: ["role":"compute-user"],
  7. “compute:get_all”: ["role":"compute-user"],
  8. “admin_api”: [["role:admin"]],
  9. “compute_extension:accounts”: [["rule:admin_api"]],
  10. “compute_extension:admin_actions”: [["rule:admin_api"]],
  11. “compute_extension:admin_actions:pause”: [["rule:admin_or_owner"]],
  12. “compute_extension:admin_actions:unpause”: [["rule:admin_or_owner"]],
  13. “compute_extension:admin_actions:suspend”: [["rule:admin_or_owner"]],
  14. “compute_extension:admin_actions:resume”: [["rule:admin_or_owner"]],
  15. “compute_extension:admin_actions:lock”: [["rule:admin_api"]],
  16. “compute_extension:admin_actions:unlock”: [["rule:admin_api"]],
  17. “compute_extension:admin_actions:resetNetwork”: [["rule:admin_api"]],
  18. “compute_extension:admin_actions:injectNetworkInfo”: [["rule:admin_api"]],
  19. “compute_extension:admin_actions:createBackup”: [["rule:admin_or_owner"]],
  20. “compute_extension:admin_actions:migrateLive”: [["rule:admin_api"]],
  21. “compute_extension:admin_actions:migrate”: [["rule:admin_api"]],
  22. “compute_extension:aggregates”: [["rule:admin_api"]],
  23. “compute_extension:certificates”: ["role":"compute-user"],
  24. “compute_extension:cloudpipe”: [["rule:admin_api"]],
  25. “compute_extension:console_output”: ["role":"compute-user"],
  26. “compute_extension:consoles”: ["role":"compute-user"],
  27. “compute_extension:createserverext”: ["role":"compute-user"],
  28. “compute_extension:deferred_delete”: ["role":"compute-user"],
  29. “compute_extension:disk_config”: ["role":"compute-user"],
  30. “compute_extension:extended_server_attributes”: [["rule:admin_api"]],
  31. “compute_extension:extended_status”: ["role":"compute-user"],
  32. “compute_extension:flavorextradata”: ["role":"compute-user"],
  33. “compute_extension:flavorextraspecs”: ["role":"compute-user"],
  34. “compute_extension:flavormanage”: [["rule:admin_api"]],
  35. “compute_extension:floating_ip_dns”: ["role":"compute-user"],
  36. “compute_extension:floating_ip_pools”: ["role":"compute-user"],
  37. “compute_extension:floating_ips”: ["role":"compute-user"],
  38. “compute_extension:hosts”: [["rule:admin_api"]],
  39. “compute_extension:keypairs”: ["role":"compute-user"],
  40. “compute_extension:multinic”: ["role":"compute-user"],
  41. “compute_extension:networks”: [["rule:admin_api"]],
  42. “compute_extension:quotas”: ["role":"compute-user"],
  43. “compute_extension:rescue”: ["role":"compute-user"],
  44. “compute_extension:security_groups”: ["role":"compute-user"],
  45. “compute_extension:server_action_list”: [["rule:admin_api"]],
  46. “compute_extension:server_diagnostics”: [["rule:admin_api"]],
  47. “compute_extension:simple_tenant_usage:show”: [["rule:admin_or_owner"]],
  48. “compute_extension:simple_tenant_usage:list”: [["rule:admin_api"]],
  49. “compute_extension:users”: [["rule:admin_api"]],
  50. “compute_extension:virtual_interfaces”: ["role":"compute-user"],
  51. “compute_extension:virtual_storage_arrays”: ["role":"compute-user"],
  52. “compute_extension:volumes”: ["role":"compute-user"],
  53. “compute_extension:volumetypes”: ["role":"compute-user"],
  54. “volume:create”: ["role":"compute-user"],
  55. “volume:get_all”: ["role":"compute-user"],
  56. “volume:get_volume_metadata”: ["role":"compute-user"],
  57. “volume:get_snapshot”: ["role":"compute-user"],
  58. “volume:get_all_snapshots”: ["role":"compute-user"],
  59. “network:get_all_networks”: ["role":"compute-user"],
  60. “network:get_network”: ["role":"compute-user"],
  61. “network:delete_network”: ["role":"compute-user"],
  62. “network:disassociate_network”: ["role":"compute-user"],
  63. “network:get_vifs_by_instance”: ["role":"compute-user"],
  64. “network:allocate_for_instance”: ["role":"compute-user"],
  65. “network:deallocate_for_instance”: ["role":"compute-user"],
  66. “network:validate_networks”: ["role":"compute-user"],
  67. “network:get_instance_uuids_by_ip_filter”: ["role":"compute-user"],
  68. “network:get_floating_ip”: ["role":"compute-user"],
  69. “network:get_floating_ip_pools”: ["role":"compute-user"],
  70. “network:get_floating_ip_by_address”: ["role":"compute-user"],
  71. “network:get_floating_ips_by_project”: ["role":"compute-user"],
  72. “network:get_floating_ips_by_fixed_address”: ["role":"compute-user"],
  73. “network:allocate_floating_ip”: ["role":"compute-user"],
  74. “network:deallocate_floating_ip”: ["role":"compute-user"],
  75. “network:associate_floating_ip”: ["role":"compute-user"],
  76. “network:disassociate_floating_ip”: ["role":"compute-user"],
  77. “network:get_fixed_ip”: ["role":"compute-user"],
  78. “network:add_fixed_ip_to_instance”: ["role":"compute-user"],
  79. “network:remove_fixed_ip_from_instance”: ["role":"compute-user"],
  80. “network:add_network_to_project”: ["role":"compute-user"],
  81. “network:get_instance_nw_info”: ["role":"compute-user"],
  82. “network:get_dns_domains”: ["role":"compute-user"],
  83. “network:add_dns_entry”: ["role":"compute-user"],
  84. “network:modify_dns_entry”: ["role":"compute-user"],
  85. “network:delete_dns_entry”: ["role":"compute-user"],
  86. “network:get_dns_entries_by_address”: ["role":"compute-user"],
  87. “network:get_dns_entries_by_name”: ["role":"compute-user"],
  88. “network:create_private_dns_domain”: ["role":"compute-user"],
  89. “network:create_public_dns_domain”: ["role":"compute-user"],
  90. “network:delete_dns_domain”: ["role":"compute-user"]
  91. }
1.2 服务管理服务管理有两个主要的概念:
服务
终端 
Identity服务同时维护着一份与各个服务相同的用户(如:Compute服务有一个对应的用户名nova),以及一个名为service的特殊服务租户。
二、安装与配置Identity服务 
2.1.安装Identity服务 
你可以安装Identity服务在任何能被其他服务主机访问的服务器上,以root身份运行如下命令: 
# yum  install  openstack-utils   openstack-keystone 备注:原文档仅提供安装命令,但该安装方式需要设置yum源,以下为个人补充的添加yum源方法,方法来源于Fedora项目。$ sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm 
安装后,你需要删除sqlite数据库并修改配置文件将其指向MySQL数据库。这样的配置更容易部署多个Keystone前段指向相同的后端数据库服务器。 
删除/var/lib/keystone目录下的keystone.db文件。 
备注:据译者亲身实验,使用以上的yum源安装时该文件并不会产生,省去了删除文件的步骤。 配置生产环境的数据库存储来取代默认的目录功能以备份服务及终端数据,这里以MySQL为例。 
安装MySQL(需要root权限): 
# yum  install  mysql   mysql-server 安装过程中会提示为mysql的root帐号设置密码,根据提示设置密码。 
设置Mysql为开机启动进程: 
# chkconfig  –level  2345  mysqld  on 
# service  mysqld  start
 
以下系列命令将创建一个名为”keystone”的数据库,以及一个名为”keystone”的mysql用户名,该用户拥有访问keystone数据库的所有权限。默认,密码与用户名同名。 
在Fedora,RHEL,CentOS系统上,你可以通过openstack-db命令创建Keystone数据库。 
$ duso  openstack-db  –init   –service   keystone 也可以通过手动的方式创建数据库。 
$ mysql  -u  root  -p                          
根据提示:需要输入mysql root的密码,创建keystone数据库。 
mysql> CREATE  DATABASE  keystone; 接着再创建一个对新建keystone数据库具有完全权限的mysql账户,注意为用户选择安全的密码,方法参考以下命令。 
mysql> GRANT  ALL  ON  keystone.*  TO   ‘keystone’@’%’ IDENTIFIED  BY  ‘你的密码’; 退出MySQL数据库: mysql> quit 
回想以下,我们在OpenStack第二天文档中对云环境的构思中建设云控制节点的IP为192.168.106.130。 
现在一个Keystone已经安装完成,你可以通过主配置文件修改配置(/etc/keystone/keystone.conf),以及通过命令行初始化数据。默认Keystone的数据保存在sqlite中,在/etc/keystone/keystone.conf修改如下一行connection定义来改变数据存储位置: 
connection = mysql://keystone:[密码]@192.168.206.130/keystone 备注:据译者亲身实验,现在的keystone版本默认就将数据库指向了本机的MySQL数据库。 同时,要确保keystone.conf文件中配置了合适的服务标识符,你可以使用自己的随机字串,像下面这样: 
admin_token = 012345SECRET99TOKEN012345 
或者通过命令行设置随机字串: $ export ADMIN_TOKEN=$(openssl   rand  -hex  10) 
$ sudo  openstack-config  –set   /etc/keystone/keystone.conf   DEFAULT  admin_token  $ADMIN_TOKEN 
译者备注:export  ADMIN_TOKEN=$(openssl  rand  -hex  10)是调用openssl命令产生10位随机字串,并将结果赋予ADMIN_TOKEN全局变量;再通过openstack-config命令修改keystone.conf配置文件就admin_token参数的取值为刚刚定义的全局变量ADMIN_TOKEN的值(10位随机字串)。 下一步,重启keystone服务,并设置为开机启动项。 
$ sudo  service  keystone  restart  &&  sudo  chkconfig  keystone  on 
译者备注:在新的版本中keystone的启动脚本不是keystone,而是openstack-keystone,所以实际工作中你需要将以上命令修改为sudo  service  openstack-keystone  restart  &&  sudo  chkconfig   openstack-keystone   on 最后初始化新的keystone数据库,需要root权限: 
# keystone-manage   db_sync 
2.2.配置Identity服务 设置租户,用户与角色,你最少需要定义一个租户、用户、角色以通过Identity服务的身份验证与授权获得其他服务。 
脚本配置: 
在Fedora,RHEL或CentOS系统上,你可以通过运行脚本更新数据。 
$ sudo  ADMIN_PASSWORD=$OS_PASSWORD  SERVICE_PASSWORD=servicepass   openstack-keystone-sample-data Keystone项目提供了一份部署客户、用户、角色的bash脚本,样本数据在https://github.com/openstack/keystone/blob/master/tools/sample_data.sh。 
译者注:系统命令openstack-keystone-sample-data运行的就是位于/usr/share/openstack-keystone目录下的sample_data.sh脚本。 
此外,任何用户pyton工具的分布,都可以通过keystone客户端的API运行keystone-init脚本完成初始化动作。 
$ git  clone  https://github.com/nimbis/keystone-init.git 这个初始化脚本需要使用PyYAML,通过https://github.com/nimbis/keystone-init/blob/master/keystone-init.py页面,你可以看到脚本做了哪些工作。 
为你的服务器编辑config.yaml文件中的IP地址,你可以在config.yaml目录下运行以下命令快速替换: 
$ sed  -i.bak   s/192.168.206.130/172.16.150.12/g  config.yaml 
译者备注:sed将把config.yaml文件中所有的192.168.206.130替换为172.16.150.12,生成一份新的config.yaml,老的文件自动备份为config.yaml.bak。 使用root身份运行脚本: 
# ./keystone-init.py  config.yaml 
手动配置 这里我们可以无需脚本、手动配置这些步骤。首先我们创建一个默认tenant(租户),名字叫openstackDemo。 $ keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
  tenant-create   \ 
–name openstackDemo   \ 
–description “Default Tenant”   \ 
–enabled true 
图表1 创建名为adminUser的默认用户: 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-create \ 
–tenant_id  b5815b046cfe47bb891a7b64119e7f80 \ 
–name adminUser \ 
–pass secretword –enabled true 
图表1 
译者备注:英文原文此处有误,命令创建的是adminUser,结果显示name的值为admin。 创建默认角色,admin与memberRole 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
role-create  \ 
–name  admin 
图表1 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
role-create \ 
–name memberRole 
图表1 
通过uesr-role-add命令选项,在openstackDemo租户中为adminUser用户赋予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  
图表1 
在Service租户中创建Glance Service用户,我们将在Keystone服务目录中为所有的服务都添加这样的用户。 
$keystone –token 012345SECRET99TOKEN012345  \ 
–endpoint   
http://192.168.206.130:35357/v2.0  \ 
user-create  \ 
–tenant_id  eb7e0c10a99446cfa14c244374549e9d  \ 
–name glance \ 
–pass glance \ 
–enabled true 
图表2
在service租户中为用户glance分配admin的角色。 
$keystone –token 012345SECRET99TOKEN012345  \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-role-add \ 
–user 46b2667a7807483d983e0b4037a1623b \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d \ 
–role e3d9d157cc95410ea45d23bbbc2e5c10 
这个命令没有输出。 
在Service租户中创建一个Nova Service用户: 
$keystone –token 012345SECRET99TOKEN012345  \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-create \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d \ 
–name nova \ 
–pass nova \ 
–enabled true 
图表1 
在service租户中为nova用户分配admin的角色。 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-role-add  \ 
–user 54b3776a8707834d983e0b4037b1345c  \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d  \ 
–role e3d9d157cc95410ea45d23bbbc2e5c10 
这条命令没有输出。 
在Service租户中创建EC2 Service用户: 
$keystone –token 012345SECRET99TOKEN012345  \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-create  \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d  \ 
–name ec2  \ 
–pass ec2 \ 
–enabled true 
图表1 
在service租户中为ec2用户分配admin的角色: 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-role-add  \ 
–user 32e7668b8707834d983e0b4037b1345c  \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d \ 
–role e3d9d157cc95410ea45d23bbbc2e5c10 
这条命令没有输出。 
在Service租户中创建Object Storage服务用户: 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0  \ 
user-create \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d \ 
–name swift \ 
–pass swiftpass  \ 
–enabled true 
图表1 
在service租户中为swift用户分配admin的角色: 
$keystone –token 012345SECRET99TOKEN012345 \ 
–endpoint 
http://192.168.206.130:35357/v2.0 \ 
user-role-add \ 
–user 4346677b8909823e389f0b4037b1246e \ 
–tenant_id eb7e0c10a99446cfa14c244374549e9d \ 
–role e3d9d157cc95410ea45d23bbbc2e5c10 
这条命令没有输出。 
后面我们还需要创建服务的定义。 
为了使Keystone内置的S3 API与Swift兼容,请确保在keystone.conf文件中定义一个新的过滤器并启用: 
       定义过滤: 
[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory 
        更新admin_api管道: 
将 
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension crud_extension admin_service 
更改为: 
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension s3_extension crud_extension admin_service 
2.3.定义服务 Keystone还担任着服务编录的角色,为其他的OpenStack系统指定哪里有相关的API终端位置。尤其是OpenStack的控制面板(Dashborad)更需要这个编录的服务。 译者备注:Keystone的服务编录类似于注册表,在这里我们把OpenStack所有服务的endpoint(终端)写入服务编录中,服务之间的调用需要经过Keystone的验证,并通过这个服务编录找到目标服务的终端(endpoint)位置。 使用keystone定义服务的方式有两种:

  • 使用模版文件定义服务
  • 使用后端数据库定义服务

使用模版文件的方式因为其比较简单,但除非是像DevStack这样的开发环境否则我们并不推荐使用这种模式。使用模版文件不支持通过keystone命令对服务编录执行CRUD操作,但不妨碍你使用service-list命令。而后端数据库则是一种更可靠的、高可用、提供数据冗余的方式。这节我们将描述如何使用后端数据库架构服务编录,你需要将/etc/keystone/keystone.conf文件中的[catalog]选项修改为如下这种配置: 
[catalog]
driver = keystone.catalog.backends.sql.Catalog 
Keystone服务编录条目的要素 对于目录中的每个服务条目,你都需要执行两个keystone操作: 
1).使用keystone  service-create命令为服务创建数据库条目,命令选项如下:
    –name                            服务名称(如:nova,ec2,glance,keystone) 
    –type                            服务类型(如:compute,ec2,image,idnetity) 
    –description                     服务描述(如:”Nova Compute Servece”) 
2).使用keystone  endpoint-create命令创建数据库条目,描述客户端如果连接不同类型的服务,即指定各个服务的终端位置,命令选项如下: 
    –region                       你为OpenStack云取的区域名称(如:RegionOne) 
    –service_id                   通过keystone   service-create命令返回的服务ID(如:935fd37b6fa74b2f9fba6d907fa95825) 
    –publicurl                    服务终端(endpoint)对公网提供的URL(如:http://192.168.206.130:9292/v1http://192.168.202.130:8774/v2%(tenat_id)s) 
    –internalurl                  服务终端对内提供的URL(典型案例是使用与publicurl相同的值) 
    –adminurl                     提供服务管理界面的URL 
Keystone允许URL使用变量,这些变量在运行期间会自动替换为正确的,例如使用类似于tenant_id这样的变量。你可以使用%(变量名)或$(变量名)标识正在使用变量。 
创建keystone服务与服务终端(service endpoints) 这里我们会定义服务及其终端。 
定义Identity服务: 
$ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=keystone \
–type=identity \
–description=”Keystone Identity Service” 
图表1
 
$ 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 
定义Compute服务,需要为不同的租户(tenant)需要独立的endpoint,这里我们使用上节创建的service租户(tenant)。 $ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=nova \
–type=compute \
–description=”Nova Compute Service” 
图表1 
$ 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’
 
图表2 
定义卷(Volume)服务,不同的tenant需要独立的endpoint: $ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=volume \
–type=volume \
–description=”Nova Volume Service”
 
图表1 
$ 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’
 
图表1 
定义镜像服务(Image service):
$ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=glance \
–type=image \
–description=”Glance Image Service”
 
图表1 
$ 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
 
图表1 
定义EC2兼容服务: $ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=ec2 \
–type=ec2 \
–description=”EC2 Compatibility Layer”
 
图表1 
$ 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 
图表1 
定义Object Storage服务: 
$ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
service-create \
–name=swift \
–type=object-store \
–description=”Object Storage Service” 
图表1 
$ keystone –token 012345SECRET99TOKEN012345 \
–endpoint 
http://192.168.206.130:35357/v2.0/ \
endpoint-create \
–region RegionOne \
–service_id=272efad2d1234376cbb911c1e5a5a6ed \
–publicurl ‘
http://127.0.0.1:8080/v1/AUTH_%(tenant_id)s’ \
–adminurl ‘
http://127.0.0.1:8080/’ \
–internalurl ‘http://127.0.0.1:8080/v1/AUTH_%(tenant_id)s’ 
图表1 
Keystone的日志文件为/var/log/keystone.log,如果需要排除可以查看该文件。
三、验证 
安装curl,一个运行REST API请求的命令行工具,同时还需要安装openssl,通过yum安装可以解决依赖包问题: 
# yum  install  curl   openssl 
你可以运行如下命令,确保你的Identity服务可以正常工作: 
curl -d ‘{“auth”: {“tenantName”: “adminTenant”, “passwordCredentials”:{“username”: “adminUser”, “password”: “secretword”}}}’   \ 
-H “Content-type:application/json” 
http://192.168.206.130:35357/v2.0/tokens | python -mjson.tool 
作为adminUser用户,你将收到如下响应: {
“access”: {
“serviceCatalog”: {},
“token”: {
“expires”: “2012-04-12T00:40:12Z”,
“id”: “cec68088d08747639c682ee5228106d1″
},
“user”: {
“id”: “6b0141904f09480d810a5949d79ea0f3″,
“name”: “adminUser”,
“roles”: [],
“roles_links”: [],
“username”: “adminUser”
}
}
或者你可以运行以下命令: curl -d ‘{“auth”: {“tenantName”: “openstackDemo”, “passwordCredentials”:{“username”: “adminUser”, “password”: “secretword”}}}’ \ 
-H “Content-type:application/json” 
http://192.168.206.130:35357/v2.0/tokens
 | python -mjson.tool 
你会收到类似于如下的信息: {
“access”: {
“serviceCatalog”: {},
“token”: {
“expires”: “2012-04-12T00:41:21Z”,
“id”: “a220bfdf313b404fa5e063fcc7cc1f3e”,
“tenant”: {
“description”: “Default Tenant”,
“enabled”: true,
“id”: “50af8cc655c24ada96f73010c96b70a2″,
“name”: “openstackDemo”
}
},
“user”: {
“id”: “6b0141904f09480d810a5949d79ea0f3″,
“name”: “adminUser”,
“roles”: [],
“roles_links”: [],
“username”: “adminUser”
}
}
这里另外还有一种快速的方法判断Keystone是否工作正常。首先,需要设置如下环境变量: export ADMIN_TOKEN=012345SECRET99TOKEN012345
export OS_USERNAME=adminUser
export OS_PASSWORD=secretword
export OS_TENANT_NAME=openstackDemo
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/ 
通过输入keystone  user-list命令,你可以看到用户列表。 
$ keystone user-list 
图表1

OpenStack云第四天
本文翻译自官方部署指南第六章。部署OpenStack Compute及Image服务。在云环境中OpenStack Compute与Image service协同工作,实现通过REST APIs访问虚拟机及镜像的功能。

目录: 
一、安装与配置Image服务 
二、配置Hypervisor 
三、预设网络 
四、部署数据库 
五、安装与配置云控制器
一、安装与配置Image Service 1.1 使用root身份,安装Image service $sudo yum install openstack-nova  openstack-glance 安装后,你需要删除sqlite数据库文件,然后修改配置指向MySQL数据库。删除/var/lib/glance目录下的glance.sqlite文件。 
# rm  /var/lib/glance/glance.sqlite 
1.2 配置后端镜像(Image)服务数据库 配置后端数据存储。使用MySQL创建一个glance数据库以及glance账户,赋予”glance”账户对glance数据库的所有权限。 
运行如下命令,进入MySQL数据库: 
$ mysql  -u  root  -p                               //根据提示输入MySQL管理员密码 
创建glance数据库: 
mysql> CREATE  DATABASE  glance; 为新创建的数据库创建MySQL账户并赋予完全控制权限: 
mysql> GRANT  ALL  ON  glance.*  TO  ‘glance’@'%’IDENTIFIED  BY  ‘你的密码’; 退出数据库: 
mysql> quit 修改Glance配置文件 
更新/etc/glance/glance-api-paste.ini文件,修改[filter:authtoken]下admin_*的值。
  1. [filter:authtoken]
  2. admin_tenant_name = service
  3. admin_user = glance
  4. admin_password = glance
确保glance-api管道部分包括authtoken
  1. [pipeline:glance-api]
  2. pipeline = versionnegotiation authtoken auth-context apiv1app
在/etc/glance/glance-api.conf文件末尾追加如下内容:
  1. [paste_deploy]
  2. flavor = keystone
重启glance-api服务: service   glance-api    restart 
译者备注:重启服务实际应该是: service  openstack-glance-api   restart 
在/etc/glance/glance-registry.conf文件末尾追加如下内容:
  1. [paste_deploy]
  2. flavor = keystone
更新/etc/glance/glance-registry-paste.ini文件,修改[filter:authtoken]下admin_*的值:
  1. [filter:authtoken]
  2. admin_tenant_name = service
  3. admin_user = glance
  4. admin_password = glance
确保glance-registry管道部分包括authtoken:
  1. [pipeline:glance-registry]
  2. #pipeline = context registryapp
  3. # NOTE: use the following pipeline for keystone
  4. pipeline = authtoken auth-context context registryapp
确保/etc/glance/glance-registry.conf和/etc/glance/glance-scrubber.conf文件数据库指向是MySQL而不是sqlite。
  1. sql_connection = mysql://glance:yourpassword@192.168.206.130/glance
注意:任何时候在修改完.conf配置文件后,记得重启相应的服务,使新的修改生效。 
现在,迁移数据库至MySQL: 
# glance-manage   db_sync 重启glance-registry与glance-api服务: 
# service  openstack-glance-registry   restart 
# service  openstack-glance-api   restart 
注意事项:本文档为配置镜像缓存,读者可参考http://glance.openstack.org获得更多信息。 
Image服务排除,可以参考日志文件/var/log/glance/registry.log或/var/log/glance/api.log。 
1.3 验证Image Service是否安装成功 你可以使用如下命令获得软件的版本号: 
# glance  –version Essex版本的挣钱版本号为glance  2012.1 
下载测试性镜像文件: 
# mkdir   /tmp/images 
# cd   /tmp/images 
# wget 
http://smoser.brickies.net/ubuntu/ttylinux-uec/ttylinux-uec-amd64-12.1_2.6.35-22_1.tar.gz 
# tar -zxvf ttylinux-uec-amd64-12.1_2.6.35-22_1.tar.gz 
上传内核: 
# glance –os_username=adminUser  –os_password=secretword  –os_tenant=openstackDemo  \ 
> –os_auth_url=
http://127.0.0.1:5000/v2.0   add name=”tty-linuxkernel”  \ 
> disk_format=aki container_format=aki     < ttylinux-uec-amd64-12.1_2.6.35-22_1-vmlinuz 
Uploading image ‘tty-linux-kernel’
==========================================================================
==============================================================================
=========[100%] 41.8M/s, ETA 0h 0m 0s
Added new image with ID: 599907ff-296d-4042-a671-d015e34317d2 

上传initrd文件: 
# glance –os_username=adminUser –os_password=secretword   \ 
>–os_tenant=openstackDemo –os_auth_url=
http://127.0.0.1:5000/v2.0   \ 
> add name=”tty-linuxOpenStackramdisk”   \ 
> disk_format=ari container_format=ari < ttylinux-uec-amd64-12.1_2.6.35-22_1-loader 
Uploading image ‘tty-linux-ramdisk’
==========================================================================
==============================================================================
===[100%] 937.483441K/s, ETA 0h 0m 0s
Added new image with ID: 7d9f0378-1640-4e43-8959-701f248d999d 

上传镜像文件: 
# glance –os_username=adminUser –os_password=secretword   、 
> –os_tenant=openstackDemo  –os_auth_url=
http://127.0.0.1:5000/v2.0   \ 
> add name=”tty-linux”disk_format=ami    container_format=ami   \ 
> kernel_id=599907ff-296d-4042-a671-d015e34317d2   \ 
> ramdisk_id=7d9f0378-1640-4e43-8959-701f248d999d < ttylinux-uecamd64-12.1_2.6.35-22_1.img
Uploading image ‘tty-linux’
==========================================================================
==============================================================================
===[100%] 118.480514M/s, ETA 0h 0m 0s
Added new image with ID: 21b421e5-44d4-4903-9db0-4f134fdd0793 

现在在glance索引中将显示有一个合法的Image。 
# glance –os_username=adminUser  –os_password=secretword  \ 
> –os_tenant=openstackDemo  –os_auth_url=http://127.0.0.1:5000/v2.0  index 
1
二、配置Hypervisor 对于生产环境,多数人会选择KVM或基于Xen的hypervisor。KVM通过libvirt运行,而Xen则通过XenAPI调用运行。我们默认选择的是KVM,而且它仅需要我们做最少的配置修改。本手册主要讲解KVM。 
2.1 KVM KVM是作为Compute默认的hypervisor被配置的。明确的启用KVM,需要在/etc/nova/nova.conf文件中添加如下配置:
  1. connection_type=libvirt
  2. libvirt_type=kvm
KVM hypervisor支持如下的虚拟机镜像格式:
  • Raw
  • QEMU Copy-on-write(qcow2)
  • VMware虚拟机格式(vmdk)
本文只要描述如果开启你系统上的KVM,你也需需要以下这些针对特定发行版本的文档作为参考:
2.2 检查你的硬件是否支持虚拟化 使用KVM需要主机CPU支持虚拟化技术(VT)。 
如果你在运行Ubuntu,当在BIOS中开启虚拟化功能以及KVM正确的被安装后,可以使用kvm-ok命令检查你的处理器是否支持VT,如果KVM是开启的,输出应该像这样: 
INFO: /dev/kvm exists
KVM acceleration can be used 
如果未能开启KVM,输出应该像这样的信息: 
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used 
如果你的发行版本没有kvm-ok命令,你也可以通过检查处理器标记查看是否支持虚拟化技术。对于Intel的处理器标记为vmx,AMD处理器标记为svm。可以通过以下简单命令来判断: 
# egrep  ‘(vmx|svm)’  –color=always   /proc/cpuinfo 有些系统 需要你在BIOS中开启virtualization technology(VT),如果你确信自己的处理器支持硬件加速而上面的命令又没有任何输出,你也许需要重启电脑,进入系统BIOS,开启VT选项。 
2.3 开启KVM模块 由于KVM是基于内核的虚拟化技术,所以需要确保kvm模块已经被正确加载。模块名称为kvm,还有kvm-intel或kvm-amd。这些模块的加载也许在你安装KVM软件是就已经自动完成了,你可以使用lsmod命令检查它们是否被正确加载,以下是基于Intel处理器的输出结果: 
$ lsmod | grep kvmkvm_intel 137721 9
kvm 415459 1 kvm_intel 
接下来,我们看看如果你的系统未能自动加载模块时,如果手动为基于Intel或AMD处理器加载相应模块。 
如果你的主机是基于Intel的处理器,以root身份运行如下命令加载内核模块: 
# modprobe  kvm 
# modprobe  kvm-intel 
将以下两行追加至/etc/modules文件,这样模块在重启后依然会被字段加载: 
kvm 
kvm-intel 
如果你的主机是基于AMD的处理器,以root身份运行如下命令加载内核模块: 
# modprobe  kvm 
# modprobe  kvm-amd 
将以下两行追加至/etc/modules文件,这样模块在重启后依然会被字段加载: 
kvm 
kvm-amd 
2.4 常见故障 尝试开启虚拟机实例时提示ERROR状态,并且在/var/log/nova/nova-compute.log日志中有如下信息: 
libvirtError: internal error no supported architecture for os type ‘hvm’ 这表明你的KVM内核模块未被正确加载。 
2.5 QEMU 从Compute service架构来看,QEMU hypervisor非常像KVM hypervisor。两者都通过libvirt控制、都支持一样的特性设置,并且KVM所有的虚拟机镜像都与QEMU兼容。两者最大的差别是QEMU不支持原生虚拟化技术(虚拟机直接运行于硬件之上)。 
译者备注:虚拟化有原生虚拟化与宿主虚拟化,宿主虚拟化典型代表是VMware Workstation,其运行在一个已经安装好的系统之上。原生虚拟化则可以直接运行与硬件之上。 所以,QEMU性能比KVM稍差些,一般在生产环境部署的较少。 
使用QEMU的案例有: 
        运行于老的硬件平台上 
        测试环境 
启用QEMU的方式如下: 
connection_type=libvirt
libvirt_type=qemu 
QEMU支持与KVM一样的虚拟机镜像格式: 
    * Raw 
    * qcow2 
    * vmdk 
译者备注:原文对Xen做了概念性介绍,但无具体配置描述,所以再次省略,感兴趣可以参考xen官方资料http://xen.org/products/xenhyp.html
三、预设网络 文章将介绍如果在但网络接口上配置使用FlatDHCP模式。 
首先,设置你的/etc/network/interfaces文件:(译者备注,这里说的是Ubuntu环境) 
    * eth0:公网IP,网关 
    * br100:stp off,fd 0 
模版如下:
  1. # The loopback network interface
  2. auto lo
  3. iface lo inet loopback
  4. # The primary network interface
  5. auto eth0
  6. iface eth0 inet dhcp
  7. # Bridge network interface for VM networks
  8. auto br100
  9. iface br100 inet static
  10. address 192.168.100.1
  11. netmask 255.255.255.0
  12. bridge_stp off
  13. bridge_fd 0
还需要安装bridge-utils: sudo  apt-get   install   bridge-utils RHEL配置要求 在/etc/qpidd.conf文件中设置auth=no 
设置SELinux模式为permissive: 
# sudo  setenforce   permissive 如果是基于RHEL6.2的系统,使用openstack-config包关闭DHCP release。 
# sudo  openstack-config   –set   /etc/nova/nova.conf   DEFAULT  force_dhcp_release  False 如果是基于RHEL6.3的系统,需要安装dnsmasq工具包: 
$ sudo  yum   install   dnsmasq-utils 如果你使用的客户机镜像没有单独的分区,要使文件可以注入需要允许libguestfs检查镜像,设置方法如下: 
$ sudo openstack-config –set /etc/nova/nova.conf DEFAULT   libvirt_inject_partition -1
四、在云控制器上配置SQL数据库 通过mysql客户端工具连接MySQL服务器: 
$ mysql  -u   root   -p                  //根据提示输入密码 
创建nova数据库: 
mysql> CREATE  DATABASE  nova; 创建MySQL用户并赋予对新建数据库的所有权限: 
mysql> GRANT  ALL ON  nova.*  TO  ‘nova’@'%’IDENTIFIED  BY  ‘密码’; 退出数据库: 
mysql> quit
五、安装与配置云控制器 
安装消息队列服务器,RabbitMQ。当然你也可以选择Apache Qpid,你可以参考官方Compute Administration Manual中的介绍。 
# yum  -y  install   rabbitmq-server 安装nova-开头的软件包,相关依赖包会被自动安装。 
# yum  -y  install   openstack-nova-compute   openstack-nova-volume   openstack-nova-novncproxy  openstack-nova-api   openstack-nova-ajax-console-proxy   openstack-nova-cert   openstack-nova-consoleauth   openstack-nova-doc   openstack-nova-scheduler  openstack-nova-network 译者备注:原文此处使用的包为nova-compute格式,不包含openstack。 5.1 配置OpenStack Compute 很多Compute服务的配置选项都存放在/etc/nova/nova.conf文件中。这里我们给出了保障运行的最小配置说明。更多配置选项可以参考OpenStack Compute Administration Manual文档。 
一般安装软件包会自动设置用户及权限,如果没有自动完成,以下为手动方式设置: 
# groupadd   nova 
# usermod  -g   nova   nova 
# chown  -R  root:nova   /etc/nova 
# chmod   640   /etc/nova/nova.conf 
编辑/etc/nova/nova.conf设置hypervisor,默认hypervisor为kvm,如果你需要使用其他的hypervisor如Xen,请修改libvirt_type=选项。 
确保数据库的连接设置: 
格式:  sql_connection=mysql://[user]:[pass]@[primary IP]/[db name] 
示例:  sql_connection=mysql://nova:yourpassword@192.168.206.130/nova 
在/etc/nova/nova.conf文件中添加以下这些网络设置,你可以在文件中添加注释说明行,方法是建立以#符号开头的行(以#开头的行全为注释行):
  1. auth_strategy=keystone
  2. network_manager=nova.network.manager.FlatDHCPManager
  3. fixed_range=192.168.100.0/24
  4. flat_network_dhcp_start=192.168.100.2
  5. public_interface=eth0
  6. flat_interface=eth0
  7. flat_network_bridge=br100
以下为nova.conf文件配置的示例:
  1. [DEFAULT]
  2. # LOGS/STATE
  3. verbose=True
  4. # AUTHENTICATION
  5. auth_strategy=keystone
  6. # SCHEDULER
  7. compute_scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
  8. # VOLUMES
  9. volume_group=nova-volumes
  10. volumevolume_name_template=volume-%08x
  11. iscsi_helper=tgtadm
  12. # DATABASE
  13. sql_connection=mysql://nova:yourpassword@192.168.206.130/nova
  14. # COMPUTE
  15. libvirt_type=qemu
  16. connection_type=libvirt
  17. instanceinstance_name_template=instance-%08x
  18. api_paste_config=/etc/nova/api-paste.ini
  19. allow_resize_to_same_host=True
  20. # APIS
  21. osapi_compute_extension=nova.api.openstack.compute.contrib.standard_extensions
  22. ec2_dmz_host=192.168.206.130
  23. s3_host=192.168.206.130
  24. # RABBITMQ
  25. rabbit_host=192.168.206.130
  26. # GLANCE
  27. image_service=nova.image.glance.GlanceImageService
  28. glance_api_servers=192.168.206.130:9292
  29. # NETWORK
  30. network_manager=nova.network.manager.FlatDHCPManager
  31. force_dhcp_release=True
  32. dhcpbridge_flagfile=/etc/nova/nova.conf
  33. firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver
  34. my_ip=192.168.206.130
  35. public_interface=br100
  36. vlan_interface=eth0
  37. flat_network_bridge=br100
  38. flat_interface=eth0
  39. fixed_range=10.0.0.0/24
  40. # NOVNC CONSOLE
  41. novncproxy_base_url=http://192.168.206.130:6080/vnc_auto.html
  42. vncserver_proxyclient_address=192.168.206.130
  43. vncserver_listen=192.168.206.130
你还需要修改api-paste.ini文件,使用keystone作为认证服务器。译者备注:原文档此处无配置说明,原文的附录部分有一个配置文件示例。 
重启nova-服务,接着与数据库同步数据: 
# for  svc  in  api  objectstore  compute  network  volume  scheduler  cert;  \ 
> do  sudo  service  openstack-nova-$svc  start;  sudo  chkconfig  openstack-nova-$svc  on;  done 
检查所有的服务是否启动成功,查看/var/log/nova日志文件是否有错误。 
为Compute配置数据库,通过如下命令在后端数据库中创建数据表: 
sudo  nova-manage   db   sync 如果你看到任何响应信息,可以查看/var/log/nova/nova-manage.log查看问题所在。没有回应说明命令正确的被执行了。 
重启服务: 
sudo restart openstack-nova-api
sudo restart openstack-nova-compute
sudo restart openstack-nova-network
sudo restart openstack-nova-scheduler
sudo restart openstack-nova-vncproxy
sudo restart openstack-nova-volume
sudo restart libvirt-bin                                            //RHEL中为libvirtd服务
sudo /etc/init.d/rabbitmq-server restart 
5.2 为Compute虚拟机实例创建网络 你必须运行如下命令为虚拟机创建在nova.conf中设定的网络及br100桥接设备。这个例子中我们为虚拟机分配192.168.100.0/24的网络,但你也可以提供为自己的网络。示例中我们我们把这个网络标记为”private”: 
# nova-manage network create private –multi_host=T –fixed_range_v4=192.168.100.0/24  \ 
> –bridge_interface=br100 –num_networks=1 –network_size=256 
5.3 验证Compute的安装 你可以使用root身份运行nova-manage命令来确保所有的Compute服务正常运行: 
# nova-manage   service  list 正常的话,你会收到笑脸 : -)的回应而不是X符号的回应,以下为示例: 
Binary Host Zone Status State Updated_At
nova-compute myhost nova enabled :-) 2012-04-02 14:06:15
nova-cert myhost nova enabled :-) 2012-04-02 14:06:16
nova-volume myhost nova enabled :-) 2012-04-02 14:06:14
nova-scheduler myhost nova enabled :-) 2012-04-02 14:06:11
nova-network myhost nova enabled :-) 2012-04-02 14:06:13
nova-consoleauth myhost nova enabled :-) 2012-04-02 14:06:10 
你也可以运行nova-manage查看安装软件的版本: 
# nova-manage  version  list Essex版本的Compute版本号是2012.1 
2012.1 (2012.1-LOCALBRANCH:LOCALREVISION) 5.4 定义Compute与Image服务的认证 创建nova与glance命令行需要使用的变量,并保存至openrc文件,本文将openrc文件保存至~/creds目录下: 
$ mkdir  ~/creds 
$ nano   ~/creds/openrc 
在你创建的openrc文件中粘贴以下内容: 
export OS_USERNAME=adminUser
export OS_TENANT_NAME=openstackDemo
export OS_PASSWORD=secretword
export OS_AUTH_URL=
http://192.168.206.130:5000/v2.0/
export OS_REGION_NAME=RegionOne 接着,让这些变量应用到你的系统环境中: 
$ source  ~/creds/openrc 
通过nova客户端命令显示可用镜像验证认证功能是否正常: 2 
注意你的系统中ID号将会此有所不同。 
5.5 安装额外的Compute节点 为了大规模部署Compute,有多种途径可以帮助你在多个节点安装Compute。 
你可以安装所有的nova- 软件包及其依赖关系包,或仅安装nova-network与nova-compute组件在你的云控制节点上。你可以在任何地方安装nova- 服务,只要服务可以访问nova.conf并知道消息队列软件(Rabbitmq | Qpid)安装在哪即可。 
因为Compute节点需要查询数据库信息,所以nova客户端与MySQL客户端软件包都应该安装在附加Compute节点上。 
拷贝nova.conf到所有的附件compute节点。
OpenStack云第五天
安装OpenStack Object Storage
目录: 
一、系统需求  
二、对象存储架构 
三、安装OpenStack Object Storage  
四、安装配置存储节点 
五、安装与配置代理节点 
六、安装验证
一、系统需求 
硬件: OpenStack对象存储被设计运行在通用计算机硬件平台上,以下表达为建议硬件配置。
操作系统:OpenStack 对象存储现在可以运行在Ubuntu,RHEL,CentOS或Fedora系统上。 
网络:建议千兆网络。为对象存储准备一个额外的网络连接外网的代理服务器。 
数据库:OpenStack对象存储,SQLite数据库是OpenStack对象存储容器和帐号管理的进程的一部分。 
权限:你可以直接只用root或用户sudo权限的用户执行安装OpenStack对象存储。 
网络规划 本文档提供两个网络规划,一个公共网络连接代理服务器,第二个是在存储集群外不可访问的存储网络。 
公共网络大小:8IPs(CIDR/29)。 
存储网络建议大小:255IPs(CIDR/24)。
二、对象存储架构 节点–运行一个或多个OpenStack对象存储服务的主机。 
代理节点–运行代理服务的主机。 
认证节点–一个可选的独立于代理服务并运行认证服务的节点。 
存储节点–运行用户、容器、对象服务的节点。 
环–OpenStack对象存储数据与物理设备之间的映射集合。 
为了增加高可用,你有可能会希望添加更多的代理服务以提供性能。 
本文档描述的存储节点都是在环中作为独立的区域,建议至少用5个区域。一个区域是相互独立的节点组合。环确保所有的备份数据在不同的区域,下图为最小安装的一种可能: 
图表2
三、安装OpenStack Object Storage 虽然在开发或测试环境下,你可以安装OpenStack Object Storage在一台服务器上,但多服务器安装可以为你的正式发布产品带来更高的可用性与冗余。 
如果你想执行单节点安装,你可以使用Swift All In One 或DevStack。参考http://swift.openstack.org/development_saio.html 或http://devstack.org。 
开始之前 如果你是在一台新服务器上安装,准备一份系统安装光盘。 
本文档演示安装一个使用了如下节点的集群: 
    * 一个运行swift-proxy-server的代理节点,代理服务器将请求发送至正确的存储节点。 
    * 五个运行swift-account-server,swift-container-server以及swift-object-server进程的存储节点。 
安装步骤 1. 在所有节点安装操作系统,如Ubuntu Server,RHEL,CentOS或Fedora。 
2. 安装swift服务以及OpenSSH。 
# yum install  openstack-swift  openstack-swift-proxy  openstack-swift-account  \
> openstack-swift-container  openstack-swift-object memcached 
3. 在所有的节点上创建目录: 
# mkdir  -p   /etc/swift 
# chown  -R  swift:swift   /etc/swift/ 
4. 创建/etc/swift/swift.conf文件
  1. [swift-hash]
  2. # random unique string that can never change (DO NOT LOSE)
  3. swift_hash_path_suffix = fLIbertYgibbitZ
注意:suffix的值为随机字串。 
下一步,设置你的存储节点、代理节点以及认证节点,这里我们使用keystone作为通用认证组件。
四、安装与配置存储节点 注意:OpenStack对象存储需要工作在支持XATTRS(扩展属性)的现代文件系统上。我们建议使用XFS文件系统。 
1. 安装存储节点包: 
# yum  install  openstack-swift-account  openstack-swift-container \
> openstack-swift-object  xfsprogs 
2. 为所有的设备设置XFS卷: 
# fdisk   /dev/sdb    (创建一个分区) 
# mkfs.xfs  -i   size=1024   /dev/sdb1 
# echo “/dev/sdb1   /srv/node/sdb1   xfs   noatime,nodiratime,nobarrier,logbufs=8  0  0” >>  /etc/fstab 
# mkdir  -p  /srv/node/sdb1 
# mount   /srv/node/sdb1 
# chown  -R  swift:swift   /srv/node 
3. 创建/etc/rsyncd.conf
  1. uid = swift
  2. gid = swift
  3. log file = /var/log/rsyncd.log
  4. pid file = /var/run/rsyncd.pid
  5. address = <STORAGE_LOCAL_NET_IP>
  6. [account]
  7. max connections = 2
  8. path = /srv/node/
  9. read only = false
  10. lock file = /var/lock/account.lock
  11. [container]
  12. max connections = 2
  13. path = /srv/node/
  14. read only = false
  15. lock file = /var/lock/container.lock
  16. [object]
  17. max connections = 2
  18. path = /srv/node/
  19. read only = false
  20. lock file = /var/lock/object.lock
4. 编辑/etc/default/rsync:
  1. RSYNC_ENABLE = true      //此处为Ubuntu环境,设置开机启动。如CentOS请使用chkconfig
5. 开启rsync进程: 
# service  rsync  start 6. 创建/etc/swift/account-server.conf文件
  1. [DEFAULT]
  2. bind_ip = <STORAGE_LOCAL_NET_IP>
  3. workers = 2
  4. [pipeline:main]
  5. pipeline = account-server
  6. [app:account-server]
  7. use = egg:swift#account
  8. [account-replicator]
  9. [account-auditor]
  10. [account-reaper]
7. 创建/etc/swift/container-server.conf
  1. [DEFAULT]
  2. bind_ip = <STORAGE_LOCAL_NET_IP>
  3. workers = 2
  4. [pipeline:main]
  5. pipeline = container-server
  6. [app:container-server]
  7. use = egg:swift#container
  8. [container-replicator]
  9. [container-updater]
  10. [container-auditor]
8. 创建/etc/swift/object-server.conf
  1. [DEFAULT]
  2. bind_ip = <STORAGE_LOCAL_NET_IP>
  3. workers = 2
  4. [pipeline:main]
  5. pipeline = object-server
  6. [app:object-server]
  7. use = egg:swift#object
  8. [object-replicator]
  9. [object-updater]
  10. [object-auditor]
  11. [object-expirer]
译者备注:经由译者实验证明,软件安装完成后在/etc/swift目录下,会自动生成account-server,container-server等目录,以上配置文件也可以分别放置在对应的目录下。 9. 开启storage服务: 
swift-init object-server start
swift-init object-replicator start
swift-init object-updater start
swift-init object-auditor start
swift-init container-server start
swift-init container-replicator start
swift-init container-updater start
swift-init container-auditor start
swift-init account-server start
swift-init account-replicator start
swift-init account-auditor start
五、安装与配置代理节点 代理服务器接受请求并查找账户、容器或对象的位置最后将请求路由到正确的位置。代理服务器同样处理APIs请求。你可以修改proxy-server.conf文件启用帐号管理。 
注意:建议所有的命令使用root帐号操作。 
1. 安装swift-proxy服务: 
# yum  install  openstack-swift-proxy  memcached 2. 创建自签名证书: 
# cd   /etc/swift 
# openssl   req   -new   -x509  -nodes   -out  cert.crt   -keyout   cert.key 
3. 修改memcached监听的端口。编辑/etc/memcached.conf文件: 
将  -l  127.0.0.1  改变为  -l   <代理服务器IP> 4. 重启memcached服务: 
# service  memcached   restart 5. 使用openstack-config命令设置swift代理配置文件的keystone管理标识: 
# openstack-config –set /etc/swift/proxy-server.conf  filter:authtoken   admin_token $ADMIN_TOKEN
# openstack-config –set /etc/swift/proxy-server.conf  filter:authtoken   auth_token $ADMIN_TOKEN 
6. 创建/etc/swift/proxy-server.conf
  1. [DEFAULT]
  2. bind_port = 8888
  3. user = <user>
  4. [pipeline:main]
  5. pipeline = catch_errors healthcheck cache authtoken keystone proxy-server
  6. [app:proxy-server]
  7. use = egg:swift#proxy
  8. account_autocreate = true
  9. [filter:keystone]
  10. paste.filter_factory = keystone.middleware.swift_auth:filter_factory
  11. operator_roles = admin, swiftoperator
  12. [filter:authtoken]
  13. paste.filter_factory = keystone.middleware.auth_token:filter_factory
  14. # Delaying the auth decision is required to support token-less
  15. # usage for anonymous referrers (‘.r:*’).
  16. delay_auth_decision = true
  17. service_port = 5000
  18. service_host = 127.0.0.1
  19. auth_port = 35357
  20. auth_host = 127.0.0.1
  21. auth_token = 012345SECRET99TOKEN012345
  22. admin_token = 012345SECRET99TOKEN012345
  23. [filter:cache]
  24. use = egg:swift#memcache
  25. set log_name = cache
  26. [filter:catch_errors]
  27. use = egg:swift#catch_errors
  28. [filter:healthcheck]
  29. use = egg:swift#healthcheck
7. 创建账户,容器以及对象环。 
命令第一个参数18代表2^18(2的幂),表示定义分区的大小,该值大小取决于你希望整个环使用存储的总大小;3代表每个对象备份的数量;最后一个数值表示分区移动的间隔(小时)。 
# cd   /etc/swift 
# swift-ring-builder account.builder create 18 3 1
# swift-ring-builder container.builder create 18 3 1
# swift-ring-builder object.builder create 18 3 1 
8. 为每个节点的存储设备添加条目至环: 
# swift-ring-builder account.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP>:6002/<DEVICE> 100
# swift-ring-builder container.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6001/<DEVICE> 100
# swift-ring-builder object.builder add z<ZONE>-<STORAGE_LOCAL_NET_IP_1>:6000/<DEVICE> 100 
例如,如果你在IP 10.0.0.1存储节点上在Zone 1(区域1)中设置分区。挂载点是/srv/node/sdb1,且在rsyncd.conf文件中是/srv/node/,设备为sdb1。命令如下: 
swift-ring-builder  account.builder  add z1-10.0.0.1:6002/sdb1  100
swift-ring-builder  container.builder  add z1-10.0.0.1:6001/sdb1  100
swift-ring-builder  object.builder  add z1-10.0.0.1:6000/sdb1  100 
注意:假设5个区域中每个区域有一个节点,ZONE从1开始并通过添加额外节点增加该数值。 
9. 验证ring内容: 
swift-ring-builder  account.builder
swift-ring-builder  container.builder
swift-ring-builder  object.builder 
10. 调整rings: 
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
swift-ring-builder object.builder rebalance 
注意:这里会花费一些时间。 
11. 拷贝account.ring.gz, container.ring.gz, object.ring.gz到每个代理与存储节的/etc/swift目录下。 
12. 确保所有的配置文件所属者为swift: 
# chown   -R   swift:swift   /etc/swift 13. 开启Proxy服务: 
# swift-init  proxy  start 配置OpenStack对象存储: 
swift-init main start
swift-init rest start
六、安装验证 1. 运行swift命令,使用$ export ADMINPASS=secretword定义全局变量。 
$ swift -V 2 -A http://&lt;AUTH_HOSTNAME>:5000/v2.0 -U adminUser:admin -K  012345SECRET99TOKEN012345 stat 2. 获得X-Storage-Url 与 X-Auth-Token: 
$ curl -k -v -H ‘X-Storage-User: adminUser:admin’ -H ‘X-Storage-Pass:$ADMINPASS’http://&lt;AUTH_HOSTNAME>:5000/auth/v1.0 3. 检查账户: 
$ curl -k -v -H ‘X-Auth-Token: <token-from-x-auth-token-above>’ <url-from-xstorage-url-above> 4. 使用swift上传一个名称为gigfile[1-2].tgz的文件至名为myfiles的容器: 
$ swift -A http://&lt;AUTH_HOSTNAME>:5000/v2.0 -U adminUser:admin -K $ADMINPASS  upload myfiles bigfile1.tgz
$ swift -A 
http://&lt;AUTH_HOSTNAME>:5000/v2.0 -U adminUser:admin -K $ADMINPASS  upload myfiles bigfile2.tgz 5. 使用swift下载所有的文件: 
$ swift -A http://&lt;AUTH_HOSTNAME>:5000/v2.0 -U adminUser:admin -K $ADMINPASS  download myfiles 排错:如果你遇到问题,可以查看/var/log/syslog。