Openstack 基本模块单机部署练习

系统版本

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并附着给一个实例,最后在实例中挂载块设备。


部署过程

正常按照官方文档进行部署即可,只不过本练习中是把控制节点、计算节点和存储节点都放在了一台虚拟机上。安装的过程中会碰到一些需要注意的地方:

[Environment]

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的安装按照文档流程即可顺利通过。

[Indentity service]

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]。

[Image service]

配置本章节时按照官方文档流程即可,最后下载一个cirros镜像并上传到openstack镜像服务中。

root@controller:/home/jason# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 56804a7b-0fc3-4bc8-b04d-60af0f4b1942 | cirros | active |
+--------------------------------------+--------+--------+

[Compute service]

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 |
+----+------------------+------------+----------+---------+-------+----------------------------+

[Networking service]

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 |
+--------------------------------------+-------------------+--------+------------------------+

[Block Storage service]

1)开始配置虚拟机时,只创建了一个虚拟磁盘,fdisk只能看到/dev/sda,为了创建LVM物理卷,需要关闭虚拟机后新增一个虚拟磁盘:
Openstack 基本模块单机部署练习_第1张图片
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环境有这么些好处:

  • 首先也是最重要的,官方文档最新也最准确。网络上也可以搜到很多用命令行部署openstack环境的中文文档,但是要么版本比较老,要么有些地方没有写清楚或者不正确,与其这样不如老老实实读官方文档。
  • 其次可以拆解式地了解到这些基础模块创建的过程,比如每个模块包含哪些组件,需要给模块配置什么参数(创建数据库-创建用户-创建服务实体-创建API端点-在配置文件中添加database链接/message queue配置/keystone认证等等),整个体系的基本网络拓扑等等。虽然是单机部署练习,但是通过阅读官方配置文档(因为配置文档是针对分布式架构部署)可以分别了解控制节点、计算节点和存储节点上分别应该部署哪些模块,他们之间如何配置到可以互相连通等等。
  • 最后通过命令行配置,多少也可以初步练习到一些基本的CLI命令,后面学习openstack CLI命令会更快。另外从熟悉linux环境的角度来说,本身熟练使用命令行操作也是必须的。

整个过程中碰到比较难以消化的是neutron网络配置这一块,因为自己网络方面的知识忘得差不多了,到最后还没有把实例网络配置到可以ping通外网,所以网络这一块的知识下来需要好好补充一下。

你可能感兴趣的:(环境搭建)