获取有效的服务器状态¶
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 变更