更新 userdata

https://blueprints.launchpad.net/nova/+spec/update-userdata

应该能够更新实例的 userdata,而无需重建相应的实例。

问题描述

目前,无法在不重建实例的情况下更新实例的 userdata。

重建比仅仅传播更新后的 userdata(例如,通过 cloud-init)花费更多的时间,并且在生产环境中可能不可取。编辑云配置文件中的几行不应导致实例的完全重建。

此外,其他公有云提供商(如 Azure [1])具有更新现有实例的 userdata 的功能,因此最终用户可能期望 Nova 也能正常工作。

AWS 要求在更新 userdata 之前关闭实例 [2],而 Google 也允许随时更新 [3][4]。

用例

作为用户,我希望能够通过 userdata 动态地重新配置实例使用的时间和名称服务器,以便使用我最初用于引导实例的相同接口(userdata)来更新这些设置。

作为具有使用 cloud-init 等工具配置临时工作负载经验的用户,我希望能够通过 userdata 和每次启动时的元数据来管理我的有状态工作负载。元数据用于存储我的外部配置,而 userdata 用于执行诸如在应用更新后重新加入集群之类的操作。

提议的变更

现有的 PUT /servers/{server_id} API 应该接受一个名为 user_data 的附加参数,以允许更新实例的 userdata。

如果请求体中设置了该参数,Nova 应该将实例的 userdata 更新为请求参数中设置的值(如果输入有效,例如,不超过 65535 字节)。

如果实例使用 config drive,则不应允许上述方法,并应以清晰的响应消息和 409(冲突)状态码拒绝。相反,可以通过硬重启(即通过 POST /servers/{server_id}/action API)来更新 userdata,并使用类似于上述方法的附加参数。硬重启将自动重建 config drive,其中包含更新后的 userdata。

备选方案

数据模型影响

REST API 影响

通过新的微版本扩展 PUT /servers/{server_id} API,添加 user_data 参数。相应地更新 POST /servers/{server_id}/action API。

  • PUT /servers/{server_id}

    {
        "server": {
            "user_data": "data"
        }
    }
    
  • POST /servers/{server_id}/action

    {
        "reboot": {
            "type": "HARD",
            "user_data": "data"
        }
    }
    

以上是一个将 userdata 更改为 data 的最小请求示例。

安全影响

通知影响

其他最终用户影响

需要使用 openstackclient 更新 userdata 的选项:openstack server set --user-data {data} {server_id}

也应添加一个更新硬重启 userdata 的选项。

性能影响

其他部署者影响

开发人员影响

升级影响

实现

负责人

主要负责人

jhartkopf

功能联络人

需要联络人

工作项

  • 实施 API 更改

  • 添加测试

  • 添加文档

依赖项

  • 需要更新 openstackclient 以实现此更改

测试

  • 添加单元测试(正向和反向)

  • 添加功能测试(API 示例)

文档影响

需要更新 API 参考以反映新微版本的特性。

此外,明确 userdata 是可变的,但它也不能替代正确的配置管理。

参考资料

历史

修订版

瑜伽

引入

Zed

重新提出