1. OpenStack简介
OpenStack 是一个开源软件,它提供了一个部署云的平台。为虚拟计算或存储服务的公有/私有云,提供可扩展的、灵活的云计算。
OpenStack包含了一组由社区维护的开源项目,主要项目有Compute(Nova), Object Storage(Swift),Image Service(Glance)。
Nova提供虚拟计算服务,Swift提供存储服务,Glance提供虚拟机镜像的注册、分发服务。
他们之间的关系可以用这个简图来表示:
![](http://dl.iteye.com/upload/attachment/589851/4a9a6f3d-8361-3102-b6d3-aa05936447ed.jpg)
2. OpenStack能够做什么
OpenStack能帮我们建立自己的IaaS,提供类似Amazon Web Service的服务给用户:
普通用户可以通过它注册云服务,查看运行和计费情况
开发和运维人员可以创建和存储他们应用的自定义镜像,并通过这些镜像启动、监控和终止实例
平台的管理人员能够配置和操作网络,存储等基础架构
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/589859/2a59d1a6-451d-359e-a1e5-60f03e8736a4.png)
3. OpenStack Compute(Nova)的软件架构
下图是Nova的软件架构,每个nova-xxx组件是由python代码编写的守护进程,每个进程之间通过队列(Queue)和数据库(nova database)来交换信息,执行各种请求。而用户通过nova-api暴露的web service来同其他组件进行进行交互。Glance是相对独立的基础架构,nova通过glance-api来和它交互。
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/589868/fc133453-cd10-3adb-b869-5fa3d0bb64da.png)
4. Nova各个组件的作用
nova-api是Nova的中心。它为所有外部调用提供服务,除了提供OpenStack本身的API规范外,他还提供了兼容EC2的部分API,所以也可以用EC2的管理工具对nova进行日常管理。
nova-compute负责对虚拟机实例进行创建、终止、迁移、Resize的操作。工作原理可以简单描述为:从队列中接收请求,通过相关的系统命令执行他们,再更新数据库的状态。
nova-volume管理映射到虚拟机实例的卷的创建、附加和取消。
nova-network从队列中接收网络任务,然后执行任务控制虚拟机的网络,比如创建桥接网络或改变iptables的规则。
nova-scheduler 提供调度,来决定在哪台资源空闲的机器上启动新的虚拟机实例
Queue为守护进程传递消息。只要支持AMQP协议的任何Message Queue Sever都可以,当前官方推荐用RabbitMQ。
SQL database存储云基础架构中的各种数据。包括了虚拟机实例数据,网络数据等。
user dashboard是一个可选的项目。它提供了一个web界面来给普通用户或者管理者来管理、配置他们的计算资源。
5. Nova的硬件架构
Nova采用无共享、基于消息的架构,我们能安装每个nova-xxx组件在单独的服务器上,这样可以根据不同目的进行不同的配置安装
单结点:一台服务器运行所有的nova-xxx组件,同时也驱动虚拟实例。这种配置只为尝试Nova,或者为了开发目的进行安装。
![](http://dl.iteye.com/upload/attachment/589876/299736b6-8b67-3386-9106-6f350ade40b3.png)
1控制节点+N个计算节点:一个控制结点运行除nova-compute外的所有nova-services,然后其他compute结点运行nova-compute。所有的计算节点需要和控制节点进行镜像交互,网络交互,控制节点是整个架构的瓶颈,这种配置主要用于概念证明或实验环境。
![](http://dl.iteye.com/upload/attachment/589884/2d336040-6ee4-3a08-a1df-5b6599d4186b.png)
多节点:增加节点单独运行nova-volume,同时在计算节点上运行nova-network,并且根据不同的网络硬件架构选择DHCP或者VLan模式,让控制网络和公共网络的流量分离。
![点击查看原始大小图片](http://dl.iteye.com/upload/attachment/589892/ebe9994a-3ffb-398c-a39d-55a3761c5b14.png)
6. OpenStack的安装
OpenStack的安装是比较麻烦,可以参考官方文档进行: http://docs.openstack.org/diablo/openstack-compute/admin/content/ , 文档有一些地方没有更新到最新版本,会遇到一些小问题,推荐一个第3方脚本进行安装: http://devstack.org/ 它适合用来搭建实验环境。可以通过阅读这个脚本,同时配合官方文档来理解整个软件架构。
同时通过Ubuntu源安装的nova在实际使用过程中遇到一些小问题,都需要打补丁来解决,建议了解整个配置以后,可以改成从git上获取stable分支的代码进行安装,这样日后维护升级也比较方便。
如果你需要从无到有搭建整个数据中心,推荐Crowbar实现自动化远程安装: https://github.com/dellcloudedge/crowbar 从裸机到可用系统只用在web界面点击几下即可完成,还自带各种SA常用功能(比如nagios监控等),不过这个东西也比较复杂,推荐有兴趣的SA们试用。
7. 遇到的问题
官方文档和devstack脚本基本上都是为了搭建实验环境写的,没有为生产环境做最佳实践的指导,在安装过程中遇到很多问题,比如:
A. 多节点部署的时候要用multi host参数
B. 使用VLAN+硬件网关的时候做网络配置时候,需要指定dnsmasq_config_file来强制覆盖dnsmasq的网关配置
C. 用KVM制作windows镜像的时候需要安装virtio驱动
D. 通过Ubuntu源安装的Nova,在Ami格式的镜像启动的instance无法做snapshot,需要打 补丁
E. 通过Ubuntu源安装的Nova,在启用keystone进行身份认证的情况下,无法提供EC2的兼容API,也需要打补丁
8. Openstack 的各种资料
A. 官网和wiki http://docs.openstack.org/
B. Devstack的脚本说明,对于了解如何配置各个组件非常有帮助 http://devstack.org/stack.sh.html
C. Rackspace的参考架构,有很多很有用的信息,包括硬件,网络,软件配置等等,强烈推荐: http://www.referencearchitecture.org
D. 看你准备基于什么技术进行虚拟化,KVM或者Xen的文档也是很有用的。
9. 展示
用dashboard管理虚拟机
![](http://dl.iteye.com/upload/attachment/589899/86c0d050-6991-3888-908b-005d6a7f3bfb.png)
通过noVNC在web上连接到虚拟机
NOVA安装指南
何为openstack
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算?软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。以Python编程语言编写并整合Tornado网页服务器、Nebula运算平台,使用Twisted软件框架,遵循Open Virtualization Format、AMQP、SQLAlchemy等标准。虚拟机器软件支援包括:KVM、Xen、VirtualBox。
openstack由三个项目组成,他们分别是OpenStack Compute(Nova),OpenStack Object Storage(Swift),以及OpenStack Image Service(Glance)。
OpenStack Compute,为云组织的控制器,它提供一个工具来部署云,包括运行实例、管理网络以及控制用户和其他项目对云的访问(the cloud through users and projects)。它底层的开源项目名称是Nova,其提供的软件能控制IaaS云计算平台,类似于Amazon EC2和Rackspace Cloud Servers。
OpenStack Object Storage,是一个可扩展的对象存储系统。对象存储支持多种应用,比如复制和存档数据,图像或视频服务,存储次级静态数据,开发数据存储整合的新应用,存储容量难以估计的数据,为Web应用创建基于云的弹性存储。
OpenStack Image Service,是一个虚拟机镜像的存储、查询和检索系统,服务包括的RESTful API允许用户通过HTTP请求查询VM镜像元数据,以及检索实际的镜像。VM镜像有四种配置方式:简单的文件系统,类似OpenStack Object Storage的对象存储系统,直接用Amazon's Simple Storage Solution (S3) 存储,用带有Object Store的S3间接访问S3。
三个项目的基本关系如下图1-1所示:
1-1 OpenStack三个组件的关系
OpenStack Compute逻辑架构中,组件中的绝大多数可分为两种自定义编写的Python守护进程(custom written python daemons)。
接收和协调API调用的WSGI应用(nova-api, glance-api, etc)
执行部署任务的Worker守护进程(nova-compute, nova-network, nova-schedule, etc.)
然而,逻辑架构中有两个重要的部分,既不是自定义编写,也不是基于Python,它们是消息队列和数据库。二者简化了复杂任务(通过消息传递和信息共享的任务)的异步部署。
逻辑架构图3-1如下所示:
3-1 OpenStack Compute逻辑架构
从图中,我们可以总结出三点:
终端用户(DevOps, Developers 和其他的 OpenStack 组件)通过和nova-api对话来与OpenStack Compute交互。
OpenStack Compute守护进程之间通过队列(行为)和数据库(信息)来交换信息,以执行API请求。
OpenStack Glance基本上是独立的基础架构,OpenStack Compute通过Glance API来和它交互。
其各个组件的情况如下:
nova-api守护进程是OpenStack Compute的中心。它为所有API查询(OpenStack API 或 EC2 API)提供端点,初始化绝大多数部署活动(比如运行实例),以及实施一些策略(绝大多数的配额检查)。
nova-compute进程主要是一个创建和终止虚拟机实例的Worker守护进程。其过程相当复杂,但是基本原理很简单:从队列中接收行为,然后在更新数据库的状态时,执行一系列的系统命令执行他们。
nova-volume管理映射到计算机实例的卷的创建、附加和取消。这些卷可以来自很多提供商,比如,ISCSI和AoE。
Nova-network worker守护进程类似于nova-compute和nova-volume。它从队列中接收网络任务,然后执行任务以操控网络,比如创建bridging interfaces或改变iptables rules。
Queue提供中心hub,为守护进程传递消息。当前用RabbitMQ实现。但是理论上能是python ampqlib支持的任何AMPQ消息队列。
SQL database存储云基础架构中的绝大多数编译时和运行时状态。这包括了可用的实例类型,在用的实例,可用的网络和项目。理论上,OpenStack Compute能支持SQL-Alchemy支持的任何数据库,但是当前广泛使用的数据库是sqlite3(仅适合测试和开发工作),MySQL和PostgreSQL。
OpenStack Glance,是一个单独的项目,它是一个compute架构中可选的部分,分为三个部分:glance-api, glance-registry and the image store. 其中,glance-api接受API调用,glance-registry负责存储和检索镜像的元数据,实际的Image Blob存储在Image Store中。Image Store可以是多种不同的Object Store,包括OpenStack Object Storage (Swift)
最后,user dashboard是另一个可选的项目。OpenStack Dashboard提供了一个OpenStack Compute界面来给应用开发者和devops staff类似API的功能。当前它是作为Django web Application来实现的。当然,也有其他可用的Web前端。接下来我们体验一下openstack:
一、环境
硬件:一台X86小麻雀台式机 AMD处理器 单网卡(官方要求多台服务器双网卡)
系统:ubuntu11.10 desktop版
nova版本:
2011.3 (2011.3-nova-milestone-tarball:tarmac-20110922115702-k9nkvxqzhj130av2)
网络:可以上互联网,由于需要的安装包太多并且依赖关系复杂,所以我使用在线安装方式。本地网卡ip:10.11.69.79,实例ip:172.16.0.0/28
二、安装
$passwd root //使用root安装,避免安装过程中产生不必要的权限问题
1. nova安装
由于openstack是由python语言编写,所以要先安装python包
# apt-get install python-software-properties
# add-apt-repository ppa:nova-core/release
# apt-get update
安装消息队列服务器rabbitmq:
# apt-get install -y rabbitmq-server
安装python依赖包:
# apt-get install -y python-greenlet python-mysqldb
安装nova-packages及一些依赖包:
# apt-get install -y nova-common nova-doc python-nova nova-api nova-network nova-objectstore nova-scheduler nova-compute glance
安装 euca2ools 工具包,后面注册镜像时候用到,否则会注册失败:
# apt-get install -y euca2ools unzip
2. 安装数据库
openstack提供了多种数据库可用,再次我使用mysql(其他数据库不了解):
# apt-get install -y mysql-server
设定数据库密码:123456
编辑/etc/mysql/my.cnf,修改‘bind-address' 从127.0.0.1到0.0.0.0,并重启mysql
# sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf
# /etc/init.d/mysql restart
创建”nova”库:
#mysql>create database nova;
#mysql> grant all privileges on *.* to root@'%' identified by '123456';
#mysql> grant all privileges on *.* to nova@'%' identified by '123456';
#mysql> flush privileges;
重启所有服务:
#restart libvirt-bin;restart nova-network;restart nova-compute;restart nova-api;restart nova-objectstore;restart nova-scheduler; restart glance-registry;restart glance-api
3. 配置网络参数
# more /etc/network/interfaces
auto br100
iface br100 inet static
bridge_ports eth0
bridge_stp off
bridge_maxwait 0
bridge_fd 0
address 10.11.69.79
netmask 255.255.255.0
broadcast 10.11.69.255
gateway 10.11.69.1
dns-nameservers 192.168.8.57
//我只有一个网卡eth0,使用10.11.69.79上网,网关和dns地址都是公司共同使用的。
#/etc/init.d/networking restart //重启网卡
配置nova:
#more /etc/nova/nova.conf //我使用openstack的dhcp网络模式
--dhcpbridge_flagfile=/etc/nova/nova.conf //dhcp 桥接配置文件位置
--dhcpbridge=/usr/bin/nova-dhcpbridge //桥接命令位置
--logdir=/var/log/nova //nova日志存放路径
--state_path=/var/lib/nova //nova 状态文件位置
--lock_path=/var/lock/nova //lock 文件位置
--force_dhcp_release=True //dhcp 释放
--use_deprecated_auth //是否启用外部认证
--iscsi_helper=tgtadm
--verbose //是否启用详细日志消息
--flagfile=/etc/nova/nova-compute.conf //compute配置文件地址
--network_manager=nova.network.manager.FlatDHCPManager //默认网络模式
--flat_network_dhcp_start=172.16.0.2 //dhcp分配给的实例的ip的起始地址
--flat_injected=False
--public_interface=eth0
--s3_host=10.11.69.79 //objectstore 服务地址
--rabbit_host=10.11.69.79 //rabbitmq 队列服务器地址
--osapi_host=10.11.69.79
--ec2_api=10.11.69.79
--ec2_url=http://10.11.69.79:8773/services/Cloud //nova-api 接口地址
--sql_connection=mysql://root:123456@10.11.69.79/nova //数据库连接参数
--image_service=nova.image.glance.GlanceImageService //默认存储镜像使用的服务
--glance_host=10.11.69.79 //glance 服务地址
--fixed_range=172.16.0.0/8 //运行实例分配 ip段
--iscsi_ip_prefix=10.11.69
--bridge_interface=br100
--flat_interface=eth0
--network_size=256 //网络主机数
--libvirt_type=kvm //通过 libvirt 连接的虚拟化类型
4. 修改sql_connection参数来指定数据库连接地址
#vi /etc/glance/glance-registry.conf
sql_connection = mysql://root:123456@localhost/glance
在mysql建立glance数据库
mysql>create database glance;
#chown -R root:nova /etc/nova
改变一下/etc/nova的属主
#chmod 640 /etc/nova/nova.conf
重启所有的服务:
#restart libvirt-bin;restart nova-network;restart nova-compute;restart nova-api;restart nova-objectstore;restart nova-scheduler; restart glance-registry;restart glance-api
5. nova运行环境配置
#/usr/bin/nova-manage db sync //在数据库nova中建立数据表
创建管理员用户:baiying
#/usr/bin/nova-manage user admin baiying
export EC2_ACCESS_KEY=6aa51bfd-6bfb-4a94-bf55-3c4bacc4d59a export
EC2_SECRET_KEY=aba78372-8a22-460c-af7e-d6da1ebf2eef //产生的密钥
创建管理员用户baiying的工程 baiying-proj
#/usr/bin/nova-manage project create baiying-proj baiying
为实例创建网络:
#nova-manage network create novanet 172.16.0.0/28 1 100 --bridge=br100
//创建了172.16.0.0的网段,含有一个网络,100个ip
查看建立的实例的ip段:
#nova-manage network list
id IPv4 IPv6 start address DNS1
1 172.16.0.0/28 None 172.16.0.2 8.8.4.4
通过命令查看建立的工程:
# nova-manage project list
baiying-proj
6. 创建证书
#mkdir creds
#nova-manage project zipfile baiying-proj baiying creds/novacreds.zip
#unzip creds/novacreds.zip -d creds/
#source creds/novarc
# cat /root/creds/novarc >> .bashrc
# source .bashrc
查看服务是否正常使用
# euca-describe-availability-zones verbose
AVAILABILITYZONE nova available
AVAILABILITYZONE |- zhaohh-G41MT-S2
AVAILABILITYZONE | |- nova-scheduler enabled :-) 2011-11-11 08:34:27
AVAILABILITYZONE | |- nova-compute enabled :-) 2011-11-11 08:34:27
AVAILABILITYZONE | |- nova-network enabled :-) 2011-11-11 08:34:27
# nova-manage service list
Binary Host Zone Status State Updated_At
nova-scheduler zhaohh-G41MT-S2 nova enabled :-) 2011-11-11 08:41:02
nova-compute zhaohh-G41MT-S2 nova enabled :-) 2011-11-11 08:41:04
nova-network zhaohh-G41MT-S2 nova enabled :-) 2011-11-11 08:41:02
使能够ping 和ssh compute节点上的虚拟机:
# euca-authorize -P icmp -t -1:-1 default
# euca-authorize -P tcp -p 22 default
7. 镜像制作
从http://smoser.brickies.net/ubuntu/ttylinux-uec/下载镜像并上传到服务器这是我下载的镜像ttylinux-uec-i386-11.2_2.6.35-16_1.tar.tar
注册镜像
# uec-publish-tarball ttylinux-uec-i386-11.2_2.6.35-16_1.tar.tar ubuntu1102
查看注册的镜像:
# euca-describe-images
8. 创建ssh keypair密钥
# euca-add-keypair mykey > mykey.priv
# chmod 600 mykey.priv //权限不可过大,否则登录实例会提示失败
创建一个虚拟机:
# euca-run-instances ami-00000006 -k mykey -t m1.tiny
//可以创建多个
查看创建好的实例:
# euca-describe-instances
# euca-describe-instances
RESERVATION r-b9rwrtsb baiying-proj default
INSTANCE i-00000005 ami-00000006 172.16.0.2 172.16.0.2 running mykey
9. 为实例添加外网地址,并分配
#nova-manage floating create 10.11.69.200
# euca-allocate-address
ADDRESS 10.11.69.200
#euca-associate-address -i i-00000006 10.11.69.200
10. 登录实例
root@zhaohh-G41MT-S2:~# ssh -i mykey.priv root@10.11.69.200
Chop wood, carry water.
# hostname
server-1
#passwd root
Changing password for root
New password:
Bad password: too weak
Retype password:
Password for root changed by root
# exit
logout
Connection to 10.11.69.200 closed.
【51CTO独家特稿】OpenStack是一套用来管理虚拟机的平台软件。它不是一个单一的软件,而是集成了很多个组件用来协同合作。简单的来说,譬如有十台服务器,在VMware的情况下,我们在每台服务器上安装esx或者esxi,然后装一台vcenter,在vcenter的管理界面里把十台服务器的esx通过域名或者ip加入,就能在vcenter里面统一管理。类似的,红帽也有virsh这种管理虚拟机的程序。
相关阅读:在Ubuntu上安装和配置OpenStackNova
在这里我不介绍其他的云平台的管理软件,只是介绍如何从技术角度来使用OpenStack。如果要作为生产环境的话,你还需要考虑更多,譬如架构,网络拓扑,存储的方式,节点的分布等等。
在本篇文章里,我将介绍采用ec2兼容认证的方式。所有组件安装在一台controller上。
关键字定义
控制端:类似vcenter的管理系统。
节点:类似安装了esx的服务器。
nova组件:安装在节点上,让节点能按照控制端的命令来操作节点上的虚拟机或者存储。
glance组件:用来管理镜像。
环境准备
ubuntu11.10,服务器双网卡
步骤
安装完基本的操作系统后
$sudo apt-get update
$sudo apt-get upgrade
$sudo apt-get install bridge-utils #安装网桥软件
配置网络接口
在这里我的架构是eth0连接了外网,即我們可以访问的网口。eth1做了网桥,和节点之间通过一个交换机连接。这样的好处是,内部节点和控制器的流量都走br100的交换机,而不会影响虚拟机上的应用使用的网络。
$sudo vi /etc/network/interfaces
autoeth0
iface eth0 inet static
address 192.168.200.21
netmask255.255.255.0
network 192.168.200.0
broadcast192.168.200.255
gateway 192.168.200.10
auto br100
ifacebr100 inet static
bridge_ports eth1
bridge_stpoff
bridge_maxwait 0
bridge_fd 0
address10.200.200.2
netmask 255.255.255.0
$ sudo/etc/init.d/networking restart
初期准备工作做好,接下来就是要安装关于nova,glance等组件
$sudo apt-get install -y rabbitmq-server #安装MQ消息組件
$sudo apt-get install -y python-greenlet python-mysqldb #安装Pythondependencies
接下来安装各个nova组件及依赖
$sudo apt-get install nova-volume nova-vncproxy nova-apinova-ajax-console-proxy
$sudo apt-get install nova-doc nova-scheduler nova-objectstore
$sudo apt-get install nova-network nova-compute
$sudo apt-get install glance
安装euca2ools和unzip
$sudo apt-get install -y euca2ools unzip
接下来我们安装数据库,这裡我选择了MySQL,其实个人觉得PostgreSQL更好。
$sudo su -
#MYSQL_PASS=nova设定mysql的密码和nova数据库的密码
#cat <<MYSQL_PRESEED | debconf-set-selections
>mysql-server-5.1mysql-server/root_password password $MYSQL_PASS
>mysql-server-5.1mysql-server/root_password_again password $MYSQL_PASS
>mysql-server-5.1mysql-server/start_on_boot boolean true
>MYSQL_PRESEED
#apt-get install -y mysql-server
#exit退出root环境
$sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/my.cnf修改my.cnf配置文件
$sudo service mysql restart
$MYSQL_PASS=nova在普通用户环境下把密码再次设置一下变量
$NOVA_PASS=notnova这是nova数据库的密码
$sudo mysql -uroot -p$MYSQL_PASS -e 'CREATE DATABASE nova;'创建一个名字为nova的数据库,这裡建议新手使用nova的名字,如果这裡换别的名字,那麽在nova的配置文件裡面也需要更改
$sudo mysql -uroot -p$MYSQL_PASS -e "GRANT ALL PRIVILEGES ON *.*TO 'nova'@'%' WITH GRANT OPTION;"
$sudo mysql -uroot -p$MYSQL_PASS -e "SET PASSWORD FOR 'nova'@'%'= PASSWORD('$NOVA_PASS');"
至此,nova,glance的安装部分完成,接下来是配置。
nova配置
$sudo vi /etc/nova/nova.conf
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/data/openstack/nova这裡的/data/openstack/nova是我新建的一个卷和目录,确保你有这个,并且要属于nova用户,或者你也可以使用他的默认设置
--instances_path=/data/openstack/nova/instances修改了默认存放instances的地方
--lock_path=/var/lock/nova
--force_dhcp_release=True
--use_deprecated_auth
--iscsi_helper=tgtadm
--verbose
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--network_manager=nova.network.manager.FlatDHCPManager
--my_ip=10.200.200.2这是我的内网ip地址
--public_inter>
--sql_connection=mysql://nova:notnova@localhost/nova刚才建立的数据库
--libvirt_type=kvm
--api_paste_config=/etc/nova/api-paste.ini
--image_service=nova.image.glance.GlanceImageService
--ec2_dmz_host=192.168.200.21
--ec2_url=http://192.168.200.21:8773/services/Cloud
--rabbit_host=localhost
--glance_api_servers=10.200.200.2:9292
--flat_network_bridge=br100
--flat_inter>
--flat_network_dhcp_start=10.200.200.51指定从instances分配从51开始,但貌似这个选项不起作用
--fixed_range=10.200.200.0/24这个选项指定instances的网段
--flat_injected=False
--multi_host=1使用multi_host,即以后可以在节点上也使用nova-network
--libvirt_use_virtio_for_bridges使用virtio做instances的网卡模式
然后是glance的:
$sudo vi /etc/glance/glance-api.conf
修改filesystem_store_datadir参数,来指定你需要存放images的目录,当然属主也要改成glance用户。
$sudo vi /etc/glance/glance-registry.conf
这个文件可以选修改sql_connection参数来指定你的数据库。
如果你要修改,使用mysql里面的数据库,请确保在mysql裡面建立了一个相对应的数据库
sql_connection= mysql://nova:notnova@localhost/glance
这是我的配置,我在mysql建立了一个glance的数据库
$sudo chown -R root:nova /etc/nova
改变一下/etc/nova的属主
$sudo chmod 640 /etc/nova/nova.conf
重启各个服务
$sudo restart libvirt-bin
$sudo restart nova-network
$sudo restart nova-compute
$sudo restart nova-api
$sudo restart nova-objectstore
$sudo restart nova-scheduler
$sudo restart glance-registry
$sudo restart glance-api
注意:我们这裡没有起nova-volume,是因为虽然我们安装了volume,但是volume需要单独的一个vg来使用,我们现在还没配置volume,所以起不来。
这裡可能network服务和compute没法起来,先暂时不要去管。
接下去,我们做配置nova的运行环境了
$sudo nova-manage db sync
nova-manageuser admin <user_name>
在这裡我们可以创建一个用户,如
$sudo nova-manage user admin test
创建成功屏幕上会返回下面这样的输出:
exportEC2_ACCESS_KEY=d6aa7747-4324-4abc-9604-4f7d6a2f8f3f
exportEC2_SECRET_KEY=2b204b75-da2d-47b8-ba7a-611d71f0ecbf
nova-manageproject create <project_name> <user_name>
创建一个项目,属于刚才我们建的那个用户如:
$sudo nova-manage project create test-proj test
nova-managenetwork create --help
创建一个实例的网络,如:
$sudo nova-manage network create --label=test-net--fixed_range_v4=10.200.200.0/24 --num_network=1 --network_size=256
再次启动刚才失败的服务
$sudo start nova-network
$sudo start nova-compute
$sudo start nova-scheduler
怎么样,成功了吧。
另外,在起每个服务的时候,最好看一下日志,譬如sudotail -f /var/log/nova/nova-network来确定有没有报错,也可以用psaux | grep [n]ova-network来确认服务有没有开启。如果起服务失败,你确认好原因,修改好以后,需要用sudostart而不是sudorestart来起
好了。这样计算的环境就部署好了。我们可以用命令来看一下状态:
$sudo nova-manage service list
$sudo nova-manage network list
如此这般。
接下来创建证书,以方便我们使用euca工具
$cd
$mkdir creds
$sudo nova-manage project zipfile test-proj test creds/novacreds.zip
$unzip creds/novacreds.zip -d creds/
$source creds/novarc
注意每次你重新登录shell的时候,需要source一下这个认证文件才能使用euca;当然你也可以把novarc的内容>>到你的用户profile文件或者bashrc
OK,完成,我们可以用工具来看一下
$euca-describe-availability-zones verbose
VAILABILITYZONEnova available
AVAILABILITYZONE|- nova-test
AVAILABILITYZONE| |- nova-network enabled :-) 2011-10-17 04:45:44
AVAILABILITYZONE| |- nova-compute enabled :-) 2011-10-17 04:45:45
AVAILABILITYZONE| |- nova-scheduler enabled :-) 2011-10-17 04:45:45
至此,成功启用了服务。当你发现服务不能正常使用时,用psaux | grepnova检查一下服务有没有开启,并需要详细观察/var/log/nova/目录下的各个服务的日志文件,这样才能获得更进一步的信息。
接下来我们可以用kvm来创建一个image镜像
$sudo apt-get install kvm-pxe
安装一下这个,否则运行kvm的时候会有个警告
$kvm-img create -f raw server.img 5G
$sudo kvm -m 1024 -cdrom rhel5.iso -drive file=server.img,if=virtio,index=0 -boot d -net nic -net user-nographic -vnc :0
这里我们使用RHEL5的iso,运行完这个命令,可以用vnc连接。
在你的本机连接服务器:ssvncviewer192.168.200.21 :0
打开vnc你就可以看到安装界面。
安装完以后,把下面一段写入rhel镜像的/etc/rc.local的开头:
depmod-a
modprobeacpiphp
#simple attempt to get the user ssh key using the meta-data service
mkdir-p /root/.ssh
echo>> /root/.ssh/authorized_keys
curl-m 10 -shttp://169.254.169.254/latest/meta-data/public-keys/0/openssh-key |grep 'ssh-rsa' >> /root/.ssh/authorized_keys
echo"AUTHORIZED_KEYS:"
echo"************************"
cat/root/.ssh/authorized_keys
echo"************************"
保存退出,这样image就做好了。
使用glance上传镜像
$glance --verbose add name="rhel5" disk_format=rawis_public=true < server.img
同时你应该观察/var/log/glance/registry和api的log。成功之后,用
$glance index
看看镜像列表。
启动你的实例
$euca-describe-images
查看你现在可用的image,输出类似下面这样:
IMAGEami-00000003 server.img
记住这里ami-000000003这个image号。
$euca-run-instances -t m1.tiny ami-00000003
启动ami-00000003镜像的实例。-t指明了实例的类型,类型规定了cpu,内存,磁盘大小等信息。
观察/var/log/nova/nova-api.lognova-scheduler.log,nova-compute,nova-network.log的输出信息,同时你也可以使用vnc连接serverip:0来看实例的console。
用命令$euca-describe-instances来查看你目前的实例情况。第一次启动实例会比较慢,因为需要把image从glance拷贝到nova下的实例目录。
由于nova目前发展的很快,diablo的release版本功能可以完成日常的一些需求。但是开发版本的nova可以更好的结合keystone,novaclient,dashboard等一些其他的项目,使得OpenStack更加健全。有兴趣的朋友,可以在生产环境使用repo的安装方式,在测试环境测试开发版本。我本人由于在生产环境中使用了git方式安装的开发版本,因此后续更加完善的整合,我都将以开发版本的形式出现。当然使用开发版本的话,会有更多的烦恼,但也同样有更多的乐趣和动手的实践,能更进一步了解其工作的原理机制。
作者简介:livemoon(博客),小小SA,关注mac,BSD,openstack,开源技术,webos。座右铭:非淡泊無以明志,非寧靜無以致遠。
OpenStack、CloudStack(Citrix创建,曾OpenStack的一大拥护者)、Eucalyptus、OpenNebula及一些其他的云开源基础设施.
毋庸置疑,OpenStack并不是唯一开放源码的项目,更不是开源云计算平台的唯一选择。它面对的不仅仅有成熟商业版的Eucalyptus的阻击,更有亚马逊的公有云计算的强力竞争,即使是前盟友Citrix也转而支持了Apache CloudStack项目。来自Zenoss得最近的一项调查报告表明,在早期大家还是比较看好OpenStack的。在600名受访者之中,虽然有82.9%的人表示并没有使用的开源云,但是在其中有超过一半的人(56.9%)表示,他们正在计划在未来两年进行部署开源云。而且62.8%的受访者表示,他们会考虑使用OpenStack进行部署,对比而言有46.8%的人会考虑使用CloudStack平台,仅仅有23.8%的人会计划使用Eucalyptus部署。
在CSDN最近一次的采访中,ezCloud的联合创始人、高级技术总监以及首席架构师蒋清野表示:“OpenStack功能不够完善,但是社区发展最快。Eucalyptus的功能最为完善,但社区较不活跃。今年4月初,CloudStack项目被捐赠给Apache基金会,其社区活跃度在短短的三个月内提升了三倍。6月底,Eucalyptus又宣布将原先企业版的功能全部开源,这个举措同样会对开源IaaS生态系统产生重大的影响。”虽然OpenStack在社区活跃度领先,并得到众多大佬的支持。但蒋清野表示,从目前开源IaaS生态系统的发展状况来看,断定OpenStack将成为IaaS的工业标准,还为时过早。
两年前OpenStack基于NASA的Nova项目和Rackspace的Swift项目合并得以建立,而今OpenStack已经成为云计算领域的一颗新星,继2012年四月发布Essex版本之后,在今年九月底OpenStack第6版Folsom正式发布,本文简要分析了OpenStack Folsom的架构。
OpenStack最新的组件
OpenStack目前有7个核心组件:Compute(计算), Object Storage(对象存储),Identity(身份认证),Dashboard(仪表盘), Block Storage(块存储), Network(网络) 和 Image Service(镜像服务) 。下面将依次进行解释:
Object Storage(代号为“Swift”) 允许进行存储或者检索文件。目前已经有几好家公司开始提供基于Swift商业存储服务,这些公司包括KT,Rackspace公司(Swift项目的发源地)和Internap,而且很多大公司内部也使用Swift来存储数据。
Image Service(代号为“Glance”) 是一个虚拟机镜像的存储、查询和检索系统,它提供了一个虚拟磁盘映像的目录和存储库,这些磁盘映像常常广泛应用于OpenStack Compute之中,而且这种服务在技术上是属于可选的,任何规模的云都适用于它。
Compute(代号为“Nova”) 根据需求提供虚拟服务。Rackspace公司和HP提供商业计算服务正是建立在Nova之上,Mercado Libre和NASA(Nova项目的起源地)内部也是使用的Nova。
Dashboard(代号为“Horizon”) 为所有OpenStack的服务提供了一个模块化的web-based用户界面。使用这个Web GUI,可以在云上完成大多数的操作,如启动实例,分配IP地址,设置访问控制等。
Identity(代号为“Keystone”) 为所有的OpenStack服务提供身份验证和授权。它还提供了一个在特定OpenStack云服务上的服务目录。
Network(代号为“Quantum”) 在接口设备之间提供“网络连接作为一种服务”,而这些接口设备主要靠其他的OpenStack服务进行管理(最有可能是Nova)。该服务允许用户创建自己的网络,然后连接接口。Quantum提供一个可插拔的体系架构,它能支持很多流行的网络供应商和技术,Quantum是Folsom版本中的新项目。
Block Storage(代号为“Cinder”) 提供稳定的数据块存储服务。这个项目的很多代码最初是来自于Nova之中(就是the nova-volume service)。但是请注意,这是块存储(或者volumes),而不是类似于NFS或者CIFS文件系统,Cinder在Folsom中也是一个全新的项目。除了这些核心项目之外,也有一些“孵化”项目,未来可能会考虑列入到OpenStack的核心项目之中。
对比AWS的服务
虽然所有的OpenStack服务都具有自己的特色,但是很多人还是希望能看到它与AWS相似的部分,而且Amazon一直也是OpenStack的重要对手。
- Nova在概念上类似于AWS中的EC2服务,不过事实上,它拥有很多种方法可以实现对EC2 API的兼容性。
- Swift在概念上类似于S3服务,不过swift具有很强的扩展性、冗余和持久性。
- Glance提供了很多与Amazon AMI catalog相似的功能。
- Cinder提供类似于EBS块存储服务。
概念架构
OpenStack项目成立的目的是“提供一个大规模的可扩展的云操作系统”。要做到这一点,每一个组成服务的设计都要精心考虑,这样才能打造一个完整的IaaS平台。从概念上,我们可以描绘出各种服务之间的关系:
- Dashboard("Horizon") 提供了一个Web前端到OpenStack其他的服务的界面
- Compute("Nova") 存储和检索虚拟磁盘(images)和Image上相关的元数据(Glance)
- Network("Quantum") 提供虚拟网络
- Block Storage("Cinder") 提供存储。
- Image("Glance") 在对象存储(Swift)上能够完成虚拟磁盘文件的存储
- 所有的服务进行身份验证(Keystone)
这是一个程式化的简化版的体系结构视图,而且假定构建者使用所有的OpenStack服务进行最常见的配置操作,不过它也仅仅是显示“操作员”看到的云——并没有显示出云用户具体的使用过程,比如说用户如何进行直接的对象存储。
逻辑架构
正如你能想象到的那样,逻辑结构要比概念架构复杂得多的多(如图所示)。正如任何面向服务的架构图一样,如果想说明所有可能的服务通信组合,图就会迅速“乱成一团”。下面的图,仅仅显示了一个最常见的基于OpenStack的云架构。当然,随着OpenStack支持技术种类的多样化,它并不能代表唯一的架构图。
该图与上述的概念架构图是一致的:
- 最终用户可以通过一个公共的Web界面(Horizon)进行交互或者通过其API直接访问每一项服务
- 所有的服务进行身份验证都是通过一个共同的来源(通过Keystone)
- 个人服务通过他们公共的API进行交互(除了那些拥有特别权限的地方才需要管理员的命令)
下面的章节中,将会深入到每个服务的架构之中进行说明。
Dashboard
Horizon是一个模块化的Django Web应用程序,它为终端用户和系统管理员提供界面来管理OpenStack服务。
和大多数Web应用程序一样,该体系架构是也是非常简单:
- Horizon通常使用Apache上的mod_wsgi进行部署。代码本身被分离成可复用的python模块,通过逻辑(使用不同的OpenStack API进行交互)和presentation(对不同的站点很容易实现定制)实现。
- 一个数据库,不过因为它主要依赖于其他的数据服务,所以本身存储的数据非常少。
从网络架构的角度来看,这项服务需要客户的访问而且要能够跟每项服务公共的API进行交互。如果您希望使用的管理员功能(即其他的服务),也需要连接到他们的Admin API端点(这不是客户能随意访问的)。
Compute
Nova是OpenStack中最复杂的分布式组件,它通过大量的进程合作,将最终用户的API请求发送到正在运行的虚拟机之上。以下是这些进程的列表及其功能的描述:
- nova-api:接受和响应最终用户Compute API的请求。它支持OpenStack Compute API,Amazon EC2 API和一个特殊的Admin API。它还引发多数业务流程的活动(如运行一个实例),并实施一些政策(主要是配额检查)。
- nova-compute:主要是一个人工守护进程,它可以通过虚拟机管理程序的API(XenAPI for XenServer/XCP, libvirt for KVM or QEMU, VMwareAPI for VMware等)来创建和终止虚拟机实例。虽然通过该进程做的事情是相当的复杂,但是它的基础原理却是非常的简单:接收队列中的动作,然后执行一系列的系统命令(如启动KVM实例),同时更新数据库中的状态。
- nova-volume:给虚拟机分配额外持久化的存储,管理持久卷到计算实例的创建,连接和分离。一个新的OpenStack项目,Cinder,将最终替代nova-volume功能。在发布的Folsom版本中,nova-volume和Block Storage service(块存储服务)有类似的功能。
- nova-network:该人工守护进程与nova-compute和nova-volume非常相似。它接受队列中的网络任务,然后执行任务操纵网络(如设立桥接接口或更改iptables规则)。不过该项功能被移植到Quantum之中,已经成为一个独立的OpenStack服务。
- nova-schedule:从概念上说是OpenStack Nova中最简单的一段代码:从队列上得到一个虚拟机实例请求并且决定它应该在哪里运行(特别是它应该运行在哪台计算服务器主机之上)
- SQL database:存储云基础设施的编译时和运行时的状态。这包括可用的实例类型,在使用中的实例,可用的网络和项目。从理论上讲,OpenStack Nova可以支持任何SQL-Alchemy支持的数据库,但是目前被广泛使用的数据库仅仅有sqlite3(只适用于测试和开发工作),MySQL和PostgreSQL。
- Nova还提供控制台的服务,让最终用户通过代理服务器访问他们的虚拟实例的控制台。这涉及到多个守护进程(nova-console,nova-vncproxy和nova-consoleauth)。(编译/@CSDN王鹏,审校/包研)
Object Store、Image Store、Identity、Network、Block Storage、Future Projects(敬请期待Part 2部分)
如何构造这么一个系统。
这张图是个简单的拓扑图。每台host都有两块网卡,连接switch1的是外部访问接口,就是用户可以直接连接到的ip网络,这个网络用来提供给虚拟机以便用户使用。switch2使用一个内部的网络,即对用户不可见,我们可以设定一个私有网络,这个网络用来node节点和controller之间的网络通讯,image的传输,nova-volume和node之间的iscsi的数据传输。
环境准备
所有的服务器都安装Ubuntu 11.10。
网络配置
参照上一篇文章中配置网络接口那一部分,请把br100的设置controller为10.200.200.1,node1为2,以此类推。
时间同步
时间同步很重要,保证你各个节点之间,通常在controller上配置ntp服务器。其余节点的配置文件以controller的ip为ntp服务器。
安装控制器
在这里我以controller的外网ip为10.11.3.62,内网为10.200.200.1,安装过程参照了devstack的脚本 ,我注释掉了脚本里的swift以及一些目前还用不到的部分。设置了一些自己的环境参数。
git clone git://github.com/livemoon/mydevstack cd mydevstack
修改localrc的内容:
DEST这个你可以设置为你自己想要安装的目录,我这里用/data/stack FIXED_RANGE这个很重要,简单的说就是switch2的网段 FLOATING_RANGE外网的地址网段 FLAT_INTERFACE这个就是你绑定网桥的那个网口。和你/etc/network/interfaces里一致 MYSQL_USER脚本里默认使用root,我使用了一个别的用户。这个随便你 然后执行脚本./stack.sh
一开始会问你几个密码,分别是mysql,rabbitmq,service_token,horizon and keystone admin。你可以按照自己的输入,只是要注意别搞混了。接着它就会运行下载安装,由于可能网络的原因会导致安装中途断掉,遇到这种情况,重新运行脚本即可。脚本执行完之后,屏幕上会出现“stack.sh completed in $SECONDS seconds.”
这时候,打开你的web浏览器。输入 “http://$HOST_IP/”,$HOST_IP/就是我的10.11.3.62,输入你自己的,如果出现登陆界面,输入admin和刚才的 horizon and keystone admin这个密码。如果登陆成功,那就说明你完成了controller的安装。
默认情况下,controller上面会起所有nova的服务,你应该可以看到你有几个cpu和内存可以使用,现在已经可以使用基本的功能了。这个时候,你的controller其实即是控制节点,也是计算节点(因为起了nova-compute和nova-network服务)。
以上就是一个最简单的搭建教程。如果你只是想看一下界面,知道它是怎么样的一个东西,那么现在已经足够了。
在下一篇中,我将介绍如何平行的添加节点,制作镜像,进行快照,设定实例的配置选项。如果你想继续深入,把OpenStack作为一个可以研究的对象的话,请先读懂devstack的脚本,然后我们再深入。
构建OpenStack的高可用性(HA,High Availability)
1、CAP理论
1) CAP 理论给出了3个基本要素:
- 一致性 ( Consistency) :任何一个读操作总是能读取到之前完成的写操作结果;
- 可用性 ( Availability) :每一个操作总是能够在确定的时间内返回;
- 分区可容忍性 (Tolerance of network Partition) :在出现网络分区的情况下,仍然能够满足一致性和可用性;
CAP 理论指出,三者不能同时满足。对这个理论有不少异议,但是它的参考价值依然巨大。
这个理论并不能为不满足这3个基本要求的设计提供借口,只是说明理论上3者不可绝对的满足,而且工程上从来不要求绝对的一致性或者可用性,但是必须寻求一种平衡和最优。
2) OpenStack、Swift与CAP的工程实践
对照CAP理论,OpenStack的分布式对象存储系统Swift满足了可用性和分区容忍性,没有保证一致性(可选的),只是实现了最终一致性。Swift如果GET操作没有在请求头中包含’X-Newest’头,那么这次读取有可能读到的不是最新的object,在一致性窗口时间内object没有被更新,那么后续GET操作读取的object将是最新的,保证了最终一致性;反之包含了’X-Newest’头,GET操作始终能读取到最新的obejct,就是一致的。
在OpenStack架构中,对于高可用性需要进行很多工作来保证。因此,下面将对OpenStack结构中的可用性进行讨论:
构建OpenStack的高可用性(HA,High Availability)
2、OpenStack的高可用性(OpenStack HA)
![OpenStack Essex Conceptual Integration](http://xip-1077754327103.http.internapcdn.net/xip-1077754327103/blog/nova-concept-int-essex.jpg)
![OpenStack Essex Logical Architecture](http://xip-1077754327103.http.internapcdn.net/xip-1077754327103/blog/nova-logical-arch-essex.jpg)
同其它大部分分布式系统一样,OpenStack也分为控制节点和计算节点两种不同功能的节点。控制节点提供除nova-compute以外的服务。这些组件和服务都是可以独立安装的,可以选择组合。
nova-compute在每个计算节点运行,暂且假设它是可信任的;或者使用备份机来实现故障转移(不过每个计算节点配置备份的代价相比收益似乎太大)。
控制节点的高可靠性是主要问题,而且对于不同的组件都有自己的高可靠性需求和方案。
(1)由于CotrolNode只有1个,且负责整个系统的管理和控制,因此当Cotrol Node不能提供正常服务时,怎么办?这就是常见的单节点故障(SPoF,single point of failure)问题。
高可用性基本上是没办法通过一台来达到目标的,更多的时候是设计方案确保在出问题的时候尽快接管故障机器,当然这要付出更大的成本。
对于单点问题,解决的方案一般是采用冗余设备或者热备,因为硬件的错误或者人为的原因,总是有可能造成单个或多个节点的失效,有时做节点的维护或者升级,也需要暂时停止某些节点,所以一个可靠的系统必须能承受单个或多个节点的停止。
常见的部署模式有:Active-passive主备模式,Active-active双主动模式,集群模式。
(2)那么如何构建冗余的控制节点?或者什么其它方法实现高可靠的控制?
很多人可能想到实现active-passive模式,使用心跳机制或者类似的方法进行备份,通过故障转移来实现高可靠性。Openstack是没有多个控制节点的,Pacemaker需要多种服务各自实现这种备份、监听和切换。
仔细分析控制节点提供的服务,主要就是nova-api、nova-network、nova-schedule、nova-volume,以及glance、keysonte和数据库mysql等,这些服务是分开提供的。nova-api、nova-network、glance等可以分别在每个计算节点上工作,RabbitMQ可以工作在主备模式,mysql可以使用冗余的高可用集群。
下面分别介绍:
1)nova-api和nova-scheduler的高可靠性
这样当控制节点出现故障,计算节点的nova-api等服务都照常进行。
3) 网络服务nova-network的高可靠性
OpenStack的网络已经存在多种高可靠的方案,常用的你只需要使用 --multi_host
选项就可以让网络服务处于高可用模式(high availability mode),具体介绍见Existing High Availability Options for Networking。
方案1: Multi-host
多主机。每个计算节点上配置nova-network。这样,每个计算节点都会实现NAT, DHCP和网关的功能,必然需要一定的开销,可以与hardware gateway方式结合,避免每个计算节点的网关功能。这样,每个计算节点都需要安装nova-compute外还要nova-network和nova-api,并且需要能连接外网。具体介绍见Nova Multi-host Mode against SPoF。
方案2: Failover
故障转移。能够4秒转移到热备份上,详细介绍见https://lists.launchpad.net/openstack/msg02099.html。不足之处是,需要备份机,而且有4秒延迟。
方案3: Multi-nic
多网卡技术。把VM桥接到多个网络,VM就拥有2种传出路由,实现故障时切换。但是这需要监听多个网络,也需要设计切换策略。
方案4: Hardware gateway
硬件网关。需要配置外部网关。由于VLAN模式需要对每个网络有一个网关,而hardware gateway方式只能对所有实例使用一个网关,因此不能在VLAN模式下使用。
方案5: Quantum(OpenStack下一个版本Folsom中)
Quantum的目标是逐步实现功能完备的虚拟网络服务。它暂时会继续兼容旧的nova-network的功能如Flat、Flatdhcp等。但是实现了类似multi_host的功能,支持OpenStack工作在主备模式(active-backup这种高可用性模式)。
Quantum只需要一个nova-network的实例运行,因此不能与multi_host模式共同工作。
Quantum允许单个租户拥有多个私人专用L2网络,通过加强QoS,以后应该能使hadoop集群很好的在nova节点上工作。
对于Quantum的安装使用,这篇文章Quantum Setup 有介绍。
4) glance、keystone的高可靠性
OpenStack的镜像可以使用swift存储,glance可以运行在多个主机。Integrating OpenStack ImageService (Glance) with Swift 介绍了glance使用swift存储。
集群管理工具 Pacemaker 是强大的高可用性解决方案,能够管理多节点集群,实现服务切换和转移,可与Corosync 和 Heartbeat等配套使用。Pacemaker 能够较为灵活的实现主备、N+1 、N-N 等多种模式。
bringing-high-availability-openstack-keystone-and-glance介绍了如何通过Pacemaker实现keystone和glance的高可靠。在每个节点安装OCF代理后,它能够告诉一个节点另一个节点是否正常运行glance和keysone服务,从而帮助Pacemaker开启、停止和监测这些服务。
Built-in Replication(N copies of accounts, container, objects) 3x+ data redundancy compared to 2x on RAID 内建冗余机制 RAID技术只做两个备份,而Swift最少有3个备份 | High Availability 高可靠性 |
Easily add capacity unlike RAID resize 可以方便地进行存储扩容 | Elastic data scaling with ease 方便的扩容能力 |
No central database 没有中心节点 | Higher performance, No bottlenecks 高性能,无瓶颈限制 |
6) 消息队列服务RabbitMQ的高可靠性
RabbitMQ失效就会导致丢失消息,可以有多种HA机制:
- publisher confirms 方法可以在故障时通知什么写入了磁盘。
- 多机集群机制,但是节点失效容易导致队列失效。
- 主备模式(active-passive),能够实现故障时转移,但是启动备份机可能需要延迟甚至失效。
在容灾与可用性方面,RabbitMQ提供了可持久化的队列。能够在队列服务崩溃的时候,将未处理的消息持久化到磁盘上。为了避免因为发送消息到写入消息之间的延迟导致信息丢失,RabbitMQ引入了Publisher Confirm机制以确保消息被真正地写入到磁盘中。它对Cluster的支持提供了Active/Passive与Active/Active两种模式。例如,在Active/Passive模式下,一旦一个节点失败,Passive节点就会马上被激活,并迅速替代失败的Active节点,承担起消息传递的职责。如图所示:
图 Active/Passive Cluster(图片来自RabbitMQ官方网站)
active-passive模式存在所说的问题,因此,基于RabbitMQ集群引入了一种双主动集群机制(active-active)解决了这些问题。http://www.rabbitmq.com/ha.html这篇文章详细介绍了RabbitMQ的高可靠部署和原理。
7) 数据库mysql的高可靠性
集群并不就是高可靠,常用的构建高可靠的mysql的方法有Active-passive主备模式:使用DRBD实现主备机的灾容,Heartbeat或者Corosync做心跳监测、服务切换甚至failover,Pacemaker实现服务(资源)的切换及控制等;或者类似的机制。其中主要使用Pacemaker实现了mysql的active-passive高可用集群。
一个重要的技术是DRBD:(distributed replication block device)即分布式复制块设备,经常被用来代替共享磁盘。
它的工作原理是:在A主机上有对指定磁盘设备写请求时,数据发送给A主机的kernel,然后通过kernel中的一个模块,把相同的数据传送给B主机的kernel中一份,然后B主机再写入自己指定的磁盘设备,从而实现两主机数据的同步,也就实现了写操作高可用。DRBD一般是一主一从,并且所有的读写操作,挂载只能在主节点服务器上进行,,但是主从DRBD服务器之间是可以进行调换的。这里有对 DRBD 的介绍。
HAforNovaDB - OpenStack介绍了只使用共享磁盘而没有使用DRBD,通过Pacemaker实现OpenStack的高可靠。
NovaZooKeeperHeartbeat介绍了使用ZooKeeper作心跳检测。
其它的方案,根据 MySQLPerformance Blog 的说法,MySQL几种高可用解决方案能达到的可用性如下:
一般来说,高可用性也就是建立冗余备份,常用策略有:
- 集群工作模式。多机互备,这样模式是把每个实例备份多份,没有中心节点,比如分布式对象存储系统Swift、nova-network多主机模式。
- 自主模式。有时候,解决单点故障(SPoF)可以简单的使用每个节点自主工作,通过去主从关系来减少主控节点失效带来的问题,比如nova-api只负责自己所在节点。
- 主备模式。常见的模式active-passive,被动节点处于监听和备份模式,故障时及时切换,比如mysql高可用集群、glance、keystone使用Pacemaker和Heartbeat等来实现。
- 双主模式。这种模式互备互援,RabbitMQ就是active-active集群高可用性,集群中的节点可进行队列的复制。从架构上来说,这样就不用担心passive节点不能启动或者延迟太大了?
总之,对于OpenStack的优化和改进不断,对于OpenStack的部署和应用也在不断尝试和发展。需要实践调优。实践非常重要,好的设计和想法需要实践来验证。
OpenStack基金会已经有5600个会员了;HP和Rackspace提供使用openstack的共有云;VMware和英特尔、NEC一道,正式获得OpenStack基金会金牌会员的资格
火力全开的OpenStack并不是唯一的IaaS技术框架提供者,包括CloudStack、Eucalyptus(中文译名为桉树)、OpenNebula以及oVirt在内的开源项目同样可以帮助企业构建内部或外部类似亚马逊公有云的服务
CloudStack还与Nicira进行了集成。Nicira是VMware耗资12.6亿美元收购的SDN(软件定义网络)领域的先锋企业,VMware正是凭借Nicira在OpenStack项目中的重要贡献,获得了OpenStack基金会金牌会员的资格。
网络的设计规划是CloudStack的一个亮点,也是CloudStack被广泛商业应用的一个主要原因.本篇深入讨论一下CloudStack中网络的设计方式.
CloudStack中根据不同的数据流量类型设计了管理,公共,客户及存储网络,可以简称为PMGS ( Public, Management, Guest, Storage) 网络.
Public:当虚拟机需要访问Internet或外部网络时,需要通过公共网络;这就说明客户虚拟机必须被分配某种形式的外网IP.用户可以在CloudStack的UI上获得一个IP来做NAT映射,也可以在Guest与Public之间做负载均衡.所有的Hypervisor都需要共享Public VLan以保证虚拟机对外的访问.
Management:CloudStack内部资源相互通信会产生Management流量,这些流量包括管理服务器节点与Hypervisor集群之间的通信,与系统虚拟机之间的通信或与其它组件之间的通信等;集群规模较小时管理流量只占用很少的带宽.
Guest:最终用户运行CloudStack创建的虚拟机实例时产生Guest流量,虚拟机实例之间的相互通信通过客户网络.
Storage:主存储与Hypervisor之间互连互通的流量;主存储与二级存储之间也会产生Stroage流量,比如虚拟机模板和快照的搬移.
CloudStack中网络模式可以分成基本网络和高级网络两种.其中MGS(Management,Guest,Storage)三种网络对于基本网络及高级网络通用.而P(Public)则只是针对高级网络才存在.可以对比下图:
基本网络 vs 高级网络
这里强烈建议不同的流量类型单独设置网卡,而对于存储网络最好用网卡绑定(NIC bonding),这样在系统的稳定性和性能方面都会有极大的提高.
基本网络模式下IP地址规划
如果打算使用基本网络模式建立CloudStack云计算环境,那就意味着客户虚拟机实例将会和CloudStack,Hypervisor整体架构拥有相同的CIDR段.这样在规划IP地址时每个资源域都要预留足够的IP地址.假设你规划有8个资源域,每个资源域容纳2000台虚拟机,那IP地址CIDR可规划成192.168.0.0/20,这样能保证最多16个资源域,每个资源域IP数量有2^12-1=4095个,除去机架,系统虚拟机,主机占用的IP,提供2000个VM的IP绰绰有余.
注:具体环境中采用哪个段的IP地址可能要与IT环境相一致.
高级网络模式下的IP地址规划
高级网络模式相对来说较为复杂,在这种模式下,每个账号都要分配:
1. 公网IP,这为了保证对外网的访问,通常这个IP设置在虚拟路由器上
2. Guest网络IP范围,比如默认的:10.1.1.0/24
3. Guest网络隔离的VLan ID
以上默认的Guest网络IP范围对于所有账户都是一样的,只有管理员可以进行更改使不同账号使用不同的的Guest网络IP范围.
一个账户下的客户虚拟机实例通过它专属的VLan进行相互之间的访问或与这个账户的虚拟路由器互通.客户虚拟机可以运行在资源域内任意一台主机上;通过二层交换的VLan端口汇聚(Trunk)功能,可以保证同一个VLan下所有的虚拟机互连互通.
预留系统IP地址
当配置一个机架时,需要为系统虚拟机保留一些IP地址,这部分是管理网络也称为私有IP地址.通常情况下10个IP地址对一个机架是足够用了.这些IP地址会被SSVM(二级存储系统虚机)和CPVM(控制台系统虚机).如果系统很庞大,CPVM会被自动部署多台来分担负载.
在整个云计算环境中,所有的主机和系统虚拟机都必须有一个唯一的IP地址,因此在添加新的资源域时,也需要考虑当前环境中资源域的网络规划.
本地链路IP(Link-Local)
在使用XenServer或KVM作为主机时,系统虚拟机(SSVM,CPVM,V-Router)会被分配一个本地链路的IP地址.这个地址的CIDR是169.254.0.0/16;这样看来本地链路的IP地址会有2^16-1=65535个,目前来看不太可能超过这个范围.如果一个机架只包含XenServer或KVM的集群,那可以分配给这个机架下的主机一个C类段的地址形如:x.x.x.x/24.如果是VMWare的集群,给机架分配的IP地址范围会被系统虚拟机占用一些那么就要考虑比C类段大一些的范围作为机架的IP地址段,形如:x.x.x.x/21,这样会有2^11-2=2046个IP供给主机,存储以及系统虚拟机使用.
虚拟机隔离
在同一个资源域内,虚拟机有两种方式进行隔离:安全组和VLAN.
安全组隔离
当使用安全组时,每一个创建的账户都会有一个默认的安全组生成,以保证通过这个账户创建的虚拟机实例默认要以互连互通.当用户创建虚拟机实例后,可以对这些虚拟机实例设定一个或多个安全组.
用户可以在任意时间创建额外的安全组,但正在运行中的此用户的实例不能应用新建的安全组规则,需要关机后更改设置.
同一个安全组下的用户虚拟机实例可以相互通信.安全组通过Ingress和Egress来进行流量控制.
VLAN
高级网络模式中默认是通过VLAN进行虚拟机实例之间的相互隔离.当一个账户的第一个虚拟机被创建并运行时,一个隔离的网络也同时创建完成.在一个资源域下,一个账户的虚拟机网络默认的CIDR配置:10.1.1.0/24;在整个云环境中,只有系统管理员有权限创建一个隔离的客户虚拟机网络,并指定一个IP范围和一个VLAN.
CloudStack中网络是较为复杂的一部分,功能也十分强大,特别是高级网络模式,这里建议大家参考CloudStack3.0的相关文档来更清楚的了解网络部分.
OneStack 的项目结构
- oneStack.sh(一键部署 all-in-one 的 OneStack,最主要文件);
- addComputeNode.sh(增加计算节点);
- delStack.sh(只卸载nova、glance、keystone等);
- delAll.sh(卸载所有安装的组件和工具);
- resetStack.sh(清空数据库,镜像、网络和实例等);
- addClient.sh(添加客户端,nova管理等);
- setup_base.sh(安装基本系统);
- setup_test.sh(添加镜像和实例);
- HAStack 目录(OneStack 的高可用性,希望更多人可以提出自己的解决方案)。
OneStack 的安装部署
可以一键自动部署 all-in-one 的 OneStack 实验环境,也可以分步骤部署(下次再讨论分步骤部署)。
一键自动部署最简单,只需要文件 oneStack.sh 把所有服务安装到一个机器。
# wget http://onestack.googlecode.com/files/oneStack.sh && \ chmod +x oneStack.sh && ./oneStack.sh
如果需要更多功能,需要 chechout 整个 svn;当然,安装同样只需要 oneStack.sh
1、安装 Ubuntu Precise (12.04);
2、下载 OneStack 脚本:
# svn checkout http://onestack.googlecode.com/svn/trunk/ onestack-read-only
3、运行 OneStack:
# cd onestack-read-only/ && ./oneStack.sh
注意:其实上面的安装还是需要更改网络配置的(其余可以不改,这个是需要改成你自己的)因为,为了简单,在上面的工具里,所有前期工作都加到了文件 oneStack.sh,比如:
- root 用户密码设置(刚安装的 Ubuntu 默认不启用这个 root 用户);
- apt 源的配置,可以设置为国内的 163、ustc 的源等;
- 网络配置,控制节点是需要外网 ip 的,你需要更改oneStack.sh里面的一些配置:/etc/network/interfaces 里面双网卡的 ip、网关等,在脚本靠前的位置,请查找 interfaces. 参数设置:外网 ip 地址等,这些也都在脚本开头一个块里面。自行检查下面 network/interfaces 的两个网卡设置:
## 2、自行检查下面 network/interfaces的两个网卡设置 + OUT_IP=192.168.139.50 + OUT_IP_PRE=192.168.139 ...
- 选择虚拟机技术,裸机使用 kvm,虚拟机使用 qemu 即可
## 选择虚拟技术,裸机使用 kvm,虚拟机里面使用 qemu
VIRT_TYPE=”qemu” - 数据库的安装和配置,为了自动化部署,参数设置里面设置好帐号和密码,后面就不需要交互;## 配置 /etc/nova/nova.conf,这里与控制节点的配置相同!比如ip是控制节点的ip
MYSQL_PASSWD=${MYSQL_PASSWD:-”cloud1234″}
NOVA_DB_USERNAME=${NOVA_DB_USERNAME:-”novadbadmin”}
NOVA_DB_PASSWD=${NOVA_DB_PASSWD:-”cloud1234″} - 系统会安装 Ubuntu 12.04 的镜像,并启动一个实例。这个过程中镜像自动从 Ubuntu 官网下载,可以查找 cloud-images 更换地址或者镜像 precise-server-cloudimg-amd64-disk1.img,也可以注释掉这个步骤,直接使用 dashboard 在 web 添加镜像启动实例。这个镜像有700多 MB,对于网速不好的用户,可能需要较长时间,因此可以先下载好镜像,然后把这里的地址改成本地即可。
总结一下需要设置的参数:
- 设置 root 密码这一步可以删掉,使用 root 执行即可;
- 可选,如果不需要跳过本步骤
系统语言设置,可以参考oneStack.sh locale部分,不在此介绍
设置apt源 /etc/apt/sources.list - 设置网络
/etc/network/interfaces
可以参考oneStack.sh locale部分 - 配置参数,除了网络ip,其它可以不变
## 数据库
MYSQL_PASSWD=${MYSQL_PASSWD:-”cloud1234″}
## 自行检查下面network/interfaces的两个网卡设置与此处一致
OUT_IP=”192.168.139.50″
## 选择虚拟技术,裸机使用kvm,虚拟机里面使用qemu
VIRT_TYPE=”qemu”
## token, 登录dashboard密码
ADMIN_TOKEN=”admin” - 然后执行./oneStack.sh安装即可。
OpenStack的高可用性(OpenStack HA)
要弄清楚怎么实现高可用性,就需要知道哪些服务容易出现不可靠。首先了解一些OpenStack的大致结构。
OpenStack由5大组件组成(计算nova,身份管理keystone,镜像管理glance,前端管理dashboard和对象存储swift)。
nova是计算、控制的核心组件,它又包括nova-compute、nova-scheduler、nova-volume、nova-network和nova-api等服务。借用http://ken.people.info的以下这幅图了解OpenStack的5大组件和功能:
下面这幅图描述了各个组件的功能和服务结构:
同其它大部分分布式系统一样,OpenStack也分为控制节点和计算节点两种不同功能的节点。控制节点提供除nova-compute以外的服务。这些组件和服务都是可以独立安装的,可以选择组合。
nova-compute在每个计算节点运行,暂且假设它是可信任的;或者使用备份机来实现故障转移(不过每个计算节点配置备份的代价相比收益似乎太大)。
控制节点的高可靠性是主要问题,而且对于不同的组件都有自己的高可靠性需求和方案。
(1)由于CotrolNode只有1个,且负责整个系统的管理和控制,因此当Cotrol Node不能提供正常服务时,怎么办?这就是常见的单节点故障(SPoF,single point of failure)问题。
高可用性基本上是没办法通过一台来达到目标的,更多的时候是设计方案确保在出问题的时候尽快接管故障机器,当然这要付出更大的成本。
对于单点问题,解决的方案一般是采用冗余设备或者热备,因为硬件的错误或者人为的原因,总是有可能造成单个或多个节点的失效,有时做节点的维护或者升级,也需要暂时停止某些节点,所以一个可靠的系统必须能承受单个或多个节点的停止。
常见的部署模式有:Active-passive主备模式,Active-active双主动模式,集群模式。
(2)那么如何构建冗余的控制节点?或者什么其它方法实现高可靠的控制?
很多人可能想到实现active-passive模式,使用心跳机制或者类似的方法进行备份,通过故障转移来实现高可靠性。Openstack是没有多个控制节点的,Pacemaker需要多种服务各自实现这种备份、监听和切换。
仔细分析控制节点提供的服务,主要就是nova-api、nova-network、nova-schedule、nova-volume,以及glance、keysonte和数据库mysql等,这些服务是分开提供的。nova-api、nova-network、glance等可以分别在每个计算节点上工作,RabbitMQ可以工作在主备模式,mysql可以使用冗余的高可用集群。
下面分别介绍:
1)nova-api和nova-scheduler的高可靠性
每个计算节点可以运行自己的nova-api和nova-scheduler,提供负载均衡来保证这样正确工作。
这样当控制节点出现故障,计算节点的nova-api等服务都照常进行。
2)nova-volume的高可靠性
对于nova-volume目前没有完善的HA(high availability)方法,还需要做很多工作。
不过,nova-volume由iSCSI驱动,这个协议与DRBD结合,或者基于iSCSI的高可靠的硬件解决方案,可以实现高可靠。
3) 网络服务nova-network的高可靠性
OpenStack的网络已经存在多种高可靠的方案,常用的你只需要使用 --multi_host 选项就可以让网络服务处于高可用模式(high availability mode),具体介绍见Existing High Availability Options for Networking。
方案1: Multi-host
多主机。每个计算节点上配置nova-network。这样,每个计算节点都会实现NAT, DHCP和网关的功能,必然需要一定的开销,可以与hardware gateway方式结合,避免每个计算节点的网关功能。这样,每个计算节点都需要安装nova-compute外还要nova-network和nova-api,并且需要能连接外网。具体介绍见Nova Multi-host Mode against SPoF。
方案2: Failover
故障转移。能够4秒转移到热备份上,详细介绍见https://lists.launchpad.net/openstack/msg02099.html。不足之处是,需要备份机,而且有4秒延迟。
方案3: Multi-nic
多网卡技术。把VM桥接到多个网络,VM就拥有2种传出路由,实现故障时切换。但是这需要监听多个网络,也需要设计切换策略。
方案4: Hardware gateway
硬件网关。需要配置外部网关。由于VLAN模式需要对每个网络有一个网关,而hardware gateway方式只能对所有实例使用一个网关,因此不能在VLAN模式下使用。
方案5: Quantum(OpenStack下一个版本Folsom中)
Quantum的目标是逐步实现功能完备的虚拟网络服务。它暂时会继续兼容旧的nova-network的功能如Flat、Flatdhcp等。但是实现了类似multi_host的功能,支持OpenStack工作在主备模式(active-backup这种高可用性模式)。
Quantum只需要一个nova-network的实例运行,因此不能与multi_host模式共同工作。
Quantum允许单个租户拥有多个私人专用L2网络,通过加强QoS,以后应该能使hadoop集群很好的在nova节点上工作。
对于Quantum的安装使用,这篇文章Quantum Setup 有介绍。
4) glance、keystone的高可靠性
OpenStack的镜像可以使用swift存储,glance可以运行在多个主机。Integrating OpenStack ImageService (Glance) with Swift 介绍了glance使用swift存储。
集群管理工具 Pacemaker 是强大的高可用性解决方案,能够管理多节点集群,实现服务切换和转移,可与Corosync 和 Heartbeat等配套使用。Pacemaker 能够较为灵活的实现主备、N+1 、N-N 等多种模式。
bringing-high-availability-openstack-keystone-and-glance介绍了如何通过Pacemaker实现keystone和glance的高可靠。在每个节点安装OCF代理后,它能够告诉一个节点另一个节点是否正常运行glance和keysone服务,从而帮助Pacemaker开启、停止和监测这些服务。
5) Swift对象存储的高可靠性
一般情况下,OpenStack的分布式对象存储系统Swift的HA是不需要自己添加的。因为,Swift设计时就是分布式(没有主控节点)、容错、冗余机制、数据恢复机制、可扩展和高可靠的。以下是Swift的部分优点,这也说明了这点。
Built-in Replication(N copies of accounts, container, objects) 3x+ data redundancy compared to 2x on RAID 内建冗余机制 RAID技术只做两个备份,而Swift最少有3个备份 | High Availability 高可靠性 |
Easily add capacity unlike RAID resize 可以方便地进行存储扩容 | Elastic data scaling with ease 方便的扩容能力 |
No central database 没有中心节点 | Higher performance, No bottlenecks 高性能,无瓶颈限制 |
6) 消息队列服务RabbitMQ的高可靠性
RabbitMQ失效就会导致丢失消息,可以有多种HA机制:
- publisher confirms 方法可以在故障时通知什么写入了磁盘。
- 多机集群机制,但是节点失效容易导致队列失效。
- 主备模式(active-passive),能够实现故障时转移,但是启动备份机可能需要延迟甚至失效。
在容灾与可用性方面,RabbitMQ提供了可持久化的队列。能够在队列服务崩溃的时候,将未处理的消息持久化到磁盘上。为了避免因为发送消息到写入消息之间的延迟导致信息丢失,RabbitMQ引入了Publisher Confirm机制以确保消息被真正地写入到磁盘中。它对Cluster的支持提供了Active/Passive与Active/Active两种模式。例如,在Active/Passive模式下,一旦一个节点失败,Passive节点就会马上被激活,并迅速替代失败的Active节点,承担起消息传递的职责。如图所示:
图 Active/Passive Cluster(图片来自RabbitMQ官方网站)
active-passive模式存在所说的问题,因此,基于RabbitMQ集群引入了一种双主动集群机制(active-active)解决了这些问题。http://www.rabbitmq.com/ha.html这篇文章详细介绍了RabbitMQ的高可靠部署和原理。
7) 数据库mysql的高可靠性
集群并不就是高可靠,常用的构建高可靠的mysql的方法有Active-passive主备模式:使用DRBD实现主备机的灾容,Heartbeat或者Corosync做心跳监测、服务切换甚至failover,Pacemaker实现服务(资源)的切换及控制等;或者类似的机制。其中主要使用Pacemaker实现了mysql的active-passive高可用集群。
一个重要的技术是DRBD:(distributed replication block device)即分布式复制块设备,经常被用来代替共享磁盘。
它的工作原理是:在A主机上有对指定磁盘设备写请求时,数据发送给A主机的kernel,然后通过kernel中的一个模块,把相同的数据传送给B主机的kernel中一份,然后B主机再写入自己指定的磁盘设备,从而实现两主机数据的同步,也就实现了写操作高可用。DRBD一般是一主一从,并且所有的读写操作,挂载只能在主节点服务器上进行,,但是主从DRBD服务器之间是可以进行调换的。这里有对 DRBD 的介绍。
HAforNovaDB - OpenStack介绍了只使用共享磁盘而没有使用DRBD,通过Pacemaker实现OpenStack的高可靠。
NovaZooKeeperHeartbeat介绍了使用ZooKeeper作心跳检测。
MySQL HA with Pacemaker 介绍了使用Pacemaker提供高可靠服务,这也是很常见的解决方案。
Galera 是针对Mysql/InnoDB的同步的多master集群的开源项目,提供了很多的优点(如同步复制、读写到任意节点、自动成员控制、自动节点加入、较小延迟等),可以参考。
Pacemaker与DRBD、Mysql的工作模式可以参考下图:
其它的方案,根据 MySQLPerformance Blog 的说法,MySQL几种高可用解决方案能达到的可用性如下:
OpenStack兼容VMware ESX、Microsoft Hyper-V、Citrix Xen 和 Linux的KVM,基本上已覆盖了目前业界绝大部分的Hypervisor
XenServer已经成为大型公共云中部署最广泛的虚拟化平台,XenServer 6.1所独有的XenServer与CloudPlatform的无缝整合将带来全新的易管理性和安全特性,从而为我们的云客户带来更显著的战略优势。”。
目前,CloudStack是全球最成功的公共云平台,已经帮助至少85个大规模生产性云平台实现了10亿美元以上的运营收入。该平台为基于Java的开源云计算编配软件,并被设计用于部署或减少那些与管理大型虚拟机网络有关的琐事。
CloudStack 3颇具亚马逊风格,它帮助那些希望效仿全球最成功云平台来构建云设施的企业用户,快速而轻松地将虚拟数据中心资源转入自动化、富于弹性且可自我服务的云平台中。
CloudStack不仅能够管理基于内核的虚拟机Linux KVM,VMware的VSphere和甲骨文的Oracle VM,还能处理裸机配置。另外, CloudStack明年还将对微软Hyper-V提供支持。
思杰正是通过收购Cloud.com和EMS- Cortex获得了CloudPortal,也获得了云堆栈一层的能力。CloudPortal是一套能够让服务提供商安装,包括运行公有云等业务程序的工具,它提供了入职、账户管理、账单和自助服务配置等功能。
XenServer是一个虚拟化管理平台,不提供与Amazon EC2兼容的云管理接口。管理软件XenCenter是运行在Windows操作系统上的,对于需要随时随地访问管理功能的系统管理员来说有点不便。目前有一些第三方提供的开放源代码的基于浏览器的XenServer管理工具,但是都还处于比较早期的阶段。
云管理平台还是虚拟化管理平台?
在IaaS这个层面,云管理和虚拟化管理的概念非常接近,但是有一些细微的差别。
虚拟化是指在同一台物理机器上提供多台虚拟机器(包括CPU、内存、存储、网络等计算资源)的能力。每一台虚拟机器都能够像普通的物理机器一样运行完整的操作系统以及执行正常的应用程序。当需要管理的物理机器数量较小时,虚拟机生命周期管理(资源配置、启动、关闭等等)可以通过手工去操作。当需要管理的物理机器数量较大时,就需要写一些脚本/程序来提高虚拟机生命周期管理的自动化程度。以管理和调度大量物理/虚拟计算资源为目的系统,属于虚拟化管理系统。这样一个系统,通常用于管理企业内部计算资源。
云计算是指通过网络访问物理/虚拟计算机并利用其计算资源的实践。通常来讲,云计算提供商以虚拟机的方式向用户提供计算资源。用户无须了解虚拟机背后实际的物理资源状况,只需了解自己所能够使用的计算资源配额。因此,虚拟化技术是云计算的基础。任何一个云计算管理平台,都是构建在虚拟化管理平台的基础之上的。如果某个虚拟化管理平台仅对某个集团内部提供服务,那么这个虚拟化管理平台也可以被称为“私有云”;如果某个虚拟化管理平台对公众提供服务,那么这个虚拟化管理平台也可以被称为“公有云”。服务对象的不同,对虚拟化管理平台的构架和功能提出了不同的需求。
私有云服务于集团内部的不同部门(或者应用),强调虚拟资源调度的灵活性。系统管理员需要为不同的部门(或者应用)定制不同的虚拟机,根据部门(或者应用)对计算资源的需求对分配给某些虚拟机的计算资源进行调整。从这个意义上来讲,OpenQRM、XenServer、Oracle VM、CloudStack和ConVirt比较适合提供私有云服务。
公有云服务于公众,强调虚拟资源的标准性。通过将计算资源切割成标准化的虚拟机配置(多个系列的产品,每个产品配置相同数量的CPU、内存、磁盘空间、网络流量配额),公有云提供商可以通过标准的服务合同(Service Level Agreement, SLA)以标准的价格出售计算资源。当用户对计算资源的需求出现改变的时候,用户只需要缩减或者是增加自己所使用的产品数量。由于Amazon EC2是目前比较成功的公有云提供商,大部分云管理平台都在某种程度上模仿Amazon EC2的构架。从这个意义上来讲,Eucalyptus、OpenNebula和OpenStack提供了与Amazon EC2兼容或者是类似的接口,比较适合提供公有云服务。
公有云和私有云之间的界限,就像“内部/外部”和“部门/合作伙伴”的概念一样,并不十分明显。根据项目需求的不同,可能会有不同的解释
一个人活在世上就是为了忍受一切摧残,想通了这点,任何事情都能泰然处之。--王小波
网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分。经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件。下面根据自己的理解,谈一谈OpenStack的虚拟网络、网络拓扑和网络流。个人理解有限,仅抛砖引玉,有问题请指正,谢谢。
一、相关概念和要点(可跳过)
1、OpenStack中nova-network的作用
OpenStack平台中有两种类型的物理节点,控制节点和计算节点。控制节点包括网络控制、调度管理、api服务、存储卷管理、数据库管理、身份管理和镜像管理等,计算节点主要提供nova-compute服务。控制节点的服务可以分开在多个节点,我们把提供nova-network服务的节点称为网络控制器。
OpenStack的网络由nova-network(网络控制器)管理,它会创建虚拟网络,使主机之间以及与外部网络互相访问。
OpenStack的API服务器通过消息队列分发nova-network提供的命令,这些命令之后会被nova-network处理,主要的操作有:分配ip地址、配置虚拟网络和通信。
区分以下两个概念:控制节点和网络控制器
在最简单的情况下,所有服务都部署在一个主机,这就是all-in-one;
稍微复杂点,除了nova-compute外所有服务都部署在一个主机,这个主机进行各种控制管理,因此也就是控制节点(本文把2个或以上节点的部署都称为“多节点”);
但是,很多情况下(比如为了高可用性),需要把各种管理服务分别部署在不同主机(比如分别提供数据库集群服务、消息队列、镜像管理、网络控制等)。这个时候网络控制器(运行nova-network)只是控制节点群中的一部分。
2、OpenStack中network的2种ip、3种管理模式
Nova有固定IP和浮动IP的概念。固定IP被分发到创建的实例不再改变,浮动IP是一些可以和实例动态绑定和释放的IP地址。
Nova支持3种类型的网络,对应3种“网络管理”类型:Flat管理模式、FlatDHCP管理模式、VLAN管理模式。默认使用VLAN摸式。
这3种类型的网络管理模式,可以在一个ОpenStack部署里面共存,可以在不同节点不一样,可以进行多种配置实现高可用性。
简要介绍这3种管理模式,后面再详细分析。
- Flat(扁平): 所有实例桥接到同一个虚拟网络,需要手动设置网桥。
- FlatDHCP: 与Flat(扁平)管理模式类似,这种网络所有实例桥接到同一个虚拟网络,扁平拓扑。不同的是,正如名字的区别,实例的ip提供dhcp获取(nova-network节点提供dhcp服务),而且可以自动帮助建立网桥。
- VLAN: 为每个项目提供受保护的网段(虚拟LAN)。
二、3种网络模式的工作机制
•Flat模式
1)指定一个子网,规定虚拟机能使用的ip范围,也就是一个ip池(
- 分配ip不会超过这个范围,也就是配置里面的fixed_range,比如10.0.0.1/27,那么可用ip就有32个;
- 这个网络是可以改变的,比如配置好节点nova.conf和interfaces后,nova-manage network delete 10.0.0.1/27 1 32;nova-manage network create192.168.1.0/24 1 255
);
2)创建实例时,从有效ip地址池接取一个IP,为虚拟机实例分配,然后在虚拟机启动时候注入虚拟机镜像(文件系统);
3)必须手动配置好网桥(br100),所有的系统实例都是和同一个网桥连接;网桥与连到网桥的实例组成一个虚拟网络,nova-network所在的节点作为默认网关。比如flat_interface=eth1;eth1的ip为10.0.0.1,其它网络ip在10.0.0.1/27内。flat interface-->br100-->flat network
4)此后,网络控制器(nova-network节点)对虚拟机实例进行NAT转换,实现与外部的通信。
注意:目前好像配置注入只能够对Linux类型的操作系统实例正常工作,网络配置保存在/etc/network/interfaces文件。
•Flat DHCP模式
与Flat模式一样,从ip池取出ip分配给虚拟机实例,所有的实例都在计算节点中和一个网桥相关。不过,在这个模式里,控制节点做了更多一些的配置,尝试和以太网设备(默认为eth0)建立网桥,通过dhcp自动为实例分配flat网络的固定ip,可以回收释放ip。
1)网络控制器(运行nova-network服务的节点)运行dusmasq作为DHCP服务器监听这个网桥;
2)实例做一次dhcp discover操作,发送请求;
3)网络控制器把从一个指定的子网中获得的IP地址响应给虚拟机实例;
4)实例通过网络控制器与外部实现互相访问。
•VLAN网络模式
OpenStack的默认网络管理模式,没有设置--network_manager=nova.network.manager.FlatDHCPManager或者FlatManager的时候默认为vlan。为了实现多台机器的安装,VLAN网络模式需要一个支持VLAN标签(IEEE 802.1Q)的交换机(switch)。
在这个模式里,为每个项目创建了VLAN和网桥。所有属于某个项目的实例都会连接到同一个VLAN,必要的时候会创建Linux网桥和VLAN。
每个项目获得一些只能从VLAN内部访问的私有IP地址,即私网网段。每个项目拥有它自己的VLAN,Linux网桥还有子网。被网络管理员所指定的子网都会在需要的时候动态地分配给一个项目。
1)网络控制器上的DHCP服务器为所有的VLAN所启动,从被分配到项目的子网中获取IP地址并传输到虚拟机实例。
2)为了实现用户获得项目的实例,访问私网网段,需要创建一个特殊的VPN实例(代码名为cloudpipe,用了创建整数、key和vpn访问实例)。
3)计算节点为用户生成了证明书和key,使得用户可以访问VPN,同时计算节点自动启动VPN。
4)vpn访问。
Flat与vLAN的比较
在两种Flat模式里,网络控制器扮演默认网关的角色,实例都被分配了公共的IP地址(扁平式结构,都在一个桥接网络里)。
vLAN模式功能丰富,很适合提供给企业内部部署使用。但是,需要支持vLAN的switches来连接,而且相对比较复杂,在小范围实验中常采用FlatDHCP模式。
三、详解FlatDHCP模式(Flat模式类似,只是少了dhcp的部分而已,就略过了)
可以有多种部署方式,比如为了实现高可用性,可以使用多网卡、外部网关、multi_host 等方法。这里主要介绍基本的部署方式(一个控制节点,或者说一个网络控制器)。
1、网卡与节点
由于网卡和节点数的不同,可以简单分为:单节点(all-in-one)单网卡、多节点单网卡、多节点单网卡、多节点多网卡
单节点的情况下,网络控制器(运行nova-network)与计算(运行nova-compute,或者更确切的说,运行虚拟机实例)部署在一个主机。这样就不需要控制节点与计算节点之间的通信,也就少了很多网络概念,这也是入门者常用的方式。
多节点时,网络控制器与计算节点分别在不同主机,普通部署方式下(不是multi_host),只有nova-network控制网络,而它仅仅在控制节点运行。因此,所有计算节点的实例都需要通过控制节点来与外网通信。
单网卡时,网卡需要作为public网络的接口使用,也需要作为flat网络的接口,因此需要处于混杂模式。不过建立的网络与双网卡类似,都分为flat网络和public网络。
使用单网卡,需要在nova.conf中使public_interface和flat_interface都为eth0。
2、网络流
如上面分析,在普通部署方式下,只有一个控制节点(或网络控制器),dhcp和外网访问都需要经过它。
dhcp时:
1)网络控制器(运行nova-network服务的节点)一直运行dusmasq作为DHCP服务器监听网桥(br100);
2)实例做一次dhcp discover操作,发送请求;
3)网络控制器把从一个指定的子网中获得的IP地址响应给虚拟机实例。
实例访问外网时:
1)实例经过所在主机的flat_interface(这是一个flat网络),连接到nova-network所在的主机(控制节点);
2)网络控制器对外出网络流进行转发。
外网访问实例时:
1)网络控制器对floating ip进行nat;
2)通过flat网络将流入数据路由给对应的实例。
下图1、图2可以比较单网卡和双网卡的网络流(traffic)情况,图2、图3可以比较单节点和多节点的网络流。
图1:双网卡多节点OpenStack网络流
图2:单网卡多节点OpenStack网络流
图3:单网卡单节点OpenStack网络流
3、多节点时控制节点和计算节点的工作原理
控制节点:
1)在主机上创建一个网桥(br100),把网关ip赋给这个桥;如果已经有ip,会自动把这个ip赋给网桥作为网关,并修复网关;
2)建立dhcp server,监听这个网桥;并在数据库记录ip的分配和释放,从而判定虚拟机释放正常关闭dhcp;
3)监听到ip请求时,从ip池取出ip,响应这个ip给实例;
4)建立iptables规则,限制和开放与外网的通信或与其它服务的访问。
计算节点:
1)在主机上建立一个对应控制节点的网桥(br100),把其上实例(虚拟机)桥接到一个网络(br100所在的网络);
2)此后,这个桥、控制节点的桥和实例的虚拟网卡都在同一虚拟网络,通过控制节点对外访问。
可见,这种方式有以下特点:1)所有实例与外网通信都经过网络控制器,这也就是SPoF(单故障点);
2)控制节点提供dhcp服务、nat、建立子网,作为虚拟网络的网关;
3)计算节点可以没有外网ip,同其上的实例一样,可以把控制节点作为网关对外访问;
4)实例与外网通信太多,会造成控制节点网络的堵塞或者高负载。
四、VLAN模式的特点
VLAN模式的目的是为每个项目提供受保护的网段,具有以下特点:
- NAT实现public ip
- 除了public NAT外没有其它途径进入每个lan
- 受限的流出网络,project-admin可以控制
- 受限的项目之间的访问,同样project-admin控制
- 所以实例和api的连接通过vpn
vLAN模式了解较少,借用OpenStack文档里的一个图供对比了解:
图4:VLAN模式OpenStack网络结构
五、网络部署
1、网络配置
apt-get install bridge-utils
安装bridge-utils就是为了建立虚拟网桥,实现虚拟网络。OpenStack会自动的创建br100这个网桥,所以不用自己创建。
--network_manager=nova.network.manager.FlatDHCPManager
设置网络管理模式,一般使用FlatDHCP,还可以配合multi_host实现高可用。
# Network Configuration
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--flat_network_bridge=br100
--flat_interface=eth1
--flat_injected=False
--public_interface=eth0
dhcpbridge_flagfile指定配置文件,flat_injected实现ipv6地址的注入,因此关闭。
flat_network_bridge指定网桥。
flat_interface指定网卡,这个主机节点(一般就是控制节点)用来建立桥,桥接实例和虚拟网络以及public网络。单网卡是设为eth0,与public的同一个。
#Block of IP addresses that are fixed IPs
--fixed_range=10.0.0.1/27
指定ip池的范围,文中多次提到的从指定的ip池取出ip分配给实例,就是这个ip池。
2、OpenStack中网络的高可用性(HA)
在基本的网络管理方式中,所有实例的网络流都要经过网络控制器。当网络控制器出现问题时,网络就出现故障,网络控制器是一个SPoF(单故障点)。《构建OpenStack的高可用性(HA,High Availability)》简单介绍了4种方法和未来的Quantum。
主要的部署方式是FlagDHCP + multi_host:
1)、每个计算节点安装nova-network,设置multi_host为true。这样,每个计算节点上flat_interface作为网桥,提供dhcp、dns,作为其上所有实例的网关(gateway)。实例不再都从控制节点经过,控制节点出现问题不会影响网络。
2)、每个计算节点的flat_interface提供switch连接,实现实例之间的虚拟网络的传输和通信。
3)、每个计算节点有个public_interface,与外网连接。
4)、为每个实例分配floating ip,作为实例的第二个虚拟ip,与外网通信。
也就是发生了如下的变化:
图5:multi_host部署方式时的OpenStack网络流
未来的Quantum和Melarge提供更好的网络服务,值得期待。Quantum项目实现二层网络相关的功能,如创建和管理虚拟网络、端口等。Melange负责三层网络相关,它的主要任务是IP地址管理(IPAM)、DHCP、NAT甚至负载均衡。不过由于其实现需要一定的时间,需要多个阶段,现在还是需要了解以上的各种网络模式和部署。
该教程基于Ubuntu12.04版,它将帮助读者建立起一份OpenStack最小化安装。
第二部分 OpenStack安装与配置
一、引言
本章内容讲解如何在3台物理机上搭建最小化云平台,这3台机器分为称为Server1、Server2和Client1,之后的各章也是如此。Server1承载着Nova、Glance、Swift、Keystone及Horizon(OpenStack的Web UI)服务。Server2只用来运行实例管理的nova运算工作站。由于OpenStack组件采用分布式结构,其中的任何一部分或几个部分都可以安装在任意服务器上。
Client1并不是安装所必须的,在本例中,它仅用来制作打包镜像,并使用它访问Horizon在Web上管理OpenStack设施。于是就避免了使用服务器来完成镜像打包等诸如此类的任务了,而且在制作桌面系统镜像时如果包含视窗界面的话,我们也只能相应地使用有GUI的电脑来完成,故而最好还是别在服务器上玩火了吧。建议Client1支持虚拟化技术,以便在制作完镜像打包时可以运行KVM。
OpenStack安装需要设定主机名、IP地址等,按你实际的环境进行配置。下表是译者安装的网络参数清单:
二、Server1
正如上表所示,Server1包含了所有的Nova服务:nova-compute、nova-api、nova-volume、nova-network以及Glance、Swift、Keystone和Horizon。这台服务器上需要双网卡。
(一)安装底层OS
不必多想,请参照下述说明,记住相关参数,选择64位Ubuntu12.04版,进行安装。
l 创建的第一个用户命名为“localadmin”
l 为eth0和eth1设定IP及其相关参数
l 在安装服务包中,仅选择“Openssh-server”作为预装项
因为Server1上也将安装nova-volume软件,而nova-volume需要一块专用分区,所以在安装Ubuntu Server时请选择手动分区,并另行创建一块合适大小的分区。从本章起,教程都将以/dev/sda6作为这块分区。你可以根据自己分区的实际情况进行修改。此外,请使用fdisk工具将该分区需要格式化为LVM(8e)格式,这一操作在安装中或刚安装完毕格式化均可。进一步,如果你还计划在这台服务器上再新建一个分区配给Swift的话,那么就新建一块分区并参照本章后文“安装Swift”一节相关内容进行安装。
待12.04的UbuntuOS安装完毕后 ,使用下列命令更新系统:
sudo apt-get update
sudo apt-get upgrade
安装网桥工具bridge-utils:
sudo apt-get install bridge-utils
(二)配置网络
编辑/etc/network/interfaces文件,如下所示:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.10.10.2
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.1
dns-nameservers 10.10.8.3
auto eth1
iface eth1 inet static
address 192.168.3.1
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255
随后重新启动网络:
sudo /etc/init.d/networking restart
(三)NTP服务器
安装NTP软件包。这个时间服务器将为所有节点提供支持。OpenStack所有组件的时间都必须同步,于是我们就在Server1上安装NTP服务并且让其他服务器或节点与之保持同步。
sudo apt-get install ntp
译者注:NTP(Network Time Protocol),是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。[来源:百度百科]
打开文件/etc/ntp.conf增加以下三行内容,目的是让本服务器时间与外部服务器时间同步。如果不能访问外网,NTP服务器将使用本机硬件时钟作为第二选择。
server ntp.ubuntu.com
server 127.127.1.0
fudge 127.127.1.0 stratum 10
然后重启NTP使配置生效:
sudo service ntp restart
请确保服务器IP地址可以被DNS解析。如果不能,则在/etc/hosts文件中手工加入。
(四)数据库
我们有很多选择:MySQL、PostgreSQL或者SQLite等都能很好地对Nova和Glance提供数据支持。究竟选哪个,自己定吧。本例中采用MySQL。
MySQL
安装mysql-server和python-mysqldb包:
sudo apt-get install mysql-server python-mysqldb
为mysql创建root密码,在此使用“mygreatsecret”。随后编辑mysql配置文件/etc/mysql/my.cnf,将绑定地址从127.0.0.1改为0.0.0.0,如下所示:
bind-address = 0.0.0.0
重启MySQL服务器让其开始监听所有端口:
sudo restart mysql
创建数据库
我们将要为nova、glance和keystone创建很多东东,各种数据库、表及用户。话音未落,这就开始了:
创建名为“nova”的数据库:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE nova;'
新建一个用户,名为“novadbadmin”:
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER novadbadmin;'
授予novadbadmin用户nova数据库全部权限:
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON nova.* TO 'novadbadmin'@'%';"
为novadbadmin同志创建密码(译者注:密码是novasecret,后文类似之处不多言,请详见命令):
sudo mysql -uroot -pmygreatsecret -e "SET PASSWORD FOR 'novadbadmin'@'%' = PASSWORD('novasecret');"
Glance登场,还是重复刚才的道道,首先创建一个名为glance的数据库:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE glance;'
然后为这个新建的数据库添加一个用户“glancedbadmin”:
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER glancedbadmin;'
接着,光荣授予他本数据库的全部权限:
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON glance.* TO 'glancedbadmin'@'%';"
是的,最后一步,为该用户分配密码:
sudo mysql -uroot -pmygreatsecret -e "SET PASSWORD FOR 'glancedbadmin'@'%' = PASSWORD('glancesecret');"
很烦的,keystone出场了。刚才的大循环,至此开始演绎第三遍:
sudo mysql -uroot -pmygreatsecret -e 'CREATE DATABASE keystone;'
sudo mysql -uroot -pmygreatsecret -e 'CREATE USER keystonedbadmin;'
sudo mysql -uroot -pmygreatsecret -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystonedbadmin'@'%';"
sudo mysql -uroot -pmygreatsecret -e "SET PASSWORD FOR 'keystonedbadmin'@'%' = PASSWORD('keystonesecret')"
现在,MySQL部分的工作结束。
(五)Keystone
Keystone是OpenStack的认证服务。使用以下命令进行安装:
sudo apt-get install keystone python-keystone python-keystoneclient
打开/etc/keystone/keystone.conf文件,将这一行:
admin_token = ADMIN
改为:
admin_token = admin
(本教程中我们将一直使用admin作为令牌)
本例中,我们使用MySQL来存储keystone配置,则将 /etc/keystone/keystone.conf中的这句配置:
connection = sqlite:var/lib/keystone/keystone.db
换成:
connection = mysql://keystonedbadmin:keystonesecret@10.10.10.2/keystone
然后,重启Keystone:
sudo service keystone restart
接着,执行以下命令同步数据库:
sudo keystone-manage db_sync
最后,有些环境变量是OpenStack运行所必须的:
export SERVICE_ENDPOINT="http://localhost:35357/v2.0"
export SERVICE_TOKEN=admin
当然为了避免下次系统重启后,还得将这些变量再次export,最稳妥的办法就是将其写入~/.bashrc中。
创建租间
使用以下命令创建两个租间,admin和service:
keystone tenant-create --name admin
keystone tenant-create --name service
创建用户
执行以下命令,创建四个用户admin、nova、glance及swift:
keystone user-create --name admin --pass admin --email admin@foobar.com
keystone user-create --name nova --pass nova --email nova@foobar.com
keystone user-create --name glance --pass glance --email glance@foobar.com
keystone user-create --name swift --pass swift --email swift@foobar.com
创建角色
使用命令创建两个角色,admin和Member(译者注:注意是大写M):
keystone role-create --name admin
keystone role-create --name Member
查看租间、用户和角色
刚才建立的租间、用户和角色可以通过如下命令进行查看:
租间列表:
keystone tenant-list
+----------------------------------+--------------------+---------+
| id | name | enabled |
+----------------------------------+--------------------+---------+
| 7f95ae9617cd496888bc412efdceabfd | admin | True |
| c7970080576646c6959ee35970cf3199 | service | True |
+----------------------------------+--------------------+---------+
用户列表:
keystone user-list
+----------------------------------+---------+-------------------+--------+
| id | enabled | email | name |
+----------------------------------+---------+-------------------+--------+
| 1b986cca67e242f38cd6aa4bdec587ca | True | swift@foobar.com | swift |
| 518b51ea133c4facadae42c328d6b77b | True | glance@foobar.com | glance |
| b3de3aeec2544f0f90b9cbfe8b8b7acd | True | admin@foobar.com | admin |
| ce8cd56ca8824f5d845ba6ed015e9494 | True | nova@foobar.com | nova |
+----------------------------------+---------+-------------------+--------+
角色列表:
keystone role-list
+----------------------------------+----------------------+
| id | name |
+----------------------------------+----------------------+
| 2bbe305ad531434991d4281aaaebb700 | admin |
| d983800dd6d54ee3a1b1eb9f2ae3291f | Member |
+----------------------------------+----------------------+
请大家格外注意id列中的值,虽然很长,但随后为用户绑定角色,继而把用户配入租间中时可全靠它们了。
为特定租间中的用户绑定角色
现在我们先为刚刚创建的用户绑定角色,通过如下命令格式可以将特定租间中的特定用户增加角色(译者注:仅是命令格式,随后才是真正执行的命令):
keystone user-role-add --user $USER_ID --role $ROLE_ID --tenant_id $TENANT_ID
其中id字段可以通过keystone user-list,keystone role-list和keystone tenant-list命令获得。
下面开始为“admin”租间中的“admin”用户绑定“admin”角色:
keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role 2bbe305ad531434991d4281aaaebb700 --tenant_id 7f95ae9617cd496888bc412efdceabfd
接着执行如下命令,为“service”租间中的“nova”、“glance”、“swift”用户绑定“admin”角色:
keystone user-role-add --user ce8cd56ca8824f5d845ba6ed015e9494 --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199
keystone user-role-add --user 518b51ea133c4facadae42c328d6b77b --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199
keystone user-role-add --user 1b986cca67e242f38cd6aa4bdec587ca --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199
Horizon和Swift只“Member”角色即可,所以相应地执行如下命令:
keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role d983800dd6d54ee3a1b1eb9f2ae3291f --tenant_id 7f95ae9617cd496888bc412efdceabfd
注意,在执行自己的安装时,请千万按照实际安装中的id进行设置,照抄本文id必将出错!
创建服务
至此,我们该创建授权用户可以享用的服务了,命令格式如下:
keystone service-create --name service_name --type service_type --description 'Description of the service'
安装上述格式,创建nova-compute、nova-volume、glance、swift、keystone及ec2服务:
keystone service-create --name nova --type compute --description 'OpenStack Compute Service'
keystone service-create --name volume --type volume --description 'OpenStack Volume Service'
keystone service-create --name glance --type image --description 'OpenStack Image Service'
keystone service-create --name swift --type object-store --description 'OpenStack Storage Service'
keystone service-create --name keystone --type identity --description 'OpenStack Identity Service'
keystone service-create --name ec2 --type ec2 --description 'EC2 Service'
刚才创建的每个服务都拥有唯一的id,要查看服务id,使用如下命令即可:
keystone service-list
+----------------------------------+----------+--------------+----------------------------+
| id | name | type | description |
+----------------------------------+----------+--------------+----------------------------+
| 1e93ee6c70f8468c88a5cb1b106753f3 | nova | compute | OpenStack Compute Service |
| 28fd92ffe3824004996a3e04e059d875 | ec2 | ec2 | EC2 Service |
| 7d4ec192dfa1456996f0f4c47415c7a7 | keystone | identity | OpenStack Identity Service |
| 96f35e1112b143e59d5cd5d0e6a8b22d | swift | object-store | OpenStack Storage Service |
| f38f4564ff7b4e43a52b2f5c1b75e5fa | volume | volume | OpenStack Volume Service |
| fbafab6edcab467bb734380ce6be3561 | glance | image | OpenStack Image Service |
+----------------------------------+----------+--------------+----------------------------+
这些id将被用于定义所属服务的入口(endpoint)。
创建入口
创建服务入口的命令格式是:
keystone endpoint-create --region region_name --service_id service_id --publicurl public_url --adminurl admin_url --internalurl internal_url
使用如下命令创建nova-compute入口:
keystone endpoint-create --region myregion --service_id 1e93ee6c70f8468c88a5cb1b106753f3 --publicurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --adminurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --internalurl 'http://10.10.10.2:8774/v2/$(tenant_id)s'
使用如下命令创建nova-volume入口:
keystone endpoint-create --region myregion --service_id f38f4564ff7b4e43a52b2f5c1b75e5fa --publicurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --adminurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --internalurl 'http://10.10.10.2:8776/v1/$(tenant_id)s'
使用如下命令创建glance入口:
keystone endpoint-create --region myregion --service_id fbafab6edcab467bb734380ce6be3561 --publicurl 'http://10.10.10.2:9292/v1' --adminurl 'http://10.10.10.2:9292/v1' --internalurl 'http://10.10.10.2:9292/v1'
使用如下命令创建swift入口:
keystone endpoint-create --region myregion --service_id 96f35e1112b143e59d5cd5d0e6a8b22d --publicurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s' --adminurl 'http://10.10.10.2:8080/v1' --internalurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s'
使用如下命令创建keystone入口:
keystone endpoint-create --region myregion --service_id 7d4ec192dfa1456996f0f4c47415c7a7 --publicurl http://10.10.10.2:5000/v2.0 --adminurl http://10.10.10.2:35357/v2.0 --internalurl http://10.10.10.2:5000/v2.0
使用如下命令创建ec2入口:
keystone endpoint-create --region myregion --service_id 28fd92ffe3824004996a3e04e059d875 --publicurl http://10.10.10.2:8773/services/Cloud --adminurl http://10.10.10.2:8773/services/Admin --internalurl http://10.10.10.2:8773/services/Cloud
(六)Glance
使用以下命令安装glance:
sudo apt-get install glance glance-api glance-client glance-common glance-
registry python-glance
配置Glance服务
Glance默认使用SQLite,MySQL或PostgreSQL也可以很好地与Glance工作。
打开 /etc/glance/glance-api-paste.ini文件并在末尾编辑如下内容:
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
这些值需要用刚才我们安装中的实际值进行替换,admin_tenant_name应该是“service”,admin_user这里是“glance”、admin_password是“glance”。
编辑完这三行应该是如下的样子:
admin_tenant_name = service
admin_user = glance
admin_password = glance
接着再打开 /etc/glance/glance-registry-paste.ini文件,也如上述操作一样在文件尾部进行同样的编辑。
然后,修改glance数据库连接为MySQL,编辑 /etc/glance/glance-registry.conf,找到“sql_connection =”这句作如下修改:
sql_connection = mysql://glancedbadmin:glancesecret@10.10.10.2/glance
紧接着还是这份文件,在底部增加如下设置,目的是让glance使用keystone授权:
[paste_deploy]
flavor = keystone
打开 /etc/glance/glance-api.conf文件,在文件末尾增加如下配置:
[paste_deploy]
flavor = keystone
在MySQL数据库中创建glance schema,进行同步:
sudo glance-manage version_control 0
sudo glance-manage db_sync
上述改动全部完成后,重启glance-api和glance-registry服务:
sudo restart glance-api
sudo restart glance-registry
设置如下环境变量,你也可以将其写入 ~/.bashrc中:
export SERVICE_TOKEN=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://localhost:5000/v2.0/"
export SERVICE_ENDPOINT=http://localhost:35357/v2.0
现在我们可以使用这个命令来测试glance是否正确安装:
glance index
如果这条命令没有返回任何结果,则说明glance已经正确安装完毕,并与Keystone正常通信。若是稍微探究一下的话,上述命令其实有返回值,正确安装情况下的返回值是0,可以使用echo $?进行查看。
在Glance正确配置且使用keystone作为授权机制后,我们便可以上传镜像到glance了,相关内容详见后文中的“镜像管理(Image Management)”。
(七)Nova
先使用如下命令安装nova及其相关组件:
sudo apt-get install nova-api nova-cert nova-compute nova-compute-kvm nova-doc nova-network nova-objectstore nova-scheduler nova-volume rabbitmq-server novnc nova-consoleauth
配置Nova
以如下配置为例,编辑nova主配文件 /etc/nova/nova.conf:
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/run/lock/nova
--allow_admin_api=true
--use_deprecated_auth=false
--auth_strategy=keystone
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--s3_host=10.10.10.2
--ec2_host=10.10.10.2
--rabbit_host=10.10.10.2
--cc_host=10.10.10.2
--nova_url=http://10.10.10.2:8774/v1.1/
--routing_source_ip=10.10.10.2
--glance_api_servers=10.10.10.2:9292
--image_service=nova.image.glance.GlanceImageService
--iscsi_ip_prefix=192.168.4
--sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova
--ec2_url=http://10.10.10.2:8773/services/Cloud
--keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens
--api_paste_config=/etc/nova/api-paste.ini
--libvirt_type=kvm
--libvirt_use_virtio_for_bridges=true
--start_guests_on_host_boot=true
--resume_guests_state_on_host_boot=true
# vnc specific configuration
--novnc_enabled=true
--novncproxy_base_url=http://10.10.10.2:60
--vncserver_proxyclient_address=10.10.10.2
--vncserver_listen=10.10.10.2
# network specific settings
--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth1
--flat_network_bridge=br100
--fixed_range=192.168.4.1/27
--floating_range=10.10.10.2/27
--network_size=32
--flat_network_dhcp_start=192.168.4.33
--flat_injected=False
--force_dhcp_release
--iscsi_helper=tgtadm
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--verbose
创建一个物理卷:
sudo pvcreate /dev/sda6
创建一个名为“nova-volumnes”的卷组:
sudo vgcreate nova-volumes /dev/sda6
修改 /etc/nova文件夹的属主及 /etc/nova/nova.conf文件的访问权限:
sudo chown -R nova:nova /etc/nova
sudo chmod 644 /etc/nova/nova.conf
进入 /etc/nova/api-paste.ini文件,找到末尾三行:
admin_tenant_name = %SERVICE_TENANT_NAME%
admin_user = %SERVICE_USER%
admin_password = %SERVICE_PASSWORD%
用之前创建的名字进行替换(译者注:和Glance如出一辙,只是这次是nova),编辑完毕如下所示:
admin_tenant_name = service
admin_user = nova
admin_password = nova
仍然在MySQL数据库进行同步:
sudo nova-manage db sync
为实例提供IP池:
sudo nova-manage network create private --fixed_range_v4=192.168.4.32/27 --num_networks=1 --bridge=br100 --bridge_interface=eth1 --network_size=32
输出环境变量:
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://localhost:5000/v2.0/"
重启nova服务:
sudo restart libvirt-bin; sudo restart nova-network; sudo restart nova-compute; sudo restart nova-api; sudo restart nova-objectstore; sudo restart nova-scheduler; sudo restart nova-volume; sudo restart nova-consoleauth;
执行下列命令测试nova是否正确安装:
sudo nova-manage service list
Binary Host Zone Status State Updated_At
nova-network server1 nova enabled :-) 2012-04-20 08:58:43
nova-scheduler server1 nova enabled :-) 2012-04-20 08:58:44
nova-volume server1 nova enabled :-) 2012-04-20 08:58:44
nova-compute server1 nova enabled :-) 2012-04-20 08:58:45
nova-cert server1 nova enabled :-) 2012-04-20 08:58:43
若所有组件都是微笑,说明nova已经正确安装完毕。
(八)OpenStack管理面板
执行下列命令安装管理面板:
sudo apt-get install openstack-dashboard
重启Apache:
sudo service apache2 restart
好消息,现在打开浏览器输入server1的IP地址,就可以看到OpenStack的管理面板登陆界面了。默认用户名和密码都是“admin”。在管理面板中,可以进行创建密匙对,创建、编辑安全群组,新建实例,添加卷等操作。具体内容详见后文“OpenStack Dashboard”章节。
(九)Swift
安装Swift
最重要的部分是swift的代理、账户、容器及对象服务器:
sudo apt-get install swift swift-proxy swift-account swift-container swift-object
随后安装一些支持组件,xfsprogs(支持XFS文件系统)、python.pastedeploy(访问keystone)和curl(测试swift):
sudo apt-get install xfsprogs curl python-pastedeploy
Swift存储端
有两种方法来创建或制备存储端,一种是采用现有的分区或卷作为存储设备,另一种是创建环回文件(Loopback file)并将当做存储设备。安装时,两种方式自选。
1. 分区作为存储设备
如果在安装OS时为Swift预留了一个分区,你就可以直接使用它。如果该分区没有使用过或仍是空闲空间(比如 /dev/sdb3),就应该把它格式化为xfs文件系统,接着编辑 /etc/fstab中该分区的挂载点(注意:请根据实际情况选择你自定的设备,本教程假定手头未使用也没分区的空闲空间在 /dev/sdb上):
sudo fdisk /dev/sdb
Type n for new partition
Type e for extended partion
Choose appropriate partition number ( or go with the default )
Choose first and last sectors to set the hard disk size (or go with defaults)
Note that 83 is the partition type number for Linux
Type w to write changes to the disk
上述命令将创建一个譬如 /dev/sdb3的分区,接着我们便将其格式化为XFS。记得格式化前要先使用命令“sudo fdisk -l”查看当前分区表,确定系统列出的分区含有你即将格式化的目标分区。最后,如果刚才xfsprogs成功安装的话,我们才能够使用以下命令:
sudo mkfs.xfs -i size=1024 /dev/sdb3
sudo tune2fs -l /dev/sdb3 |grep -i inode
创建一个该分区的挂载点,并命名为“swift_backend”:
sudo mkdir /mnt/swift_backend
紧接着编辑 /etc/fstab文件写入如下内容以便系统启动时自动加载这个分区:
/dev/sdb3 /mnt/swift_backend xfs noatime,nodiratime,nobarrier,logbufs=8 0 0
2. 环回文件作为存储设备
创建一个空文件作为Swift存储的环回设备,在这里我们使用disk copy命令创建它并命名为swift-disk,还将为其分配1G的磁盘空间。如果空间不够,可以通过改变seek值来增加空间。随后格式化为XFS:
sudo dd if=/dev/zero of=/srv/swift-disk bs=1024 count=0 seek=1000000
sudo mkfs.xfs -i size=1024 /srv/swift-disk
file /srv/swift-disk
swift-disk1: SGI XFS filesystem data (blksz 4096, inosz 1024, v2 dirs)
创建挂载点:
sudo mkdir /mnt/swift_backend
写入 /etc/fstab:
/srv/swift-disk /mnt/swift_backend xfs loop,noatime,nodiratime,nobarrier,logbufs=8 0 0
3. 使用存储
挂载存储分区前,需要创建一些设备节点并设置其属主和主群为“Swift”:
sudo mount /mnt/swift_backend
pushd /mnt/swift_backend
sudo mkdir node1 node2 node3 node4
popd
sudo chown swift.swift /mnt/swift_backend/*
for i in {1..4}; do sudo ln -s /mnt/swift_backend/node$i /srv/node$i; done;
sudo mkdir -p /etc/swift/account-server /etc/swift/container-server /etc/
swift/object-server /srv/node1/device /srv/node2/device /srv/node3/device /srv/node4/device
sudo mkdir /run/swift
sudo chown -L -R swift.swift /etc/swift /srv/node[1-4]/ /run/swift
为了在系统启动时启动Swift服务,需要把如下两行命令写入 /etc/rc.local里,位置在“exit 0;”之前:
sudo mkdir /run/swift
sudo chown swift.swift /run/swift
配置远程备份
Rsync用来维护对象副本,许多swift服务都使用它保持对象一致性及进行更新操作。所有存储节点都将享用此配置:
首先编辑 /etc/default/rsync文件:
Set RSYNC_ENABLE=true
然后编辑 /etc/rsyncd.conf配置文件,如下所示:
# General stuff
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /run/rsyncd.pid
address = 127.0.0.1
# Account Server replication settings
[account6012]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/account6012.lock
[account6022]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/account6022.lock
[account6032]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/account6032.lock
[account6042]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/account6042.lock
# Container server replication settings
[container6011]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/container6011.lock
[container6021]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/container6021.lock
[container6031]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/container6031.lock
[container6041]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/container6041.lock
# Object Server replication settings
[object6010]
max connections = 25
path = /srv/node1/
read only = false
lock file = /run/lock/object6010.lock
[object6020]
max connections = 25
path = /srv/node2/
read only = false
lock file = /run/lock/object6020.lock
[object6030]
max connections = 25
path = /srv/node3/
read only = false
lock file = /run/lock/object6030.lock
[object6040]
max connections = 25
path = /srv/node4/
read only = false
lock file = /run/lock/object6040.lock
最后重新启动服务完成rsync配置:
sudo service rsync restart
配置Swift组件
详细的配置选项参见http://swift.openstack.org/deployment_guide.html。如果安装了swift-doc包的话,则可以在/usr/share/doc/swift-doc/html目录下直接查看。Python使用paste.deploy管理配置。默认配置选项在[DEFAULT]段中,后面配置其它特殊项会覆盖默认段中的相关内容。格式如下:
THE SYNTAX set option_name = value
以下是一份paste.deploy的配置样例,仅供参考:
[DEFAULT]
name1 = globalvalue
name2 = globalvalue
name3 = globalvalue
set name4 = globalvalue
[pipeline:main]
pipeline = myapp
[app:myapp]
use = egg:mypkg#myapp
name2 = localvalue
set name3 = localvalue
set name5 = localvalue
name6 = localvalue
创建并编辑 /etc/swift/swift.conf文件,并写入如下配置:
[swift-hash]
# random unique string that can never change (DO NOT LOSE). I'm using 03c9f48da2229770.
# od -t x8 -N 8 -A n < /dev/random
# The above command can be used to generate random a string.
swift_hash_path_suffix = 03c9f48da2229770
特别的,当建立更多的节点时,你需要记住随机串。不要照抄本例,请通过以下命令生成自己的随机字符串:
od -t x8 -N 8 -A n < /dev/random
1. 配置Swift代理服务器
代理服务器是swift的门卫,它的职责是检测合法性。它将审查:一、请求是否伪造,二、请求使用资源的用户身份。具体操作由keystone之类的认证服务器来协助完成。
创建并编辑 /etc/swift/proxy-server.conf并增加如下内容:
[DEFAULT]
bind_port = 8080
user = swift
swift_dir = /etc/swift
[pipeline:main]
# Order of execution of modules defined below
pipeline = catch_errors healthcheck cache authtoken keystone proxy-server
[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true
set log_name = swift-proxy
set log_facility = LOG_LOCAL0
set log_level = INFO
set access_log_name = swift-proxy
set access_log_facility = SYSLOG
set access_log_level = INFO
set log_headers = True
account_autocreate = True
[filter:healthcheck]
use = egg:swift#healthcheck
[filter:catch_errors]
use = egg:swift#catch_errors
[filter:cache]
use = egg:swift#memcache
set log_name = cache
[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory
auth_protocol = http
auth_host = 127.0.0.1
auth_port = 35357
auth_token = admin
service_protocol = http
service_host = 127.0.0.1
service_port = 5000
admin_token = admin
admin_tenant_name = service
admin_user = swift
admin_password = swift
delay_auth_decision = 0
[filter:keystone]
paste.filter_factory = keystone.middleware.swift_auth:filter_factory
operator_roles = admin, swiftoperator
is_admin = true
注意:可以使用apt-get安装swift-doc软件包,安装后许多文档都收录在/usr/share/doc/swift-doc/html下,本配置样例也是如此。
2. 配置Swift账户服务器
默认swift容器服务配置文件为 /etc/swift/account-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
[account-replicator]
[account-auditor]
[account-reaper]
所有的account server配置文件都在 /etc/swift/account-server目录中。与 /srv里的设备相对应,我们创建1.conf、2.conf等等文件,并将它们放到/etc/swift/account-server/下。以下是/etc/swift/account-server/1.conf配置文件的内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6012
user = swift
log_facility = LOG_LOCAL2
[pipeline:main]
pipeline = account-server
[app:account-server]
use = egg:swift#account
[account-replicator]
vm_test_mode = no
[account-auditor]
[account-reaper]
对其它设备也是如此,比如/srv/node2、/srv/node3、/srv/node4等,我们分别创建2.conf,3.conf和4.conf与之对应。现在利用1.conf进行复制生成其余文件,并一一设置唯一的绑定端口及本地日志值:
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/2.conf
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/3.conf
sudo cp /etc/swift/account-server/1.conf /etc/swift/account-server/4.conf
sudo sed -i 's/6012/6022/g;s/LOCAL2/LOCAL3/g;s/node1/node2/g' /etc/swift/account-server/2.conf
sudo sed -i 's/6012/6032/g;s/LOCAL2/LOCAL4/g;s/node1/node3/g' /etc/swift/account-server/3.conf
sudo sed -i 's/6012/6042/g;s/LOCAL2/LOCAL5/g;s/node1/node4/g' /etc/swift/account-server/4.conf
3. 配置Swift容器服务器
默认swift容器服务配置文件为 /etc/swift/container-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
[container-replicator]
[container-updater]
[container-auditor]
[container-sync]
与account-server类似,我们同样创建 /etc/swift/container-server/1.conf等等文件与 /srv设备匹配,这是1.conf文件内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6011
user = swift
log_facility = LOG_LOCAL2
[pipeline:main]
pipeline = container-server
[app:container-server]
use = egg:swift#container
[container-replicator]
vm_test_mode = no
[container-updater]
接着利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6021、6031和6041)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和 LOG_LOCAL5)。
4. 配置Swift对象服务器
默认swift容器服务配置文件为 /etc/swift/object-server.conf:
[DEFAULT]
bind_ip = 0.0.0.0
workers = 2
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
[object-replicator]
[object-updater]
[object-auditor]
与account-server和container-server一样,我们同样创建 /etc/swift/object-server/1.conf等等文件与 /srv设备匹配,这是1.conf文件内容:
[DEFAULT]
devices = /srv/node1
mount_check = false
bind_port = 6010
user = swift
log_facility = LOG_LOCAL2
[pipeline:main]
pipeline = object-server
[app:object-server]
use = egg:swift#object
[object-replicator]
vm_test_mode = no
[object-updater]
[object-auditor]
继而利用1.conf继续创建2.conf、3.conf和4.conf。并修改端口(分别是6020、6030和6040)及本地日志值(LOG_LOCAL3、LOG_LOCAL4和 LOG_LOCAL5)。
5. 配置Swift Ring服务器
Ring是swift的一个极为重要的组件,它维护着对象的真实物理位置信息,对象的副本及多种设备。创建与对象服务、容器服务和账户服务相对应的ring-builder文件:
pushd /etc/swift
sudo swift-ring-builder object.builder create 18 3 1
sudo swift-ring-builder container.builder create 18 3 1
sudo swift-ring-builder account.builder create 18 3 1
注意:执行以上命令时需要在 /etc/swift目录下。
命令中的参数指定了分区、副本和小时的数量,用来限制分区多次移动。可以参考man页面中的swift-ring-builder获取更多信息。
现在添加区域以均衡ring服务。命令格式如下:
swift-ring-builder <builder_file> add <zone>-<ip_address>:<port>/<device><weight>
执行下列命令:
sudo swift-ring-builder object.builder add z1-127.0.0.1:6010/device 1
sudo swift-ring-builder object.builder add z2-127.0.0.1:6020/device 1
sudo swift-ring-builder object.builder add z3-127.0.0.1:6030/device 1
sudo swift-ring-builder object.builder add z4-127.0.0.1:6040/device 1
sudo swift-ring-builder object.builder rebalance
sudo swift-ring-builder container.builder add z1-127.0.0.1:6011/device 1
sudo swift-ring-builder container.builder add z2-127.0.0.1:6021/device 1
sudo swift-ring-builder container.builder add z3-127.0.0.1:6031/device 1
sudo swift-ring-builder container.builder add z4-127.0.0.1:6041/device 1
sudo swift-ring-builder container.builder rebalance
sudo swift-ring-builder account.builder add z1-127.0.0.1:6012/device 1
sudo swift-ring-builder account.builder add z2-127.0.0.1:6022/device 1
sudo swift-ring-builder account.builder add z3-127.0.0.1:6032/device 1
sudo swift-ring-builder account.builder add z4-127.0.0.1:6042/device 1
sudo swift-ring-builder account.builder rebalance
启动Swift服务
使用以下命令启动swift和REST API:
sudo swift-init main start
sudo swift-init rest start
测试Swift
可以通过Swift命令或Horizon提供的Web管理面板测试Swift是否正确运行。
首先,将 /etc/swift目录的属主设为swift.swift:
sudo chown -R swift.swift /etc/swift
执行以下命令查看是否能得到正确的account、容器数量和存储的对象信息:
swift -v -V 2.0 -A http://127.0.0.1:5000/v2.0/ -U service:swift -K swift stat
StorageURL: http://127.0.0.1:8080/v1/AUTH_c7970080576646c6959ee35970cf3199
Auth Token: ba9df200a92d4a5088dcd6b7dcc19c0d
Account: AUTH_c7970080576646c6959ee35970cf3199
Containers: 1
Objects: 1
Bytes: 77
Accept-Ranges: bytes
X-Trans-Id: tx11c64e218f984749bc3ec37ea46280ee
至此,Server1终于安装完毕!
三、Server2
Server2仅运行nova的运算服务。
(一)安装底层OS
安装64位Ubuntu12.04服务器。
(二)配置网络
安装网桥软件:
sudo apt-get install bridge-utils
编辑 /etc/network/interfaces文件,如下所示:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.10.10.3
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.1
dns-nameservers 10.10.8.3
auto eth1
iface eth1 inet static
address 192.168.3.2
netmask 255.255.255.0
network 192.168.3.0
broadcast 192.168.3.255
重启网络:
sudo /etc/init.d/networking restart
(三)NTP客户端
安装NTP软件包:
sudo apt-get install ntp
编辑 /etc/ntp.conf文件,增加如下内容以同步至server1:
server 10.10.10.2
重启NTP服务使配置生效:
sudo service ntp restart
(四)Nova组件(仅nova-compute)
安装Nova及其依赖包:
sudo apt-get install nova-compute
如下所示,编辑 /etc/nova/nova.conf文件。该文件与Server1中的一致:
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/run/lock/nova
--allow_admin_api=true
--use_deprecated_auth=false
--auth_strategy=keystone
--scheduler_driver=nova.scheduler.simple.SimpleScheduler
--s3_host=10.10.10.2
--ec2_host=10.10.10.2
--rabbit_host=10.10.10.2
--cc_host=10.10.10.2
--nova_url=http://10.10.10.2:8774/v1.1/
--routing_source_ip=10.10.10.2
--glance_api_servers=10.10.10.2:9292
--image_service=nova.image.glance.GlanceImageService
--iscsi_ip_prefix=192.168.4
--sql_connection=mysql://novadbadmin:novasecret@10.10.10.2/nova
--ec2_url=http://10.10.10.2:8773/services/Cloud
--keystone_ec2_url=http://10.10.10.2:5000/v2.0/ec2tokens
--api_paste_config=/etc/nova/api-paste.ini
--libvirt_type=kvm
--libvirt_use_virtio_for_bridges=true
--start_guests_on_host_boot=true
--resume_guests_state_on_host_boot=true
# vnc specific configuration
--novnc_enabled=true
--novncproxy_base_url=http://10.10.10.2:6080/vnc_auto.html
--vncserver_proxyclient_address=10.10.10.2
--vncserver_listen=10.10.10.2
# network specific settings
--network_manager=nova.network.manager.FlatDHCPManager
--public_interface=eth0
--flat_interface=eth1
--flat_network_bridge=br100
--fixed_range=192.168.4.1/27
--floating_range=10.10.10.2/27
--network_size=32
--flat_network_dhcp_start=192.168.4.33
--flat_injected=False
--force_dhcp_release
--iscsi_helper=tgtadm
--connection_type=libvirt
--root_helper=sudo nova-rootwrap
--verbose
重新启动Server2上的nova-compute服务:
sudo service restart nova-compute
利用如下命令测试云中第二个运算节点(即Server2)是否正常运行:
sudo nova-manage service list
Binary Host Zone Status State Updated_At
nova-network server1 nova enabled :-) 2012-04-20 08:58:43
nova-scheduler server1 nova enabled :-) 2012-04-20 08:58:44
nova-volume server1 nova enabled :-) 2012-04-20 08:58:44
nova-compute server1 nova enabled :-) 2012-04-20 08:58:45
nova-cert server1 nova enabled :-) 2012-04-20 08:58:43
nova-compute server2 nova enabled :-) 2012-04-21 10:22:27
如果看到类似结果,则说明安装已经成功可以使用。
至此,Server2安装完毕!
三、Client1
(一)安装OS
安装64位Ubuntu12.04桌面版。
(二)配置网络
如下所示,编辑 /etc/nova/nova.conf文件:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 10.10.10.4
netmask 255.255.255.0
broadcast 10.10.10.255
gateway 10.10.10.1
dns-nameservers 10.10.8.3
(三)NTP客户端
安装NTP软件包:
sudo apt-get install -y ntp
编辑 /etc/ntp.conf文件,增加如下内容以同步至server1:
server 10.10.10.2
重启NTP服务使配置生效:
sudo service ntp restart
(四)客户端工具
如前所述,Ubuntu12.04桌面版用来制作镜像,同样它也可以使用nvoa、glance和swift命令行工具管理云。
使用下列命令安装我们需要的命令行工具:
sudo apt-get install python-novaclient glance-client swift
接着安装qemu-kvm:
sudo apt-get install qemu-kvm
输入环境变量,并将其添加进 ~/.bashrc脚本中:
export SERVICE_TOKEN=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL="http://10.10.10.2:5000/v2.0/"
export SERVICE_ENDPOINT=http://10.10.10.2:35357/v2.0
运行nova和glance命令查看是否与OpenStack正常连接:
nova list
+--------------------------------------+------------+--------+----------------------+
| ID | Name | Status | Networks
|
+--------------------------------------+------------+--------+----------------------+
| 25ee9230-6bb5-4eca-8808-e6b4e0348362 | myinstance | ACTIVE | private=192.
168.4.35 |
| c939cb2c-e662-46e5-bc31-453007442cf9 | myinstance1| ACTIVE | private=192.
168.4.36 |
+--------------------------------------+------------+--------+----------------------+
glance index
ID Name Disk Container Size
Format Format
------------------------------------ ------------------------------
----------------
65b9f8e1-cde8-40e7-93e3-0866becfb9d4 windows qcow2 ovf
7580745728
f147e666-990c-47e2-9caa-a5a21470cc4e debian qcow2 ovf
932904960
f3a8e689-02ed-460f-a587-dc868576228f opensuse qcow2 ovf
1072300032
aa362fd9-7c28-480b-845c-85a5c38ccd86 centoscli qcow2 ovf
1611530240
49f0ec2b-26dd-4644-adcc-2ce047e281c5 ubuntuimage qcow2 ovf
1471807488
(五)管理面板
打开浏览器输入Server1的IP地址,如:http://10.10.10.2,便进入管理面板的登陆页面。使用用户名“admin”和密码“admin”进行登陆来管理您刚建好的OpenStack吧。
现在,全部安装结束