OpenStack 计算管理:实例锁定后被普通用户解锁了?避坑实操
给实例上了锁,转身普通用户登录就把锁解了、机删了——这不是 bug,是
policy.json里 unlock 那条规则默认对 owner 开放。这篇把计算管理走一遍完整闭环:主机聚合与可用分区、规格的 Public/Private、密钥对与服务器组、发放实例,再到开关机、重启、锁定、暂停、挂起、搁置、快照重建、resize 的生命周期全家桶,环境仍是192.168.108.10的 Victoria 双节点(controller + compute)。文中命令名均标注英文全称(如flavor= 实例规格),完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 从主机聚合、规格、密钥对、服务器组到实例发放与生命周期操作的完整实操,重点讲清锁定与 policy.json、resize 与共享存储两个坑 |
| 所属类别 | 云计算 → 私有云平台 → OpenStack 计算管理 |
| 知识关键字 | aggregate·availability zone·flavor·keypair·server group·server create·lock/unlock·pause/suspend/shelve·rebuild·resize·policy.json |
主线的因果只有一条:聚合决定实例能调度到哪,规格与镜像决定它长什么样,policy.json 决定谁能对它做什么。所以先看资源池怎么划,再备齐五要素发放实例,最后按状态图过一遍生命周期。
一、认清家底:Hypervisor 与主机聚合
先看环境里有哪些计算资源:
[root@controller ~(keystone_admin)]# openstack hypervisor list --long # 虚拟机管理器列表[root@controller ~(keystone_admin)]# openstack host list # 主机列表这两条容易混着用:hypervisor list只列装了 nova-compute 的计算节点(虚拟机管理器视角);host list列的是 nova 管到的所有主机服务,controller 上跑的调度、API 服务也会以主机行的形式出现——所以host list出的行数只多不少。
主机聚合(host aggregate)是「一批计算节点 + 一组元数据」的逻辑分组,是管理员视角的划分工具——不设 zone 也能独立存在,比如纯用来给一批主机打元数据。而可用分区(Availability Zone,AZ)不是和聚合并列的另一种东西:给聚合设置--zone属性后,这个聚合对普通用户暴露出来的一面就是 AZ——用户发放实例时只能选 AZ,看不到也选不了聚合。环境里没建任何聚合时,所有计算节点都归在默认的nova分区名下。Dashboard 入口在「管理员 → 计算 → 主机聚合」。
两个概念最容易混,正反各记一句:AZ 一定是聚合(带--zone属性的那批聚合),聚合不一定是 AZ(不带 zone 属性就只是个分组)。
| 对比项 | 主机聚合 | 可用分区(AZ) |
|---|---|---|
| 谁在用 | 管理员——划分资源、打元数据 | 普通用户——发放实例时指定--availability-zone |
| 本质 | 主机 + 元数据的逻辑分组 | 带--zone属性的聚合对外的名字 |
| 能否独立存在 | 能,不设 zone 就是纯分组 | 不能,必须依托聚合 |
| 默认归属 | 不建就没有 | 没建聚合时全体计算节点都在nova里 |
拿公有云对照更好懂:在华为云、阿里云控制台创建云服务器时让你选的「可用区」就是 AZ——但你在公有云里永远摸不到「主机聚合」,因为聚合是云厂商内部调度用的分组,对外只露 AZ 这一层。私有云 OpenStack 则两层都给你:聚合留给管理员划资源、打元数据,AZ 留给用户做调度筛选。概念对齐:公有云的「地域(Region)」对应 OpenStack 多区域部署里的 region,可用区对应这里的 AZ。
普通用户在公有云里能碰到 AZ 的位置就两处:购买页的下拉选择框、实例详情页「基本信息」里的可用区字段——如上图红框,除此之外整个控制台翻不到「聚合」二字。
aggregate 主机聚合命令族速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
aggregate create --zone | 创建聚合并指定可用分区 | availability zone |
aggregate add host | 把主机加入聚合 | add host |
aggregate set --zone | 修改聚合的可用分区属性 | set |
aggregate remove host | 把主机移出聚合 | remove host |
aggregate delete | 删除聚合 | delete |
aggregate list | 列出聚合,可加--long | list |
[root@controller ~(keystone_admin)]# openstack aggregate create --zone nova HostAggr_cli[root@controller ~(keystone_admin)]# openstack aggregate add host HostAggr_cli controller# 验证:同一台主机加入另一个 AZ 的聚合[root@controller ~(keystone_admin)]# openstack aggregate create --zone AZ_cli HostAggr_cli_test[root@controller ~(keystone_admin)]# openstack aggregate add host HostAggr_cli_test controller两个验证结论:同一台主机可以加入不同的主机聚合,也可以分属两个 AZ——因为 AZ 只是聚合身上的--zone属性,controller 身上同时挂着 zone 为nova和AZ_cli的两个聚合,它就同时属于这两个 AZ(反过来,同一个 AZ 名下一台主机只能待在一个聚合里,nova 不允许重复加入)。删除聚合前要先把主机移出去,否则删不掉。
⚠️注意:创建实例时指定 AZ,调度器就用 AvailabilityZoneFilter 把不在这个 AZ 里的计算节点全部过滤掉;不指定则落默认的
nova分区。
二、规格:Public 与 Private 建完就定死
规格(flavor)定义 vCPU、内存、根磁盘三件套,Dashboard 入口在「管理员 → 计算 → 实例类型」。
flavor 规格命令族速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
flavor create --vcpus | vCPU 数量 | virtual CPU |
flavor create --ram | 内存(MB) | RAM |
flavor create --disk | 根磁盘(GB) | root disk |
flavor create --private --project | 建为私有并指定可见项目 | private |
flavor unset --project | 移除对某项目的可见性 | unset |
flavor show/flavor delete | 查详情 / 删除 | show / delete |
[root@controller ~(keystone_admin)]# openstack flavor create --vcpus 1 --ram 128 --disk 1 \>--private--projectProject_cli Flavor_cli[root@controller ~(keystone_admin)]# openstack flavor unset --project Project_cli Flavor_cli[root@controller ~(keystone_admin)]# openstack flavor show Flavor_cli # 仍不是 Public实验里专门验证过两件事,都是反直觉的。其一,把可见项目全部移除,规格仍是 Private 而不是 Public——此时 admin 看得到它但用不了,其他用户既看不到也用不了。其二,规格创建后不支持变更可见性,想从 Private 变 Public 只能删了重建。不带--private重建出来的规格默认就是 Public。
三、密钥对与服务器组
[root@controller ~(keystone_admin)]# openstack keypair create KeyPair_cli # 私钥立即下载,只显示一次[root@controller ~(keystone_admin)]# openstack server group create --policy affinity ServerGroup_cli服务器组(server group)的四种策略,决定组内虚拟机怎么往计算节点上放:
| 策略 | 语义 | 调度行为 |
|---|---|---|
| 关联 affinity | 亲和性 | 组内虚拟机尽量放同一台主机 |
| 不关联 anti-affinity | 反亲和 | 组内虚拟机尽量分开到不同主机 |
| 软关联 soft-affinity | 弱亲和 | 资源充足才亲和,不足就忽略规则 |
| 软不关联 soft-anti-affinity | 弱反亲和 | 资源充足才分开,不足就忽略规则 |
前两种是硬约束(放不下就调度失败),后两种是尽力而为。Web 界面入口在「项目 → 计算 → 主机组 → 创建服务器组」。
四、发放实例:五要素一次配齐
前置三样前两篇已备好:镜像Img_cli(第一篇)、规格Flavor_cli(本篇第二章)、网络shared(在「项目 → 网络」创建的共享网络)。再加密钥对与服务器组,正好五要素。
Dashboard 向导六页:「详情」填名称与可用分区 → 「源」选镜像(创建新卷选否)→ 「实例类型」选规格 → 「网络」分配 shared → 「Key Pair」分配密钥。最后在「服务器组」页选组,点创建实例。
openstack server create 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
server create | 发放虚拟机实例 | create |
--availability-zone | 指定可用分区 | availability zone |
--image | 启动镜像 | image |
--flavor | 实例规格 | flavor |
--network | 接入的网络 | network |
--key-name | 注入的密钥对 | key name |
--hint group= | 指定服务器组(值为组 ID) | scheduler hint |
<实例名> | 实例名称 | — |
[root@controller ~(keystone_admin)]# openstack server create --availability-zone nova \>--imageImg_cli--flavorFlavor_cli--networkshared\>--key-name KeyPair_cli--hintgroup=SERVER_GROUP_ID Instance_cli_01[root@controller ~(keystone_admin)]# openstack server list # 状态 ACTIVE 即创建成功[root@controller ~(keystone_admin)]# openstack server show Instance_cli_01 | grep status⚠️注意:Web 向导里「创建实例」按钮是灰的,多半是「网络」页没分配网络——点「下一项」到网络页选上再回来。
五、生命周期:一张状态图 + 三组对比
5.1 开关机与软硬重启
server stop/server start是常规关机开机;重启分软硬两种:
| 方式 | 命令 | 实际效果 |
|---|---|---|
| 软重启 | server reboot | 只重启操作系统,过程实例保持运行,相当于系统里敲 reboot |
| 硬重启 | server reboot --hard | 整机断电再上电,相当于关机后再开机 |
5.2 锁定与解锁:规则写在 policy.json 里
[root@controller ~(keystone_admin)]# openstack server lock Instance_cli_01[root@controller ~(keystone_admin)]# openstack server unlock Instance_cli_01锁定是为了防止意外删除。实验验证出一组反直觉的现象:admin 锁定的实例,普通用户不能直接删,但能自己解锁后再删。原因在 unlock 的规则——它是admin_or_owner,项目属主天然有解锁权。想让普通用户解不了,改策略文件(packstack 环境在/etc/openstack-dashboard/nova_policy.json):
"os_compute_api:os-lock-server:lock":"rule:admin_or_owner","os_compute_api:os-lock-server:unlock":"rule:admin_api","os_compute_api:os-lock-server:unlock:unlock_override":"rule:admin_api",把unlock从admin_or_owner收紧成admin_api后,普通用户点解锁直接被拒,admin 不受影响(浏览器清缓存再验证)。
5.3 暂停、挂起、搁置:状态存到了哪
三者都是「先停一下」,差别在状态存哪、资源还不占:
| 对比项 | pause 暂停 | suspend 挂起 | shelve 搁置 |
|---|---|---|---|
| 状态存到哪 | 宿主机内存 | 宿主机磁盘 | 做成镜像存进 Glance |
| 界面显示状态 | 暂停(Paused) | 关机(Shut Down) | 强制搁置(Shelved) |
| 宿主机资源 | 仍占用 | 仍预留 | 已释放 |
| 恢复命令 | unpause | resume | unshelve |
注意恢复命令并不同名。pause 对应的恢复在内部叫 unpause;suspend 对应的才是 resume,日志里能看出来。
还有个容易犯迷糊的地方:suspend 后界面显示的是「关机(Shut Down)」,和真stop出来的关机长得一模一样。区分看两条:一是挂起的实例在宿主机上还留着状态文件、资源照样预留,resume一喊就原样醒来,关机的实例得走完整开机流程;二是恢复命令不同——挂起的用resume,关机的用start。公有云对照着看更清楚:华为云、阿里云的控制台压根不给「暂停/挂起」按钮——这类贴着虚拟化层的操作只在私有云里开放,公有云只留关机、重启这些整机级动作。
5.4 快照与重建:坏了这样救回来
[root@controller ~(keystone_admin)]# openstack server image create --name Instance_Snap_cli Instance_cli_01[root@controller ~(keystone_admin)]# openstack image list # 快照就是一张镜像[root@controller ~(keystone_admin)]# openstack server rebuild --image Instance_Snap_cli Instance_cli_01[root@controller ~(keystone_admin)]# openstack server show Instance_cli_01 | grep image快照本质是一张 Glance 镜像(可见性私有);实例坏了起不来,rebuild指着快照镜像重建,镜像名从 Img_cli 变成 Instance_Snap_cli 即恢复成功。
最后把 shelve 和「快照 + rebuild」这对也掰开——两者都要跟 Glance 镜像打交道,方向完全相反:shelve 是腾地方,整机打包进 Glance 后宿主机资源当场释放,恢复靠unshelve从镜像把实例重新起回来,适合长期不用又不想删的场景;快照 + rebuild 是原地修,实例不挪窝、资源照占,只是拿快照镜像把系统盘重装一遍,让系统回到快照那一刻的状态。一个「存起来省资源」,一个「坏了重装系统」。公有云里也能找到影子:shelve 类似阿里云的「节省停机模式」——停机即释放计算资源、只留磁盘,恢复时重新分配宿主机(控制台路径:ECS 实例列表 → 停止 → 停止模式选「节省停机模式」);rebuild 则对应华为云的「切换操作系统」、阿里云的「更换操作系统」,同样是不换实例、原地重装系统盘。
上图的对话框和server rebuild --image是同一件事的两个入口:都是实例不换、拿选定的镜像重装系统盘,差别只是公有云把入口做成了「更多 → 切换操作系统」的菜单项。
5.5 调整实例大小:resize 两步走
[root@controller ~(keystone_admin)]# openstack flavor create --vcpus 1 --ram 156 --disk 1 Flavor_cli_new[root@controller ~(keystone_admin)]# openstack server resize --flavor Flavor_cli_new Instance_cli_01[root@controller ~(keystone_admin)]# openstack server list | grep Instance_cli_01 # 状态:确认或放弃调整[root@controller ~(keystone_admin)]# openstack server resize confirm Instance_cli_01resize 后实例处于「确认或放弃 调整大小/迁移」状态,确认用resize confirm,反悔用resize revert,确认前旧规格还留着退路。
⚠️注意:多节点环境下 resize 涉及跨主机迁移,需要共享存储支撑;实验环境要先给 Cinder 配好 NFS 后端再做这步,否则迁移失败。内存改小(如 156 改 64)这类缩小方向的 resize 同样会失败。
5.6 生命周期命令对照表
| 命令 | 作用 | 回退 / 恢复 |
|---|---|---|
server stop/start | 关机 / 开机 | 互为逆操作 |
server reboot/reboot --hard | 软重启 / 硬重启 | — |
server lock/unlock | 锁定 / 解锁 | 互为逆操作 |
server pause/unpause | 暂停(内存) | unpause |
server suspend/resume | 挂起(磁盘) | resume |
server shelve/unshelve | 搁置(进 Glance) | unshelve |
server resize/resize confirm | 调整规格并确认 | resize revert |
server rebuild --image | 用指定镜像重建 | 快照镜像 |
server delete | 删除实例 | 不可逆,先有快照 |
📚 参考资料(官方文档 · 中英双语)
英文原版
- openstack server 命令参考(python-openstackclient):lock/pause/suspend/shelve/resize/rebuild 全量参数
- openstack aggregate 命令参考:
--zone与主机聚合的关系 - Nova 服务文档
中文版
- OpenStack 中文文档:官方文档中文入口
- 华为云:什么是可用区,怎样选择和查看可用区?:可用区字段在控制台的位置(图源出处)
- 华为云:切换操作系统:切换操作系统对话框(图源出处)
- 阿里云:节省停机模式:与普通停机模式的官方对比表
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
openstack hypervisor list | hypervisor(虚拟机管理器) | 看计算节点虚拟化层 |
openstack host list | host | 看主机列表 |
aggregate | host aggregate(主机聚合) | 计算节点逻辑分组 |
--zone | availability zone(可用分区) | 聚合的 AZ 属性,调度过滤依据 |
flavor | flavor(实例规格) | vCPU / 内存 / 磁盘三件套 |
flavor unset --project | unset | 移除规格对项目的可见性 |
keypair create | key pair(密钥对) | 建密钥对,私钥只给一次 |
server group create --policy | policy(策略) | 建服务器组并指定亲和策略 |
affinity/anti-affinity | 亲和 / 反亲和 | 组内同机 / 分机 |
soft-affinity | soft(软) | 资源充足才生效的弱策略 |
server create | create | 发放实例 |
--hint group= | scheduler hint(调度提示) | 指定服务器组,值是组 ID |
server lock/unlock | lock / unlock | 锁定防误删 / 解锁 |
server pause/unpause | pause | 暂停到内存并恢复 |
server suspend/resume | suspend | 挂起到磁盘并恢复 |
server shelve/unshelve | shelve(搁置) | 做镜像释放资源 / 重建回来 |
server resize | resize | 更换规格,两步确认 |
resize confirm/revert | confirm / revert | 确认生效 / 回退旧规格 |
server rebuild | rebuild | 用镜像重建实例系统盘 |
policy.json | policy | 各服务的 API 访问控制规则 |
总结:计算管理的主线是「聚合划资源池 → 规格定形状 → 五要素发实例 → policy.json 定权限」。锁定救不了误删(owner 能自己解锁),快照才是最后防线;resize 不是一步到位,确认前随时能 revert。
📚同系列 · OpenStack 实验手册(其余篇目见博客主页)
blog.csdn.net/nbsxl
- 上一篇:《OpenStack 镜像管理:共享镜像一直 pending 看不见?Glance 全流程实操》
- 相关篇:《OpenStack 认证管理:角色、用户、组、项目、配额,五样东西到底谁绑谁》
💬 你的实例被锁过吗?改 policy.json 收紧 unlock 后普通用户报了什么错,评论区贴出来对对看。