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 与主机聚合先看环境里有哪些计算资源[rootcontroller ~(keystone_admin)]# openstack hypervisor list --long # 虚拟机管理器列表[rootcontroller ~(keystone_admin)]# openstack host list # 主机列表这两条容易混着用hypervisor list只列装了 nova-compute 的计算节点虚拟机管理器视角host list列的是 nova 管到的所有主机服务controller 上跑的调度、API 服务也会以主机行的形式出现——所以host list出的行数只多不少。主机聚合host aggregate是「一批计算节点 一组元数据」的逻辑分组是管理员视角的划分工具——不设 zone 也能独立存在比如纯用来给一批主机打元数据。而可用分区Availability ZoneAZ不是和聚合并列的另一种东西给聚合设置--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 zoneaggregate add host把主机加入聚合add hostaggregate set --zone修改聚合的可用分区属性setaggregate remove host把主机移出聚合remove hostaggregate delete删除聚合deleteaggregate list列出聚合可加--longlist[rootcontroller ~(keystone_admin)]# openstack aggregate create --zone nova HostAggr_cli[rootcontroller ~(keystone_admin)]# openstack aggregate add host HostAggr_cli controller# 验证同一台主机加入另一个 AZ 的聚合[rootcontroller ~(keystone_admin)]# openstack aggregate create --zone AZ_cli HostAggr_cli_test[rootcontroller ~(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 --vcpusvCPU 数量virtual CPUflavor create --ram内存MBRAMflavor create --disk根磁盘GBroot diskflavor create --private --project建为私有并指定可见项目privateflavor unset --project移除对某项目的可见性unsetflavor show/flavor delete查详情 / 删除show / delete[rootcontroller ~(keystone_admin)]# openstack flavor create --vcpus 1 --ram 128 --disk 1 \--private--projectProject_cli Flavor_cli[rootcontroller ~(keystone_admin)]# openstack flavor unset --project Project_cli Flavor_cli[rootcontroller ~(keystone_admin)]# openstack flavor show Flavor_cli # 仍不是 Public实验里专门验证过两件事都是反直觉的。其一把可见项目全部移除规格仍是 Private 而不是 Public——此时 admin 看得到它但用不了其他用户既看不到也用不了。其二规格创建后不支持变更可见性想从 Private 变 Public 只能删了重建。不带--private重建出来的规格默认就是 Public。三、密钥对与服务器组[rootcontroller ~(keystone_admin)]# openstack keypair create KeyPair_cli # 私钥立即下载只显示一次[rootcontroller ~(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指定服务器组值为组 IDscheduler hint实例名实例名称—[rootcontroller ~(keystone_admin)]# openstack server create --availability-zone nova \--imageImg_cli--flavorFlavor_cli--networkshared\--key-name KeyPair_cli--hintgroupSERVER_GROUP_ID Instance_cli_01[rootcontroller ~(keystone_admin)]# openstack server list # 状态 ACTIVE 即创建成功[rootcontroller ~(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 里[rootcontroller ~(keystone_admin)]# openstack server lock Instance_cli_01[rootcontroller ~(keystone_admin)]# openstack server unlock Instance_cli_01锁定是为了防止意外删除。实验验证出一组反直觉的现象admin 锁定的实例普通用户不能直接删但能自己解锁后再删。原因在 unlock 的规则——它是admin_or_owner项目属主天然有解锁权。想让普通用户解不了改策略文件packstack 环境在/etc/openstack-dashboard/nova_policy.jsonos_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宿主机资源仍占用仍预留已释放恢复命令unpauseresumeunshelve注意恢复命令并不同名。pause 对应的恢复在内部叫 unpausesuspend 对应的才是 resume日志里能看出来。还有个容易犯迷糊的地方suspend 后界面显示的是「关机Shut Down」和真stop出来的关机长得一模一样。区分看两条一是挂起的实例在宿主机上还留着状态文件、资源照样预留resume一喊就原样醒来关机的实例得走完整开机流程二是恢复命令不同——挂起的用resume关机的用start。公有云对照着看更清楚华为云、阿里云的控制台压根不给「暂停/挂起」按钮——这类贴着虚拟化层的操作只在私有云里开放公有云只留关机、重启这些整机级动作。5.4 快照与重建坏了这样救回来[rootcontroller ~(keystone_admin)]# openstack server image create --name Instance_Snap_cli Instance_cli_01[rootcontroller ~(keystone_admin)]# openstack image list # 快照就是一张镜像[rootcontroller ~(keystone_admin)]# openstack server rebuild --image Instance_Snap_cli Instance_cli_01[rootcontroller ~(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 两步走[rootcontroller ~(keystone_admin)]# openstack flavor create --vcpus 1 --ram 156 --disk 1 Flavor_cli_new[rootcontroller ~(keystone_admin)]# openstack server resize --flavor Flavor_cli_new Instance_cli_01[rootcontroller ~(keystone_admin)]# openstack server list | grep Instance_cli_01 # 状态确认或放弃调整[rootcontroller ~(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暂停内存unpauseserver suspend/resume挂起磁盘resumeserver shelve/unshelve搁置进 Glanceunshelveserver resize/resize confirm调整规格并确认resize revertserver rebuild --image用指定镜像重建快照镜像server delete删除实例不可逆先有快照 参考资料官方文档 · 中英双语英文原版openstack server 命令参考python-openstackclientlock/pause/suspend/shelve/resize/rebuild 全量参数openstack aggregate 命令参考--zone与主机聚合的关系Nova 服务文档中文版OpenStack 中文文档官方文档中文入口华为云什么是可用区怎样选择和查看可用区可用区字段在控制台的位置图源出处华为云切换操作系统切换操作系统对话框图源出处阿里云节省停机模式与普通停机模式的官方对比表附命令英文全称速查表命令 / 缩写英文全称 / 原意作用openstack hypervisor listhypervisor虚拟机管理器看计算节点虚拟化层openstack host listhost看主机列表aggregatehost aggregate主机聚合计算节点逻辑分组--zoneavailability zone可用分区聚合的 AZ 属性调度过滤依据flavorflavor实例规格vCPU / 内存 / 磁盘三件套flavor unset --projectunset移除规格对项目的可见性keypair createkey pair密钥对建密钥对私钥只给一次server group create --policypolicy策略建服务器组并指定亲和策略affinity/anti-affinity亲和 / 反亲和组内同机 / 分机soft-affinitysoft软资源充足才生效的弱策略server createcreate发放实例--hint groupscheduler hint调度提示指定服务器组值是组 IDserver lock/unlocklock / unlock锁定防误删 / 解锁server pause/unpausepause暂停到内存并恢复server suspend/resumesuspend挂起到磁盘并恢复server shelve/unshelveshelve搁置做镜像释放资源 / 重建回来server resizeresize更换规格两步确认resize confirm/revertconfirm / revert确认生效 / 回退旧规格server rebuildrebuild用镜像重建实例系统盘policy.jsonpolicy各服务的 API 访问控制规则总结计算管理的主线是「聚合划资源池 → 规格定形状 → 五要素发实例 → policy.json 定权限」。锁定救不了误删owner 能自己解锁快照才是最后防线resize 不是一步到位确认前随时能 revert。同系列 · OpenStack 实验手册其余篇目见博客主页blog.csdn.net/nbsxl上一篇《OpenStack 镜像管理共享镜像一直 pending 看不见Glance 全流程实操》相关篇《OpenStack 认证管理角色、用户、组、项目、配额五样东西到底谁绑谁》 你的实例被锁过吗改 policy.json 收紧 unlock 后普通用户报了什么错评论区贴出来对对看。