Nova 服务以及外部组件(Glance, Neutron, Cinder, Keystone)。 、基本流程 sequenceDi ...

发布时间:2026/7/26 17:10:39

Nova 服务以及外部组件(Glance, Neutron, Cinder, Keystone)。 、基本流程 sequenceDi ... Nova 服务与外部组件交互实战解析Glance、Neutron、Cinder、Keystone 协同工作流程在 OpenStack 云平台中Nova 作为核心计算服务负责虚拟机的生命周期管理。但 Nova 并非孤岛它需要与 Glance镜像服务、Neutron网络服务、Cinder块存储服务和 Keystone认证服务紧密协作才能完成一个完整的虚拟机启动流程。本文将从实战角度出发通过代码示例和序列图深入解析这些组件之间的交互机制。## 1. 整体架构与组件角色### 1.1 组件职责速览-Keystone统一认证和授权管理用户、项目和角色。-Glance镜像仓库存储和管理虚拟机磁盘镜像。-Neutron网络即服务提供虚拟网络、子网和端口。-Cinder块存储服务提供持久化的卷Volume。-Nova计算调度核心协调上述组件完成虚拟机创建、迁移等操作。### 1.2 交互流程图简化版mermaidsequenceDiagram participant Client as 用户/客户端 participant Keystone participant Nova participant Glance participant Neutron participant Cinder Client-Keystone: 1. 认证获取Token Keystone--Client: 返回Token Client-Nova: 2. 创建虚拟机请求含Token Nova-Keystone: 3. 验证Token有效性 Keystone--Nova: 验证通过 Nova-Glance: 4. 获取镜像元数据 Glance--Nova: 返回镜像信息如格式、大小 Nova-Neutron: 5. 创建网络端口 Neutron--Nova: 返回端口ID和MAC地址 Nova-Cinder: 6. 创建并挂载卷可选 Cinder--Nova: 返回卷连接信息 Nova-Nova: 7. 调度计算节点调用Hypervisor启动VM Nova--Client: 返回虚拟机信息## 2. 实战代码示例模拟组件交互### 2.1 模拟 Keystone 认证与 Token 获取pythonimport requestsimport json# 模拟 Keystone 认证请求def authenticate_with_keystone(auth_url, username, password, project_name): 向 Keystone 发送认证请求获取服务 Token :param auth_url: Keystone 认证端点例如 http://10.0.0.1:5000/v3 :param username: 用户名例如 admin :param password: 密码 :param project_name: 项目名例如 demo :return: 认证成功后返回的 Token 字符串 auth_payload { auth: { identity: { methods: [password], password: { user: { name: username, domain: {id: default}, password: password } } }, scope: { project: { name: project_name, domain: {id: default} } } } } headers {Content-Type: application/json} try: response requests.post(f{auth_url}/auth/tokens, datajson.dumps(auth_payload), headersheaders) if response.status_code 201: # 从响应头中获取 Token token response.headers[X-Subject-Token] print(f[成功] 获取 Token: {token[:20]}...) return token else: print(f[失败] 认证错误: {response.status_code} - {response.text}) return None except requests.exceptions.RequestException as e: print(f[异常] 网络请求失败: {e}) return None# 使用示例if __name__ __main__: # 注意实际部署中请替换为真实端点 auth_url http://controller:5000/v3 token authenticate_with_keystone(auth_url, admin, secret, demo)### 2.2 模拟 Nova 与 Glance 的镜像交互pythonimport requestsimport jsondef get_image_info(glance_url, token, image_id): 通过 Glance API 获取指定镜像的元数据如格式、大小 :param glance_url: Glance 服务端点例如 http://10.0.0.1:9292 :param token: 之前从 Keystone 获取的有效 Token :param image_id: 镜像 UUID :return: 镜像元数字典包含 disk_format、container_format、size 等 headers { X-Auth-Token: token, Content-Type: application/json } try: # Glance v2 API 获取镜像详情 response requests.get(f{glance_url}/v2/images/{image_id}, headersheaders) if response.status_code 200: image_meta response.json() print(f[成功] 获取镜像信息:) print(f 名称: {image_meta.get(name, N/A)}) print(f 格式: {image_meta.get(disk_format, N/A)}) print(f 大小: {image_meta.get(size, 0)} 字节) return image_meta else: print(f[失败] 获取镜像错误: {response.status_code}) return None except requests.exceptions.RequestException as e: print(f[异常] 请求失败: {e}) return None# 模拟 Nova 核心逻辑启动虚拟机前检查镜像def nova_boot_vm(token, image_id, flavor_id, network_id): 模拟 Nova 创建虚拟机的核心步骤仅演示与 Glance 交互部分 :param token: 有效 Token :param image_id: 镜像 ID :param flavor_id: 规格 ID定义 CPU、内存等 :param network_id: 网络 ID print(\n Nova 启动虚拟机关联流程 ) # 步骤 1: 获取镜像元数据实际中还会校验镜像状态 glance_endpoint http://glance:9292 # 假设服务内部地址 image_info get_image_info(glance_endpoint, token, image_id) if not image_info: print(错误无法获取镜像信息停止创建虚拟机) return False # 步骤 2: 检查镜像是否可用例如 disk_format 是否为 raw/qcow2 valid_formats [raw, qcow2, iso] if image_info.get(disk_format) not in valid_formats: print(f错误不支持的镜像格式 {image_info.get(disk_format)}) return False # 步骤 3: 检查镜像大小是否超过 Flavor 的磁盘限制简化处理 flavor_disk_gb 20 # 假设规格磁盘大小为 20GB image_size_gb image_info[size] / (1024**3) # 字节转 GB if image_size_gb flavor_disk_gb: print(f错误镜像大小 {image_size_gb:.2f}GB 超过规格磁盘 {flavor_disk_gb}GB) return False print(f[成功] 镜像检查通过准备创建虚拟机 (image{image_id}, flavor{flavor_id})) # 后续步骤调用 Neutron 创建端口、调用 Cinder 创建卷、调度计算节点等 return True# 使用示例if __name__ __main__: # 假设已经通过 authenticate_with_keystone 获取了 token token gAAAAABmR0... # 实际应使用真实 Token image_uuid c9c3e8b0-1a2b-3c4d-5e6f-7a8b9c0d1e2f nova_boot_vm(token, image_uuid, m1.small, net-1234)## 3. 组件交互的关键细节### 3.1 Nova 如何调用 Neutron 创建网络端口当 Nova 准备启动虚拟机时它会向 Neutron 发送请求创建一个虚拟端口。这个端口会绑定到指定的网络并分配 IP 地址和 MAC 地址。关键步骤包括1. Nova 解析用户指定的网络 ID。2. 调用 Neutron API 创建端口port指定 network_id 和可选的安全组。3. Neutron 返回端口信息如 MAC 地址、IP 地址。4. Nova 将这些信息传递给 Hypervisor如 KVM用于虚拟机配置。### 3.2 Cinder 的卷挂载流程如果用户指定了额外的块存储卷Cinder 会参与以下流程1. Nova 通过 API 通知 Cinder 创建指定大小的卷。2. Cinder 在存储后端如 LVM、Ceph上分配空间并返回卷 ID。3. Nova 将卷挂载到计算节点通过 iSCSI 或 NFS 等协议。4. 虚拟机启动后卷显示为额外的磁盘设备如 /dev/vdb。### 3.3 错误处理与重试机制在实际生产环境中组件间的网络调用可能失败。Nova 内置了重试机制和状态机- 如果 Glance 响应超时Nova 会重试 3 次并记录错误日志。- 如果 Neutron 端口创建失败Nova 会清理已分配的资源如删除未使用的端口。- 所有关键操作都会写入 Nova 的数据库instances表确保重启后状态可恢复。## 4. 总结Nova 与 Glance、Neutron、Cinder、Keystone 的协作是 OpenStack 云平台稳定运行的核心。通过本文的实战代码和序列图我们可以看到1.Keystone 是所有交互的起点任何 API 调用都必须携带有效的 Token。2.Glance 提供虚拟机镜像的元数据Nova 在启动前必须检查镜像的格式和大小避免不兼容。3.Neutron 负责网络连接端口创建是虚拟机获得网络访问能力的关键。4.Cinder 增强存储灵活性允许虚拟机动态挂载持久化卷实现数据分离。5.错误处理至关重要组件间的异步调用需要健壮的重试和回滚机制。掌握这些交互细节不仅能帮助你在开发中调试问题还能让你在运维 OpenStack 时快速定位故障点。建议读者在实际环境中结合 OpenStack 命令行工具如openstack server create和日志文件/var/log/nova/nova-compute.log加深理解。

相关新闻