部署一个 All-In-One 的 OpenStack

最近在学习 OpenStack,于是在虚拟机上使用DevStack部署了一个 All-In-One 的版本(也就是把所有的组件都放在了一个节点上),用于学习和测试。

Prerequisite

  • VMware Workstation 15 Pro(也可使用VirtualBoxKVM
  • Ubuntu 16.04.5-server-amd64.iso(也可以使用其它Linux版本,只是OpenStack官网推荐Ubuntu。使用server版本可以节省内存等消耗。)

Ubuntu虚拟机至少分配4G内存。

Pre-Installation

安装好虚拟机后,一般来说只会用默认的账号登录,为了方便后续安装,可以先切换到root用户

设置root密码:

1
$ sudo passwd root

设置密码后,可以切换到root:

1
$ su root

以下操作在 root 用户下进行。

IP设置

如果部署多节点,需要设置 Ubuntu 静态 IP 。Ubuntu 下配置静态的方法可以参考Ubuntu 设置静态 IP

对于单节点,使用DHCP影响不大。

工具安装

git

1
$ apt install git -y

其它的大部分工具,如pip等,DevStack会在安装过程中自动检测并安装

环境设置

DevStack的运行需要一个拥有 sudo 权限非 root 用户。这里创建一个名为stack的用户:

1
$ useradd -s /bin/bash -d /opt/stack -m stack

赋权:

1
$ echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Configuration

接下来的安装过程,使用创建好的stack用户:

1
$ su stack

下载DevStack

下载 DevStack 到 stack 用户的根目录下,我这里使用的是 queens 版本:

1
2
$ cd
$ git clone https://git.openstack.org/openstack-dev/devstack -b stable/queens

也可以直接使用最新版本(master 分支):

1
$ git clone https://git.openstack.org/openstack-dev/devstack

具体的版本可以在这个链接查看。

配置local.conf

首先要确认虚拟机的IP,如果是设置了静态IP,使用静态IP即可;如果使用DHCP,则需要查看IP。

1
$ ifconfig

在输出里,可以看到ubuntu的IP以及对应网卡名称。例如,我的IP是192.168.99.10,子网掩码255.255.255.0,对应的网卡是ens33

local.conf是整个过程中非常重要的文件。这里仅做最简单的配置,配置文件的详细内容可以参考OpenStack官方文档

1
2
$ cd devstack
$ vim local.conf

输入以下内容(也可以直接下载我的文件并替换 IP 即可):

1
2
3
4
5
6
7
8
9
10
[[local|localrc]]
FLOATING_RANGE=192.168.99.224/27
FIXED_RANGE=10.11.12.0/24
FIXED_NETWORK_SIZE=256
FLAT_INTERFACE=ens33
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret
LOGFILE=/opt/stack/logs/stack.sh.log
  • FLOATING_RANGE 设置为本地网络中未被使用的IP地址范围,例如192.168.99.224/27,代表192.168.99.225~192.168.99.254,这些IP要和虚拟机IP地址在一个子网。
  • FIXED_RANGEFIXED_NETWORK_SIZE 用于限定之后 OpenStack 运行的实例可用的网络地址空间。
  • FLAT_INTERFACE 设置为上一步查看到的网卡名称。
  • ADMIN_PASSWORD 是管理员密码,即之后自动创建的OpenStack用户 admindemo 的密码。
  • DATABASE_PASSWORD是 OpenStack 的 MySQL 管理员密码。
  • RABBIT_PASSWORD是 RabbitMQ(OpenStack 的消息队列)密码。
  • SERVICE_PASSWORD 是 OpenStack 各个服务 (Nova, Glance,等)用于Keystone验证的密码。
  • LOGFILE设置了stack.sh 运行日志路径。

Installation

接下来,只需要运行一个脚本就能开始下载和安装了:

1
$ ./stack.sh

部署 OpenStack 是一个很需要耐心的过程,这不只是因为它本身安装时间较长,更是因为国内的网络问题以及容易出现一些各种各样的错误。但是大部分问题都是可以通过Google解决的,还有一些错误通过./unstack.sh && ./stack.sh就消失了。进行每一步的过程中,多使用 VMware 的快照功能,减少重复操作和错误恢复的时间。

Congratulation

如果你能看到以下输出,就已经成功部署了 OpenStack

在浏览器输入http://192.168.99.10/dashboard

使用admin/secret就可以登陆了

Troubleshooting

安装并升级pip

./stack.sh 默认是会检测和安装pip的,也可以提前完成,减少错误发生的可能性。

1
2
$ apt install python-pip -y
$ pip -V

如果 pip 版本太旧,进行升级:

1
2
$ pip install --upgrade pip
$ pip -V

如果升级 pip 后报错 ImportError: cannot import name main,需要修改 /usr/bin/pip

1
2
3
from pip import main
# 改为
from pip._internal import main

配置pip源

如果 pip 安装 python module 过程中经常出现网络错误,可以修改 pip 源(在 stack 用户下)

1
2
$ mkdir ~/.pip
$ vim ~/.pip/pip.conf

修改为豆瓣源:

1
2
3
[global]
trusted-host=pypi.douban.com
index-url=http://pypi.douban.com/simple/

ipv6 错误

在 VMware 界面,编辑 -> 虚拟网络编辑器 -> 更改设置

选中 VMnet8 网卡,并启用 IPV6 选项。

文件下载失败

安装过程中,会下载很多的文件,国内网络原因可能导致一些文件下载失败。一般来说有3种解决方案:

  • 修改源,一般用于修改 ubuntu 源或者 pip 源。
  • 在宿主机科学上网,再设置虚拟机使用 proxy 通过宿主机的代理进行连接。
  • 在宿主机科学上网下载好文件后,传输到虚拟机。传输可以使用 scp,也可以直接利用 VMware 等提供的共享文件夹功能,放入虚拟机。

例如,我在安装过程中,无法下载 etcd-v3.1.10-linux-amd64.tar.gz,查看 log 找到其下载地址,下载到宿主机之后,放在 E:\vmfiles 中,然后开启共享文件夹:

一般共享文件夹位于 /mnt/hgfs/ 下。在 log 日志中,找到这个文件应该放置的位置,例如 /opt/stack/devstack/files,复制到里面即可:

1
$ cp /mnt/hgfs/vmfiles/etcd-v3.1.10-linux-amd64.tar.gz /opt/stack/devstack/files

重新运行

1
./unstack.sh && ./stack.sh

本文为博主原创文章,转载请注明出处。