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 与主机聚合

先看环境里有哪些计算资源:

bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[root@controller ~(keystone_admin)]# openstack flavor create --vcpus 1 --ram 128 --disk 1 \
>   --private --project Project_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。

三、密钥对与服务器组

bash 复制代码
[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
<实例名> 实例名称 ---
bash 复制代码
[root@controller ~(keystone_admin)]# 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
[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 里

bash 复制代码
[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):

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 快照与重建:坏了这样救回来

bash 复制代码
[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 两步走

bash 复制代码
[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_01

resize 后实例处于「确认或放弃 调整大小/迁移」状态,确认用 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 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 后普通用户报了什么错,评论区贴出来对对看。

相关推荐
静以修身zzz2 小时前
OpenStack对象存储-Swift、OpenStack编排管理-heat、OpenStack网络管理-neutron
linux·运维·服务器·架构·openstack·swift
知已难寻20 小时前
01 · OpenStack的认证管理 Keystone
运维·服务器·云原生·云计算·openstack
青峰讲运维1 天前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack
青峰讲运维2 天前
OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
开发语言·openstack·swift
程序员大阳2 天前
副队长JavaScript教程(58)-基于DOM的网页留言板开发
javascript·实例·dom·案例·留言板
知已难寻2 天前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
Z21-X2 天前
云原生运维笔记:硬核拆解OpenStack计算与存储——从主机聚合到Cinder挂载全流程
运维·笔记·学习·云原生·openstack
青峰讲运维3 天前
OpenStack Nova 计算服务深度解析|原理 + 架构 + 完整实操
架构·openstack
Linux界最忧郁之人3 天前
OpenStack Victoria双节点实战|Packstack一键部署(CentOS‑Stream‑8)+华为云ECS实操
linux·运维·服务器·centos·华为云·openstack