V3 诊断 - 常见输出

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

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

注意: 这不能用于 V2,因为可能存在已部署的系统会解析 V2 诊断的当前输出。

问题描述

在 V2 中,VM 诊断是由每个 hypervisor 返回的“blob”数据。这里的目标是定义一个正式的输出规范,如果可能的话,由支持 API 的驱动程序返回。此外,驱动程序可以选择返回额外的数据。

提议的变更

引入一个新的驱动程序方法,该方法将返回预定义的结构:get_instance_diagnostics(self, context, instance)

这是一个新的驱动程序方法。原因是,使用新的方法比使用指示新旧版本的 if 语句更清晰。我们还应考虑弃用 get_diagnostics。这应在 virt 驱动程序 API 中记录。

提议让驱动程序在对象类中返回以下信息。将引入一个 Diagnostics Model() 类。virt 驱动程序将实例化并填充该类。该类将具有序列化为 JSON 的方法,以便 API 接口可以以 JSON 格式将数据返回给用户。如果驱动程序未填充某个字段,则该字段将返回在上述类中设置的默认值。

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

描述

state

VM 的当前状态。示例值包括:‘pending’(等待中)、‘running’(运行中)、‘paused’(暂停)、‘shutdown’(关机)、‘crashed’(崩溃)、‘suspended’(挂起)和 ‘building’(构建中)(字符串)

driver

一个字符串,表示 VM 正在运行的驱动程序。示例可能包括:‘libvirt’、‘xenapi’、‘hyperv’ 和 ‘vmwareapi’(字符串)[仅管理员 - 如果是非管理员,则该键将不会出现]

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 (布尔值)

driver_private_data

来自驱动程序的私有数据字典。这特定于驱动程序,每个驱动程序可以返回有价值的信息,用于诊断 VM 问题。原始数据应进行版本控制。

注意:上述许多细节都适用于所有驱动程序。在调用驱动程序之前,Nova 计算管理器将填充这些值。virt 驱动程序特定的值将由 virt 驱动程序尽可能地填充。如果 virt 驱动程序无法提供特定字段,则该字段将不会在诊断信息中报告。

例如

def get_instance_diagnostics(self, context, instance):
    """Retrieve diagnostics for an instance on this host."""
    current_power_state = self._get_power_state(context, instance)
    if current_power_state == power_state.RUNNING:
        LOG.audit(_("Retrieving diagnostics"), context=context,
                  instance=instance)
        diagnostics = {}
        diagnostics['state'] = instance.vm_state
        ...
        driver_diags = self.driver.get_instance_diagnostics(instance)
        diagnostics.update(driver_diags)
        return diagnostics

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

描述

time

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

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

描述

mac_address

接口的 MAC 地址 (字符串)

rx_octets

接收到的字节数 (整数)

rx_errors

接收到的错误数 (整数)

rx_drop

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

rx_packets

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

tx_octets

发送的字节数 (整数)

tx_errors

发送错误数 (整数)

tx_drop

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

tx_packets

发送的数据包数 (整数)

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

描述

id

磁盘 ID(字符串)

read_bytes

磁盘读取字节数(整数)

read_requests

读取请求数 (整数)

write_bytes

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

write_requests

写入请求数 (整数)

errors_count

磁盘错误数 (整数)

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

描述

maximum

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

used

VM 使用的内存量,以 MB 为单位(整数)

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

{'state': 'running',
 'driver': 'fake-driver',
 'hypervisor_os': 'fake-os',
 'uptime': 7,
 'num_cpus': 1,
 'num_vnics': 1,
 'num_disks': 1,
 'cpu_details': [{'time': 1024}]
 'nic_details': [{'rx_octets': 0,
                  'rx_errors': 0,
                  'rx_drop': 0,
                  'rx_packets': 0,
                  'tx_octets': 0,
                  'tx_errors': 0,
                  'tx_drop': 0,
                  'tx_packets': 0}],
 'disk_details': [{'read_bytes':0,
                   'read_requests': 0,
                   'write_bytes': 0,
                   'write_requests': 0,
                   'errors_count': 0}],
 'memory_details': {'maximum': 512, 'used': 256},
 'driver_private_data': {'version': 1,
                         'memory': {'actual': 220160,
                                    'rss': 200164}}

备选方案

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

我们可以向 V2 API 添加一个扩展,以启用我们返回此规范中定义的信息。

数据模型影响

REST API 影响

V3 诊断 API 将不再返回驱动程序定义的数据,但将返回此规范中定义的通用数据。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

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

我们应该考虑为 V2 添加此支持。为了支持向后兼容性,我们可以添加一个配置标志。也就是说,我们可以引入一个用于旧格式的标志。

开发人员影响

实现

负责人

主要负责人

Gary Kotton - garyk

其他贡献者

Bob Ball - bob-ball

工作项

所有工作项都在 Icehouse 中进行审查。它们被分解如下

  • VM 诊断(仅 V3 API)

  • XenAPI

  • libvirt

  • VMware

依赖项

测试

一旦代码获得批准,我们将向 Tempest 添加测试,这些测试将对 V3 API 执行以下操作(假设底层驱动程序未返回 NotImplemented (501),这可能是驱动程序不支持该方法的情况)

  • 检查返回的驱动程序是否是树中支持的驱动程序之一(目前只有 libvirt、vmware 和 xenapi 支持 v3 方法)。

  • 检查 CPU 数量是否与 flavor 匹配。

  • 检查磁盘数据是否与 flavor 匹配。

  • 检查内存是否与 flavor 匹配。

  • 如果已附加 cinder 卷,则检查是否附加了正确的磁盘数量。

  • 检查 vNic 的数量是否与正在运行的实例匹配。

  • 如果存在私有数据,则检查它是否是字典并且具有 ‘version’ 键。

此外,如果测试失败,我们可以使用 V3 诊断来帮助调试。也就是说,我们可以获取诊断信息,这可能有助于隔离问题。

文档影响

我们现在至少可以记录返回的字段及其含义。

如果决定更新 v2 支持,我们需要更新

请同时更新:https://docs.openstack.org/user-guide-admin/common/nova_show_usage_statistics_for_hosts_instances.html https://docs.openstack.org/user-guide/content/usage_statistics.html https://docs.openstack.org/user-guide/content/novaclient_commands.html https://docs.openstack.org/trunk/openstack-ops/content/lay_of_the_land.html#diagnose-compute

我们需要确保更新所有等效的 v3 文档。上述表格中的信息将是我们添加到文档中的内容。

参考资料

https://wiki.openstack.org/wiki/Nova_VM_Diagnostics https://bugs.launchpad.net/nova/+bug/1240043