从API暴露Conductor信息

https://storyboard.openstack.org/#!/story/1724474

该规范建议从API暴露Conductor信息,以及Conductor和节点之间的映射关系。

问题描述

在包含多个Ironic Conductor的部署中,节点通过哈希环分配到不同的Conductor,目前我们没有机制可以在不查询数据库的情况下识别给定节点的特定Conductor。

在以下几种情况下,我们需要定位节点的Conductor主机,例如

  • 节点在节点部署期间无法从PXE启动,我们需要检查Conductor主机的PXE环境。

  • 如果后端设置为本地,Ramdisk日志存储在Conductor主机中,这需要识别为节点提供服务的确切Conductor。

同时,我们缺乏对与Conductor相关信息的API支持,这些信息可能对诊断很有用。例如

  • 此云中有多少个Conductor,它们是否处于活动状态。

  • 每个Conductor所属的Conductor组。

  • 当前映射到此Conductor的节点。

这些信息也有助于实现诸如服务监控、Ironic外部告警等功能。

提议的变更

添加API端点 /v1/conductors 以检索Conductor信息列表,包括主机名、Conductor组和活动标志。

活动标志的计算方式与Ironic认为Conductor不活动的方式相同,即通过检查 update_atheartbeat_timeout

添加API端点 /v1/conductors/{hostname} 以检索详细的Conductor信息,包括与此Conductor关联的节点。映射关系从哈希环检索。

在Node API对象中添加一个字段 conductor,指示当前节点映射到的Conductor的主机名。

备选方案

管理员可以直接查询Ironic数据库以获取Conductor列表。要定位为节点提供服务的最后一个Conductor,请查询nodes表中的 conductor_affinity 字段,然后查询 conductors 表以获取Conductor的主机名。 conductor_affinity 在几种情况下会更新,主要是在节点部署期间。无法通过哈希环获取实时映射。

数据模型影响

状态机影响

REST API 影响

API微版本将会增加。

添加一个新的 conductor API对象,以及三个API端点

  • GET /v1/conductors

    • 获取Ironic所知的Conductor列表

    • 微版本早于此功能的客户端将收到404。对于正常请求,返回200。

    • 示例响应数据

      {
        "conductors": [
          {
            "hostname": "Compute01",
            "conductor_group": "region1",
            "alive": true,
            "links": [
              {
                "href": "http://127.0.0.1:6385/v1/conductors/Compute01",
                "rel": "self"
              },
              {
                "href": "http://127.0.0.1:6385/conductors/Compute01",
                "rel": "bookmark"
              }
            ]
          },
          {
            "hostname": "Compute03",
            "conductor_group": "region1",
            "alive": true,
            "links": [...]
          }
        ]
      }
      
  • GET /v1/conductors/{hostname}

    • 按主机名获取Conductor的详细信息

    • 微版本早于此功能的客户端将收到404。对于正常请求,返回200。

    • 示例响应数据

      {
        "hostname": "Compute01",
        "conductor_group": "region1",
        "alive": true
        "drivers": ["ipmi"],
        "last_seen": "2018-09-10 19:53:17"
        "links": [
          {
            "href": "http://127.0.0.1:6385/v1/conductors/Compute01",
            "rel": "self"
          },
          {
            "href": "http://127.0.0.1:6385/conductors/Compute01",
            "rel": "bookmark"
          }
        ]
      }
      
  • GET /v1/nodes/{node_ident}/conductor

    • 获取给定节点的Conductor的详细信息

    • 微版本早于此功能的客户端将收到404。对于正常请求,返回200。

    • 响应数据与 /v1/conductors/{hostname} 相同

以以下方式更改 Node API对象

  • 添加一个只读属性 conductor,指示关联Conductor的主机名。

  • Node.convert_with_links 中检索并分配Conductor主机名。

Conductor的主机名将在以下端点中返回

  • POST /v1/nodes

  • GET /v1/nodes (当 detail 设置为true时)

  • GET /v1/nodes/detail

  • GET /v1/nodes/{node_ident}

对于 GET /v1/nodes/{node_ident} 的示例响应数据是

{
  "nodes": [
    {
      "instance_uuid": null,
      "conductor": "Compute01",
      "uuid": "a308bca6-e6a3-4349-b8ea-695e17672898",
      "links": ...,
      "maintenance": false,
      "provision_state": "available",
      "power_state": "power off",
      "name": "node-0"
    }
  ]
}

为以下端点添加支持,按Conductor主机名查询节点

  • GET /v1/nodes

  • GET /v1/nodes/detail

例如,GET /v1/nodes/?conductor=Compute01 将返回映射到主机名为Compute01的Conductor的节点。

客户端 (CLI) 影响

“ironic” CLI

“openstack baremetal” CLI

增强Ironic客户端,添加两个新命令

  • openstack baremetal conductor list

  • openstack baremetal conductor show <hostname>

暴露Conductor字段到命令

  • openstack baremetal node list --detail

  • openstack baremetal node show <node>

支持按Conductor主机名查询节点

  • openstack baremetal node list --conductor <hostname>

RPC API 影响

驱动程序 API 影响

Nova 驱动程序影响

Ramdisk 影响

安全影响

其他最终用户影响

可扩展性影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

kaifeng <kaifeng.w@gmail.com>

工作项

  • 实现API端点。

  • conductor 字段添加到node API对象。

  • CLI增强,用于API更改。

  • 文档和api参考。

依赖项

测试

该功能将由单元测试覆盖。

升级和向后兼容性

该功能将受到微版本保护。

文档影响

新的API将在API参考中记录。新的命令将在ironicclient文档中记录。

参考资料