我已经使用 juju 基于 MAAS 创建了 Openstack。我已经创建了实例、项目等。我已经备份了数据库和 openstack 配置文件。我正在尝试通过销毁和删除服务来测试恢复基石,只是为了看看它是否可以恢复。我还删除了 keystone 数据库。(它已备份)因此,使用 juju,我销毁了损坏的旧 keystone,并部署了新的 keystone。这实际上让我重新开始运行,但事实上所有项目(租户)都消失了,并且实例不属于任何项目。因此,我恢复了 keystone 数据库,但没有令牌,但当我这样做时,我在 horizon 中收到一个错误,告诉我 keystone 不会授权客户端。
恢复损坏的基石节点的最佳方法是什么?似乎当您使用 juju 重做基石时,您会获得新的令牌。juju 能以某种方式将旧的令牌注入新的基石吗?
答案1
您遇到的问题是,keystone charm 在 keystone 数据库之外存储了一些信息;具体来说,服务的用户名和密码存储在本地磁盘上,以便当有其他服务单元与 keystone 相关时,keystone 服务可以将请求用户的正确密码分发给相关服务。
如果在部署 keystone 时没有提供管理员密码和管理员令牌配置,您也会遇到问题;如果没有明确配置,keystone 服务单元将随机生成这些配置 - 因此当您删除然后添加新的 keystone 服务单元时它们会发生变化。
您最终会得到一组数据库中的散列密码(由第一个服务单元创建),它们与第二个 keystone 服务单元中磁盘上生成的密码不匹配。
理想情况下,我们应该通过 juju 中的某种通用对象存储功能(例如 object-put/object-get)来解决这个问题,但这不是受支持的功能。
所有密码和令牌的磁盘存储都位于 /var/lib/keystone 中;您可能能够将它们选出作为 keystone 服务单元本身备份的一部分;但是,当您添加新的服务单元时,您会遇到竞争,因为服务关系会在您能够恢复这些文件之前触发。
作为 OpenStack 魅力维护者之一,我会对此进行更多的思考,看看我们是否可以想出更优雅的方案。