9.4. 替换 Controller 节点
重要
这个过程当前正在进行复审,请不要在当前地状态下使用它。详细信息,请参阅 BZ#1326507。
在一些情况下,高可用性集群中的 Controller 节点可能会出现故障。在这种情况下,您需要把这个节点从集群中删除,并使用一个新 Controller 节点替换它。另外,还要保证节点可以和集群中的其它节点进行连接。
本节介绍了如果替换 Controller 节点。这个过程包括运行
openstack overcloud deploy
命令来更新需要替换 controller 节点的 Overcloud。请注意,这个过程不是完全自动的,在 Overcloud 栈更新过程中,openstack overcloud deploy
命令会在某个阶段报告一个错误,Overcloud 栈更新的过程会随之停止。这时,需要一些人工的干预后,openstack overcloud deploy
进程才会继续。
首先,找到要被删除节点的索引。节点索引是
nova list
输出中的实例名的一个后缀。
[stack@director ~]$ nova list +--------------------------------------+------------------------+ | ID | Name | +--------------------------------------+------------------------+ | 861408be-4027-4f53-87a6-cd3cf206ba7a | overcloud-compute-0 | | 0966e9ae-f553-447a-9929-c4232432f718 | overcloud-compute-1 | | 9c08fa65-b38c-4b2e-bd47-33870bff06c7 | overcloud-compute-2 | | a7f0f5e1-e7ce-4513-ad2b-81146bc8c5af | overcloud-controller-0 | | cfefaf60-8311-4bc3-9416-6a824a40a9ae | overcloud-controller-1 | | 97a055d4-aefd-481c-82b7-4a5f384036d2 | overcloud-controller-2 | +--------------------------------------+------------------------+
在这个示例中,您需要删除
overcloud-controller-1
节点,并使用 overcloud-controller-3
替换它。首先,把节点设置为维护模式,从而使 director 不再关心故障节点。把 nova list
中的实例 ID 与 ironic node-list
中的节点 ID 相关联
[stack@director ~]$ ironic node-list +--------------------------------------+------+--------------------------------------+ | UUID | Name | Instance UUID | +--------------------------------------+------+--------------------------------------+ | 36404147-7c8a-41e6-8c72-a6e90afc7584 | None | 7bee57cf-4a58-4eaf-b851-2a8bf6620e48 | | 91eb9ac5-7d52-453c-a017-c0e3d823efd0 | None | None | | 75b25e9a-948d-424a-9b3b-f0ef70a6eacf | None | None | | 038727da-6a5c-425f-bd45-fda2f4bd145b | None | 763bfec2-9354-466a-ae65-2401c13e07e5 | | dc2292e6-4056-46e0-8848-d6e96df1f55d | None | 2017b481-706f-44e1-852a-2ee857c303c4 | | c7eadcea-e377-4392-9fc3-cf2b02b7ec29 | None | 5f73c7d7-4826-49a5-b6be-8bfd558f3b41 | | da3a8d19-8a59-4e9d-923a-6a336fe10284 | None | cfefaf60-8311-4bc3-9416-6a824a40a9ae | | 807cb6ce-6b94-4cd1-9969-5c47560c2eee | None | c07c13e6-a845-4791-9628-260110829c3a | +--------------------------------------+------+--------------------------------------+
把节点设为维护模式:
[stack@director ~]$ ironic node-set-maintenance da3a8d19-8a59-4e9d-923a-6a336fe10284 true
使用
control
配置集标记新节点。
[stack@director ~]$ ironic node-update 75b25e9a-948d-424a-9b3b-f0ef70a6eacf add properties/capabilities='profile:control,boot_option:local'
创建一个 YAML 文件(
~/templates/remove-node.yaml
),它定义了要被删除的节点索引:
parameters: ControllerRemovalPolicies: [{'resource_list': ['1']}]
重要
如果使用索引为 0 的节点进行替换,在开始替换前,编辑 heat 模板,修改 bootstrap 节点的索引。打开 Heat 模板集合的根目录下的
overcloud-without-mergepy.yaml
文件:
bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]} bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
修改为:
bootstrap_nodeid: {get_attr: [Controller, resource.1.hostname]} bootstrap_nodeid_ip: {get_attr: [Controller, resource.1.ip_address]}
在指定节点索引后,重新部署 Overcloud,包括
remove-node.yaml
环境文件:
[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 -e ~/remove-node.yaml
重要
如果您在创建 Overcloud 时传递了额外的环境变量,使用
-e
或 --environment-file
选项再次传递它们来避免对 Overcloud 的不必要的手工改变。
请注意,
remove-node.yaml
在这个实例中只需要一次。
director 会删除旧节点、创建一个新节点并更新 Overcloud 栈。您可以使用以下命令检查 Overcloud 栈的状态:
[stack@director ~]$ heat stack-list --show-nested
在配置过程中,Overcloud 栈更新会停止并报告一个
UPDATE_FAILED
错误。这是因为一些 Puppet 模块不支持节点替换。此时,需要一些人工的干预。您需要执行以下操作:
- 以
heat-admin
的身份登录到其它节点中的一个。director 的stack
用户有一个访问heat-admin
用户的 SSH 密钥。 - 从集群中删除故障节点:
[heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
- 从 RabbitMQ 集群中删除故障节点:
[heat-admin@overcloud-controller-0 ~]$ sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1
- 从 MongoDB 中删除故障节点。首先,从其它任何节点上连接到 MongoDB:
[heat-admin@overcloud-controller-0 ~]$ mongo --host 192.168.0.23 MongoDB shell version: 2.6.9 connecting to: 192.168.0.23:27017/test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user tripleo:SECONDARY>
检查 MongoDB 集群的状态:tripleo:SECONDARY> rs.status()
删除故障节点并退出:tripleo:SECONDARY> rs.remove('192.168.0.23:27017') tripleo:SECONDARY> exit
- 在 Galera 集群中更新节点列表:
[heat-admin@overcloud-controller-0 ~]$ sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2
- 登录到每个 Controller 节点,从
/etc/corosync/corosync.conf
中删除故障节点并重启 Corosync。例如,从 Controller 节点 0 的配置中删除故障节点:[heat-admin@overcloud-controller-0 ~]$ sudo vi /etc/corosync/corosync.conf
删除包括故障节点(节点 1)的部分:node { ring0_addr: overcloud-controller-1 nodeid: 2 }
重新启动 Corosync:[heat-admin@overcloud-controller-0 ~]$ sudo systemctl restart corosync
在每个节点上完成这个操作。 - 在新节点上启动 Pacemaker 和 Corosync:
[heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster node add overcloud-controller-3 [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster start overcloud-controller-3
- 在新节点上启动 keystone 服务。从其它节点上把
/etc/keystone
目录复制到 director 主机:[heat-admin@overcloud-controller-0 ~]$ sudo -i [root@overcloud-controller-0 ~]$ scp -r /etc/keystone stack@192.168.0.1:~/.
然后登录到新的 Controller 节点。从新节点中删除/etc/keystone
目录,从 director 主机上复制keystone
文件:[heat-admin@overcloud-controller-3 ~]$ sudo -i [root@overcloud-controller-3 ~]$ rm -rf /etc/keystone [root@overcloud-controller-3 ~]$ scp -r stack@192.168.0.1:~/keystone /etc/. [root@overcloud-controller-3 ~]$ chown -R keystone: /etc/keystone [root@overcloud-controller-3 ~]$ chown root /etc/keystone/logging.conf /etc/keystone/default_catalog.templates
编辑/etc/keystone/keystone.conf
,把admin_bind_host
和public_bind_host
参数设置为新 Controller 节点的 IP 地址。通过 Pacemaker 启用并重启 keystone 服务:[heat-admin@overcloud-controller-3 ~]$ sudo pcs resource enable openstack-keystone-clone overcloud-controller-3 [heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup openstack-keystone-clone overcloud-controller-3
手工配置已完成。重新运行 Overcloud 部署命令来继续栈的更新:
[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 -e [ENVIRONMENT_FILE]
重要
如果您在创建 Overcloud 时传递了额外的环境变量,使用
-e
或 --environment-file
选项再次传递它们来避免对 Overcloud 的不必要的手工改变。
请注意,
remove-node.yaml
不再需要。
如果 Overcloud 栈更新失败,这可能是由 keystone 服务的一个问题造成的。登录到新的节点,再次重启 keystone 服务:
[heat-admin@overcloud-controller-3 ~]$ sudo pcs resource enable openstack-keystone-clone overcloud-controller-3 [heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup openstack-keystone-clone overcloud-controller-3
在 Overcloud 栈更新完成后,还需要以下最终的配置。登录到一个 Controller 节点,使用 Pacemaker 刷新以下服务:
[heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup neutron-server-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup openstack-nova-api-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup openstack-nova-consoleauth-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup openstack-heat-engine-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup openstack-cinder-api-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup openstack-glance-registry-clone [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource cleanup httpd-clone
执行最后的状态检查来确保服务在正确运行:
[heat-admin@overcloud-controller-0 ~]$ sudo pcs status
故障节点现在已被一个新节点替换。
注意
如果故障节点仍然出现在
pcs status
的输出中,使用以下命令把它删除:
[heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force