恢复标准化的 VM 诊断

https://blueprints.launchpad.net/nova/+spec/restore-vm-diagnostics

目前没有为 VM 诊断定义的格式。此 BP 将确保提供 VM 诊断的所有驱动程序都具有一致的格式。

注意:VM 诊断规范已在 Juno 中实现,但仅适用于 API v3 [1]。之后 V3 API 已被移除。此规范将恢复 VM 诊断 BP 的 API 部分。BP 的其他部分(例如计算 API 部分、virt 驱动程序部分)未随 v3 API 一起移除。

问题描述

现在,VM 诊断是由每个 hypervisor 返回的“blob”数据。这里的目标是,如果可能的话,对驱动程序支持的 API 应返回的输出进行正式定义。

用例

所有 virt 驱动程序都将具有相同的诊断信息格式。这将有助于使用这些信息,并有助于消除需要了解您获取诊断信息的 virt 驱动程序的需求。

提议的变更

添加一个 API 微版本,以标准化获取 VM 诊断信息请求的响应 [2]。此微版本默认情况下为仅管理员。访问由策略驱动。该微版本将使用返回预定义结构的 virt 驱动程序方法。它已经实现

get_instance_diagnostics(self, instance)

此方法将信息作为对象类返回。将实例化一个诊断模型类,并由 virt 驱动程序填充。驱动程序未填充的字段将返回在上述类中设置的默认值。在从该方法获取对象类后,我们将通过从该对象获取字段在 API 层构建响应。

下表包含键以及返回值的描述

描述

state

一个字符串枚举,表示 VM 的当前状态。可能的值是:‘pending’、‘running’、‘paused’、‘shutdown’、‘crashed’、‘suspended’ (字符串)

driver

一个字符串枚举,表示 VM 正在运行的驱动程序。可能的值是:‘libvirt’、‘xenapi’、‘vmwareapi’、‘hyperv’、‘ironic’ (字符串)

hypervisor

一个字符串,表示 VM 正在运行的 hypervisor。对于 libvirt 驱动程序,示例可能是:‘qemu’、‘kvm’ 或 ‘xen’。(字符串)

hypervisor_os

一个字符串,表示 hypervisor 操作系统 (字符串)

uptime

VM 运行的时间量,以秒为单位 (整数)

num_cpus

vCPU 的数量 (整数)

num_nics

vNIC 的数量 (整数)

num_disks

磁盘的数量 (整数)

cpu_details

每个 vCPU 的详细信息数组(字典)(见下文)

nic_details

每个 vNIC 的详细信息数组(字典)(见下文)

disk_details

每个磁盘的详细信息数组(字典)(见下文)

memory_details

内存详细信息字典 (见下文)

config_drive

指示实例是否支持 config drive (布尔值)

注意:如果 virt 驱动程序无法提供特定字段,则该字段将在诊断信息中报告为 ‘None’。

cpu 详细信息是每个虚拟 CPU 的字典数组。

描述

id

CPU ID (整数)

time

CPU 时间,以纳秒为单位 (整数)

utilisation

CPU 利用率,以百分比为单位 (整数)

网络详细信息是每个虚拟 NIC 的字典数组。

描述

mac_address

接口的 MAC 地址 (字符串)

rx_octets

接收到的字节数 (整数)

rx_errors

接收到的错误数 (整数)

rx_drop

丢弃的接收数据包数 (整数)

rx_packets

接收到的数据包数 (整数)

rx_rate

接收速率,以字节为单位 (整数)

tx_octets

发送的字节数 (整数)

tx_errors

发送错误数 (整数)

tx_drop

丢弃的发送数据包数 (整数)

tx_packets

发送的数据包数 (整数)

tx_rate

发送速率,以字节为单位 (整数)

磁盘详细信息是每个虚拟磁盘的字典数组。

描述

read_bytes

磁盘读取的字节数 (整数)

read_requests

读取请求数 (整数)

write_bytes

磁盘写入的字节数 (整数)

write_requests

写入请求数 (整数)

errors_count

磁盘错误数 (整数)

内存详细信息是一个字典。

描述

maximum

为 VM 预置的内存量,以 MB 为单位 (整数)

used

客户操作系统及其应用程序当前使用的内存量,以 MB 为单位 (整数)

以下是 libvirt 驱动程序返回的字典数据的示例

{'state': 'running',
 'driver': 'libvirt',
 'hypervisor_os': 'ubuntu',
 'hypervisor': 'kvm',
 'uptime': 7,
 'num_cpus': 1,
 'num_vnics': 1,
 'num_disks': 1,
 'cpu_details': [{'id': 0,
                  'time': 1024,
                  'utilisation': None}],
 'nic_details': [{'mac_address': '00:00:00:00:00:00',
                  'rx_octets': 0,
                  'rx_errors': 0,
                  'rx_drop': 0,
                  'rx_packets': 0,
                  'rx_rate': None,
                  'tx_octets': 0,
                  'tx_errors': 0,
                  'tx_drop': 0,
                  'tx_packets': 0,
                  'tx_rate': None}],
 'disk_details': [{'read_bytes':0,
                   'read_requests': 0,
                   'write_bytes': 0,
                   'write_requests': 0,
                   'errors_count': 0}],
 'memory_details': {'maximum': 512, 'used': 256}}

备选方案

继续使用当前 API 具有的相同格式。这存在问题,因为我们无法构建可以查询 VM 状态的通用用户界面,例如在 tempest 中。

数据模型影响

REST API 影响

将添加一个新的微版本,该版本将使用已合并的 VM 诊断 BP 的部分。此微版本将更改获取 VM 诊断信息请求的响应 [2]。此微版本默认情况下为仅管理员。访问由策略驱动。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

这将使生活更轻松 - 部署者将能够更好地了解 VM 的状态并能够进行故障排除。

开发人员影响

实现

负责人

主要负责人

Sergey Nikitin - snikitin

工作项

大多数 virt 驱动程序支持 get_instance_diagnostics() 方法

  • libvirt 支持 (完成)

  • XenAPI 支持 (部分完成)

  • VMware 支持 (部分完成)

  • Hyper-V 支持 (正在进行中) [3]

  • Ironic 支持 (未开始)

在这种情况下,工作项目将是

  • 完成 XenAPI 支持

  • 完成 VMware 支持

  • 添加 VM 诊断 API 微版本

  • 恢复和修改现有的 tempest 测试

  • 添加对 python-novaclient 的支持

依赖项

测试

Tempest 已经有 VM 诊断的测试,但它们被跳过,因为此规范的 API 部分已从 Nova 中使用 V3 API 移除 [4]。这些测试应该被恢复和修改。

文档影响

需要为新的 API 微版本编写文档。这些文档将描述获取 VM 诊断信息响应的新输出。

参考资料