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 相关链接
- OpenStack 官网:http://www.openstack.org/
- OpenStack 文档:http://docs.openstack.org/
- OpenStack Passport:https://www.openstack.org/passport/
- RDO 公网源 RPM 包:https://www.rdoproject.org/repos/rdo-release.rpm
- FedoraPeople OpenStack 仓库:https://repos.fedorapeople.org/repos/openstack/
- Mitaka 版中文安装文档:https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/
三、核心组件详解
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 交互的通用流程
- 客户端(Horizon /
openstackCLI / SDK)带用户名密码请求 Keystone。 - Keystone 校验通过,返回 Token + Service Catalog。
- 客户端从 Catalog 中取出目标服务的 Endpoint,带 Token 发起 REST 请求。
- 目标服务收到请求后,再向 Keystone 校验 Token 合法性与权限。
- 校验通过后执行业务逻辑,需要跨子服务时通过 RabbitMQ 投递 RPC 消息,状态写入 MySQL。
4.3 创建一台虚拟机的完整内部流程
以 openstack server create ... 为例:
- 认证:CLI 用
keystonerc_admin中的凭据向 Keystone 取 Token 和服务目录。 - 提交请求:CLI 带 Token 请求
nova-api的创建实例接口。 - 校验:
nova-api向 Keystone 验证 Token,检查配额(Quota)与参数(flavor、image、network、security-group、key-name 是否存在)。 - 落库:
nova-api在数据库中创建一条 instance 记录,状态为BUILDING,并把请求投递到 RabbitMQ。 - 调度:
nova-scheduler从队列取出请求,通过 Filter(内存、CPU、磁盘、可用域等)筛选候选主机,再按 Weight 排序,选出目标计算节点,把消息发到该节点的队列。 - 准备资源:目标节点的
nova-compute取出消息:- 向 Glance 请求镜像,下载并缓存到本地(首次较慢)。
- 向 Neutron 申请端口(Port)与 IP,配置 OVS 网桥、DHCP、安全组规则。
- 若需要持久卷,向 Cinder 申请卷并获取挂载信息(iSCSI target 等)。
- 创建虚拟机:
nova-compute通过 libvirt 生成 XML 定义并启动 KVM 虚拟机,此阶段实例状态为SPAWNING。 - 注入配置:虚拟机启动后通过 cloud-init 访问元数据服务(
169.254.169.254,由neutron-metadata-agent转发),拿到主机名与注入的公钥,从而实现密钥登录。 - 完成:
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 参考资源
- Mitaka 版中文安装文档:https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/
- 本地源中的相关 RPM 示例:
http://192.168.1.9/openstack/centos-openstack-ocata/common/python-openvswitch-2.6.1-4.1.git20161206.el7.noarch.rpm
七、部署后验证
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.qcow2Fedora-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_URLIP 是否与本机实际 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)。
- 宿主机内存 / 磁盘不足:flavor 要求大于剩余资源,调小 flavor 或加 swap。运行
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 |
十一、参考文档
- OpenStack 官网:http://www.openstack.org/
- OpenStack 文档:http://docs.openstack.org/
- Mitaka 中文安装文档:https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/
- RDO 项目:https://www.rdoproject.org/
- OpenShift(PaaS):https://www.openshift.com/
十二、练习
- 用一句话分别解释 IaaS、PaaS、SaaS,并各举一个本文提到的例子;说明「虚拟化」与「云计算」的区别。
- 列出从「自建机房」到「云主机」的 6 种 IT 资源交付方式,并说明云主机相对 VPS 增强了什么。
- 准备一台 CentOS 7.3 虚拟机(50G 磁盘、6G 内存),完成主机名设置、
/etc/hosts绑定、关闭 NetworkManager / firewalld / SELinux、配置 NTP 与三个 YUM 源,并在此处打一个快照。 - 用
packstack --allinone完成单节点部署;记录 answer-file、keystonerc_admin与安装日志的完整路径。 - 用
packstack --gen-answer-file生成 answer 文件,找出并说明CONFIG_KEYSTONE_ADMIN_PW、CONFIG_CINDER_INSTALL、CONFIG_PROVISION_DEMO、CONFIG_NEUTRON_OVS_BRIDGE_IFACES四个参数的作用。 - 从
keystonerc_admin中找出 admin 密码,登录 Dashboard 并把界面切换为中文。 source keystonerc_admin后执行openstack service list与openstack compute service list,记录输出,判断各服务是否正常。- 创建 flavor
m1.nano(2 vCPU / 1024MB / 10GB),并查看 flavor 列表确认。 - 上传
Fedora-Cloud-Base-22的 qcow2 镜像为fedora22,确认 Status 为active。 - 生成空密码 SSH 密钥并导入为
keypair1;创建安全组newgroup并放行 ICMP 与 TCP 22,列出其规则。 - 用命令行创建实例
instance01(flavorm1.nano、镜像fedora22、安全组newgroup、密钥keypair1),等待状态变为ACTIVE后用密钥 SSH 登录。 - 手工创建一个内部网络
private(10.0.0.0/24)、一个路由器router1,把它连接到外部网络,为实例分配并绑定一个浮动 IP,验证从外部能 ping 通。 - 创建一个 1G 的 Cinder 卷并挂载到
instance01,在实例内部格式化为 xfs 并挂载到/data。 - 故意在未放行安全组规则的情况下创建实例,验证无法 ping / ssh,然后加规则使其可达,写出整个排查思路。
- 模拟
host 'xxx' no mapper to cell报错场景,说明该报错的原因(Cell V2)与两种解决办法。 - 为承载 OpenStack 的虚拟机新增一块磁盘
/dev/sdb,按 82 类型分区、mkswap、swapon,用free -g验证,并写入/etc/fstab实现开机自动启用。 - 画出「创建一台虚拟机」的完整内部流程图,标注 Keystone、Nova(api/scheduler/conductor/compute)、Glance、Neutron、Cinder、RabbitMQ、MySQL 各自出现的位置。
此处评论已关闭