在 macOS 上通过 Multipass 部署 OpenStack 测试环境是一个非常方便的方式,尤其是使用 All-in-One 部署方式来简化环境配置。All-in-One 部署将 OpenStack 的所有核心组件(如 Nova、Keystone、Glance、Cinder、Neutron 等)部署在一台虚拟机上,适合用于测试和开发环境。
使用 Multipass 部署 OpenStack #
1. 准备工作: #
- 安装 Multipass:确保你已经安装了 Multipass。你可以通过官网(Multipass 官方网站)下载并安装。
- 安装 Ubuntu 虚拟机:创建一个 Ubuntu 虚拟机来部署 OpenStack。
2. 创建虚拟机: #
使用 Multipass 创建 Ubuntu 虚拟机时,你可以指定虚拟机的资源配置(如 CPU 核数、内存和硬盘空间)。以下是创建虚拟机的命令:
multipass launch --name openstack-vm --cpus 4 --mem 8G --disk 40G 22.04
--name openstack-vm
:虚拟机的名称。--cpus 4
:分配 4 个 CPU 核心。--mem 8G
:分配 8GB 内存。--disk 40G
:分配 40GB 硬盘空间。20.04
:指定使用 Ubuntu 20.04 LTS 版本。
这将创建一台名为 openstack-vm
的虚拟机,具有 4 核 CPU、8GB 内存和 40GB 硬盘空间。
3. 连接到虚拟机: #
创建虚拟机后,你可以通过以下命令连接到虚拟机的终端:
multipass shell openstack-vm
进入虚拟机后,你可以开始在里面安装 OpenStack。
4. 在虚拟机中部署 OpenStack: #
有几种方式可以在 Ubuntu 虚拟机中安装 OpenStack:
- 使用 DevStack:这是最常见的开发环境部署工具,适合在单一节点(All-in-One)部署 OpenStack。DevStack 会自动配置所有 OpenStack 组件,并且可以通过简单的配置来启动整个环境。
- 使用 Packstack:这是 Red Hat 开发的脚本工具,适用于 OpenStack 的快速部署。
下面是通过 DevStack 在虚拟机中部署 OpenStack 的简单步骤:
5. 使用 DevStack 安装 OpenStack #
更新系统:
sudo apt update sudo apt upgrade -y sudo apt install git -y
克隆 DevStack 仓库:
git clone https://opendev.org/openstack/devstack cd devstack
配置 DevStack: 你可以使用默认的配置文件,也可以创建一个自定义配置文件。在
devstack
目录下创建一个配置文件local.conf
,例如:vim local.conf
配置内容如下(修改为你自己的用户名和密码):
[[local|localrc]] ADMIN_PASSWORD=yourpassword DATABASE_PASSWORD=$ADMIN_PASSWORD RABBIT_PASSWORD=$ADMIN_PASSWORD SERVICE_PASSWORD=$ADMIN_PASSWORD [[local|localrc]] ADMIN_PASSWORD=1234 DATABASE_PASSWORD=1234 RABBIT_PASSWORD=1234 SERVICE_PASSWORD=1234
运行 DevStack 安装 OpenStack: 运行以下命令来安装 OpenStack:
./stack.sh FORCE=yes ./stack.sh
这个过程会下载和安装所有需要的依赖,并配置 OpenStack 所有组件。安装过程可能需要一些时间。
你遇到的错误信息表明 stack.sh
脚本在执行过程中遇到了一些问题。根据报错信息,可能是以下几个原因导致的:
- 权限问题或目录不存在:
- 错误消息显示
functions-common
脚本试图访问/opt/stack/logs/error.log
文件时找不到该目录。这通常是由于目标目录没有创建或当前用户没有足够权限导致的。
- 错误消息显示
- 缺少必要的目录:
- OpenStack 的安装脚本会创建一些日志和临时目录。如果这些目录没有正确创建,可能会导致后续操作失败。
解决方案 #
1. 创建缺少的目录 #
尝试手动创建日志目录 /opt/stack/logs
,并设置正确的权限:
sudo mkdir -p /opt/stack/logs
sudo chown -R ubuntu:ubuntu /opt/stack
这里假设你是以 ubuntu
用户身份运行的(根据错误信息中的 ubuntu@openstack-vm
)。
2. 确保脚本具有执行权限 #
如果是权限问题,确保脚本具有正确的执行权限:
chmod +x stack.sh
3. 使用 FORCE=yes
重新运行脚本
#
如果你想绕过当前的错误并强制运行安装脚本,可以使用 FORCE=yes
环境变量来继续执行脚本:
FORCE=yes ./stack.sh
这会强制脚本继续执行,但需要注意,这种方式可能会跳过一些错误检查。
4. 查看更详细的日志 #
如果问题依旧没有解决,查看脚本日志的详细信息可以帮助找出根本原因。你可以查看 stack.sh
脚本所在目录中的其他日志文件,通常这些文件会有更多的错误信息。
cat /opt/stack/logs/error.log
5. 清理之前的安装并重新开始 #
如果前面的步骤都没有解决问题,可以尝试清理之前的安装并重新运行:
./unstack.sh
./clean.sh
然后再尝试重新运行 stack.sh
:
./stack.sh
6. 检查依赖和配置 #
确保系统已安装所有必要的依赖项,特别是网络相关的工具(如 git
、python
等),并且你的配置文件(如 local.conf
)没有遗漏或配置错误。
总结 #
- 检查并创建缺少的目录
/opt/stack/logs
。 - 确保脚本具有正确的执行权限。
- 尝试使用
FORCE=yes
重新运行脚本。 - 查看错误日志获取更多信息。
- 清理并重新开始安装过程。
这些步骤应该能帮助你解决安装过程中的问题。
6. 完成安装后访问 OpenStack: #
安装完成后,DevStack 会启动一个默认的 Horizon Web 界面,你可以在浏览器中访问并登录。
获取虚拟机的 IP 地址:
multipass list
在浏览器中访问 Horizon Web 界面: 访问
http://<VM-IP>/dashboard
,并使用 DevStack 安装过程中设置的ADMIN_PASSWORD
登录。
推荐配置 #
- CPU:4 核 CPU(可以根据需要调整,2 核也能满足基础体验)
- 内存:8GB 内存(OpenStack 虽然可以在 4GB 内存上运行,但 8GB 会带来更好的体验,尤其是在启动虚拟机和运行服务时)
- 硬盘空间:40GB 硬盘(40GB 适合测试环境,如果需要运行多个虚拟机,可能需要更多存储空间)
总结 #
通过 Multipass 和 DevStack,你可以轻松在 macOS 上的 Ubuntu 虚拟机中部署一个测试用的 OpenStack 环境。资源配置方面,4 核 CPU、8GB 内存和 40GB 硬盘是一个合适的基础配置,可以支撑 OpenStack 的基础功能和一些虚拟机的运行。如果需要更多的虚拟机或服务,可以根据需求适当调整资源配置。
/opt/stack/requirements/upper-constraints.txt
zipp
admin-openrc.sh
是一个环境配置文件,它包含了 OpenStack 管理员账户的认证信息,通常在安装和部署 OpenStack 时生成。这个文件用于设置环境变量,使得你可以通过 openstack
命令行工具与 OpenStack 进行交互。
如何使用 admin-openrc.sh
文件:
#
下载
admin-openrc.sh
文件如果你从 OpenStack 的 Web 控制面板(Horizon)下载了
admin-openrc.sh
文件,你需要在本地环境中使用它来设置命令行环境。通常,你可以在 Horizon 控制面板中找到 “Download OpenRC file” 的选项,选择下载 admin-openrc.sh,这个文件会包含你 OpenStack 管理员账号的认证信息(如用户名、密码等)。
使用
source
命令加载环境变量打开终端并定位到
admin-openrc.sh
文件所在的目录,使用source
命令加载该文件,这样文件中定义的环境变量就会在当前的 shell 会话中生效。source admin-openrc.sh
执行后,它会要求你输入 OpenStack 管理员账号的密码。输入密码后,环境变量会设置好,你就可以使用 OpenStack 的命令行工具进行操作了。
验证环境变量设置
加载环境变量后,可以通过
openstack
命令验证是否设置成功。例如,查看当前项目的信息:openstack project list
如果环境变量设置正确,你应该能够看到当前 OpenStack 环境中的所有项目。
使用
openstack
命令行工具加载了环境变量之后,你就可以开始使用 OpenStack 的命令行工具(如
openstack server create
,openstack image list
,openstack flavor list
等)来管理你的 OpenStack 实例和资源。示例:
查看所有镜像:
openstack image list
查看所有实例:
openstack server list
创建一个新的实例:
openstack server create --image <image_name> --flavor <flavor_name> --network <network_name> --key-name <key_name> <server_name>
示例步骤:如何使用 admin-openrc.sh
创建实例
#
加载 OpenRC 文件:
source admin-openrc.sh
查看可用的镜像:
openstack image list
你会看到类似下面的输出:
+--------------------------------------+------------------+--------+ | ID | Name | Status | +--------------------------------------+------------------+--------+ | 1234abcd-5678-efgh-ijkl-mnopqrstuv | ubuntu-22.04 | active | | abcd1234-5678-efgh-ijkl-mnopqrstuv | centos-7 | active | +--------------------------------------+------------------+--------+
查看可用的 flavor:
openstack flavor list
你会看到如下输出:
+---------+--------+------+------+ | ID | Name | RAM | Disk | +---------+--------+------+------+ | 1 | m1.small | 2048 | 20 | | 2 | m1.medium | 4096 | 40 | +---------+--------+------+------+
创建实例:
假设你想使用
ubuntu-22.04
镜像,m1.small
规格,并连接到名为private
的网络,命令如下:openstack server create --image ubuntu-22.04 --flavor m1.small --network private --key-name my-key test-instance
这会创建一个名为
test-instance
的实例。查看实例状态:
openstack server list
你会看到实例的状态变为
ACTIVE
,并且可以访问它。
总结 #
admin-openrc.sh
是一个包含 OpenStack 管理员认证信息的文件,加载它之后,你可以使用 OpenStack 的命令行工具来管理资源。- 使用
source admin-openrc.sh
加载文件后,你可以创建实例、查看镜像、管理网络等。 - 加载后,你就可以使用
openstack
命令行工具执行各种操作,例如创建实例、查看网络、配置安全组等。
通过这些步骤,你可以成功使用 OpenStack 的 CLI 创建实例并管理资源。
openstack compute service list
ubuntu@openstack-vm:~$ openstack compute service list
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+
| 0aab74ff-7591-4f21-9d1e-eafc61e1a76f | nova-scheduler | openstack-vm | internal | enabled | up | 2024-12-08T22:40:48.000000 |
| c2a831c6-6a29-4222-aa46-a6241de24d4f | nova-conductor | openstack-vm | internal | enabled | up | 2024-12-08T22:40:58.000000 |
| ff2187dc-c994-44a2-92e3-db4be37f1005 | nova-conductor | openstack-vm | internal | enabled | up | 2024-12-08T22:41:21.000000 |
| 6d0341c1-bacb-409e-8628-61e870bb83ac | nova-compute | openstack-vm | nova | enabled | up | 2024-12-08T22:41:16.000000 |
+--------------------------------------+----------------+--------------+----------+---------+-------+----------------------------+
ubuntu@openstack-vm:~$
在 DevStack 环境中重启 Nova 服务有几种方式:
- 使用
systemctl
命令(如果是 systemd 管理的服务):
# 重启所有 nova 相关服务
sudo systemctl restart devstack@n-*
# 重启具体服务
sudo systemctl restart devstack@n-api.service
sudo systemctl restart devstack@n-cpu.service
sudo systemctl restart devstack@n-cond.service
sudo systemctl restart devstack@n-sch.service
- 使用 DevStack 自带的脚本:
# 进入 devstack 目录
cd /opt/stack/devstack
# 重启所有服务
./unstack.sh
./stack.sh
# 或者使用 rejoin-stack.sh
./rejoin-stack.sh
- 使用 screen 会话方式:
# 查看所有 screen 会话
screen -ls
# 重新连接到 nova 相关的 screen
screen -r stack
# 按 Ctrl-A + " 切换到需要的窗口(n-api, n-cpu 等)
# 按 Ctrl-C 停止服务
# 重新运行服务命令
- 检查服务状态:
# 查看 nova 服务状态
openstack compute service list
# 查看具体服务日志
sudo tail -f /var/log/nova/nova-api.log
sudo tail -f /var/log/nova/nova-compute.log
如果遇到问题:
- 检查日志文件:
# 查看系统日志
sudo journalctl -u devstack@n-*
# 查看 nova 日志
cd /var/log/nova/
tail -f *.log
- 检查服务配置:
# 检查 nova 配置文件
cat /etc/nova/nova.conf
# 检查服务状态
openstack compute service list
nova service-list
- 常见问题处理:
# 清理数据库(谨慎使用)
mysql -u root -p
> use nova;
> show tables;
> truncate table instances;
# 重置 nova 数据库
cd /opt/stack/devstack
./unstack.sh
mysql -u root -p -e "drop database nova;"
./stack.sh
注意事项:
- 重启前最好先检查服务状态
- 建议查看日志确认是否有错误
- 如果单个服务重启失败,可能需要重启相关依赖服务
- 重要数据操作前做好备份
使用 unstack.sh
关闭后再用 stack.sh
重启,实例是否还在取决于几个因素:
- 默认情况下:
- 实例的数据会保留在数据库中
- 实例的状态可能会变为
SHUTOFF
或ERROR
- 重启后需要手动启动实例
- 检查和恢复实例:
# 查看实例状态
openstack server list --all
# 启动处于关闭状态的实例
openstack server start 实例ID
# 如果实例状态异常,可以尝试重置状态
openstack server reset-state --active 实例ID
- 如果想完全清除环境:
# 清理所有数据(包括实例)
cd /opt/stack/devstack
./clean.sh
# 或者清理数据库
mysql -u root -p
> drop database nova;
> drop database neutron;
注意事项:
- 建议在关闭前备份重要数据
- 如果实例很重要,最好在关闭前做快照
- 重启后检查网络和存储是否正常挂载
- 可能需要重新配置安全组和浮动IP
最佳实践:
# 关闭前
openstack server list --all # 记录实例信息
openstack server stop 实例ID # 优雅关闭实例
# 关闭 devstack
./unstack.sh
# 重启后
./stack.sh
openstack server start 实例ID # 启动实例