9.4. 替换 Controller 节点
重要
				这个过程当前正在进行复审,请不要在当前地状态下使用它。详细信息,请参阅 BZ#1326507。
			
			在一些情况下,高可用性集群中的 Controller 节点可能会出现故障。在这种情况下,您需要把这个节点从集群中删除,并使用一个新 Controller 节点替换它。另外,还要保证节点可以和集群中的其它节点进行连接。
		
			本节介绍了如果替换 Controller 节点。这个过程包括运行 
openstack overcloud deploy 命令来更新需要替换 controller 节点的 Overcloud。请注意,这个过程不是完全自动的,在 Overcloud 栈更新过程中,openstack overcloud deploy 命令会在某个阶段报告一个错误,Overcloud 栈更新的过程会随之停止。这时,需要一些人工的干预后,openstack overcloud deploy 进程才会继续。
		
			首先,找到要被删除节点的索引。节点索引是 
nova list 输出中的实例名的一个后缀。
		
			在这个示例中,您需要删除 
overcloud-controller-1 节点,并使用 overcloud-controller-3 替换它。首先,把节点设置为维护模式,从而使 director 不再关心故障节点。把 nova list 中的实例 ID 与 ironic node-list 中的节点 ID 相关联
		
			把节点设为维护模式:
		
ironic node-set-maintenance da3a8d19-8a59-4e9d-923a-6a336fe10284 true
[stack@director ~]$ ironic node-set-maintenance da3a8d19-8a59-4e9d-923a-6a336fe10284 true
			使用 
control 配置集标记新节点。
		ironic node-update 75b25e9a-948d-424a-9b3b-f0ef70a6eacf add properties/capabilities='profile:control,boot_option:local'
[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']}]
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.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]}
bootstrap_nodeid: {get_attr: [Controller, resource.1.hostname]}
bootstrap_nodeid_ip: {get_attr: [Controller, resource.1.ip_address]}
			在指定节点索引后,重新部署 Overcloud,包括 
remove-node.yaml 环境文件:
		openstack overcloud deploy --templates --control-scale 3 -e ~/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 栈的状态:
		
heat stack-list --show-nested
[stack@director ~]$ heat stack-list --show-nested
			在配置过程中,Overcloud 栈更新会停止并报告一个 
UPDATE_FAILED 错误。这是因为一些 Puppet 模块不支持节点替换。此时,需要一些人工的干预。您需要执行以下操作:
		- 以heat-admin的身份登录到其它节点中的一个。director 的stack用户有一个访问heat-admin用户的 SSH 密钥。
- 从集群中删除故障节点:sudo crm_node -R overcloud-controller-1 --force [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --forceCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
- 从 RabbitMQ 集群中删除故障节点:sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1 [heat-admin@overcloud-controller-0 ~]$ sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
- 从 MongoDB 中删除故障节点。首先,从其它任何节点上连接到 MongoDB:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 MongoDB 集群的状态:tripleo:SECONDARY> rs.status() tripleo:SECONDARY> rs.status()Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除故障节点并退出:tripleo:SECONDARY> rs.remove('192.168.0.23:27017') tripleo:SECONDARY> exittripleo:SECONDARY> rs.remove('192.168.0.23:27017') tripleo:SECONDARY> exitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 
- 在 Galera 集群中更新节点列表:sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2 [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
- 登录到每个 Controller 节点,从/etc/corosync/corosync.conf中删除故障节点并重启 Corosync。例如,从 Controller 节点 0 的配置中删除故障节点:sudo vi /etc/corosync/corosync.conf [heat-admin@overcloud-controller-0 ~]$ sudo vi /etc/corosync/corosync.confCopy to Clipboard Copied! Toggle word wrap Toggle overflow 删除包括故障节点(节点 1)的部分:node { ring0_addr: overcloud-controller-1 nodeid: 2 }node { ring0_addr: overcloud-controller-1 nodeid: 2 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新启动 Corosync:sudo systemctl restart corosync [heat-admin@overcloud-controller-0 ~]$ sudo systemctl restart corosyncCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在每个节点上完成这个操作。
- 在新节点上启动 Pacemaker 和 Corosync:sudo pcs cluster node add overcloud-controller-3 sudo pcs cluster start overcloud-controller-3 [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster node add overcloud-controller-3 [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster start overcloud-controller-3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
- 在新节点上启动 keystone 服务。从其它节点上把/etc/keystone目录复制到 director 主机:sudo -i scp -r /etc/keystone stack@192.168.0.1:~/. [heat-admin@overcloud-controller-0 ~]$ sudo -i [root@overcloud-controller-0 ~]$ scp -r /etc/keystone stack@192.168.0.1:~/.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 然后登录到新的 Controller 节点。从新节点中删除/etc/keystone目录,从 director 主机上复制keystone文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 编辑/etc/keystone/keystone.conf,把admin_bind_host和public_bind_host参数设置为新 Controller 节点的 IP 地址。通过 Pacemaker 启用并重启 keystone 服务:sudo pcs resource enable openstack-keystone-clone overcloud-controller-3 sudo pcs resource cleanup openstack-keystone-clone overcloud-controller-3 [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-3Copy to Clipboard Copied! Toggle word wrap Toggle overflow 
			手工配置已完成。重新运行 Overcloud 部署命令来继续栈的更新:
		
openstack overcloud deploy --templates --control-scale 3 -e [ENVIRONMENT_FILE]
[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 -e [ENVIRONMENT_FILE]
重要
				如果您在创建 Overcloud 时传递了额外的环境变量,使用 
-e 或 --environment-file 选项再次传递它们来避免对 Overcloud 的不必要的手工改变。
			
				请注意,
remove-node.yaml 不再需要。
			
			如果 Overcloud 栈更新失败,这可能是由 keystone 服务的一个问题造成的。登录到新的节点,再次重启 keystone 服务:
		
sudo pcs resource enable openstack-keystone-clone overcloud-controller-3 sudo pcs resource cleanup openstack-keystone-clone overcloud-controller-3
[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 刷新以下服务:
		
			执行最后的状态检查来确保服务在正确运行:
		
sudo pcs status
[heat-admin@overcloud-controller-0 ~]$ sudo pcs status
			故障节点现在已被一个新节点替换。
		
注意
				如果故障节点仍然出现在 
pcs status 的输出中,使用以下命令把它删除:
			sudo crm_node -R overcloud-controller-1 --force
[heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force