OpenStack 云计算平台

本文合并自:01-OpenStack云计算.md、3-3-OpenStack单节点部署.md

本文涵盖云计算基础概念、OpenStack 项目概述与核心组件、整体架构与消息机制、RDO / packstack 单节点(all-in-one)部署实战、部署后验证、基于 Dashboard 与命令行的基本使用(镜像、规格、网络、安全组、密钥对、实例、浮动 IP、云硬盘),以及安装与创建实例过程中的常见问题排错方法。文中命令以 CentOS 7.3 + RDO Ocata / Mitaka 环境为准,IP、密码等以实际安装输出为准。


一、云计算基础

1.1 什么是云计算

云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件、服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。

可以理解为:把任何 IT 资源(包括网络、服务器硬件、存储、开发平台、应用软件、服务等)整合到一起,为用户提供按需分配。像自来水、电这种资源一样,用多少付多少钱。但这里面包括了大量的运算(比如用多少资源、如何分配指定的资源、如何计费等)。

重点关键词:

  • 资源整合(资源高效利用)
  • 弹性按需分配
  • 按量计费

1.2 IT 资源交付方式的演进

一个刚成立的公司,需要做简单的网站或其它基本服务,从以前到现在的选择有:

序号 方式 说明
0 自建机房 自行采购、运维硬件
1 服务器托管 服务器放在 IDC 机房
2 服务器租用 租用物理服务器
3 虚拟主机 一般来说只能用于 web
4 VPS(Virtual Private Server) 把物理服务器虚拟化成多个虚拟机,租给用户使用
5 云主机 在 VPS 的基础上做了加强,如随时在线修改资源

底层是 N 台物理机(宿主机)组成的资源池。演进的主线是:资源粒度越来越细、交付速度越来越快、弹性越来越强。

1.3 云计算服务模型(IaaS / PaaS / SaaS)

模型 全称 含义 典型用户
IaaS Infrastructure as a Service,基础架构即服务 给客户提供基础架构,以虚拟化技术为基础,云主机就属于这一种 系统管理员
PaaS Platform as a Service,平台即服务 用户看不到虚拟机,虚拟的是开发库、开发接口、开发工具,能自动开发、调试及安装应用程序;简单来说就是把开发框架、开发架构做成云资源 开发人员
SaaS Software as a Service,软件即服务 提供一个如浏览器的客户端,就可以做文本编辑、玩游戏、搭建服务 普通用户

举例:

  • IaaS 之虚拟机(如云主机)
  • PaaS 之 lnmp(如开发框架)
  • SaaS 之 vsftp(如在线办公)

三层的关系可以理解为自底向上的堆叠:IaaS 提供 CPU / 内存 / 磁盘 / 网络,PaaS 在 IaaS 之上提供运行时与中间件,SaaS 在 PaaS 之上直接提供可用的应用。用户自己需要维护的部分逐层减少。

1.4 云计算部署模式

  • 公有云:由服务商建设运营,通过公网向所有租户提供服务,按量计费,用户不拥有硬件。
  • 私有云:企业自建自用,硬件与数据都在企业内部,可控性、合规性强,OpenStack 最典型的落地场景。
  • 混合云:私有云与公有云打通,常规业务跑在私有云,峰值业务或备份溢出到公有云。

1.5 云计算与虚拟化的关系

  • 虚拟化(KVM、Xen、VMware ESXi 等)是技术手段,解决的是「一台物理机切成多台虚拟机」。
  • 云计算是服务模式,解决的是「把大量虚拟化资源池化,并按需、自助、可计量地交付给用户」。
  • 虚拟化是 IaaS 云的基础,但仅有虚拟化不等于云:云还必须具备统一认证、资源调度、自助门户、网络与存储的自动编排、计量计费等能力。

OpenStack 本身不实现虚拟化,它调用底层 Hypervisor(默认 KVM / libvirt),是虚拟化之上的管理与编排框架。


二、OpenStack 概述

2.1 项目定位

OpenStack(Python 语言开发)是 IaaS 的一种,可以理解成一种虚拟化管理工具。如果公司有强大的二次开发能力,可以基于它开发出不同的自动化管理工具。

在私有云中的定位:

  • 对下:统一纳管计算(KVM)、存储(LVM / Ceph)、网络(OVS / Linux Bridge)资源。
  • 对中:提供统一的认证、配额、调度与 REST API。
  • 对上:提供 Web 自助门户(Horizon)和命令行 / SDK,让业务部门自助申请资源。

同类开源云平台还有:

  • Apache 基金会的 CloudStack
  • Eucalyptus、OpenNebula、Nimbus、openQRM 等

Red Hat 有两种云平台:

  • IaaS:OpenStack
  • PaaS:OpenShift

红帽的云计算平台 OpenShift 可以免费申请使用(也有付费空间):https://www.openshift.com/

2.2 版本发展

OpenStack 差不多半年发布一次版本,按字母顺序命名:

A、B、C、D、E、F
Grizzly、Havana、Icehouse、Juno、Kilo、Liberty、
Mitaka、Newton、Ocata、Pike、Queens

本文实验环境使用 Ocata / Mitaka 版本。

2.3 相关链接


三、核心组件详解

3.1 组件总览与本文操作对应关系

本文以 packstack all-in-one 方式一次性部署各组件,操作中涉及的主要组件如下:

组件 项目名 作用 本文对应操作
Keystone keystone 身份认证、服务目录、租户/用户管理 keystonerc_admin 环境变量、source 登录
Glance glance 镜像服务 openstack image create/list
Nova nova 计算服务,管理实例生命周期 openstack server create/list、nova-manage cell_v2
Neutron neutron 网络服务 实例获取 IP、安全组规则
Cinder cinder 块存储服务 packstack 部署(本文未单独演示卷操作,见 8.8 补充)
Swift swift 对象存储服务 packstack 部署(本文未单独演示容器操作)
Horizon horizon Web 管理控制台(Dashboard) 浏览器访问 /dashboard 图形化管理
Heat heat 编排服务 模板化批量创建资源
Ceilometer ceilometer 计量 / 监控服务 采集资源使用数据,为计费提供依据

3.2 Keystone:身份认证服务

作用:

  • 用户(User)、项目 / 租户(Project / Tenant)、角色(Role)管理。
  • 为所有组件提供统一认证与授权,签发 Token。
  • 维护服务目录(Service Catalog):记录每个服务的 Endpoint(公共、内部、管理三种 URL),客户端拿到 Token 后再从目录里查到要访问的服务地址。

调用关系:任何组件在接受请求前,都会向 Keystone 校验 Token 的有效性。因此 Keystone 挂了,整个平台的 API 全部不可用。

关键环境变量文件:/root/keystonerc_admin。

3.3 Glance:镜像服务

作用:

  • 存储、注册、检索虚拟机镜像(qcow2、raw、vmdk、iso 等格式)。
  • 提供镜像元数据(磁盘格式、容器格式、最小磁盘 / 内存要求)。
  • 后端可用本地文件系统、Swift、Ceph 等。

调用关系:Nova 创建实例时向 Glance 请求下载镜像;Cinder 从镜像创建卷时也会调用 Glance。

3.4 Nova:计算服务

作用:管理虚拟机实例的整个生命周期(创建、启动、停止、重启、迁移、删除、调整规格)。

主要子服务:

子服务 作用
nova-api 接收并响应外部 REST 请求
nova-scheduler 调度器,决定实例落在哪个计算节点(过滤 + 权重)
nova-conductor 代理计算节点访问数据库,避免计算节点直连 DB
nova-compute 运行在计算节点,通过 libvirt 驱动 KVM 真正创建虚拟机
nova-novncproxy 提供 Web VNC 控制台代理
placement 资源清单与容量跟踪(Ocata 之后独立)

Ocata 引入了 Cell V2 架构,主机必须映射到 cell 才能被调度,这也是本文 6.x / 9.x 中 no mapper to cell 报错的根源。

3.5 Neutron:网络服务

作用:

  • 提供网络(Network)、子网(Subnet)、端口(Port)、路由器(Router)、浮动 IP(Floating IP)、安全组(Security Group)等网络即服务能力。
  • 通过插件 / 代理实现:neutron-openvswitch-agent、neutron-dhcp-agent、neutron-l3-agent、neutron-metadata-agent。

关键概念:

  • 内部网络(tenant / private):实例之间通信使用。
  • 外部网络(external / public):连接物理网络,浮动 IP 从这里分配。
  • 路由器:连接内部网络与外部网络,做 SNAT / DNAT。
  • 安全组:作用在实例端口上的分布式防火墙,默认拒绝所有入站,因此默认既不能 ping 也不能 ssh。

3.6 Cinder:块存储服务

作用:

  • 提供持久化块设备(云硬盘 / Volume),可挂载到实例,实例删除后数据仍保留。
  • 支持卷快照、从卷启动实例、卷扩容。
  • 后端可用 LVM(默认,all-in-one 会创建 cinder-volumes 卷组)、Ceph RBD、各厂商存储阵列。

子服务:cinder-api、cinder-scheduler、cinder-volume、cinder-backup。

调用关系:Nova 通过 Cinder 提供的连接信息(iSCSI / RBD)把卷挂载给虚拟机。

3.7 Swift:对象存储服务

作用:

  • 提供高可用、可无限扩展的对象存储(HTTP 存取),适合图片、备份、日志、静态文件。
  • 概念:账户(Account)→ 容器(Container)→ 对象(Object)。
  • 通过多副本 + 一致性哈希环(Ring)保证可靠性,最终一致性模型。

与 Cinder 区别:Cinder 是块设备(要格式化后挂载使用),Swift 是对象接口(RESTful 存取,不能当磁盘挂载)。

3.8 Horizon:Web 管理面板

作用:

  • 基于 Django 的 Web 控制台(Dashboard),封装各组件 API,提供图形化管理。
  • 部署后通过 http://<IP>/dashboard 访问。
  • 支持多语言,可在 admin → Settings 中切换中文。

Horizon 本身不存业务数据,所有操作最终都转成对各组件 REST API 的调用。

3.9 Heat:编排服务

作用:

  • 用模板(HOT,Heat Orchestration Template,YAML 格式)描述一整套资源(网络 + 卷 + 若干实例 + 负载均衡),一键创建 / 更新 / 删除整个「栈(Stack)」。
  • 支持自动伸缩(配合 Ceilometer 告警触发扩容 / 缩容)。

3.10 Ceilometer:计量与监控服务

作用:

  • 采集各组件的计量数据(CPU 使用率、网络流量、磁盘 IO、镜像大小等)。
  • 数据用于计费(按量付费的基础)、监控告警与自动伸缩触发。
  • 相关组件:Aodh(告警)、Gnocchi(时序数据存储)、Panko(事件存储)。

四、架构与消息机制

4.1 两条基础依赖:消息队列与数据库

中间件 作用
RabbitMQ(AMQP) 组件内部各子服务之间的异步通信总线。例如 nova-api 不直接调用 nova-compute,而是把消息投递到队列,由计算节点消费。RabbitMQ 宕机会导致实例创建等操作全部卡住
MySQL / MariaDB 持久化各组件的元数据(用户、镜像元信息、实例记录、网络与端口、卷信息)。每个组件有独立的库,如 keystone、glance、nova、neutron、cinder

两种通信方式的分工:

  • 组件之间(如 Nova 调 Glance、Nova 调 Neutron):走 REST API(HTTP),需要携带 Keystone Token。
  • 组件内部子服务之间(如 nova-api → nova-scheduler → nova-compute):走 RabbitMQ 消息队列(RPC)。

4.2 API 交互的通用流程

  1. 客户端(Horizon / openstack CLI / SDK)带用户名密码请求 Keystone。
  2. Keystone 校验通过,返回 Token + Service Catalog。
  3. 客户端从 Catalog 中取出目标服务的 Endpoint,带 Token 发起 REST 请求。
  4. 目标服务收到请求后,再向 Keystone 校验 Token 合法性与权限。
  5. 校验通过后执行业务逻辑,需要跨子服务时通过 RabbitMQ 投递 RPC 消息,状态写入 MySQL。

4.3 创建一台虚拟机的完整内部流程

以 openstack server create ... 为例:

  1. 认证:CLI 用 keystonerc_admin 中的凭据向 Keystone 取 Token 和服务目录。
  2. 提交请求:CLI 带 Token 请求 nova-api 的创建实例接口。
  3. 校验:nova-api 向 Keystone 验证 Token,检查配额(Quota)与参数(flavor、image、network、security-group、key-name 是否存在)。
  4. 落库:nova-api 在数据库中创建一条 instance 记录,状态为 BUILDING,并把请求投递到 RabbitMQ。
  5. 调度:nova-scheduler 从队列取出请求,通过 Filter(内存、CPU、磁盘、可用域等)筛选候选主机,再按 Weight 排序,选出目标计算节点,把消息发到该节点的队列。
  6. 准备资源:目标节点的 nova-compute 取出消息:
    • 向 Glance 请求镜像,下载并缓存到本地(首次较慢)。
    • 向 Neutron 申请端口(Port)与 IP,配置 OVS 网桥、DHCP、安全组规则。
    • 若需要持久卷,向 Cinder 申请卷并获取挂载信息(iSCSI target 等)。
  7. 创建虚拟机:nova-compute 通过 libvirt 生成 XML 定义并启动 KVM 虚拟机,此阶段实例状态为 SPAWNING。
  8. 注入配置:虚拟机启动后通过 cloud-init 访问元数据服务(169.254.169.254,由 neutron-metadata-agent 转发),拿到主机名与注入的公钥,从而实现密钥登录。
  9. 完成:nova-compute 更新数据库,实例状态变为 ACTIVE,openstack server list 中可见 IP。

数据库中的状态流转顺序:BUILDING → SCHEDULING → NETWORKING → BLOCK_DEVICE_MAPPING → SPAWNING → ACTIVE。卡在哪一步就去看对应组件的日志。


五、单节点部署实战:环境准备

5.1 环境要求与硬件建议

在 KVM(或 VMware / 物理机)中准备一台 CentOS 7.3 虚拟机:

  • 硬盘最好 50G 或以上。
  • 内存建议:若进行基本安装最好 6G 或以上(另一版本记录为 5G 或以上),请以实际安装包需求为准。
  • 最小化安装,分区自动分区,关闭 kdump,时区选择上海。
  • CPU 需开启嵌套虚拟化(KVM 嵌套),否则实例只能用 QEMU 软件模拟,速度极慢。
  • 最好使用新的虚拟机,不要使用老虚拟机恢复快照。

5.2 删除物理桥接网卡

使用准备好的 Server.example.com 虚拟机,删除物理桥接网卡(避免 packstack 配置 OVS 时与已有网桥冲突)。

5.3 配置静态 IP(关闭 NetworkManager)

IP 要设为静态,并确保能上公网(或使用本地源)。

systemctl stop NetworkManager
systemctl disable NetworkManager

5.4 主机名配置和绑定

hostnamectl set-hostname --static openstack.cluster.com

编辑 /etc/hosts,确保主机名和 IP 地址对应正确:

192.168.224.10  openstack.cluster.com

或(另一版本记录):

192.168.1.8 openstack.cluster.com

注意:文档示例中同时出现过 192.168.224.10、192.168.1.8 等地址,实际请以本机 IP 为准,/etc/hosts、keystonerc_admin、Dashboard 访问地址应保持一致。

5.5 时间同步

yum install ntp -y
systemctl restart ntpd
systemctl enable ntpd

时间不同步会导致 Keystone Token 校验失败(认证报错)以及组件间调用异常,必须配置。

5.6 关闭防火墙和 SELinux

systemctl stop firewalld
systemctl disable firewalld

编辑 /etc/selinux/config:

SELINUX=disabled

重启系统:

reboot

5.7 配置 YUM 源

需要配置本地 ISO 源、163 源和 OpenStack 源。

挂载本地 ISO 镜像到 /yum:

mkdir /yum
mount /dev/cdrom /yum          # 确保光驱里有 iso 镜像
echo "mount /dev/cdrom /yum" >> /etc/rc.d/rc.local
chmod a+x /etc/rc.d/rc.local

清空原有 repo 文件:

rm /etc/yum.repos.d/* -rf

也可以直接安装 RDO 公网源(适用于能直连公网的环境):

wget https://www.rdoproject.org/repos/rdo-release.rpm
rpm -ivh https://www.rdoproject.org/repos/rdo-release.rpm

由于公网速度慢,可将所需源全部下载到本地,再统一写入 /etc/yum.repos.d/openstack.repo(三个源配置到同一文件中):

[local]
name=local
baseurl=file:///yum
enabled=1
gpgcheck=0

[centos163]
name=centos163
baseurl=http://192.168.1.9/centos163/
enabled=1
gpgcheck=0

[openstack]
name=openstack
baseurl=http://192.168.1.9/openstack
enabled=1
gpgcheck=0

原文第一版 [local] 段落中写作 enable=1,规范写法应为 enabled=1,此处按规范给出。

5.8 清理冲突软件包

yum remove libvirt-client -y
yum remove gnome-software -y
yum install libreoffice-math -y

原文此处记录为重新安装 libreoffice-math,并移除 libvirt-client、gnome-software,以避免安装过程中的软件包冲突。

准备工作完成后,建议重启系统,并在此处为虚拟机做一个快照。


六、单节点部署实战:packstack 一键部署

6.1 安装 openstack-packstack

yum clean all
yum makecache fast
yum install openstack-packstack -y

准备 OK 后,建议重启系统并做一个虚拟机快照。

6.2 一键 all-in-one 安装

packstack --allinone

开始一键安装。过程中很可能会出现各种错误,可以根据报错信息或把报错贴到网上查找解决方法。

解决完问题后,不要直接再使用 packstack --allinone 重装。只要开始安装过,会在当前目录产生一个 answer-file,可使用它继续安装:

packstack --answer-file=packstack-answers-xxxxxxxx.xxxxx.txt
# xxxxx 代表产生 answer-file 的时间戳

6.3 answer 文件关键参数(按需定制部署)

若不想一次装全部组件,可先生成 answer 文件再修改后安装:

packstack --gen-answer-file=/root/answer.txt
vim /root/answer.txt
packstack --answer-file=/root/answer.txt

常用关键参数说明:

参数 说明
CONFIG_DEFAULT_PASSWORD 统一设置所有服务的默认密码,留空则各服务随机生成
CONFIG_KEYSTONE_ADMIN_PW Dashboard 中 admin 用户的登录密码
CONFIG_CONTROLLER_HOST 控制节点 IP
CONFIG_COMPUTE_HOSTS 计算节点 IP,多个用逗号分隔(单节点即控制节点自身 IP)
CONFIG_NETWORK_HOSTS 网络节点 IP
CONFIG_CINDER_INSTALL 是否安装 Cinder(y/n)
CONFIG_CINDER_VOLUMES_SIZE Cinder 使用的 LVM 卷组回环文件大小,如 20G
CONFIG_SWIFT_INSTALL 是否安装 Swift
CONFIG_HEAT_INSTALL 是否安装 Heat(默认 n,需要编排时改为 y)
CONFIG_CEILOMETER_INSTALL 是否安装 Ceilometer 计量服务
CONFIG_HORIZON_SSL Dashboard 是否启用 HTTPS
CONFIG_PROVISION_DEMO 是否创建 demo 项目与 cirros 测试镜像,建议保持 y
CONFIG_NEUTRON_ML2_TYPE_DRIVERS ML2 网络类型驱动,如 vxlan,flat
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS OVS 网桥映射,如 extnet:br-ex
CONFIG_NEUTRON_OVS_BRIDGE_IFACES 绑定到网桥的物理网卡,如 br-ex:eth0
CONFIG_NTP_SERVERS NTP 服务器地址,留空则跳过时间同步配置
CONFIG_NAGIOS_INSTALL 是否安装 Nagios 监控

手工逐组件部署(先装 MySQL / RabbitMQ,再依次装 Keystone → Glance → Nova → Neutron → Cinder → Horizon,并逐个创建数据库、服务用户与 Endpoint)请参考官方文档:https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/。本文所用部署方式为 packstack 一键部署。

6.4 安装成功标志

最后出现如下信息表示安装成功:

 **** Installation completed successfully ******

Additional information:
 * A new answerfile was created in: /root/packstack-answers-20180312-115305.txt
 * Time synchronization installation was skipped. Please note that unsynchronized time on server instances might be problem for some OpenStack components.
 * File /root/keystonerc_admin has been created on OpenStack client host 192.168.1.8. To use the command line tools you need to source the file.
 * To access the OpenStack Dashboard browse to http://192.168.1.8/dashboard .
Please, find your login credentials stored in the keystonerc_admin in your home directory.
 * The installation log file is available at: /var/tmp/packstack/20180312-115303-i4Z7ak/openstack-setup.log
 * The generated manifests are available at: /var/tmp/packstack/20180312-115303-i4Z7ak/manifests

关键文件位置:

文件/目录 说明
/root/packstack-answers-<时间>.txt 本次安装生成的 answer-file
/root/keystonerc_admin admin 用户的环境变量(含登录密码)
/var/tmp/packstack/<时间>-xxxxxx/openstack-setup.log 安装日志
/var/tmp/packstack/<时间>-xxxxxx/manifests 生成的 Puppet manifests

安装完成后,建议再次为虚拟机做一个快照。

6.5 参考资源


七、部署后验证

7.1 查找登录凭据

cat /root/keystonerc_admin

输出示例:

unset OS_SERVICE_TOKEN
export OS_USERNAME=admin            # 图形登录界面的用户名 admin
export OS_PASSWORD=143acf3c84084b1a # 图形登录界面 admin 用户的密码
export OS_AUTH_URL=http://192.168.1.8:5000/v2.0
export PS1='[\u@\h \W(keystone_admin)]\$ '

export OS_TENANT_NAME=admin
export OS_REGION_NAME=RegionOne

7.2 Horizon 登录

在浏览器中访问:

http://192.168.224.10/dashboard

或:

http://192.168.1.8/dashboard
  • 用户名:admin
  • 密码:对应 keystonerc_admin 中的 OS_PASSWORD

切换中文:右上角 admin → Settings 里可以将界面修改为中文。

7.3 命令行客户端认证

source /root/keystonerc_admin

命令提示符会变为 (keystone_admin),后续 openstack 命令均在此环境下执行。

7.4 检查服务与端点

openstack service list          # 查看已注册的服务
openstack endpoint list         # 查看各服务的 Endpoint
openstack user list             # 查看用户
openstack project list          # 查看项目/租户
openstack compute service list  # 查看 nova 各子服务状态(state 应为 up)
openstack network agent list    # 查看 neutron 各 agent 状态(alive 应为 True)
openstack hypervisor list       # 查看计算节点

系统级检查:

systemctl status openstack-nova-compute
systemctl status openstack-nova-scheduler
systemctl status neutron-server
systemctl status httpd
systemctl status rabbitmq-server
systemctl status mariadb

八、基本使用

8.1 通过 Dashboard 创建实例

查看测试镜像:进入 项目 → 计算 → 镜像,里面有一个十几 M 大小的镜像叫 cirros,是用于测试的小镜像。

创建实例:进入 项目 → 计算 → 实例 → 创建实例:

  • 实例名称:instance01
  • 实例镜像源:cirros
  • 实例类型:m1.small

创建成功后,默认不能 ping 它、不能 ssh 它,也不能使用 virsh console 连接它,但可以在实例后面的操作指令列表中选择「控制台」进行图形化操作(可能比较卡,较难操作成功)。要能 ping / ssh 必须先放行安全组规则(见 8.5)。

8.2 上传镜像

可使用 Fedora Cloud Base 镜像进行测试。两版笔记分别使用过:

  • Fedora-Cloud-Base-22-20150521.x86_64.qcow2
  • Fedora-Cloud-Base-28-1.1.x86_64.qcow2(运行该镜像需要 16G 以上内存)

可从宿主机共享目录下载,例如:

http://192.168.2.9/arch/openstack_image/Fedora-Cloud-Base-22-20150521.x86_64.qcow2

将 qcow2 文件拷贝到 OpenStack 服务器上(例如 /root/),然后创建镜像:

openstack image create fedora22 --disk-format qcow2 --file /root/Fedora-Cloud-Base-22-20150521.x86_64.qcow2

多行写法(等价):

openstack image create fedora22 \
  --disk-format qcow2 \
  --file /root/Fedora-Cloud-Base-22-20150521.x86_64.qcow2

如使用 28 版本镜像:

openstack image create fedora22 --disk-format qcow2 --file /root/Fedora-Cloud-Base-28-1.1.x86_64.qcow2

查看镜像列表:

openstack image list
+--------------------------------------+----------+--------+
| ID                                   | Name     | Status |
+--------------------------------------+----------+--------+
| f9c5e3e4-25df-4c4e-b9e8-d4936a5d9d5f | cirros   | active |
| 2632de0b-184d-45d6-adcf-d7eb9e737d47 | fedora22 | active |
+--------------------------------------+----------+--------+

使用旧版 glance 客户端上传(等价操作):

glance image-create --name fedora22 --disk-format qcow2 --container-format bare \
  --visibility public --file /root/Fedora-Cloud-Base-22-20150521.x86_64.qcow2
glance image-list

8.3 创建实例类型(flavor)

openstack flavor create --id 0 --vcpus 2 --ram 1024 --disk 10 m1.nano

参数说明:

参数 说明
--id 0 自定义 flavor ID
--vcpus 2 vCPU 数量
--ram 1024 内存大小(MB)
--disk 10 根磁盘大小(GB)
m1.nano flavor 名称

删除 flavor:

openstack flavor delete m1.nano

查看 flavor 列表:

openstack flavor list
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name      |   RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 0  | m1.nano   |  1024 |   10 |         0 |     2 | True      |
| 1  | m1.tiny   |   512 |    1 |         0 |     1 | True      |
| 2  | m1.small  |  2048 |   20 |         0 |     1 | True      |
| 3  | m1.medium |  4096 |   40 |         0 |     2 | True      |
| 4  | m1.large  |  8192 |   80 |         0 |     4 | True      |
| 5  | m1.xlarge | 16384 |  160 |         0 |     8 | True      |
+----+-----------+-------+------+-----------+-------+-----------+

说明:第一版笔记中 --ram 记录为 512,但列表示例与第二版一致均为 1024。以上以实际命令输出为准,注释里「cpu 核数为 1、内存 512M、磁盘 1G」为早期笔误,实际参数为 2 vCPU / 1024MB / 10GB。

8.4 创建网络、子网与路由

packstack 加 CONFIG_PROVISION_DEMO=y 时会自动创建 public(172.24.4.0/24)等网络,本文实例即使用自动创建的 public 网络。如需手工创建:

# 创建外部网络(需要 admin 权限)
openstack network create --external --provider-network-type flat \
  --provider-physical-network extnet public

# 外部网络子网(关闭 DHCP,指定浮动 IP 分配池)
openstack subnet create --network public --no-dhcp \
  --subnet-range 172.24.4.0/24 --gateway 172.24.4.1 \
  --allocation-pool start=172.24.4.10,end=172.24.4.200 public-subnet

# 创建内部网络与子网
openstack network create private
openstack subnet create --network private \
  --subnet-range 10.0.0.0/24 --gateway 10.0.0.1 \
  --dns-nameserver 114.114.114.114 private-subnet

# 创建路由器并连接内外网络
openstack router create router1
openstack router set router1 --external-gateway public
openstack router add subnet router1 private-subnet

查看:

openstack network list
openstack subnet list
openstack router list
openstack port list

8.5 配置安全组与规则

默认情况下创建的云主机不允许 ping、也不允许 ssh,需要在安全组中放行对应规则。

先列出安全组(可能有多个名为 default 的安全组,因为每个项目都有一个同名默认安全组):

openstack security group list
+--------------------------------------+---------+------------------------+---------+
| ID                                   | Name    | Description            | Project |
+--------------------------------------+---------+------------------------+---------+
| 6f5e3001-2fd2-472e-98a4-4635b8e2b2c0 | default | Default security group |         |
| ccc8739b-fb6f-46f7-9702-2b88a4bdddcc | default | Default security group |         |
| d4e1d499-40fa-44ca-9cfe-0ab8992ef34e | default | Default security group |         |
+--------------------------------------+---------+------------------------+---------+

创建一个新的安全组 newgroup:

openstack security group create newgroup

添加允许 ICMP(ping)和 TCP 22(ssh)的规则:

openstack security group rule create --proto icmp newgroup
openstack security group rule create --proto tcp --dst-port 22 newgroup

再次查看安全组列表:

openstack security group list
+--------------------------------------+----------+------------------------+---------+
| ID                                   | Name     | Description            | Project |
+--------------------------------------+----------+------------------------+---------+
| 00a9bea2-14dd-4b01-8424-2ccfaeaec060 | default  | Default security group |         |
| 9f490a14-fa60-469e-8a56-4afd06e5bd2b | default  | Default security group |         |
| bf3d880c-5ecc-4bfc-bb84-29c8ecbad22c | default  | Default security group |         |
| e6e0d8d5-74ab-4891-9dec-c2b9019fee53 | newgroup | newgroup               |         |
| eced313d-c623-4156-a510-08a5af950e87 | default  | Default security group |         |
+--------------------------------------+----------+------------------------+---------+

查看 newgroup 的规则:

openstack security group rule list newgroup
+--------------------------------------+-------------+-----------+------------+-----------------------+
| ID                                   | IP Protocol | IP Range  | Port Range | Remote Security Group |
+--------------------------------------+-------------+-----------+------------+-----------------------+
| 7886e6e4-a0cd-4453-8dd6-862702d85177 | None        | None      |            | None                  |
| a0b3f9a6-37b7-4f8b-9ff4-ba4ca20d68d5 | icmp        | 0.0.0.0/0 |            | None                  |
| a6ac6c40-402c-49fc-8a3d-c9040df7f8a6 | tcp         | 0.0.0.0/0 | 22:22      | None                  |
| fc1cc957-74cb-4ce5-8be9-33bc27b44a6d | None        | None      |            | None                  |
+--------------------------------------+-------------+-----------+------------+-----------------------+

表中两条 None 协议的规则是默认的出站(egress)放行规则,IPv4 与 IPv6 各一条。

8.6 创建密钥对

生成空密码密钥:

ssh-keygen -q -N ""
Enter file in which to save the key (/root/.ssh/id_rsa):

将公钥导入 OpenStack:

openstack keypair create --public-key ~/.ssh/id_rsa.pub keypair1

删除密钥对:

openstack keypair delete keypair1

查看密钥对:

openstack keypair list
+----------+-------------------------------------------------+
| Name     | Fingerprint                                     |
+----------+-------------------------------------------------+
| keypair1 | f8:33:06:04:af:bf:85:13:08:35:8d:3f:04:8a:f2:8a |
+----------+-------------------------------------------------+

8.7 创建并登录实例

创建一个实例:名称 instance01、类型 m1.nano、镜像 fedora22、安全组 newgroup、密钥对 keypair1:

openstack server create --flavor m1.nano --image fedora22 --security-group newgroup --key-name keypair1 instance01

多行写法(等价,若需指定网络可加 --nic net-id=<network-id>):

openstack server create \
  --flavor m1.nano \
  --image fedora22 \
  --security-group newgroup \
  --key-name keypair1 \
  instance01

查看实例列表(确认状态为 ACTIVE 即表示创建完成):

openstack server list
+--------------------------------------+------------+--------+--------------------+------------+
| ID                                   | Name       | Status | Networks           | Image Name |
+--------------------------------------+------------+--------+--------------------+------------+
| 6c610831-b1ed-42ff-8fa8-e50d341d4906 | instance01 | ACTIVE | public=172.24.4.12 | fedora22   |
+--------------------------------------+------------+--------+--------------------+------------+

使用密钥登录实例:

ssh -i keypair1.pem fedora@172.24.4.12

说明:若密钥是用 ssh-keygen 在本机生成并导入的,私钥即 ~/.ssh/id_rsa,可直接 ssh fedora@172.24.4.12;keypair1.pem 是在 Dashboard 或用 openstack keypair create keypair1 > keypair1.pem 方式创建密钥时下载得到的私钥文件,需 chmod 600 keypair1.pem。cirros 镜像的默认用户为 cirros,Fedora 云镜像默认用户为 fedora。

其他实例生命周期操作:

openstack server show instance01        # 查看详情
openstack console log show instance01   # 查看控制台日志(排查 cloud-init)
openstack console url show instance01   # 获取 VNC 控制台 URL
openstack server stop instance01
openstack server start instance01
openstack server reboot instance01
openstack server delete instance01

8.8 绑定浮动 IP

当实例只有内网 IP、需要从外部访问时,绑定浮动 IP:

# 从外部网络分配一个浮动 IP
openstack floating ip create public

# 查看浮动 IP 列表
openstack floating ip list

# 绑定到实例
openstack server add floating ip instance01 172.24.4.150

# 解绑
openstack server remove floating ip instance01 172.24.4.150

# 释放
openstack floating ip delete 172.24.4.150

浮动 IP 依赖路由器已设置外部网关(见 8.4),否则绑定后仍不通。

8.9 挂载云硬盘(Cinder 卷)

# 创建 1G 卷
openstack volume create --size 1 volume1

# 查看卷(Status 为 available 表示可用)
openstack volume list

# 挂载到实例
openstack server add volume instance01 volume1

# 卸载
openstack server remove volume instance01 volume1

# 删除卷
openstack volume delete volume1

挂载后进入实例内部格式化并使用:

lsblk                       # 确认新设备,如 /dev/vdb
mkfs.xfs /dev/vdb
mkdir /data
mount /dev/vdb /data

旧版 cinder 客户端等价命令:

cinder create --display-name volume1 1
cinder list
nova volume-attach instance01 <volume-id> auto

8.10 为虚拟机手动添加交换分区

当内存不足时,可为(承载 OpenStack 的)虚拟机增加一块磁盘并配置为交换分区。

确认新增加的磁盘被识别:

ls /dev/sdb

对新硬盘进行分区,将整个硬盘作为一个分区:

fdisk /dev/sdb

交互操作:

输入 n,创建新分区。
输入 t,选择分区类型代码 82(Linux swap)。
输入 w,保存分区修改结果。

将 /dev/sdb1 格式化为交换分区:

mkswap /dev/sdb1

启用交换分区:

swapon /dev/sdb1

确认交换分区生效:

free -g

若需开机自动启用,把 /dev/sdb1 swap swap defaults 0 0 写入 /etc/fstab。


九、常见问题与排错清单

9.1 安装阶段报错

  • 安装过程中很可能出现各种错误,先看报错信息,再查安装日志 /var/tmp/packstack/<时间>-xxxxxx/openstack-setup.log,也可把报错贴到网上查找解决方法。
  • 不要在失败后直接重跑 packstack --allinone,应使用已生成的 answer-file 继续安装:
packstack --answer-file=packstack-answers-xxxxxxxx.xxxxx.txt
  • 软件包冲突:按 5.8 移除 libvirt-client、gnome-software。
  • 源不可用:检查 /etc/yum.repos.d/openstack.repo 的三个源地址是否可达,yum clean all; yum makecache fast。
  • 已有物理桥接网卡会与 OVS 网桥冲突,安装前先删除(见 5.2)。

9.2 创建实例报 no mapper to cell

当前版本(Ocata)创建实例时可能报如下错误:

host 'openstack.cluster.com' no mapper to cell

解决方法一:升级版本或降级版本。

解决方法二:手动执行 cell_v2 初始化:

source /root/keystonerc_admin
nova-manage cell_v2 simple_cell_setup

解决后重新创建实例。相关辅助命令:

nova-manage cell_v2 list_cells
nova-manage cell_v2 discover_hosts --verbose

9.3 服务未起来

排查顺序:

systemctl status <service>            # 看服务状态
openstack compute service list        # nova 子服务是否 up
openstack network agent list          # neutron agent 是否 alive
systemctl status rabbitmq-server      # 消息队列
systemctl status mariadb              # 数据库
systemctl status httpd                # Keystone / Horizon 依赖 httpd

日志位置:

组件 日志目录
Nova /var/log/nova/
Neutron /var/log/neutron/
Glance /var/log/glance/
Cinder /var/log/cinder/
Keystone / Horizon /var/log/httpd/、/var/log/keystone/
安装过程 /var/tmp/packstack/<时间>-xxxxxx/openstack-setup.log

常见原因:内存不足导致服务被 OOM 杀掉(用 8.10 加 swap)、RabbitMQ 未启动导致 RPC 超时、主机名解析失败。

9.4 认证失败

现象:The request you have made requires authentication、Unauthorized (HTTP 401)。

排查:

  • 是否执行了 source /root/keystonerc_admin(提示符应为 (keystone_admin))。
  • keystonerc_admin 中的 OS_AUTH_URL IP 是否与本机实际 IP 一致(重装或改 IP 后需同步修改)。
  • OS_PASSWORD 是否与实际密码一致。
  • 系统时间是否同步:时间偏差过大会导致 Token 判定为过期。
  • /etc/hosts 中主机名与 IP 绑定是否正确。
  • Keystone 服务(httpd)是否正常,openstack service list 能否返回结果。

9.5 实例创建卡在 spawning / 状态变为 ERROR

  • 查看错误原因:
openstack server show instance01      # 看 fault 字段
tail -f /var/log/nova/nova-compute.log
  • 常见原因:
    • 宿主机内存 / 磁盘不足:flavor 要求大于剩余资源,调小 flavor 或加 swap。运行 Fedora-Cloud-Base-28 镜像需要 16G 以上内存。
    • 未开启硬件虚拟化(嵌套虚拟化):只能软件模拟,创建极慢,检查 egrep '(vmx|svm)' /proc/cpuinfo。
    • 镜像首次下载缓存耗时长,耐心等待。
    • no valid host was found:调度器找不到满足条件的主机,检查 nova-compute 是否 up、cell 映射是否正确、资源是否充足。
    • Cell V2 映射未完成(见 9.2)。

9.6 网络不通

  • 实例创建成功后默认不能 ping、不能 ssh,也不能用 virsh console 连接,必须先在安全组中放行 ICMP 与 TCP 22(见 8.5),并确认实例使用的是放行后的安全组。
  • 检查实例是否拿到 IP:openstack server list;没拿到 IP 说明 DHCP 有问题,检查 neutron-dhcp-agent。
  • 检查 agent 状态:openstack network agent list,neutron-openvswitch-agent、neutron-l3-agent、neutron-metadata-agent 都应 alive。
  • 从外部访问需绑定浮动 IP,且路由器已设置外部网关(见 8.4、8.8)。
  • 检查 OVS 网桥:ovs-vsctl show,确认 br-ex 已绑定物理网卡。
  • SSH 登录失败但能 ping 通:多为公钥注入失败,openstack console log show instance01 看 cloud-init 是否成功访问 169.254.169.254 元数据服务(检查 neutron-metadata-agent)。
  • 防火墙 / SELinux 未关闭也会造成访问异常(见 5.6)。

9.7 Dashboard 无法访问

  • 检查 httpd 是否运行:systemctl status httpd。
  • 访问地址是否为 http://<IP>/dashboard(不要漏掉路径)。
  • 防火墙是否关闭。
  • 登录密码取自 /root/keystonerc_admin 的 OS_PASSWORD。

十、常用命令速查

操作 命令
加载管理员环境 source /root/keystonerc_admin
查看服务列表 openstack service list
查看端点 openstack endpoint list
查看计算服务状态 openstack compute service list
查看网络 agent openstack network agent list
创建 flavor openstack flavor create --id <id> --vcpus <n> --ram <MB> --disk <GB> <name>
查看 flavor openstack flavor list
删除 flavor openstack flavor delete <name>
导入密钥对 openstack keypair create --public-key ~/.ssh/id_rsa.pub <name>
查看密钥对 openstack keypair list
删除密钥对 openstack keypair delete <name>
创建安全组 openstack security group create <name>
查看安全组 openstack security group list
放行 ICMP openstack security group rule create --proto icmp <sg>
放行 TCP 端口 openstack security group rule create --proto tcp --dst-port <port> <sg>
查看安全组规则 openstack security group rule list <sg>
创建镜像 openstack image create <name> --disk-format qcow2 --file <path>
查看镜像 openstack image list
创建网络 openstack network create <name>
创建子网 openstack subnet create --network <net> --subnet-range <cidr> <name>
创建路由器 openstack router create <name>
创建实例 openstack server create --flavor <flavor> --image <image> --security-group <sg> --key-name <keypair> <name>
查看实例 openstack server list
查看实例详情 openstack server show <name>
查看实例控制台日志 openstack console log show <name>
删除实例 openstack server delete <name>
分配浮动 IP openstack floating ip create <external-net>
绑定浮动 IP openstack server add floating ip <server> <ip>
创建卷 openstack volume create --size <GB> <name>
挂载卷 openstack server add volume <server> <volume>
修复 cell 映射 nova-manage cell_v2 simple_cell_setup

十一、参考文档


十二、练习

  1. 用一句话分别解释 IaaS、PaaS、SaaS,并各举一个本文提到的例子;说明「虚拟化」与「云计算」的区别。
  2. 列出从「自建机房」到「云主机」的 6 种 IT 资源交付方式,并说明云主机相对 VPS 增强了什么。
  3. 准备一台 CentOS 7.3 虚拟机(50G 磁盘、6G 内存),完成主机名设置、/etc/hosts 绑定、关闭 NetworkManager / firewalld / SELinux、配置 NTP 与三个 YUM 源,并在此处打一个快照。
  4. 用 packstack --allinone 完成单节点部署;记录 answer-file、keystonerc_admin 与安装日志的完整路径。
  5. 用 packstack --gen-answer-file 生成 answer 文件,找出并说明 CONFIG_KEYSTONE_ADMIN_PW、CONFIG_CINDER_INSTALL、CONFIG_PROVISION_DEMO、CONFIG_NEUTRON_OVS_BRIDGE_IFACES 四个参数的作用。
  6. 从 keystonerc_admin 中找出 admin 密码,登录 Dashboard 并把界面切换为中文。
  7. source keystonerc_admin 后执行 openstack service list 与 openstack compute service list,记录输出,判断各服务是否正常。
  8. 创建 flavor m1.nano(2 vCPU / 1024MB / 10GB),并查看 flavor 列表确认。
  9. 上传 Fedora-Cloud-Base-22 的 qcow2 镜像为 fedora22,确认 Status 为 active。
  10. 生成空密码 SSH 密钥并导入为 keypair1;创建安全组 newgroup 并放行 ICMP 与 TCP 22,列出其规则。
  11. 用命令行创建实例 instance01(flavor m1.nano、镜像 fedora22、安全组 newgroup、密钥 keypair1),等待状态变为 ACTIVE 后用密钥 SSH 登录。
  12. 手工创建一个内部网络 private(10.0.0.0/24)、一个路由器 router1,把它连接到外部网络,为实例分配并绑定一个浮动 IP,验证从外部能 ping 通。
  13. 创建一个 1G 的 Cinder 卷并挂载到 instance01,在实例内部格式化为 xfs 并挂载到 /data。
  14. 故意在未放行安全组规则的情况下创建实例,验证无法 ping / ssh,然后加规则使其可达,写出整个排查思路。
  15. 模拟 host 'xxx' no mapper to cell 报错场景,说明该报错的原因(Cell V2)与两种解决办法。
  16. 为承载 OpenStack 的虚拟机新增一块磁盘 /dev/sdb,按 82 类型分区、mkswap、swapon,用 free -g 验证,并写入 /etc/fstab 实现开机自动启用。
  17. 画出「创建一台虚拟机」的完整内部流程图,标注 Keystone、Nova(api/scheduler/conductor/compute)、Glance、Neutron、Cinder、RabbitMQ、MySQL 各自出现的位置。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏