将控制台转换为使用对象框架¶
https://blueprints.launchpad.net/nova/+spec/convert-consoles-to-objects
使控制台使用对象框架——当前的控制台代码没有利用框架对象,而是提供了一些类型(console/type.py)来处理它们。这些类型不提供任何处理版本控制、RPC 或任何使其有用的方法的功能。
问题描述¶
当前代码没有提供任何处理版本控制的机制。此外,由于 RPC 无法处理从 Python 对象类型派生的类,我们需要在 RPC 调用之间处理一个“connect_info”字典,并且没有提供任何方法来跨进程共享控制台的状态。
另一个问题在于令牌,memcached 不是数据库,无法保证尊重过期时间,令牌可能会在限制之前过期(驱逐)。通过使用框架对象,我们可以有机会将整个 Console 对象的状态与数据库中的有效令牌一起存储,并在进程之间共享状态。
例如,bug 1425640 需要知道用户从多个角度连接到特定端口的时间:从计算节点,返回下一个定义的未连接端口;从代理,拒绝已连接端口上的新连接;从 API,让用户知道没有更多可用端口。
我们还将通过仅将令牌的哈希值存储在数据库中来增强安全性,在将干净的令牌返回给用户之后。然后,当用户请求连接控制台时,传递的令牌将被哈希并与数据库中存储的令牌进行比较以进行验证。
将引入一个新的选项“console_tokens_backend”,允许操作员在不同的后端之间切换。此规格的范围将允许 2 个后端:consoleauth(使用 memcached)或数据库。consoleauth 服务将保留用于遗留兼容性,但处于弃用状态,支持一个版本。在此期间之后,可以删除 consoleauth 服务。
由于新的令牌将存储在数据库中,我们需要考虑 cells v2。子单元格数据库是存储控制台连接信息的适当位置,因为它与实例直接相关。目前,返回给用户的控制台连接 URL 仅包含一个令牌。这不足以确定哪个单元格持有控制台连接。可以通过将实例 UUID 添加到 URL 的查询字符串中来解决此问题。这种方法与现有的控制台代理向后兼容。最终,仍然是令牌决定了连接到控制台的权限,但我们将添加验证,以确保 URL 中的实例 UUID 与从令牌检索到的连接信息中的实例 UUID 匹配。
用例¶
开发人员可以在添加新的控制台或功能时利用框架对象。
提议的变更¶
定义一个新的 ConsoleConnection 对象。
转换驱动程序以生成 ConsoleConnection 对象。
定义模式和 API 以在子单元格数据库中存储 ConsoleConnection 对象。
更新代码以存储带有有效令牌的 ConsoleConnection 到数据库或 consoleauth,具体取决于开关,直到 consoleauth 被移除。
将实例 UUID 添加到控制台代理 URL,以允许代理找到包含连接信息的子单元格数据库。
更新代理,以使用数据库或 consoleauth,具体取决于开关,直到 consoleauth 被移除。
定义一个定期任务来清理数据库中存储的过期对象;为了平衡负载并避免长时间阻塞数据库,每个计算节点将负责清理其托管的客户的 connection_info。
修复 bug 1425640
备选方案¶
继续使用 memcached 作为后端将使连接信息行为不可预测,因为对象可能会被驱逐。此外,为了解决问题 1425640 和 1455252,必须进行扫描以列出可用的端口,这在使用 memcached 时很困难,除非添加特定代码来维护存储键的列表。
数据模型影响¶
需要定义一个新的 ConsoleConnection 模型,并具有属性
instance:引用控制台的实例
host:用于处理主机名的字符串字段
port:用于处理服务编号的整数字段
token_hash:用于处理令牌或 null 的字符串字段
access_url:用于处理访问或 null 的字符串字段
options:用于处理特定信息(例如 usetls、internal_access_path、mode…)的字典字段
expires:指示令牌过期时间的日期时间或 null
数据库模式
CREATE TABLE console_connection (
instance_uuid CHAR(36) NOT NULL,
host VARCHAR(255) NOT NULL,
port INT NOT NULL,
token_hash CHAR(40),
access_url VARCHAR(255),
options TEXT,
expires DATETIME,
PRIMARY KEY (instance_uuid, host, port),
INDEX (token, instance_uuid),
FOREIGN KEY (instance_uuid)
REFERENCES instances(uuid)
ON DELETE CASCADE
);
注意
从 memcached 存储的序列化字典连接信息升级到数据库时,预计不会进行任何迁移,在升级期间,已经连接到控制台的客户端将保持其连接,直到代理重新启动。在此步骤中,我们预计 consoleauth 服务也将重新启动。
REST API 影响¶
无
安全影响¶
从令牌的角度来看,我们可以期望更好的安全性,因为当前令牌存储在 memcached 中,memcached 不提供任何安全层。现在只有令牌的哈希值才会存储在数据库中,并且安全策略也将得到增强,与存储在数据库中的其他关键组件相同。
通知影响¶
无
其他最终用户影响¶
当 proxyclient 重新启动时,用户将从我们的控制台断开连接,但如果尚未过期,应该使用相同的令牌重新连接到它。
性能影响¶
数据库负载将增加,但我们可以预期 DBA 的影响最小。
其他部署者影响¶
必须先重新启动 consoleauth 服务,然后再重新启动代理服务。当代理重新启动时,客户端将从控制台断开连接。consoleauth 将继续作为后端工作,直到一个弃用版本,操作员鼓励切换到数据库后端(参见选项:console_tokens_backend)。
如果部署者选择使用数据库来存储控制台连接信息,则不需要 consoleauth 服务。
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
PaulMurray
- 其他贡献者
sahid-ferdjaoui
工作项¶
将代码转换为使用对象框架
更新 consoleauth 以利用数据库来处理令牌
修复 bug 1425640
依赖项¶
无
测试¶
当前代码已经通过功能和单元测试进行了测试,由于我们没有提供任何功能,因此可以认为该代码将通过这些测试得到很好的覆盖。
新版本将在 gate 中进行测试。
文档影响¶
无
参考资料¶
无
历史¶
发布名称 |
描述 |
|---|---|
Liberty |
引入 |
Newton |
重新提出 |