使用服务令牌进行长时间运行的任务¶
https://blueprints.launchpad.net/nova/+spec/use-service-tokens
利用 Keystone 的新特性,如果随用户令牌发送了服务令牌,则它将忽略用户令牌的过期时间。这可以解决用户令牌在长时间运行的操作期间(例如,实时迁移)过期的问题。
问题描述¶
Nova 中的某些操作可能需要很长时间才能完成。在此期间,与此请求关联的用户令牌可能会过期。当 Nova 尝试使用相同的用户令牌与 Cinder、Glance 或 Neutron 通信时,由于令牌已过期,Keystone 将无法验证该请求。请参阅 Bug 1571722。
用例¶
大多数失败案例是在实时迁移过程中观察到的,但并不局限于此
用户启动块实时迁移。根据卷的大小,将此卷移动到新实例可能需要很长时间,并且用户令牌将过期。当 Nova 调用 Cinder 通过传递用户令牌来更新此卷的信息时,由于令牌已过期,Keystone 将拒绝该请求。
用户启动实时迁移。有时,libvirt 可能需要一段时间才能根据大小和网络带宽将虚拟机移动到新主机。用户令牌可能会过期,并且任何后续调用 Neutron 以更新端口绑定都将因 Keystone 而失败。
用户在 Nova 中启动快照操作。用户令牌在此操作期间过期。Nova 调用 Glance 以更新最终数据,由于用户令牌已过期,Keystone 拒绝该请求。
注意:周期性任务和使用管理员令牌的情况不在本规范的讨论范围内。这些将在后续规范中讨论。
提议的变更¶
Keystone/auth_token 中间件现在支持,如果提交给它的令牌已过期,并且带有服务角色的“X-Service-Token”,它将验证该令牌并忽略用户令牌的过期时间。Nova 需要使用此功能来避免实时迁移等长时间运行操作中的故障。
Keystone 详细信息可以在这里找到:https://specs.openstack.org/openstack/keystone-specs/specs/keystone/ocata/allow-expired.html
将服务令牌传递给 Cinder。
将服务令牌传递给 Neutron,但仅限于非管理员情况。
将服务令牌传递给 Glance
注意:延迟将服务令牌传递给其他服务,直到需要时。
OpenStack 服务仅通过公共 REST API 与彼此通信。在进行服务到服务的请求时,Keystone auth_token 中间件提供了一种使用服务令牌包装器将用户令牌和服务令牌都添加到请求中的方法。
服务令牌添加到服务到服务通信中是可配置的。将注册一个名为“service_user”的新配置组,该组使用 keystoneauth1 中的 register_auth_conf_options。
一个配置选项 send_service_user_token,默认值为 False,可用于使用服务令牌验证服务间通信的请求。
服务到服务通信现在将包含一个由 keystoneauth1 单独验证的服务令牌。目前,Keystone 不支持多令牌验证。因此,这将是另一个验证请求,这将导致额外的 API 调用到 Keystone。Rally 基准测试将在启用和禁用“service_user”配置选项的情况下运行,以比较快照或实时迁移等长时间运行任务的结果。
备选方案¶
一种替代方法是为用户令牌设置更长的过期时间,以便它们不会在长时间运行的操作期间过期。但大多数情况下,更喜欢短寿命令牌,因为 Keystone 提供的 bearer 令牌在安全性方面非常薄弱。较短的过期时间限制了攻击者滥用被盗令牌的时间。
或者,我们可以像上面建议的那样实现,为每个服务提供一个单独的服务令牌。这样,即使其中一个令牌被泄露,也不会暴露对所有服务的访问权限。
将来,服务令牌请求验证可以在 neutron、cinder 或 glance 客户端中进行缓存,以减少额外的 API 调用到 Keystone。
数据模型影响¶
无
REST API 影响¶
无。
安全影响¶
在实时迁移的情况下,服务令牌将与用户令牌一起传递给 Cinder 和 Neutron。
通知影响¶
无
其他最终用户影响¶
无。
性能影响¶
对于我们发送到外部服务的每个请求,将会有额外的 API 调用到 Keystone 以生成服务令牌。
外部服务的 Keystone auth 中间件现在还需要验证用户令牌和服务令牌,从而进一步增加 Keystone 的负载。
其他部署者影响¶
如果我们想使用服务令牌验证,则需要升级我们发送令牌到的服务的 Keystone 中间件。
部署者需要了解添加的新配置值。应在升级部分中记录这些值。
开发人员影响¶
所有服务都应了解使用服务令牌进行跨服务通信。需要在开发者文档中记录服务令牌的使用情况,以便其他人了解正在发生的事情。
实现¶
负责人¶
- 主要负责人
Sarafraj Singh (raj_singh)
- 其他贡献者
Pushkar Umaranikar (pumaranikar) OSIC 团队
工作项¶
将服务令牌传递给 Cinder。
将服务令牌传递给 Neutron,但仅限于非管理员情况。
将服务令牌传递给 Glance
依赖于 DevStack 更改以创建服务用户和配置更新
更新依赖于 devstack 更改的 CI 作业。
依赖项¶
https://specs.openstack.org/openstack/keystone-specs/specs/keystone/ocata/allow-expired.html 这已经基本实现。需要使用更新的 keystone 中间件来开始修复过期的令牌。
测试¶
现有的功能测试将涵盖此新的流程。
测试启用和禁用服务令牌验证的,服务到服务通信。
文档影响¶
更新开发者文档
更新管理指南以配置和使用服务用户组。
参考资料¶
Keystone 规范
历史¶
发布名称 |
描述 |
|---|---|
Ocata |
引入 |