Oracle VM VirtualBox 5.0.24,Ubuntu-14.04.4(LTS) 64位。
由于是在虚拟机环境下单机部署,考虑到系统的流畅性,内存分配4096MB,4 CPU,虚拟磁盘动态分配16GB,双网卡(Host-Only+桥接)。
*注:这里虚拟机网卡用Host-Only模式,个人想法是Host-Only模式正好可以模拟一个局域网,便于以后配置openstack多节点的管理网络,所以本练习中就用Host-Only模式这块网卡来作为控制节点的管理网络接口;而虚拟机第二块网卡采用桥接方式便于在搭建环境中访问外网。
Openstack目前最新的版本是Mitaka(2016.04),Ubuntu_14.04版本上的安装指南如下:
http://docs.openstack.org/mitaka/install-guide-ubuntu/
本次练习中安装的基本服务包括:
Service | Project Name |
---|---|
Identity service | Keystone |
Image service | Glance |
Compute service | Nova |
Networking service | Neutron |
Block Storage | Cinder |
*注:Horizon其实也装了,但是没有调试起来,回头再去debug一下django的问题。
练习在单机上部署openstack基本的服务模块,配通这些服务模块;
练习创建一个实例,其中包括上传镜像、创建一个openstack网络、创建一个volume并附着给一个实例,最后在实例中挂载块设备。
正常按照官方文档进行部署即可,只不过本练习中是把控制节点、计算节点和存储节点都放在了一台虚拟机上。安装的过程中会碰到一些需要注意的地方:
1)[Networking]章节中给出了两种网络选择:provider network和self-service network,选择了更简单的前者作为练习部署的网络选择。这里大概能看懂官方文档中的解释,前者配置的网络只有层2服务,后者可以配置的网络包含层3服务,相关层2层3网络的知识点(bridge、routing、NAT、VXLAN等)还需要课外补充下。
2)官方推荐使用虚拟机安装,也是本练习采用的方案,原因是可以利用快照节省时间,另外虚拟机方便配置多网卡。由于对linux操作系统比较生疏,练习过程中确实在安装操作系统和配置openstack服务上花费了很多时间,中间还在物理机上安装了ubuntu练习部署openstack环境,但是中间碰到问题不知道怎么回滚,所以后来还是转移到虚拟机环境下部署。
3) 部署过程中,密码有_DBPASS和_PASS两种,前者是sql密码,后者是service密码,为了方便,本练习中的_DBPASS全部采用openstack,_PASS采用项目名称(即glance项目的服务密码是glance,以此类推)。
4)[Host networking]章节中给出了官方推荐的网络拓设计示例。本次练习中虚拟机Host-Only模式的网卡(eth0)扮演的是控制/计算/存储节点的管理网络接口,但是没有练习到把管理网络配通道外网。
5)接着是练习手动修改节点网卡配置,配置节点IP,修改Hosts文件(虚拟机hostname配置为controller,和文档中控制节点的保持一致,这样后续直接复制粘贴配置指令很方便)等操作。其中网卡配置文件/etc/network/interfaces内容的含义自己查了一下,参考[Debian / Ubuntu的网络配置]:
# The provider network interface
auto INTERFACE_NAME //auto小节定义了接口是不是要在系统启动时自动初始化。
iface INTERFACE_NAME inet manual //iface小节定义的逻辑接口的特性,这里意思应该是手动配置
up ip link set dev $IFACE up //启动端口
down ip link set dev $IFACE down //关闭端口
6)NTP同步并没有调试,因为是单节点练习,这里随便百度了下网络上可用的NTP服务器,貌似国内的NTP服务器都无法ping通。
7)安装和配置数据库,最后需要运行一次安全配置向导。
8)RabbitMQ和Memcached的安装按照文档流程即可顺利通过。
1)在生成一个随机数用作admin token时,可以把随机数保存到文件中,后续用到时方便查阅,例如:
openssl rand -hex 10 > /root/token
2)配置/etc/keystone/keystone.conf的[database]小节时,官方文档并没有强调必须注释掉默认的数据库连接这句,但国内写的很多openstack配置文档上都强调需要注释掉这句,实际看起来好像不注释掉这句也没有影响。
...
connection = sqlite:////var/lib/keystone/keystone.db
connection = mysql+pymysql://keystone:openstack@controller/keystone
...
3)最后会创建两个client environment scripts,我也是保存在/root目录下,后续会经常用到。
4)Keystone模块是第一个创建的模块,是Openstack框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone来处理,本次练习中配置的是V3版本,新加入了Domain和Group等概念,详细的模块介绍可以看官方[wiki]。
配置本章节时按照官方文档流程即可,最后下载一个cirros镜像并上传到openstack镜像服务中。
root@controller:/home/jason# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 56804a7b-0fc3-4bc8-b04d-60af0f4b1942 | cirros | active |
+--------------------------------------+--------+--------+
1)需要分别创建nova_api和nova两个数据库。
2)修改/etc/nova/nova.conf时,官方文档提到的需要修改的小节都是缺省的,需要手动添加上去。文档有句很隐蔽的提示:由于某个BUG,需要注释掉[DEFAULT]小节中logdir选项的配置。
3)由于是单机部署,所以配置计算节点的部分基本上在配置控制节点时都已经完成了,唯一不同的地方是在/etc/nova/nova.conf文件的[vnc]小节。另外需要验证节点是否支持硬件加速,本练习中虚拟机并不支持,所以要将libvirt改为QEMU,这样才能在虚拟机里成功创建实例吧。
4)本练习中部署的计算服务列表如下:
root@controller:/home/jason# openstack compute service list
+----+------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 3 | nova-consoleauth | controller | internal | enabled | up | 2016-09-10T15:53:39.000000 |
| 4 | nova-scheduler | controller | internal | enabled | up | 2016-09-10T15:53:39.000000 |
| 5 | nova-conductor | controller | internal | enabled | up | 2016-09-10T15:53:38.000000 |
| 6 | nova-compute | controller | nova | enabled | up | 2016-09-10T15:53:46.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+
1)本练习中创建的是Provider networks。
2)配置/etc/neutron/plugins/ml2/ml2_conf.ini文件的[ml2]小节时,由于是单机部署,type_drivers字段采用了示例值而没有完全按照官方文档来配置:
[ml2]
...
type_drivers = local,flat,vlan,gre,vxlan,geneve
3)配置/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件的[linux_bridge]小节时,physical_interface_mappings的值配置为eth1,因为官方文档给出该字段的解释是应该配置为provider physical network的接口。
4)计算服务部署完毕后,就可以练习启动一个实例了。
root@controller:/home/jason# openstack network list
+--------------------------------------+----------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+----------+--------------------------------------+
| bda76bb6-bb48-47a2-9f80-d6306c2388a9 | provider | a3eb4871-d48a-4f78-8d3e-6c525cb8beaa |
+--------------------------------------+----------+--------------------------------------+
root@controller:/home/jason# openstack server list
+--------------------------------------+-------------------+--------+------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------------------+--------+------------------------+
| 11fe5a2c-f594-46b2-90d3-e8eeefd51159 | provider-instance | ACTIVE | provider=192.168.0.102 |
+--------------------------------------+-------------------+--------+------------------------+
1)开始配置虚拟机时,只创建了一个虚拟磁盘,fdisk只能看到/dev/sda,为了创建LVM物理卷,需要关闭虚拟机后新增一个虚拟磁盘:
2)修改lvm配置文件/etc/lvm/lvm.conf时,devices小节的filter字段配置需要接受sda和sdb:
filter = [ "a/sda/", "a/sdb/", "r/.*/"]
3)cinder服务部署完毕后,就可以创建一个volume并附着到之前创建的实例上了。
root@controller:/home/jason# openstack volume list
+--------------------------------------+--------------+--------+------+--------------------------------------------+
| ID | Display Name | Status | Size | Attached to |
+--------------------------------------+--------------+--------+------+--------------------------------------------+
| 500ec894-9d1d-44d4-a0bb-5322c9f8ac11 | volume1 | in-use | 1 | Attached to provider-instance on /dev/vdb |
+--------------------------------------+--------------+--------+------+--------------------------------------------+
登陆到实例中,可以看到实例用volume作为它的/dev/vdb块存储设备。
root@controller:/home/jason# ssh [email protected]
$ sudo fdisk -l
Disk /dev/vda: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/vda1 * 16065 2088449 1036192+ 83 Linux
Disk /dev/vdb: 1073 MB, 1073741824 bytes
9 heads, 8 sectors/track, 29127 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x55b4d605
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2097151 1047552 83 Linux
最后在实例中挂在该快设备,并写入一个文件:
root@controller:/home/jason# ssh [email protected]
$ sudo su
$ fdisk -l
Disk /dev/vda: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/vda1 * 16065 2088449 1036192+ 83 Linux
Disk /dev/vdb: 1073 MB, 1073741824 bytes
9 heads, 8 sectors/track, 29127 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x55b4d605
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2097151 1047552 83 Linux
$ df -h
Filesystem Size Used Available Use% Mounted on
/dev 21.3M 0 21.3M 0% /dev
/dev/vda1 23.2M 18.2M 3.8M 83% /
tmpfs 24.8M 0 24.8M 0% /dev/shm
tmpfs 200.0K 72.0K 128.0K 36% /run
/dev/vdb1 1006.9M 17.3M 938.5M 2% /mnt/vdb1
$ echo "Hello world!" > /mnt/vdb1/text
$ cat /mnt/vdb1/text
Hello world!
$
其实有很多一键部署的项目例如Devstack这种,通过几个脚本来非常快速地部署openstack环境,我一开始也用这种方法操作过,大约20分钟就可以直接登陆使用web界面了。但是练习按照官方文档来手动配置openstack环境有这么些好处:
整个过程中碰到比较难以消化的是neutron网络配置这一块,因为自己网络方面的知识忘得差不多了,到最后还没有把实例网络配置到可以ping通外网,所以网络这一块的知识下来需要好好补充一下。