获取有效的服务器状态

https://blueprints.launchpad.net/nova/+spec/get-valid-server-state

当计算服务失败时,托管 VM 的电源状态不会更新。正常用户查询其 VM 时,不会收到有关故障的任何指示。同样,也没有维护的指示。

问题描述

VM 查询无法向用户提供有关已失败/无法访问的计算主机、已失败/停止的 nova-compute 服务或显式标记为失败或禁用的 nova-compute 服务所需的信息。用户在查询其 VM 时应获取 nova-compute 状态信息,以便更好地了解情况。

用例

作为用户,我希望即使在计算服务失败或主机宕机时,也能获得准确的 VM 状态信息,以便我可以快速对我的 VM 执行操作。大多数情况下,故障信息对于拥有需要快速切换以提供服务的 HA 类型 VM 的用户至关重要。另一方面,用户或管理员需要对主机上的 VM 执行某些操作。操作可能因用例和部署而异,因为某些管理操作可以为外部服务自动化,而另一些则留给用户。通常,用户只能删除或创建 VM。

作为用户,我希望获取有关维护的信息,以便我可以对我的 VM 执行操作。当用户获取有关主机处于维护状态(service= disabled)的信息时,用户知道要计划对他的 VM 执行什么操作,因为主机可能很快重启。

提议的变更

一个新的 host_status 字段将被添加到 /servers/{server_id}/servers/detail 端点。如果 nova-compute 的状态为 up,则 host_status 将为 UP,如果 nova-compute 被 forced_down,则为 DOWN,如果 nova-compute last_seen_up 未更新,则为 UNKNOWN,如果 nova-compute 的状态为 disabled,则为 MAINTENANCE。如果新的策略允许,可以通过主机 API 和 servicegroup API 获取所需的信息。forced_down 标志处理在此规范中描述:https://specs.openstack.org/openstack/nova-specs/specs/liberty/implemented/mark-host-down.html

将添加一个新的策略元素来控制对 host_status 的访问。这既可以防止公开基于主机的此类数据,也可以消除此功能的性能影响。

备选方案

在返回 VM power_state 时,检查主机的服务状态。如果服务为 forced_down,则返回 UNKNOWN。这将是一个仅限 API 的更改,我们不建议更新 DB 值到 UNKNOWN。这意味着我们将保留 VM power state 的记录,与服务状态无关,这在主机失去网络而不是电源时可能很有趣。社区反馈表明,由于 power_state 只是对某个时间点的真实状态,因此从技术上讲,状态始终为 UNKNOWN

os-services/force-down 可以将受影响服务管理的所有 VM 在 db 中标记为 UNKNOWN。这有时可能是错误的,因为即使主机无法访问,VM 也可以处于 up 状态。这也将需要删除 VM 迁移到另一个计算节点时的数据状态。

一个可能的扩展是主机 NEEDS_MAINTENANCE 状态,这将显示维护即将进行。这将允许监控此信息的用户为他们的 VM 准备停机时间,并在对他们方便的时间进入维护状态。

可以添加一个扩展,用于根据 host_status 过滤 /servers/servers/detail 端点响应消息。

数据模型影响

REST API 影响

GET /v2.1/{tenant_id}/servers/{server_id}/v2.1/{tenant_id}/servers/ detail 将返回 host_status 字段,如果用户定义了“os_compute_api:servers:show: host_status”策略。这将需要一个微版本。

nova-compute 启用并正常报告的情况

GET /v2.1/{tenant_id}/servers/{server_id}

200 OK
{
  "server": {
    "host_status": "UP",
    ...
  }
}

nova-compute 启用,但未正常报告的情况

GET /v2.1/{tenant_id}/servers/{server_id}

200 OK
{
  "server": {
    "host_status": "UNKNOWN",
    ...
  }
}

nova-compute 启用,但 forced_down 的情况

GET /v2.1/{tenant_id}/servers/{server_id}

200 OK
{
  "server": {
    "host_status": "DOWN",
    ...
  }
}

nova-compute 禁用的情况

GET /v2.1/{tenant_id}/servers/{server_id}

200 OK
{
  "server": {
    "host_status": "MAINTENANCE",
    ...
  }
}

这可能由 python-novaclient 呈现为

+-------+------+--------+------------+-------------+----------+-------------+
| ID    | Name | Status | Task State | Power State | Networks | Host Status |
+-------+------+--------+------------+-------------+----------+-------------+
| 9a... | vm1  | ACTIVE | -          | RUNNING     | xnet=... | UP          |
+-------+------+--------+------------+-------------+----------+-------------+

要添加的新策略元素,以允许分配查看 host_status 的权限

"os_compute_api:servers:show:host_status": "rule:admin_api"

安全影响

普通用户可能能够关联多个 VM 之间的主机状态,以得出有关云拓扑的结论。可以通过不授予策略来防止这种情况。

通知影响

其他最终用户影响

性能影响

当收到服务器详细请求时,需要进行额外的数据库查询来查找服务。

其他部署者影响

开发人员影响

实现

负责人

主要负责人:Tomi Juvonen 其他贡献者:None

工作项

  • 将 host_status 作为详细信息公开。

  • 更新 python-novaclient。

依赖项

测试

需要添加单元和功能测试用例。

文档影响

需要记录 API 变更

参考资料