OpenStack 是一套用来管理虚拟机器的平台站群软件。它不是一个单一的站群软件,而是整合了很多个元件用来协同合作。简单的来说,譬如有十台站群服务器,在 VMware 的情况下,我们在每台站群服务器上安装 esx 或者 esxi,然后装一台 vcenter,在 vcenter 的管理介面里把十台站群服务器的 esx 通过域名或者 ip 加入,就能在 vcenter 里面统一管理。类似的,红帽也有 virsh 这种管理虚拟机器的程式。
在这里我不介绍其他的云平台的管理站群软件,只是介绍如何从技术角度来使用 OpenStack 。如果要作为生产环境的话,你还需要考虑更多,譬如架构,互联网拓扑,储存的方式,节点的分布等等。
在本篇文章里,我将介绍采用 ec2 相容认证的方式 。所有元件安装在一台 controller 上。
关键字定义
控制端:类似 vcenter 的管理系统。
节点:类似安装了 esx 的站群服务器。
nova 元件:安装在节点上,让节点能按照控制端的命令来操作节点上的虚拟机器或者储存。
glance 元件:用来管理镜像站群。
环境准备
ubuntu 11.10,站群服务器双网络卡
步骤
安装完基本的操作系统后
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install bridge-utils  #安装网桥站群软件
配置互联网介面
在这里我的架构是 eth0 连线了外网,即我们可以访问的网口。 eth1 做了网桥,和节点之间通过一个交换机连线。这样的好处是,内部节点和控制器的流量都走 br100 的交换机,而不会影响虚拟机器上的应用使用的互联网。
$ sudo vi /etc/network/interfaces

auto eth0
iface eth0 inet static
address 192.168.200.21
netmask 255.255.255.0
network 192.168.200.0
broadcast 192.168.200.255
gateway 192.168.200.10
auto br100
iface br100 inet static
bridge_ports eth1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
address 10.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 #安装 Python dependencies
接下来安装各个 nova 元件及依赖
$ sudo apt-get install nova-volume nova-vncproxy nova-api nova-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-server-5.1 mysql-server/root_password password $MYSQL_PASS
>mysql-server-5.1 mysql-server/root_password_again password $MYSQL_PASS
>mysql-server-5.1 mysql-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-manage user admin
在这里我们可以建立一个使用者,如
$ sudo nova-manage user admin test
建立成功萤幕上会返回下面这样的输出:
export EC2_ACCESS_KEY=d6aa7747-4324-4abc-9604-4f7d6a2f8f3f
export EC2_SECRET_KEY=2b204b75-da2d-47b8-ba7a-611d71f0ecbf
nova-manage project create
建立一个专案,属于刚才我们建的那个使用者 如:
$ sudo nova-manage project create test-proj test
nova-manage network 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
怎么样,成功了吧。
另外,在起每个服务的时候,最好看一下日志,譬如 sudo tail -f /var/log/nova/nova-network 来确定有没有报错,也可以用 ps aux | grep [n]ova-network 来确认服务有没有开启。如果起服务失败,你确认好原因,修改好以后,需要用 sudo start 而不是 sudo restart 来起
好了。这样计算的环境就部署好了。我们可以用命令来看一下状态:
$ 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
VAILABILITYZONE nova 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
至此,成功启用了服务。当你发现服务不能正常使用时,用 ps aux | grep nova 检查一下服务有没有开启,并需要详细观察/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
这里我们使用 RHEL 5 的 iso,执行完这个命令,可以用 vnc 连线。
在你的本机连线站群服务器:ssvncviewer 192.168.200.21 :0
开启 vnc 你就可以看到安装介面。
安装完以后,把下面一段写入 rhel 镜像站群的/etc/rc.local 的开头:
depmod -a
modprobe acpiphp

# 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 -s http://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=raw is_public=true < server.img 同时你应该观察/var/log/glance/registry 和 api 的 log 。成功之后,用 $ glance index 看看镜像站群列表。 启动你的例项 $ euca-describe-images 检视你现在可用的 image,输出类似下面这样: IMAGE ami-00000003 server.img 记住这里 ami-000000003 这个 image 号。 $ euca-run-instances -t m1.tiny ami-00000003 启动 ami-00000003 镜像站群的例项。-t 指明了例项的型别,型别规定了 cpu,内存,磁碟大小等资讯。 观察/var/log/nova/nova-api.log nova-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 方式安装的开发版本,因此后续更加完善的整合,我都将以开发版本的形式出现。当然使用开发版本的话,会有更多的烦恼,但也同样有更多的乐趣和动手的实践,能更进一步了解其工作的原理机制。