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