恢复标准化的 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 诊断信息响应的新输出。