OpenStack 核心服务实战笔记
💡 前置操作:执行
source keystonerc_admin加载管理员环境变量;切换普通用户:source keystonerc_用户名。命令均可复制直接执行,附带原理、概念、踩坑提示。
组件功能总览
OpenStack 由多个独立微服务协同工作:Keystone 负责身份权限,其余服务分别管理一类云资源,Heat 实现基础设施一键编排。
| 组件 | 功能定位 | 一句话说明 | 通俗类比 |
|---|---|---|---|
| Keystone | 认证与授权 | 管理用户/项目/组/角色,签发Token;所有服务请求的身份入口 | 门卫 + 户口本 |
| Glance | 镜像服务 | 虚拟机操作系统模板注册、存储、共享;实例基于镜像启动 | 装机光盘仓库 |
| Nova | 计算服务 | 虚拟机实例生命周期管理:创建、调度、开关机、快照、规格调整 | 虚拟机工厂 |
| Cinder | 块存储服务 | 云硬盘卷管理:创建、挂载、快照、扩容;卷独立于实例,删除实例不会自动销毁卷 | 移动硬盘管理员 |
| Neutron | 网络服务 | 虚拟网络、子网、路由器、浮动IP、安全组,实现实例内网互通与外网访问 | 网络运营商 |
| Heat | 编排服务 | YAML模板描述整套云资源,一键批量创建销毁,实现基础设施即代码(IaC) | 自动化部署脚本 |
完整调用链(创建一台虚拟机) :
openstack server create → Keystone校验身份权限 → Nova调度到合适计算节点 → 从Glance拉取操作系统镜像 → Neutron分配网络IP与虚拟网卡 → 按需挂载Cinder云硬盘。
📝记忆口诀:认证找 Keystone,装系统找 Glance,开虚拟机找 Nova,加硬盘找 Cinder,组网络找 Neutron,全自动找 Heat。
一、认证管理 Keystone
原理与概念
| 概念 | 作用 |
|---|---|
| Domain 域 | 最高层级隔离容器,对应机构/数据中心,全局唯一;用户、项目、组全部归属某个域 |
| User 用户 | OpenStack访问身份实体,输入密码完成认证后获取Token通行证 |
| Group 用户组 | 用户集合,给组授权一次,组内全部用户自动继承权限,适合批量运维授权 |
| Project 项目 | 云资源隔离单元,公有云也叫租户;资源归项目所有,不属于单独用户 |
| Role 角色 | 权限集合包,区分项目级权限、域级权限 |
| Service | OpenStack内部服务(nova/glance/cinder等) |
| Endpoint | 服务API访问地址,分为public公网、admin管理、internal内部访问三类入口 |
| Token | 身份认证成功后Keystone签发的通行证,默认有效期24h,后续所有API请求携带Token鉴权 |
完整认证流程
- 用户提交账号密码给Keystone,校验通过后签发Token;
- 用户携带Token访问Nova/Glance/Neutron等业务服务;
- 业务服务拿着Token回传给Keystone校验合法性;
- 业务服务读取自身
policy.json权限策略,判断该角色是否允许执行本次操作。
内置常用角色:
admin(管理员)、member/_member_(项目普通成员)、reader(只读角色)。
💡高频坑点
role add是把角色绑定到项目/域,不是直接给用户赋权;用户加入用户组不等于拥有权限,必须执行角色绑定。- 日常优先使用系统内置角色,自定义角色需要修改
policy.json策略文件,一般生产环境不改动。 - 排查权限首选命令:
openstack role assignment list --names。 - Dashboard多域登录需要修改
/etc/openstack‑dashboard/local_settings开启OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True,重启httpd服务生效。
命令速查表
1. 域 Domain
bash
openstack domain list
# 列出当前环境中所有域。域是OpenStack顶层隔离容器,后续创建项目、用户、组都归属域
openstack domain create domain-test
# 创建domain‑test域,创建默认启用,可在域下创建项目、用户、组
openstack domain show Default
# 查看系统内置Default域的详细信息(ID、启用状态、描述)
openstack domain set --disable domain-test
# 禁用domain‑test域;禁用后域下所有用户、项目全部不可用,停用域优先使用禁用而不是直接删除
openstack domain delete domain-test
# 删除域:必须先执行disable禁用,否则直接删除会报错
2. 项目 Project(租户)
bash
openstack project list
# 列出全部项目,项目是计算、存储、网络资源的隔离单元
openstack project create --domain Default demo
# 在Default域下创建demo项目
openstack project show demo
# 查看demo项目详情
openstack project set --disable demo
# 禁用项目,项目内资源停止对外服务,成员无法操作资源
openstack project delete demo
# 删除项目,项目内部存在实例、卷、网络等资源会删除失败,需要提前清理资源
openstack quota show demo
# 查看demo项目资源配额上限(实例、CPU、内存、卷等)
openstack quota set --instances 5 --cores 10 --ram 5120 demo
# 修改项目配额:最多5实例、10核vCPU、5120MB内存;调低配额不会影响已经存在的资源
3. 用户 User
bash
openstack user list
# 列出所有用户
openstack user create --domain Default --project admin --password-prompt user1
# 交互式创建用户user1,归属Default域,主项目admin;--password‑prompt交互式输入密码,生产环境更安全
openstack user create --password HUAWEI user1
# 明文密码创建用户,⚠密码会留在终端历史记录,生产环境不推荐
openstack user show user1
# 查看用户详情
openstack user set --password 654321 user1
# 修改用户密码
openstack user set --project ProjectA user1
# 修改用户默认主项目
openstack user set --disable user1
# 禁用账号,离职人员账号优先禁用,而不是直接删除
openstack user delete user1
# 删除用户,删除后不可恢复,确认不再使用再执行
4. 用户组 Group(批量授权)
bash
openstack group list
# 列出所有用户组
openstack group create --domain Default admin_group
# 在Default域创建admin_group用户组
openstack group show admin_group
# 查看用户组详情
openstack group add user admin_group user1 user2
# 将user1、user2加入用户组,支持一次性添加多个用户
openstack group remove user admin_group user2
# 将user2从组移除,移除后不再继承组的权限
openstack group contains user admin_group user1
# 校验user1是否属于该用户组,返回True代表在组内,排错确认授权
openstack group delete admin_group
# 删除用户组,不会删除组内用户,仅解除归属关系
5. 角色 Role(权限包)
bash
openstack role list
# 列出所有角色
openstack role create backup_role
# 创建自定义角色;注意自定义角色需要配合policy.json,一般业务场景直接用内置角色
openstack role show admin
# 查看admin角色详情
# 用户在项目内授予member普通成员权限
openstack role add --project demo --user user1 member
# 用户组批量授权:组内所有用户获得demo项目admin管理员权限
openstack role add --project demo --group admin_group admin
# 域级授权:整个Default域下admin_group组拥有域管理员权限,范围大于项目级
openstack role add --domain Default --group admin_group admin
# 回收用户在demo项目的member角色权限
openstack role remove --project demo --user user1 member
# 回收用户组项目管理员权限
openstack role remove --project demo --group admin_group admin
# ✨排错必备:查看全部角色绑定关系,显示名称而不是ID
openstack role assignment list --names
# 只看某个用户的全部权限分配
openstack role assignment list --user user1 --names
# 只看某个用户组的全部权限分配
openstack role assignment list --group admin_group --names
6. 服务 Service 与端点 Endpoint
bash
openstack service list
# 列出注册到keystone的所有服务
openstack service create --name glance --description "镜像服务" image
# 注册glance镜像服务,type类型为image
openstack endpoint list
# 查看所有服务API访问端点
openstack endpoint create --region RegionOne image public [http://192.168.108.10:9292](http://192.168.108.10:9292)
# 为image(glance)服务创建public对外访问端点
openstack catalog list
# 查看当前用户可访问全部服务目录,等价endpoint list
7. 环境变量与认证切换
bash
source keystonerc_admin
# 加载管理员环境变量,后续openstack命令使用admin身份执行
source keystonerc_user1
# 加载普通用户环境,验证普通账号权限
unset OS_AUTH_URL OS_USERNAME OS_PASSWORD
# 清除认证环境变量,终端回到未认证状态,排查环境变量异常
openstack
# 进入openstack交互式终端,输入exit退出交互模式
二、镜像管理 Glance
原理与概念
| 术语 | 说明 |
|---|---|
| 镜像 Image | 预装操作系统的虚拟机模板,使用镜像可以批量启动多台实例;修改实例不会改动原始镜像 |
| 实例 Instance | 镜像运行出来的虚拟机副本 |
| Flavor | 实例规格,定义vCPU、内存、根磁盘大小,启动实例必须指定 |
Glance架构
glance‑api接收镜像API请求;元数据存入MariaDB数据库;镜像文件默认存储本地路径/var/lib/glance/images/,后端支持对接Ceph、Swift分布式存储。
磁盘格式
| 格式 | 说明 |
|---|---|
| qcow2 | QEMU默认格式,支持稀疏盘、写时复制、压缩,OpenStack最常用 |
| raw | 裸磁盘格式,性能高,不支持压缩稀疏 |
| vmdk | VMware虚拟机磁盘格式 |
| iso | 光盘ISO镜像 |
容器格式:绝大多数场景使用
bare,不需要额外封装。
镜像可见性
public:全部项目可见;private:仅当前创建项目可见;shared:共享模式,共享给其他项目,对方项目需要执行--accept接收共享镜像。
镜像状态流转 :queued仅元数据 → saving/uploading上传中 → active可用 → deactivated禁用访问 / killed异常错误。
💡高频坑点
- 大镜像优先使用命令行上传,Web界面上传容易超时失败。
- 镜像设置shared共享之后,对方项目必须执行
openstack image set --accept接收,镜像才会变为可用。 - 创建镜像必须同时指定
--disk‑format磁盘格式和--container‑format bare。 - 镜像实体文件保存在
/var/lib/glance/images/镜像ID,数据库image_locations记录表存储路径。
命令速查表
1. 镜像增删改查
bash
openstack image list
# 列出全部镜像,包含状态、可见性、ID
openstack image show Img_cli
# 查看镜像详细信息
openstack image delete Img_cli
# 删除镜像;已基于该镜像启动的实例不受影响,只是不能再新建实例
# 创建注册本地qcow2镜像
openstack image create --disk-format qcow2 --container-format bare \
--min-disk 1 --min-ram 128 \
--private --file ./cirros-0.5.2-x86_64-disk.img Img_cli
openstack image set --public Img_cli
# 设置镜像为公有,所有项目可用
openstack image set --shared Img_cli
# 设置镜像为共享模式,才可以跨项目共享
openstack image set --protected Img_cli
# 镜像开启保护锁,防止误删除
openstack image set --unprotected Img_cli
# 解除镜像保护锁,才允许删除
2. 镜像共享(跨项目)
bash
openstack image set --shared Img_cli
# 第一步:源项目镜像设置shared
openstack image add project IMAGE_ID PROJECT_ID
# 第二步:将镜像共享给目标项目ID,对方镜像状态pending等待接收
openstack image set --accept IMAGE_ID
# ✨切换到被共享项目执行,接收共享镜像,状态变为active可以使用
3. 镜像导出与格式转换
bash
openstack image save --file Ubuntu.qcow2 Ubuntu_cli
# 将glance镜像导出保存本地,用于备份迁移
qemu-img info cirros-0.5.2-x86_64-disk.img
# 本地查看镜像文件信息,不调用glance服务
# vmdk格式转换qcow2,-c开启压缩,-p显示进度
qemu-img convert -f vmdk -O qcow2 -c -p \
bionic-server-cloudimg-amd64.vmdk bionic-server-cloudimg-amd64.qcow2
4. 卷转为镜像
bash
openstack image create --volume Volume_cli_01 --disk-format qcow2 Volume_Img_cli
# 将已经配置好的cinder卷生成镜像,沉淀环境用于批量部署
三、计算管理 Nova
原理与概念
Nova核心组件
| 组件 | 作用 |
|---|---|
| nova‑api | 接收REST请求,鉴权,下发RPC消息 |
| nova‑scheduler | 调度器,过滤+权重打分,决定虚拟机调度在哪台计算节点 |
| nova‑compute | 真正管理虚拟机生命周期,调用libvirt/kvm驱动 |
| nova‑conductor | 数据库代理,避免compute直接访问数据库,提升安全 |
| placement | 资源库存跟踪CPU、内存资源 |
| RabbitMQ | 组件之间RPC消息队列 |
调度Filter Scheduler流程
- Filter过滤:AZ可用区匹配 → 计算节点服务正常 → 内存/磁盘/vCPU资源充足 → 虚拟机组亲和/反亲和策略过滤;
- Weight权重打分:过滤剩下节点根据空闲内存打分,分数最高节点调度实例。
实例四种状态区分
| 操作 | 数据保存位置 | 使用场景 |
|---|---|---|
| Pause暂停 | 内存 | 短时间暂停,恢复速度快 |
| Suspend挂起 | 磁盘 | 长时间暂停,内存数据落盘释放CPU资源 |
| Shelve搁置 | 保存为Glance镜像,删除实例 | 释放计算资源,保留系统环境 |
| Lock锁定 | 标记实例 | 防误删,普通用户无法删除锁定实例 |
soft软重启:虚拟机内部执行reboot;hard硬重启:强制断电上电。
资源超分:
ram_allocation_ratio内存超分、cpu_allocation_ratiovCPU超分,磁盘一般不开启超分。
💡高频坑点
- 创建实例必备四要素:镜像、flavor规格、网络、密钥对。
- resize变更实例规格,多节点环境需要共享存储(NFS/Ceph),否则容易失败。
- 删除锁定实例,必须先执行unlock解锁。
- 排错日志路径
/var/log/nova/nova‑scheduler.log,生产不要开启debug日志。
命令速查表
1. Hypervisor / 主机聚合 / 可用分区
bash
openstack hypervisor list --long
# 查看全部计算节点硬件资源使用情况
openstack host list
# 列出环境所有主机(控制节点+计算节点)
openstack compute service list
# 查看nova各个组件服务运行状态,排查服务down
openstack aggregate create --zone nova HostAggr_cli
# 创建主机聚合,绑定可用分区AZ
openstack aggregate add host HostAggr_cli controller
# 将主机加入聚合组
openstack aggregate remove host HostAggr_cli controller
# 将主机移出聚合组
openstack aggregate set --zone nova HostAggr_cli_test
# 修改聚合关联可用分区
openstack aggregate list
openstack aggregate show HostAggr_cli
openstack aggregate delete HostAggr_cli_test
# 删除聚合前必须把内部主机全部移出
2. 规格 Flavor
bash
openstack flavor list
openstack flavor show Flavor_cli
# 创建私有规格,仅Project_cli项目可见
openstack flavor create --vcpus 1 --ram 128 --disk 1 --private --project Project_cli Flavor_cli
# 创建公有规格,全部项目可用
openstack flavor create --vcpus 1 --ram 128 --disk 1 Flavor_cli
openstack flavor unset --project Project_cli Flavor_cli
# 回收项目对私有规格的使用权
openstack flavor delete Flavor_cli
# 已经被实例使用的规格删除会受限
3. 密钥对与虚拟机组
bash
openstack keypair list
openstack keypair create KeyPair_cli
# 创建ssh密钥对,私钥本地下载,公钥注入虚拟机
openstack server group list
# 虚拟机组,支持affinity亲和 / anti‑affinity反亲和
openstack server group create --policy affinity ServerGroup_cli
# affinity:实例调度同一物理机;anti‑affinity分散不同物理机实现高可用
openstack server group delete ServerGroup_cli
4. 实例生命周期
bash
# 创建实例,指定AZ、镜像、规格、网络、密钥、虚拟机组
openstack server create --availability-zone nova \
--image Img_cli --flavor Flavor_cli \
--network shared --key-name KeyPair_cli \
--hint group=SERVER_GROUP_ID Instance_cli_01
# 批量创建2台实例
openstack server create --image Img_cli --flavor Flavor_cli \
--network Network_cli_01 --min 2 --max 2 Instance_cli_test
openstack server list
openstack server show Instance_cli_01
openstack server delete Instance_cli_01
# 开关机重启
openstack server stop Instance_cli_01
openstack server start Instance_cli_01
openstack server reboot Instance_cli_01
openstack server reboot --hard Instance_cli_01
# 暂停、挂起恢复
openstack server pause Instance_cli_01
openstack server unpause Instance_cli_01
openstack server suspend Instance_cli_01
openstack server resume Instance_cli_01
# 锁定解锁防误删
openstack server lock Instance_cli_01
openstack server unlock Instance_cli_01
# shelve搁置释放计算资源,镜像保存glance
openstack server shelve Instance_cli_01
openstack server unshelve Instance_cli_01
5. 快照与规格调整resize
bash
# 实例快照,生成glance镜像
openstack server image create --name Instance_Snap_cli Instance_cli_01
# 修改实例规格流程
openstack flavor create --vcpus 1 --ram 156 --disk 1 Flavor_cli_new
openstack server resize --flavor Flavor_cli_new Instance_cli_01
openstack server resize confirm Instance_cli_01
# openstack server resize revert Instance_cli_01 #回滚备选
# 使用快照镜像重建实例,系统损坏恢复
openstack server rebuild --image Instance_Snap_cli Instance_cli_01
四、块存储管理 Cinder
原理与概念
Cinder不是真实存储设备,属于逻辑卷抽象层,通过driver对接LVM、Ceph、SAN、NFS后端存储。
| 组件 | 作用 |
|---|---|
| cinder‑api | 接收API请求,参数校验,写入数据库 |
| cinder‑scheduler | 调度,过滤后端存储,权重打分选择存储节点 |
| cinder‑volume | 调用存储驱动,执行卷创建、挂载操作 |
| cinder‑backup | 卷备份到Swift/Ceph对象存储 |
默认实验环境后端LVM,卷组名称cinder‑volumes。
挂载流程:Nova调用CinderAPI → cinder‑scheduler选择后端 → cinder‑volume通知存储授权访问 → 返回iSCSI连接信息 → nova将磁盘挂载到虚拟机。
卷状态:available空闲可用 → in‑use已经挂载实例 → error异常故障。
💡高频坑点
- 删除卷:必须先删除快照,卷状态为available空闲;in‑use挂载状态卷无法删除。
- 系统启动卷不能执行卸载,只能删除实例。
‑‑non‑bootable非启动卷,不可以用来创建实例。- 挂载状态卷打快照可能出现数据不一致,优先关机或者卸载卷再做快照。
命令速查表
1. 卷类型与QoS
bash
openstack volume type list
openstack volume type create --public VolumeType_cli
openstack volume qos list
openstack volume qos create --consume back-end QoS_cli
openstack volume qos associate QoS_cli VolumeType_cli
openstack volume qos show QoS_cli
2. 卷管理
bash
openstack volume list
openstack volume show Volume_cli_01
openstack volume delete Volume_cli_01
# 基于镜像创建可启动卷
openstack volume create --image Img_cli --type VolumeType_cli \
--size 1 --availability-zone nova --bootable Volume_cli_01
# 卷挂载到实例
openstack server add volume Instance_cli_01 Volume_cli_01
# 卸载卷
openstack server remove volume Instance_cli_01 Volume_cli_01
# 扩容卷:仅支持扩大,系统内部还需要手动扩容文件系统
openstack volume set --size 2 Volume_cli_01
openstack volume set --state error Volume_cli_01
# 排错手动修改卷状态,生产谨慎使用
openstack volume set --non-bootable Volume_cli_02
# 设置为非启动卷,不能用于启动虚拟机
3. 卷快照
bash
openstack volume snapshot list
openstack volume snapshot create --volume Volume_cli_01 Volume_Snap_cli
openstack volume snapshot delete Volume_Snap_cli
# 基于快照生成新卷,用于数据恢复
openstack volume create --snapshot Volume_Snap_cli Volume_cli_02
4. 基于卷直接发放实例
bash
openstack server create --volume Volume_cli_02 --flavor Flavor_cli \
--network shared Instance_cli_02
# 不使用镜像,直接把cinder卷当做系统盘启动实例
5. NFS共享存储部署(resize跨节点必备)
bash
## NFS服务端(192.168.108.12)
mkdir /nfs_share && chmod -R 777 /nfs_share
yum -y install nfs-utils
echo "/nfs_share *(rw,sync,no_root_squash)" > /etc/exports
systemctl restart nfs-server && systemctl enable nfs-server
## controller、compute计算节点客户端
mkdir -p /mnt/nfs_share && chmod -R 777 /mnt/nfs_share
mount 192.168.108.12:/nfs_share /mnt/nfs_share
# cinder.conf关键配置片段
# [DEFAULT]
# enabled_backends = lvm,nfs
# [nfs]
# nfs_mount_point_base = /mnt/nfs_share
# nfs_shares_config = /etc/cinder/nfs_shares
# volume_backend_name = nfs
# /etc/cinder/nfs_shares写入 192.168.108.12:/nfs_share
chown -R cinder:cinder /mnt/nfs_share
systemctl restart openstack-cinder-volume
五、网络管理 Neutron
原理与概念
层级关系:Project项目 → Network网络 → Subnet子网 → Port虚拟网口 → 实例虚拟机
| 概念 | 说明 |
|---|---|
| Network | 二层广播域,网络隔离单元,支持vlan/vxlan/flat/gre多种网络模式 |
| Subnet | IP地址网段,DHCP地址池,实例IP从子网分配 |
| Port | 虚拟交换机端口,绑定MAC+IP,虚拟机网卡对接port |
| Router | 虚拟路由器,基于network namespace隔离;实现子网互通、SNAT外网访问 |
| Floating IP浮动IP | 外部公网IP,DNAT映射内网实例,实现外网访问虚拟机 |
| Security Group安全组 | 实例级别防火墙底层基于iptables;默认允许全部出站,禁止全部入站流量 |
网络连通规则
- 同一个Network内实例默认互通;
- 不同Network默认隔离,不通;
- 多个子网接入同一个Router路由器,子网之间互通;
- 内网实例访问外网:路由器绑定外部网关 + 分配浮动IP + 安全组放行入站规则。
💡高频坑点
- 浮动IP分配后ping不通,绝大多数是安全组没有放行ICMP/TCP入站规则。
- Router必须绑定
‑‑external‑gateway External外部网络才能访问公网;内网子网通过router add subnet接入路由器。 - 不同Network子网CIDR网段可以重叠,依靠namespace隔离。
- 删除浮动IP前,必须先从实例解绑。
命令速查表
1. 网络 Network 与子网 Subnet
bash
openstack network list
openstack network show Network_cli_01
openstack network create --share Network_cli_01
# --share 共享网络,所有项目可以使用
openstack subnet create --network Network_cli_01 \
--subnet-range 192.168.3.0/24 \
--allocation-pool start=192.168.3.100,end=192.168.3.200 \
--gateway 192.168.3.1 Subnet_cli_01
openstack subnet list
openstack port list --network Network_cli_01 --long
# 查看网络下所有虚拟端口port、MAC、绑定实例信息
2. 路由器 Router
bash
openstack router list
openstack router create --project admin Router_cli
# 设置路由器外部网关,接入External外网网络
openstack router set --external-gateway External Router_cli
# 将内网子网接入路由器,实现子网互通
openstack router add subnet Router_cli Subnet_cli_01
openstack router add subnet Router_cli Subnet_cli_02
openstack router show Router_cli | grep interfaces_info
# 过滤查看路由器接入的子网接口,排错使用
3. 浮动IP Floating IP
bash
openstack floating ip list --long
# 创建浮动IP并且直接绑定端口
openstack floating ip create --port PORT_ID External
# 创建浮动IP,暂不绑定
openstack floating ip create External
# 实例绑定浮动IP
openstack server add floating ip Instance_cli_test-1 FLOATING_IP
# 解绑浮动IP
openstack server remove floating ip Instance_cli_test-1 FLOATING_IP
openstack floating ip delete FLOATING_IP
# 删除前必须先解绑实例
4. 安全组 Security Group
bash
openstack security group list
openstack security group create SG_cli
# 放行ICMP ping入站全部源地址
openstack security group rule create --protocol icmp --ingress --remote-ip 0.0.0.0/0 SG_cli
# 放行全部TCP入站
openstack security group rule create --protocol tcp --ingress --remote-ip 0.0.0.0/0 SG_cli
openstack security group rule list
openstack security group rule show RULE_ID
# 实例添加安全组
openstack server add security group Instance_cli_test-3 SG_cli
# 移除安全组,实例至少保留一个安全组
openstack server remove security group Instance_cli_test-3 default
openstack server show Instance_cli_test-3 | grep security_groups
# 查看实例生效安全组
六、编排管理 Heat
原理与概念
Heat使用YAML HOT模板声明式描述整套云资源,自动调用各个OpenStack组件API,按资源依赖顺序创建/销毁整套环境,实现基础设施即代码IaC。
| 组件 | 作用 |
|---|---|
| heat‑api | REST API接收请求,转发给engine |
| heat‑api‑cfn | 兼容AWS CloudFormation格式API |
| heat‑engine | 核心引擎,资源调度、生命周期管理 |
支持嵌套模板:主模板引用子模板,实现模板模块化复用。
常见资源类型:
OS::Nova::Server虚拟机、OS::Neutron::Net网络等。
💡高频坑点
- YAML语法:冒号后面必须带空格;缩进只用空格,禁止Tab制表符。
- 删除stack堆栈会自动删除模板创建的全部资源。
‑‑yes参数跳过交互式确认删除。- 模板内镜像、flavor、密钥、网络名称,必须环境真实存在。
命令速查表
1. Stack堆栈生命周期
bash
openstack stack list
openstack stack show Stack_demo
openstack stack event list Stack_demo
# 查看创建事件,排查资源失败步骤
openstack stack output show --all Stack_demo
# 查看模板output输出,例如实例IP
# 使用HOT模板创建堆栈,传入参数
openstack stack create -t demo-template.yaml \
--parameter "NetID=$NET_ID" Stack_demo
openstack stack delete Stack_demo
# 交互式确认删除,连带删除全部资源
openstack stack delete --yes Stack_nest
# 跳过确认直接删除堆栈
2. HOT模板示例(YAML)
yaml
heat_template_version: 2015-10-15
description: Heat测试模板
parameters:
NetID:
type: string
description: 网络ID
resources:
server:
type: OS::Nova::Server
properties:
image: Img_cli
flavor: Flavor_cli
key_name: KeyPair_cli
networks:
- network: { get_param: NetID }
outputs:
instance_ip:
description: 实例IP地址
value: { get_attr: [server, first_address] }
常用内置函数:
get_param读取输入参数、get_resource获取其他资源ID、get_attr读取资源属性。
七、通用排错速查
bash
# 查看各个服务日志目录
ls /var/log/keystone/ /var/log/nova/ /var/log/glance/ /var/log/cinder/ /var/log/neutron/ /var/log/heat/
# 排错临时开启debug:修改对应服务conf的[DEFAULT] debug=True,重启服务;排错完毕务必关闭debug,日志量巨大影响性能
# 查看rabbitmq消息队列,排查RPC消息积压
rabbitmqctl list_queues
# 进入数据库查看底层表
mysql
show databases;
use keystone; show tables;
| 故障现象 | 排查方向 |
|---|---|
| source环境后返回401鉴权失败 | 检查OS_AUTH_URL、账号密码、项目名称环境变量 |
| 实例一直Build构建中 | openstack server event show查看事件;检查镜像、flavor、网络参数 |
| 浮动IP分配成功但是ping不通 | 安全组入站规则、路由器外部网关、实例是否真正拿到FIP |
| cinder卷无法删除 | 删除快照、卷先卸载,状态置为available |
| 创建glance镜像失败 | 确认同时配置‑‑disk‑format与‑‑container‑format bare |