支持在服务器上触发崩溃转储

https://blueprints.launchpad.net/nova/+spec/instance-crash-dump

此规格添加了一个新的 API,用于通过向服务器注入特定于驱动程序的信号来触发服务器(实例或裸机)上的崩溃转储。

问题描述

目前,我们无法从 nova 触发服务器上的崩溃转储。但用户出于某些调试目的需要此功能。

如果操作系统发生错误(内核崩溃),它将自行触发内核崩溃转储。但如果操作系统死锁,我们需要从硬件触发崩溃转储。不同的平台可能具有不同的触发服务器崩溃转储的方法。Nova 驱动程序需要实现这些方法。

对于 x86 平台,使用 NMI(不可屏蔽中断)可以触发操作系统中的崩溃转储。用户应配置操作系统,以便在接收到 NMI 时触发崩溃转储。在 Linux 中,可以通过以下方式完成:

$ echo 1 > /proc/sys/kernel/panic_on_io_nmi

许多 hypervisor 支持向实例注入 NMI。

  • Libvirt 支持命令“virsh inject-nmi” [1]。

  • Ipmitool 支持命令“ipmitool chassis power diag” [2]。

  • Hyper-V Cmdlets 支持命令“Debug-VM -InjectNonMaskableInterrupt” [3]。

因此,我们应该添加一个 API,以驱动程序级别向服务器注入 NMI。Libvirt 驱动程序已经实现了这样一个 API [6]。Ironic 驱动程序也将为裸机实现。然后添加一个 Nova API 来触发服务器上的崩溃转储。

这对于驱动程序应该是可选的。

用例

最终用户需要一个界面来触发其服务器上的崩溃转储。通过触发,内核崩溃转储机制会将生产内存映像转储为转储文件,并再次重新启动内核。之后,最终用户可以在其服务器的磁盘上获取转储文件,并基于该文件调查问题原因。

此规格仅实现触发崩溃转储的过程。转储文件将位于何处取决于用户如何配置服务器中的转储机制。以 Linux 为例

  • 如果用户配置 kdump 将转储文件存储在本地磁盘上,则用户需要重新启动服务器并访问本地磁盘上的转储文件。

  • 如果用户配置 kdump 将转储文件复制到 NFS 存储,则用户无需重新启动服务器即可在 NFS 存储上找到转储文件。

提议的变更

  • 添加一个 libvirt 驱动程序 API,以向实例注入 NMI。(已合并到 Liberty 中。[6])

  • 添加一个 ironic 驱动程序 API,以向裸机注入 NMI。

  • 添加一个 Nova API,使用上述驱动程序 API 在服务器上触发崩溃转储。如果 hypervisor 不支持注入 NMI,将引发 NotImplementedError。此方法不会修改实例的 task_state 或 vm_state。

  • 将引入一个新的实例操作。

备选方案

数据模型影响

REST API 影响

  • 方法的规范

    • 适合在用户文档中使用的对方法描述

      • 在服务器上触发崩溃转储。

    • 方法类型

      • POST

    • 正常的 HTTP 响应代码

      • 202: Accepted

    • 预期的错误 HTTP 响应代码

      • badRequest(400)

        • 当 RPC 不支持此 API 时,将返回此错误。如果驱动程序未实现该 API,则该错误由新的实例操作处理,因为该 API 是异步的。

      • itemNotFound(404)

        • 没有具有指定 uuid 的实例或裸机。

      • conflictingRequest(409)

        • 服务器状态必须为 ACTIVE、PAUSED、RESCUED、RESIZED 或 ERROR。如果不是,则返回此代码。

        • 如果指定的服务器已锁定,则此代码将返回给没有管理员权限的用户。在使用内核转储机制时,会导致服务器重新启动。因此,只有管理员才能向锁定的服务器发送 NMI,就像其他电源操作一样。

    • 资源的 URL

      • /v2.1/servers/{server_id}/action

    • 可以通过 url 传递的参数

      • 传递服务器 uuid。

    • JSON 模式定义用于正文数据

      {
          "trigger_crash_dump": null
      }
      
    • 响应数据的 JSON schema 定义

      • 当结果成功时,不返回响应正文。

      • 当发生错误时,响应数据包括错误消息 [5]。

    • 此 REST API 需要一个 API 微版本。

安全影响

通知影响

其他最终用户影响

  • 将向 python-novaclient 添加一个客户端 API,用于此新 API

  • 将向 python-novaclient 添加一个 CLI,用于新 API。

    nova trigger-crash <server>
    

性能影响

其他部署者影响

此 API 的默认策略是默认情况下由管理员和所有者。

开发人员影响

此规格将在 libvirt 驱动程序、ironic 驱动程序和 nova 本身中实现新的 API。

实现

负责人

主要负责人

唐辰 (tangchen)

其他贡献者

shiina-horonori (hshiina)

工作项

  • 添加一个新的 REST API。

  • 添加一个新的驱动程序 API。

  • 在 libvirt 驱动程序中实现该 API。

  • 在 ironic 驱动程序中实现该 API。

依赖项

此规格与 ironic 中的蓝图相关。

测试

将添加单元测试。

文档影响

参考资料

[1] http://linux.die.net/man/1/virsh

[2] http://linux.die.net/man/1/ipmitool

[3] https://technet.microsoft.com/en-us/library/dn464280.aspx

[4] https://review.openstack.org/#/c/183456/

[5] https://docs.openstack.org/developer/nova/v2/faults.html

[6] https://review.openstack.org/#/c/202380/

历史

修订版

发布名称

描述

Liberty

引入

Mitaka

更改 API 操作名称,并添加 ironic 驱动程序计划