资源描述
用CloudStack配置和管理一个简单云CloudStack的配置、部署与管理,以及API的使用陈争云,软件工程师,IBM简介:CloudStack是Ctrix公司在IaaS市场上的主打产品,它提供了对云计算资源的灵活部署与管理能力。今年上半年Ctrix将其源代码贡献给Apache后,CloudStack成为一个开源项目。这类开源项目的文档虽历经完善,但作为一个云计算领域的新手开始尝试它的安装与部署时,总还是遇到或多或少的挑战。这便是本文目的所在,即忠实记录并尝试总结这个过程中的一些问题,与大家分享。发布日期:2013年3月21日级别:中级访问情况:8983次浏览评论:1(查看|添加评论-登录)JLit平均分(36个评分)为本文评分CloudStack在IaaS市场的背景和主要竞争对手随着亚马逊在公有云和VMware在私有云方面的成功,各类企业纷纷在云时代迈出了自己的步伐,这些企业希望在自身的计算资源(主机,网络,存储)虚拟化过程中能够获得强大功能的同时,又维持相对低廉的成本。这正是IaaS供应商们发展的动力。IaaS提供了对资源的自动化管理能力。例如用界面、脚本甚至WebServiceAPI实现对大量硬件、大量虚拟机的生命周期管理。IaaS产品面对的是大规模、可伸缩的云环境,这是与用手工管理有限资源的方式完全不同的一类系统。CloudStack前身为的商业化产品,它在2011年被Ctrix以超过二亿美金价格收购,随后又在今年被捐献给Apache基金会。这项产品开源的举措,引起了市场对IaaS发展路线的一些争议,例如它与另外一个开源产品OpenStack的竞争与合作关系?OpenStack是由Rackspace和NASA主导开发的一个IaaS,它拥有更大的用户群,包括HP,IBM,Dell和Redhat等大公司。表1列出了CloudStack与OpenStack的一些对比。表I.CloudStack与OpenStack的对比CloudStackOpenStackLicenseApache2.0授权协议,可免费用于商业模式Apache2.0授权协议,可免费用于商业式支持的HypervisorsKVM,XENOracleVM,vSphere和BareMetalKVM,XEN,(有限支持Hyper-V,ESPowerVM)支持的NetworkingOpenFlow,VLAN和FlatnetworksVLAN,Flat,FlatDHCPModel支持的StorageNFSClusterLVM,RadosBlockDevice(Ceph),LocaliSCSICeph,NFSLocalStorage和SStorage(对象存储)客户群不到60家,包括诺基亚,公司,塔塔,阿尔卡特Zynga,日本电报电话160家左右,包括了NASA,RackspaHP,红帽,Piston开发语言Java为主Python为主兼容亚马逊EC2API是是附:比较数据截止至2012年中,对应的软件版本为CloudStack3和OpenStackEssex可以认为,在市场上CloudStack和OpenStack这两个laaS平台存在不同的功能、客户和发展路线,前者作为曾经的商业软件,已经被证明为可以可靠的用于生产系统;而后者,虽则目前缺少广泛的真实用户,却拥有更多的大公司支持。这是它们显著的不同。尽管如此,但从技术而言,它们背后的源代码贡献者并不是一定不同的,经常有来自同一家公司的开发人员为这两个开源项目提交代码。从这个角度说,两个平台在某一天的合并也不会令人惊奇。还存在其它众多的laaS产品(例如Eucalyptus,Nebula等),可以在文末的参考资源中找到一些介绍。总体而言,这些产品当中CloudStack和OpenStack是特性最为相近、也是最引起争论的,参考资源中的一篇文章提及到了最近发生的一个有趣争论。回页首CloudStack架构图CloudStack采用了典型的分层结构:客户端、核心引擎、以及资源层。它面向各类型的客户提供了不同的访问方式:WebConsole、CommandShell和WebServiceAPI。通过它们,用户可以管理使用在其底层的计算资源(又分为主机、网络和存储),完成诸如在主机上分配虚拟机,配给虚拟磁盘等功能。见图1。图1.系统架构图ComputeNetworkStorageNFSiSCSIFJVirtualRouterFirewallLoadBalancer虚拟机如果使用Xen和KVM,需要安装CloudStackAgent来支持其与管理服务器的交互。而管理服务器和XenServer交互则是靠XAPI,和vCenter、ESX交互靠HTTP。当部署CloudStack时,需要了解它的层次结构和存储管理,见图2。图2.部署图HostSecondaryStorageHostPrimaryEtorageClusterMySQLcloud_db,-ClusterPodPodZone/Zone:Zone对应于现实中的一个数据中心,它是CloudStack中最大的一个单元。Pod:Pod对应着一个机架。同一个pod中的机器在同一个子网(网段)中。Cluster:Cluster是多个主机组成的一个集群。同一个cluster中的主机有相同的硬件,相同的Hypervisor,和共用同样的存储。同一个cluster中的虚拟机,可以实现无中断服务地从一个主机迁移到另外一个上。Host:Host就是运行虚拟机(VM)的主机。即从包含关系上来说,一个zone包含多个pod,一个pod包含多个cluster,一个cluster包含多个host。CloudStack中存在两种存储:Primarystorage:一级存储与cluster关联,它为该cluster中的主机的全部虚拟机提供磁盘卷。一个cluster至少有一个一级存储,且在部署时位置要临近主机以提供高性能。Secondarystorage:二级存储与zone关联,它存储模板文件,ISO镜像和磁盘卷快照。*模板:可以启动虚拟机的操作系统镜像,也包括了诸如已安装应用的其余配置信息。ISO镜像:包含操作系统数据或启动媒质的磁盘镜像。*磁盘卷快照:虚拟机数据的已储存副本,能用于数据恢复或者创建新模板。安装CloudStack环境准备一个完整的CloudStack环境包括两部分:*管理服务器(ManagementServer)虚拟机管理器(Hypervisor)附:通常对CloudStack的hypervisor也有另外的称呼,例如主机(host),代理(agent)等。本文统一为hypervisor。即所有被管理的虚拟机都位于一个网段。在本乂的女装步骤中,相应的硬件如下:表2.软硬件环境所要配置的为一个间单网络,ManagementServerHypervisorIPHostNameCPUi3i3Memory6G6GHardDisk500G200GOSCentOS6.264-bitCentOS6.264-bit本次安装中CloudStack的版本为:RedHatEnterpriseLinux/CentOS6.2Hypervisor为KVM。管理服务器需要更多的存储空间是因为NFS也建在该机上。更多的详细安装需求可以参阅CloudStack官网的指南。这里需要着重列出的问题为:Q1:官网的安装要求中哪些软硬件因素容易导致CloudStack的安装失败?Hypervisor所在的主机,要求CPU和主板支持硬件虚拟化(本人的机器是DELL台式机,需要在主板的BIOS中设置Intel-VT为enable)。* 操作系统必须是64位的,推荐centos6.2(当前最新的CloudStack3支持6.2)。如果使用5.5或者6.0版本,一定要选择匹配的CloudStack安装包。Ubuntu目前只有运行在10.04平台上的发行版,且该release不是最新的CloudStack。此处强烈建议新用户给ManagmentServer和Hypervisor所在的两台主机选择一样的操作系统(推荐centos/redhat)和一样版本的CloudStack软件,同时注意OS定是要被官方release宣称支持,这样能避免走不少弯路。例如确实也存在有人能成功在Ubuntu12.04或centos6.3(官方2012年9月尚未宣称支持)上部署CloudStack,但付出精力较大。Hypervisor的主机不能有任何正在运行的虚拟机,否则在后续的addhost操作中会遇到失败。最佳的建议是hypervisor主机上的操作系统为全新安装,且没有部署任何其余虚拟机。* 无论是管理服务器还是hypervisor所在主机,都需要以root登录进行CloudStack安装。ManagementServer和Hypervisor主机必须是有独立静态IP的主机。否则后续安装因为IP地址变化会导致service状态异常。CentOS安装后的默认网络配置为DHCP,需修改为手工分配IP,这步操作要在cloud-server和cloud-agent两台机器都进行:点击桌面右上角的网络图标,编辑网络:图3Method原来为“DHCP改成设置为“Manual,”然后输入静态IP地址、掩码、网关、DNS服务器信息。安装ManagementServer1. 以root身份登录。2. 运行“hostname-fqdn”,检查其返回的格式必须是包括域名的全称(例如)。Hostname最好是在安装centos时即设置好,否则需要在/etc/hosts和/etc/sysconfig/network两处文件中同时修改才可以永久生效。设置SELinux。在/etc/selinux/config中修改“SELINUX=enforcing为”“SELINUX=permissive并在shell中运行“setenforcepermissive令其立即生效。3. 进入下载并解压好的CloudStack安装目录(我这里是/home/squirrel/mybox/cloud/CloudStack-oss-3.0.2-1-rhel6.2),运行命令./install.sh,选择“M安装ManagementServer软件。4. 运行下面命令启动NFS和rpcbind服务,并设置为开机运行:# servicerpcbindstartservicenfsstartchkconfignfsonchkconfigrpcbindon7. 编辑/etc/f,在mysqld下面加入内容:innodb_rollback_on_timeout=1innodb_lock_wait_timeout=600max_connections=350log-bin=mysql-binbinlog-format=ROW8. 重启数据库后,设置root用户密码。servicemysqldrestartmysql-urootmysqlSETPASSWORD=PASSWORD();mysqlexit9. 运行CloudStack脚本让其自动配置数据库:#cloud-setup-databasescloud:localhost-deploy-as=root:即表示以root用户身份来生成数据库,该数据库属于新建的cloud用户(密码dbpassword可以留空)。10. 最后,下面的命令将完成对操作系统iptables、sudoers的设置(CloudStack本身有安全性方面的要求,不是无限暴露给网络,同时又需要一些管理权限来运行自身服务,因此要做这两项的设置),并启动管理服务器:#cloud-setup-management使用“servicecloudmanagementstatus查看运行状态。Q2:第2步中运行“hostnamefn命令时,要保证机器是联网状态,才能返回正确的主机名称。Q3:如果后续打算把hypervisor也安装在managementserver的同一台主机上,需要在/etc/sysconfig/network-scripts/ifcfg-中配置出对应的信息。同时,如果该hypervisor为KVM,需要修改/etc/sudoers,加入如下行:Defaults:cloud!requiretty配置NFS前面讲过,CloudStack需要两类存储(primarystorage和secondarystorage)来支持它的cluster和host,本节中由NFS来提供这两个存储,因此前述步骤中要启动NFS服务。同时为了方便起见,NFSServer也由充当。1. 以root身份登录。2. 创建两个目录,分别作为一级和二级存储:# mkdir-p/export/primarymkdir-p/export/secondary3. 编辑文件/etc/exports,加入:/export*(rw,async,no_root_squash)然后导出/export目录:4. #exportfs-a编辑/etc/sysconfig/nfs文件,取消如下行的注释符号(或者在文件末尾直接添加下列行):LOCKD_TCPPORT=32803LOCKD_UDPPORT=32769MOUNTD_PORT=892RQUOTAD_PORT=875STATD_PORT=662STATD_OUTGOING_PORT=20205. 编辑防火墙设置文件/etc/sysconfig/iptables,在input部分最上面加入如下的规则:-AINPUT-mstate-stateNEW-pudp-dport111-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport111-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport2049-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport32803-jACCEPT-AINPUT-mstate-stateNEW-pudp-dport32769-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport892-jACCEPT-AINPUT-mstate-stateNEW-pudp-dport892-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport875-jACCEPT-AINPUT-mstate-stateNEW-pudp-dport875-jACCEPT-AINPUT-mstate-stateNEW-ptcp-dport662-jACCEPT-AINPUT-mstate-stateNEW-pudp-dport662-jACCEPT6. 重启防火墙,并保存修改:7. serviceiptablesrestartserviceiptablessave在管理服务器()禾口hypervisor主机()上,修改文件/etc/idmapd.conf,加入如下内容:Domain=squirrel.org重启管理服务器的主机,然后测试并挂载NFS在机器建立目录/primarymount,运行如下命令并确认其是否成功:mount-tnfs192.168.1.4:/export/primary/primarymountQ4:在KVMhypervisor机器运行showmount命令时,如果采用的是hostname,例如“,并且失败,报错“clnt_create:RPC:Programnotregistered,那么可以尝试用IP代替:“。或者编辑本机的/etc/hosts,加入对方server的IP-主机名映射(但这样失去了灵活性):Q5:第5步中新加入规则在防火墙配置文件中的次序对NFSshare成功很重要,一定要加入INPUT区的最开始部分,即系统中原有的input项必须在新加入行的后面,否则可能在运行时会出现clnt_create:RPC:Portmapperfailure-Unabletoreceive:errno113(Noroutetohost)的错误。Q6:出现错误mount.nfs:accessdeniedbyserverwhilemounting192.168.1.4:/export/primary的处理?有时当运行“有clnt_create:RPC:Portmapperfailure-Unabletoreceive:errno111(Connectionrefused)错误提示,然后mountnfs失败,会出现标题上的错误信息,这可能跟NFS的建立方式有关,有时也跟防火墙有关。需要检查log:tail-200/var/log/messagesrefusedmountrequestfrom192.168.1.5for/export/primary(/export):illegalport1024那么考虑尝试如下方法:vi/etc/exports在原来的那一行上修改如下:/export*(rw,async,insecure,no_root_squash)然后:exportfs-rvservicenfsrestart在上重新运行命令:mount-tnfs192.168.1.4:/export/primary/primarymount没有提示,应该成功了,可以确认:mount|grepprimaryOK!准备系统虚拟机模板系统虚拟机模板(SystemVMTemplate)保存在二级存储上,是用于创建云平台上的系统虚拟机的。1. 以root身份登录。2. 这里下载的是KVM模板,运行如下命令安装:#/usr/lib64/cloud/agent/scripts/storage/secondary/cloud-install-sys-tmplt-m/export/secondary-u依赖于网络速度,这个过程所需时间在几分钟到数小时(笔者的下载速度显示在2M3M/s,三分钟左右完成全部下载和安装)。Q7:这里有两点需要注意: 磁盘分区必须够大。虚拟机模板的下载安装这步不可省略,否则后面在控制台添加二级存储时会失败。系统虚拟机不同于普通的hypervisorhost上的虚拟机,它是CloudStack自带的用于完成自身系统相关的一些任务的vm。它有两种:二级存储虚拟机(SecondaryStorageVM):下载上传模板、下载镜像,第一次创建虚拟机时从二级存储拷贝模板到一级存储并且自动创建快照等。控制台代理虚拟机(ConsoleProxyVM):用于在web界面上展示控制台。需要注意的是,系统虚机为Debian32位操作系统,CloudStack管理员可以用SSH登录。同时,能在主机的/var/lib/libvirt/images查看到它们,如图5:图5.查看已经安装的VMs-rw,1匚EtiQL104I576QOct73iSVcl&31亡呂目日乡-rw1rootrcot5L9O4S1GtZ303:31705M60C-5ceZ-4a?a-8Ef-79G8&7t&Gr7t-rw.1上r-tjoe.104Oct2303:2&414b-Aft&e-JlbeCSi&O0krv1xddCAt5253098Cet2309:91b&bsMl5-ecfC-Mb-b943-M4b1f93&aBe4-ZW.1MM3匚HOL1992-9920OCL2393!24B3Sf-H4K9安装KVMHypervisor1. 以root身份登录hypervisor主机。2. 确保hostname是完整带域名的,修改方法同管理服务器步骤1。3. 运行“yumeraseqemtkvm删除OS自带的qemu-kvm。进入下载并解压好的CloudStack安装目录,运行命令“./install.sh,选择“A安装agent。4. 安装完毕后,运行下面命令启动nfs和rpcbind服务,并设置为开机运行:# servicerpcbindstart# servicenfsstart# chkconfignfsonchkconfigrpcbindonQ8:如何处理因为没有enableVT而导致CloudStackAgent启动不成功?注意检查log:/var/log/cloud/agent/。如果是因为BIOS的VT没有打开而引起的启动失败,则需要在打开VT支持后重新安装agent。运行命令:#servicecloud-agentstatus若显示:则说明已经成功运行了。安装NTP,时间同步1.2.cloud-agent(pid4188)isrunning.运行yuminstallntp安装NTP服务。编辑配置文件/etc/ntp.conf,加入如下服务器:3. 重启NTP并设置为开机自动运行:servicentpdrestartchkconfigntpdon在ManagementConsole中配置虚拟化资源当上面的管理服务器与hypervisor安装好后,可以登录进CloudStack的UIconsole进行资源的配置与部署。和几个竞争对手例如Eucalyptus从一开始就对AWS的兼容,OpenStack对松耦合组件的系统结构设计一一相比,CloudStack的特点之一就是有最友好的用户界面,即控制管理台。首先打开浏览器,登录URL:http:192.168.1.4:8080/client用户名/密码:admin/password选择“Continuewithbasicinstallation,接着修改CloudStack管理员密码。图6.添加zoneAddzoneSackContinue图7.添加podAddPodName:poddellCateay:Netmask:IPRange:BackContinue图8.添加客户机网络AddguestnetworkG白白y;Netmask:rIPRange:192JC81.51BackContinueHypervisor:Mame;Continue图9.添加clusterAddClusterSack图10.添加hostAddHost匚ontinue图11.添加一级存储AddPrimaryStorageNameiprimarystorage_lPnotocakNFS二Server:Patti/export/primaryContinue图12.添加二级存储AddSecondaryStoragePath;/export/se匚ondaryBackContinue最后点击Launch”动CloudStack云平台,开始初始化。图13.初始化中Noir/buildingyourcloud.,.oQesoe令e-eeiCHHIMhIpaHrKHlHMwOCktCpi|wrir|H叩!rtf*fflrtTWfciKhaJbllphfftwcwri&rpCrMVBnrqi呼lartlniCmrtbwgpdCQU1CigluringCrffvcAddddrigtkM:直到出现成功信息。这样一个简单的云环境就搭建完毕,我们随后可以在这个控制台执行计算资源的管理任务了。下面两图为控制台显示界面。图14.0verview图.InfrastructureQ9:有时因为各种原因,例如在控制台错误的配置了一些数据,需要重新初始化时,可以删除CloudStack的数据库,步骤如下:在命令行下:mysqlrootmysqldropdatabasecloud;dropdatabasecloud_usage;#cloud-setup-databasescloud:localhost-deploy-as=root:#cloud-setup-management然后重复本节的操作。附:CloudStack的WebConsole界面是可以定制化的。回页首使用CloudStackAPI如同AWSAPI样,CloudStackAPI也是基于WebService,可以使用任何一种支持HTTP调用的语言(例如Java,PHP)编写代码。调用代码(caller)首先需要在管理服务器进行认证。目前CloudStack采用两种认证方式: Session认证:通过loginAPI,获得一个JSESSIONIDcookie和一个SESSIONKEYtoken* APIKey认证。本文代码示例采用APIKey进行认证。其过程如下:管理员给调用者分配APIKey和SecurityKey(由Admin通过webconsole或者用registerUserKeys在程序中生成)。1. 调用者用SecurityKey以HMACSHA-1哈希算法对APIKey+CommandString生成签名。最后的APIRequest=BaseURL+APIPath+CommandString+Signature下面具体为admin用户生成两个key:首先登陆管理台:http:192.168.1.4:8080/client。点击accounts,选择admin,点击userstab,找至Uadmin。可以看到APIKey和SecurityKey,如果两个框没有值,点击工具栏的钥匙小图标,“GenerateKeys”如图16。图16.生成APIKey和SecurityKey两个Key的生成结果如下:表3.Admin用户的APIKey和SecurityKeyAPIKeyKn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD1TmoVw3e-oNxjRTCBXchfju5OFTqW4zPlik-HKxHSecurityKeyYaCSGzL9PvadlW4CDxH-k5QDAN8pDjPK7V5NZdvnlvJnzf_TKXg_OPXg616FM5k8yuYeyWkltMgugsbma9接下来用CloudStack的RestfulAPI生成一个虚拟机。其调用URL如下:http:/192.168.1.4:8080/client/api?command=deployVirtualMachine&serviceofferingid=1&templateid=4&zoneid=1command参数中的内容可以参阅APIReference:CloudStack,此处不赘述。需要注意的是,URL当中每个参数是按照字母顺序排列的,这是生成签名必要的。下面演示如何生成签名并组装一个完整的URL。首先在此处下载一段perl脚本,我们要利用它来帮助生成签名。将它放入合适的目录,然后在命令行下键入:$./generate-url.pl-1-ucommand=deployvirtualmachine&serviceofferingid=1&templateid=4&zoneid=1-aTEBBqfXkV-9blsxpkjFLAxNUmnvMsFEq7WKwPOMT_nuce69bmcEIXz1izsN1qJFK58ye5U5hWWN2ckscsysodg-s7VJxOQfxvJQZBYZbLdct2QFck8IV6hwLMvo9YCJ97pVou8f_aDSHdhEqBaY2CtFI6_MULP0eYqr_Z7D2Jon8nQ-f后面数字1是生成url的意思,-a后面是APIKey,-s后面是SecurityKey。-u后面的command参数都已经修改为小写字母(此步不可省略)。命令运行完毕生成一段字符串:http:/*.*.*.*/client/api?command=deployvirtualmachine&serviceofferingid=1&zoneid=1&templateid=4&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD1TmoVw3e-oNxjRTCBXchffju5OFTqW4zPlik-HKxH7-w&signature=%2BQMXTBOoicZJG6EosCcRGvO7OWU%3D然后把IP替换入上面url,并把command中的小写字母还原成原来正确的API名字,结果如下:http:/192.168.1.4:8080/client/api?command=listVirtualMachines&account=admin&domainld=1&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD仃moVw3e-oNxjRTCBXchffju5OFTqW4zPIik-HKxH7-w&signature=i5%2FQxBf7FIGc6GvAfNcpFnVKpEw%3D把该URL键入浏览器,可以执行成功,返回一段XMLresponse:如果回到控制台界面的instaneetab,可以看到一个新的vminstanee被创建。用同样的方法,使用如下命令,列举出Admin用户下的全部虚拟机。http:/192.168.1.4:8080/client/api?command=listVirtualMachines&account=admin&domainld=1&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD仃moVw3e-0NxjRTCBXchffju5OFTqW4zPlik-HKxH7-w&signature=%2BQMXTBOoicZJG6EosCcRGvO7OWU%3DQ10:CentOS需要安装perl开发环境才能运行上面的脚本。如果在命令执行过程中出现类似cannotlocateWWW/Mechanize类的错误,需要先安装cpan:yuminstallcpan然后用cpan安装缺少的module:cpaninstallWWW:Mechanize后面缺少哪个module,就用cpan安装该module,直到所使用的包都被装入。总体而言,CloudStack的API提供了很灵活和强大的功能,而且通过CloudBridge,更是实现了与亚马逊EC2API的兼容。回页首现状与展望CloudStack目前在Apache站点的更新也很快,最新的4.0也已经发布,它提供了VLAN间路由(VPC)能力、给管理资源保存元数据、增加新类型存储、和支持Ubuntu12.04和REHL6.3等新功能。在国内,像中国电信这类大型企业,还有一些中小型企业,都在迅速的使用CloudStack来构建它们的公共云或私有云、混合云平台。在这些用户的实践中,CloudStack对丰富种类的Hypervisor、存储类型的支持、强大的伸缩能力和网络功能、良好的安全设计、灵活的API调用都令人留下深刻印象。与OpenStack的竞争会是接下来几年CloudStack无法回避的问题,相对于对手的后发优势,CloudStack更强调成熟的产品应用。但随着自身的开源,将来的IaaS市场也许会在求同方面走的更远。
展开阅读全文