)
爆肝整理OpenStack 管理实战从认证到计算一文吃透三大核心模块附全套可直接复制的命令摘要OpenStack 作为开源云操作系统核心价值不仅在架构更在日常运维管理。本文基于真实实验环境controller compute 双节点系统梳理 OpenStack三大核心管理模块认证Keystone、镜像Glance、计算Nova。每个模块都从核心概念讲起配套可直接复制的实操命令与配置用户/项目/角色管理、配额控制、镜像上传与状态机、虚拟机调度过滤与权重、十大 Filter 详解、nova-compute 原理、RabbitMQ 监控并完整拆解创建虚拟机的 29 步流程。全文附排错方法与命令速查助你从会用走向会管、会排障。一、认证管理 Keystone —— 云世界的门禁系统在 OpenStack 里所有服务都不认识你它们只认 Keystone 发的一张通行证Token。Keystone 负责两件事认证Authentication——你是谁鉴权Authorization——你能干什么1.1 九个核心概念一张表看懂概念中文一句话理解类比Domain域一组 User/Group/Project 的容器必须全局唯一小区User用户可通过 Keystone 访问服务的个人、系统或服务住户Group用户组一组 User 的容器给组分配角色即可批量授权家庭Project项目各服务中可访问资源的集合只需域内唯一储物间Role角色一组权限集合角色不同权限不同必须全局唯一门禁卡等级Service服务一种 OpenStack 服务暴露一个或多个端点设施水电燃气Endpoint端点访问某个具体服务的网络地址URL门牌号Token令牌认证通过后签发的凭证默认有效期 24 小时临时通行证Credential凭证证明用户身份的数据用户名/密码、Token、API Key身份证关键点资源的所有权属于Project而不是 UserUser包括 admin必须挂在 Project 里才能访问其资源一个 User 可属于多个 Project。1.2 实战域、用户、组、项目、角色管理# 1. 加载管理员环境变量[rootcontroller ~]# source keystonerc_admin# 2. 查看/创建/删除域Domain[rootcontroller ~(keystone_admin)]# openstack domain list[rootcontroller ~(keystone_admin)]# openstack domain create domain-test[rootcontroller ~(keystone_admin)]# openstack domain set --disable domain-test # 先禁用[rootcontroller ~(keystone_admin)]# openstack domain delete domain-test # 再删除# 3. 开启多域登录界面[rootcontroller ~(keystone_admin)]# vim /etc/openstack-dashboard/local_settings#修改配置文件83行如下开启keystone支持多域83OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORTTrue[rootcontroller ~(keystone_admin)]# systemctl restart httpd# 4. 创建用户 user1[rootcontroller ~(keystone_admin)]# openstack user create --password HUAWEI user1[rootcontroller ~(keystone_admin)]# openstack user show user1 # 查看详情# 5. 创建组 group1并把 user1 加入[rootcontroller ~(keystone_admin)]# openstack group create group1[rootcontroller ~(keystone_admin)]# openstack group add user group1 user1[rootcontroller ~(keystone_admin)]# openstack group contains user group1 user1 # 验证成员# 6. 创建项目 ProjectA并给 user1 授权[rootcontroller ~(keystone_admin)]# openstack project create ProjectA[rootcontroller ~(keystone_admin)]# openstack user set --project ProjectA user1 # 修改用户的默认项目为ProjectA[rootcontroller ~(keystone_admin)]# openstack role add --user user1 --project ProjectA admin# 7. 给组直接赋角色组内用户全部生效[rootcontroller ~(keystone_admin)]# openstack role add --project admin --group group1 admin[rootcontroller ~(keystone_admin)]# openstack role assignment list --names --group group1 # 列出group1角色分配记录1.3 配额管理配额决定了某个 Project 里最多能创建多少资源防止一个租户把云资源吃光# 将 ProjectA 配额设置为实例 3 台、vCPU 5 核、内存 5000MB[rootcontroller ~(keystone_admin)]# openstack quota set --instance 3 --cores 5 --ram 5000 ProjectA[rootcontroller ~(keystone_admin)]# openstack quota show ProjectA1.4 查看服务与端口节点# 查看服务[rootcontroller ~(keystone_admin)]# openstack service list# 查询服务节点入口[rootcontroller ~(keystone_admin)]# openstack endpoint list[rootcontroller ~(keystone_admin)]# openstack catalog list # 建议使用这个查询1.5 认证 vs 鉴权安全的两半概念英文解决什么问题类比认证Authentication你是谁验证 Credential签发 Token出示身份证鉴权Authorization你能干什么借助 Role 判定权限门禁卡能刷几层1.6 policy.json —— 权限的红头文件每个服务用policy.json决定某个 Role 能做什么路径为/etc/服务名/policy.jsonpackstack 安装后位于/etc/openstack-dashboard/服务名_policy.json# 以 Nova 的锁实例权限为例[rootcontroller ~(keystone_admin)]# vim /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_or_owner,os_compute_api:os-lock-server:unlock:unlock_override:rule:admin_api,⚠️ 默认配置只区分 admin 和非 admin。要精细授权可改 policy.json但一般不建议动。1.7 一次完整访问流程以查询镜像为例用户 admin 登录 → Keystone 验证身份 → 签发 TokenToken 内携带 Role 信息前端拿到 Keystone 维护的各服务 Endpoint才能显示实例、镜像、卷等菜单点击镜像 → 请求发往Glance 的 EndpointGlance 拿着 Token 向 Keystone 询问admin 是否有效Glance 查看/etc/glance/policy.json判断 admin 有无查看权限权限通过 → Glance 返回镜像列表。1.8 排错看日志 开 debug# Keystone 日志位置[rootcontroller ~(keystone_admin)]# cd /var/log/keystone/ lskeystone.log# 需要最详细日志时打开 debug[rootcontroller ~(keystone_admin)]# vim /etc/keystone/keystone.conf94debugTrue二、镜像管理 Glance —— 虚拟机的出厂模板2.1 Glance 架构Glance 是 OpenStack 的镜像服务Image Service核心职责是管理虚拟机镜像的 “登记” 与 “存放”。当前版本的架构精髓**“元数据与数据分离”**镜像的描述信息元数据存数据库镜像的二进制文件存存储后端两者解耦可灵活选择存储后端而不影响上层接口。当前架构只有3 个角色组件角色通俗理解glance-api入口服务对外提供 REST API 的 “门卫”接收所有镜像请求Glance DB元数据存储存镜像 “身份证”名称、大小、格式、状态Store Backend镜像文件存储真正存镜像文件的 “仓库”file/rbd/swift…2.2 公有云镜像概念以华为云为例镜像类型说明可见性公共镜像云平台提供的标准 OS 镜像正版授权、高度稳定所有用户可见私有镜像基于云服务器或外部文件自制的个人镜像仅自己可见共享镜像其他用户共享给你的私有镜像指定用户可见市场镜像第三方预装应用的镜像一键部署所有用户可见镜像最主要的作用节约时间不必每次从零装系统。2.3 镜像、实例、规格别再傻傻分不清概念是什么关键点镜像 Image装了 OS 的模板文件可从一个镜像启动任意多个实例实例 Instance正在运行的虚拟机基于镜像的副本对实例的修改不影响镜像规格 Flavor资源规格vCPU/内存/磁盘启动实例必须指定规格2.4 磁盘格式速查格式说明qcow2QEMU 格式支持动态扩展 写时复制最常用raw非结构化磁盘镜像vmdkVMware 常见格式vhd/vhdxXen、微软、VirtualBox 常用vdiVirtualBox 与 QEMU 支持iso光盘存档格式aki/ari/amiAmazon 内核/内存盘/机器镜像2.5 镜像状态机镜像状态含义queued已注册元数据但数据未上传saving原始数据正在上传active创建完成可用deactivated非管理员禁止访问killed上传出错不可用deleted保留信息不久后自动清理pending_delete类似 deleted尚未清除数据、不可恢复任务状态含义pending/processing挂起 / 处理中success/failure成功 / 失败2.6 上传镜像实战# 1. 查看镜像文件磁盘格式[rootcontroller ~]# qemu-img info cirros-0.5.2-x86_64-disk.img # qcow2[rootcontroller ~]# qemu-img info TinyCore-12.0.iso # raw# 2. 命令行上传大文件强烈推荐带进度条Web 界面可能失败[rootcontroller ~(keystone_admin)]# glance image-create --name image_centos \--fileCentOS-7-x86_64-Minimal-1810.iso --disk-format raw--containerbare--progress# 3. 镜像上传到哪里去了[rootcontroller ~]# find / -name e846b42b-5024-479b-9f79-1ae181bfa14e/var/lib/glance/images/e846b42b-5024-479b-9f79-1ae181bfa14e# 4. 数据库里确认镜像位置[rootcontroller ~]# mysqlMariaDB[(none)]use glance;MariaDB[glance]selectid,value from image_locations;命令上传镜像命令解析命令片段参数含义解析glance image-create调用 glance CLI 创建镜像旧版客户端命令新版是openstack image create--name image_centos镜像名称上传后镜像显示名可自定义--file CentOS-7-x86_64-Minimal-1810.iso本地镜像文件指定要上传的本地文件路径若文件不在当前目录需写绝对路径--disk-format raw磁盘格式声明镜像磁盘格式为 raw--container bare容器格式无容器封装裸格式ISO 通常配 bare正确--progress显示上传进度上传时打印进度条便于观察大文件传输2.7 镜像制作最简单下载系统供应商官方 OpenStack 镜像预装 cloud-init支持密钥对登录、用户数据注入手动制作以 Ubuntu 为例用 virt-manager 装系统 →apt install cloud-init→ 关机 →virt-sysprep预清理 →virsh undefine释放定义 → 制作并上传镜像。2.8 Glance 使用 Swift 作为后端存储# 1. 查看 Swift 密码安装时随机生成[rootcontroller ~]# vim answers.txt1137CONFIG_SWIFT_HASHf8715a7c2bf640b9#这个密码配置到下面的配置文件# 2. 修改 Glance 配置默认存储改为 swift[rootcontroller ~]# vim /etc/glance/glance-api.conf3111default_storeswift# 默认存储后端Swift 对象存储3982swift_store_regionRegionOne# 区域名须与 Keystone 的 Swift endpoint 一致4090swift_store_containergqdglance# 镜像容器名默认容器4118swift_store_large_object_size5120# 大对象阈值 5120MB≈5GB超过则分段上传4160swift_store_create_container_on_puttrue# 上传时自动创建容器4182swift_store_multi_tenanttrue# 多租户模式按项目隔离容器与权限4230swift_store_admin_tenantsservices# 管理租户项目services有全局权限4391swift_store_auth_addresshttp://192.168.108.10:5000/v3# Swift 认证地址Keystone v34399swift_store_userswift# Swift 服务账号4408swift_store_keyf8715a7c2bf640b9# 填写之前查到的swift密码# 3. 重启 Glance 生效[rootcontroller ~(keystone_admin)]# systemctl restart openstack-glance*配置后新上传镜像会以swifthttp://.../AUTH_xxx/gqdglance_xxx/...的形式存到 Swift 中。三、计算管理 Nova —— 虚拟机生命周期管家3.1 Nova 管什么、不管什么Nova 负责 ✅Nova 不负责 ❌虚拟机生命周期管理承载虚拟机的物理主机自身的管理其他计算资源生命周期管理全面的系统状态监控3.2 系统架构组件职责速查组件职责DBSQL 数据库存实例/资源数据API接收 HTTP 请求校验参数、配额预留Scheduler为虚拟机挑选合适的物理主机Compute虚拟机生命周期与复杂流程控制Conductor数据库代理解耦 Compute 的数据库访问Placement跟踪资源提供者的库存和使用情况RPC远程过程调用组件间通过消息队列通信3.3 核心组件逐个拆解组件功能亮点nova-api对外 REST 接口、参数校验、配额预留生命周期管理入口nova-conductor数据库操作、复杂流程控制创建/冷热迁移/重建①安全Compute 不再直连 DB②方便升级③性能RPC 绿色线程友好nova-scheduler过滤 权重选节点两步调度nova-compute真正执行创建对接不同虚拟化平台支持 KVM/VMware/XEN/Ironic 等3.4 调度器过滤 权重# 查看默认过滤器配置[rootcontroller ~]# vim /etc/nova/nova.conf1931available_filtersnova.scheduler.filters.all_filters1938enabled_filtersAvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter调度两步走① 多个 Filter 层层过滤掉不合格节点 → ② 对通过的节点按权重打分得分最高者胜出默认按空闲内存越多权重越大。3.5 十大 Filter 详解Filter作用类比RetryFilter刷掉上次调度失败过的节点打人别打同一张脸AvailabilityZoneFilter只保留指定可用域的节点指定楼层RamFilter过滤内存不足的节点可 overcommit内存够不够DiskFilter过滤磁盘不足的节点硬盘够不够CoreFilter过滤 vCPU 不足的节点需手动启用CPU 够不够ComputeFilter只留 nova-compute 正常的节点必选服务活着吗ComputeCapabilitiesFilter按节点特性筛选如 x86_64/ARM挑架构ImagePropertiesFilter按镜像属性筛选如必须跑在 KVM挑超管ServerGroupAntiAffinityFilter尽量把实例分散到不同节点反亲和鸡蛋不放一篮ServerGroupAffinityFilter尽量把实例聚拢到同一节点亲和就近扎堆overcommit 超配RAM 超配比默认 1.510GB 内存当 15GB 用vCPU 超配比默认 168 vCPU 当 128 用。生产环境可调但要谨慎。# 反亲和示例调度 hintnova server-group-create--policyanti-affinity group-1 nova boot--imageIMAGE_ID--flavor1--hintgroupgroup-1 inst1 nova boot--imageIMAGE_ID--flavor1--hintgroupgroup-1 inst2# 亲和示例调度 hintnova server-group-create--policyaffinity group-2 nova boot--imageIMAGE_ID--flavor1--hintgroupgroup-2 inst1 nova boot--imageIMAGE_ID--flavor1--hintgroupgroup-2 inst2# 通过日志查看创建实例过滤过程[rootcontroller ~]# vim /etc/nova/nova.conf694debugTrue[rootcontroller ~]# systemctl restart openstack-nova*[rootcontroller ~]# tail /var/log/nova/nova-scheduler.log -f3.6 nova-compute虚拟机生命周期操作的真正执行者会调用对应的hypervisor的driver。底层对接不同虚拟化的平台KVM/VMware/XEN/Ironic等。内置周期性任务完成资源刷新虚拟机状态同步等功能。资源管理模块resource_tracker配合插件机制完成资源的统计。# 配置compute节点配置文件定义driver[rootcompute ~]# vim /etc/nova/nova.conf53compute_driverlibvirt.LibvirtDriver[rootcompute ~]# cd /usr/lib/python3.6/site-packages/nova/virt/[rootcompute virt]# lsarch.py driver.py hyperv __init__.py netutils.py storage_users.py block_device.py event.py image interfaces.template osinfo.py virtapi.py configdrive.py fake.py imagecache.py ironic powervm vmwareapi disk hardware.py images.py libvirt __pycache__ zvm3.7 RabbitMQ 监控性能排查# 启用 RabbitMQ 图形化管理插件[rootcontroller ~]# rabbitmq-plugins enable rabbitmq_management# 创建管理用户并授权[rootcontroller ~]# iptables -F[rootcontroller ~]# rabbitmqctl add_user user_admin passwd_admin #创建用户名密码[rootcontroller ~]# rabbitmqctl set_user_tags user_admin administrator rabbitmqctl set_permissions -p / user_admin .* .* .* #授权# 浏览器访问管理台http://192.168.108.10:15672⚠️ 重点看Unacked未处理消息正常应为 0持续增长说明队列积压、消息堆积是严重信号。3.8 创建虚拟机的完整 29 步Step1用户通过 Dashboard/CLI 申请创建虚拟机并以 REST API 方式来请求 Keystone 授权。Step2keystone 通过用户请求认证信息并生成 auth-token 返回给对应的认证请求。Step3界面或命令行通过 RESTful API 向 nova-api 发送一个 boot instance 的请求携带 auth-token。Step4nova-api 接受请求后向 keystone 发送认证请求查看 token 是否为有效用户和 token。Step5keystone 验证 token 是否有效如有效则返回有效的认证和对应的角色注有些操作需要有角色权限才能操作。Step6通过认证后 nova-api 和数据库通讯。Step7初始化新建虚拟机的数据库记录。Step8nova-api 通过 rpc.call 向 nova-scheduler 请求是否有创建虚拟机的资源Host ID。Step9nova-scheduler 进程侦听消息队列获取 nova-api 的请求。Step10nova-scheduler 通过查询 nova 数据库中计算资源的情况并通过调度算法计算符合虚拟机创建需要的主机。Step11对于有符合虚拟机创建的主机nova-scheduler 更新数据库中虚拟机对应的物理主机信息。Step12nova-scheduler 通过 rpc.cast 向 nova-compute 发送对应的创建虚拟机请求的消息。Step13nova-compute 会从对应的消息队列中获取创建虚拟机请求的消息。Step14nova-compute 通过 rpc.call 向 nova-conductor 请求获取虚拟机消息。Step15nova-conductor 从消息队队列中拿到 nova-compute 请求消息。Step16nova-conductor 根据消息查询虚拟机对应的信息。Step17nova-conductor 从数据库中获得虚拟机对应信息。Step18nova-conductor 把虚拟机信息通过消息的方式发送到消息队列中。Step19nova-compute 从对应的消息队列中获取虚拟机信息消息。Step20nova-compute 通过 keystone 的 RESTful API 拿到认证的 token并通过 HTTP 请求 glance-api 获取创建虚拟机所需要镜像。Step21glance-api 向 keystone 认证 token 是否有效并返回验证结果。Step22token 验证通过nova-compute 获得虚拟机镜像信息URL。Step23nova-compute 通过 keystone 的 RESTful API 拿到认证的 token并通过 HTTP 请求 neutronserver 获取创建虚拟机所需要的网络信息。Step24neutron-server 向 keystone 认证 token 是否有效并返回验证结果。Step25token 验证通过nova-compute 获得虚拟机网络信息。Step26nova-compute 通过 keystone 的 RESTful API 拿到认证的 token并通过 HTTP 请求 cinder-api 获取创建虚拟机所需要的持久化存储信息。Step27cinder-api 向 keystone 认证 token 是否有效并返回验证结果。Step28token 验证通过nova-compute 获得虚拟机持久化存储信息。Step29nova-compute 根据 instance 的信息调用配置的虚拟化驱动来创建虚拟机。简单归类总结阶段步骤关键机制通俗理解① 认证与请求1~5Keystone 发 Token nova-api 回验先办 “通行证” 再进门② 数据库初始化6~7nova-api 直连 DB给虚拟机先 “登记入册”③ 调度选主8~11rpc.call同步等结果找个 “最合适的物理机” 来承载④ 分发到节点12~13rpc.cast异步投递把任务 “派单” 给目标计算节点⑤ Conductor 代理查库14~19compute→conductor→DB计算节点不直接碰库让中介代查⑥ 获取三件资源20~28逐个经 Keystone 鉴权后取镜像 / 网络 / 存储三件套备齐⑦ 调用驱动创建29虚拟化驱动libvirt/KVM真正把虚拟机 “生” 出来 结语本文基于真实双节点实验环境把 OpenStack认证Keystone、镜像Glance、计算Nova三大核心模块的原理与命令串成了完整闭环从门禁认证鉴权到模板镜像管理再到管家虚拟机生命周期。尤其是调度器十大 Filter与创建虚拟机 29 步两节几乎覆盖了运维排查的高频考点。如果本文对你有帮助欢迎点赞、收藏、关注后续将继续更新块存储Cinder、对象存储Swift、编排Heat、网络Neutron等模块的实战攻略。有疑问欢迎评论区交流