Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

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 模块不支持节点替换。此时,需要一些人工的干预。您需要执行以下操作:
  1. heat-admin 的身份登录到其它节点中的一个。director 的 stack 用户有一个访问 heat-admin 用户的 SSH 密钥。
  2. 从集群中删除故障节点:
    [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
    
  3. 从 RabbitMQ 集群中删除故障节点:
    [heat-admin@overcloud-controller-0 ~]$ sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1
    
  4. 从 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
    
  5. 在 Galera 集群中更新节点列表:
    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2
    
  6. 登录到每个 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
    
    在每个节点上完成这个操作。
  7. 在新节点上启动 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
    
  8. 在新节点上启动 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_hostpublic_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