Red Hat Training

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

第 12 章 替换 Controller 节点

在一些情况下,高可用性集群中的 Controller 节点可能会出现故障。在这种情况下,您需要把这个节点从集群中删除,并替换为一个新的 Controller 节点。

完成本节中的步骤来替换 Controller 节点。在 Controller 节点替换过程中,需要运行 openstack overcloud deploy 命令,以使用替换 Controller 节点的请求来更新 overcloud。

重要

以下操作过程仅适用于高可用性环境。在只有一个 Controller 节点的情况下不要使用此过程。

12.1. 准备替换 Controller 节点

在尝试替换 overcloud 控制器节点前,务必要检查Red Hat OpenStack Platform环境的当前状态;此检查有助于避免在替换控制器节点的过程中出现混乱。参照以下初步检查列表,确定是否可以安全地执行控制器节点替换。在 undercloud 中执行这些检查的所有命令。

步骤

  1. 在 undercloud 中检查 overcloud 栈的当前状态:

    $ source stackrc
    (undercloud) $ openstack stack list --nested

    overcloud 栈以及它们的子栈的状态需要是 CREATE_COMPLETEUPDATE_COMPLETE

  2. 安装数据库客户端工具:

    (undercloud) $ sudo yum -y install mariadb
  3. 配置数据库的 root 用户访问权限:

    (undercloud) $ sudo cp /var/lib/config-data/puppet-generated/mysql/root/.my.cnf /root/.
  4. 对 undercloud 数据库进行备份:

    (undercloud) $ mkdir /home/stack/backup
    (undercloud) $ sudo mysqldump --all-databases --quick --single-transaction | gzip > /home/stack/backup/dump_db_undercloud.sql.gz
  5. 确认您的 undercloud 含有 10 GB 的可用存储空间,以容纳部署新节点期间的镜像缓存和转换。
  6. 在运行的 Controller 节点上检查 Pacemaker 的状态。例如,运行的 Controller 节点的 IP 地址是 192.168.0.47,使用以下命令获得 Pacemaker 的状态:

    (undercloud) $ ssh heat-admin@192.168.0.47 'sudo pcs status'

    这个命令的输出应该显示,所有服务都在存在的节点上运行,并已在出现故障的节点上停止运行。

  7. 检查 overcloud 的 MariaDB 集群中各个节点的以下参数:

    • wsrep_local_state_comment: Synced
    • wsrep_cluster_size: 2

      使用以下命令检查各个运行的 Controller 节点的这些参数。在本例中,Controller 节点 IP 地址是 192.168.0.47 和 192.168.0.46:

      (undercloud) $ for i in 192.168.0.47 192.168.0.46 ; do echo "*** $i ***" ; ssh heat-admin@$i "sudo mysql -p\$(sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password) --execute=\"SHOW STATUS LIKE 'wsrep_local_state_comment'; SHOW STATUS LIKE 'wsrep_cluster_size';\""; done
  8. 检查 RabbitMQ 状态。例如,如果一个运行的 Controller 节点的 IP 地址是 192.168.0.47,则可使用以下命令获取其状态:

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo docker exec \$(sudo docker ps -f name=rabbitmq-bundle -q) rabbitmqctl cluster_status"

    running_nodes 应该只显示两个可用的节点,而不会显示有故障的节点。

  9. 如果启用了隔离服务,需要禁用它。例如,一个运行的 Controller 节点的 IP 地址是 192.168.0.47,使用以下命令禁用隔离服务:

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property set stonith-enabled=false"

    使用以下命令检查隔离服务的状态:

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property show stonith-enabled"
  10. 检查 director 节点上的 Compute 服务是否活跃:

    (undercloud) $ openstack hypervisor list

    以上命令的输出应该显示所有没有处于维护模式的节点的状态为 up

  11. 确保所有 undercloud 容器都在运行:

    (undercloud) $ sudo docker ps

12.2. 删除 Ceph Monitor 守护进程

按照这个操作过程操作,从存储集群中删除 ceph-mon 守护进程。如果 Controller 节点正在运行 Ceph 监控器服务,请完成以下步骤以删除 ceph-mon 守护进程。这个操作过程假设 Controller 可供连接。

注意

在集群中添加新的 Controller,也会自动添加新的 Ceph 监控器守护进程。

步骤

  1. 连接到您要替换的 Controller,然后改为 root 用户身份:

    # ssh heat-admin@192.168.0.47
    # sudo su -
    注意

    如果无法连接到该 Controller,请跳过第 1 步和第 2 步,然后在能够正常工作的任意 Controller 节点上从第 3 步开始继续执行这个操作过程。

  2. 以 root 用户的身份,停止该监控器:

    # systemctl stop ceph-mon@<monitor_hostname>

    例如:

    # systemctl stop ceph-mon@overcloud-controller-1
  3. 断开与要被替换的控制器的连接:
  4. 连接到现有控制器中的一个。

    # ssh heat-admin@192.168.0.46
    # sudo su -
  5. 从集群中删除该监控器:

    # ceph mon remove <mon_id>
  6. 在所有 Controller 节点上,从 /etc/ceph/ceph.conf 中删除监控器条目。例如,如果您删除 controller-1,那就要删除 controller-1 的 IP 和主机名。

    删除前:

    mon host = 172.18.0.21,172.18.0.22,172.18.0.24
    mon initial members = overcloud-controller-2,overcloud-controller-1,overcloud-controller-0

    删除后:

    mon host = 172.18.0.22,172.18.0.24
    mon initial members = overcloud-controller-2,overcloud-controller-0
    注意

    在添加替换控制器节点时,director 会更新相关 overcloud 节点上的 ceph.conf 文件。通常,这个配置文件由 director 独占管理,您不应手动编辑。不过,如果在您添加新节点前其他节点重新启动,您可以手动编辑该文件来确保一致性。

  7. 此外,也可选择归档监控器数据,并将其保存到其他服务器上:

    # mv /var/lib/ceph/mon/<cluster>-<daemon_id> /var/lib/ceph/mon/removed-<cluster>-<daemon_id>

12.3. 为 Controller 替换准备集群

在替换旧节点前,您必须确保节点上不再运行 Pacemaker,然后将该节点从 Pacemaker 集群中删除。

步骤

  1. 获取 Controller 节点的 IP 地址列表:

    (undercloud) $ openstack server list -c Name -c Networks
    +------------------------+-----------------------+
    | Name                   | Networks              |
    +------------------------+-----------------------+
    | overcloud-compute-0    | ctlplane=192.168.0.44 |
    | overcloud-controller-0 | ctlplane=192.168.0.47 |
    | overcloud-controller-1 | ctlplane=192.168.0.45 |
    | overcloud-controller-2 | ctlplane=192.168.0.46 |
    +------------------------+-----------------------+
  2. 如果旧节点仍然可以连接,请登录其中一个剩余的节点,并停止旧节点上的 pacemaker。在本例中,请停止 overcloud-controller-1 上的 pacemaker:

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs status | grep -w Online | grep -w overcloud-controller-1"
    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs cluster stop overcloud-controller-1"
    注意

    如果旧节点在物理上不可用或者已经停止,则不必进行前面的操作,因为该节点上 pacemaker 已经停止。

  3. 在旧节点上停止 Pacemaker 后,将旧节点从各个节点上的 Corosync 配置中删除,然后重启 Corosync。要检查旧节点上的 Pacemaker 状态,请运行 pcs status 命令,并验证其状态是否为 Stopped

    以下示例命令将登录 overcloud-controller-0overcloud-controller-2 来删除 overcloud-controller-1

    (undercloud) $ for NAME in overcloud-controller-0 overcloud-controller-2; do IP=$(openstack server list -c Networks -f value --name $NAME | cut -d "=" -f 2) ; ssh heat-admin@$IP "sudo pcs cluster localnode remove overcloud-controller-1; sudo pcs cluster reload corosync"; done
  4. 登录到其中一个剩余的节点,然后使用 crm_node 命令从集群中删除节点:

    (undercloud) $ ssh heat-admin@192.168.0.47
    [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
  5. overcloud 数据库必须在替换过程中继续运行。为了确保 Pacemaker 不会在此过程中停止 Galera,可选择一个运行中的 Controller 节点,然后使用该 Controller 节点的 IP 地址在 undercloud 上运行以下命令:

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs resource unmanage galera-bundle"

12.4. 替换 Controller 节点

要替换 Controller 节点,请确定您要替换的节点的索引。

  • 如果节点是虚拟节点,请确定包含故障磁盘的节点,然后从备份中恢复磁盘。确保用于故障服务器上 PXE 引导的 NIC 的 MAC 地址在磁盘替换后保持不变。
  • 如果该节点是裸机节点,请替换磁盘,利用您的 overcloud 配置准备新磁盘,然后对新硬件上执行节点内省。

完成下方的示例步骤,将 overcloud-controller-1 节点替换为 overcloud-controller-3 节点。overcloud-controller-3 节点的 ID 是 75b25e9a-948d-424a-9b3b-f0ef70a6eacf

重要

要将节点替换为现有的 ironic 节点,请在传出节点上启用维护模式,以便 director 不会自动重新置备节点。

步骤

  1. 查找 stackrc 文件:

    $ source ~/stackrc
  2. 确定 overcloud-controller-1 节点的索引:

    $ INSTANCE=$(openstack server list --name overcloud-controller-1 -f value -c ID)
  3. 确定与实例关联的裸机节点:

    $ NODE=$(openstack baremetal node list -f csv --quote minimal | grep $INSTANCE | cut -f1 -d,)
  4. 把节点设为维护模式:

    $ openstack baremetal node maintenance set $NODE
  5. 如果 Controller 节点是虚拟节点,请在 Controller 主机上运行以下命令,从备份中替换虚拟磁盘:

    $ cp <VIRTUAL_DISK_BACKUP> /var/lib/libvirt/images/<VIRTUAL_DISK>

    <VIRTUAL_DISK_BACKUP> 替换为故障虚拟磁盘备份的路径,然后将 <VIRTUAL_DISK> 替换为要替换的虚拟磁盘的名称。

    如果您没有传出节点的备份,必须使用新的虚拟化节点。

    如果 Controller 节点是裸机节点,请完成下列步骤,将磁盘替换为新的裸机磁盘:

    1. 更换物理硬盘或固态硬盘驱动器。
    2. 使用与故障节点相同的配置来准备节点。
  6. 列出未关联的节点,并确定新节点的 ID:

    $ openstack baremetal node list --unassociated
  7. 使用 control 配置集标记新节点:

    (undercloud) $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' 75b25e9a-948d-424a-9b3b-f0ef70a6eacf

12.5. 触发 Controler 节点替换

完成以下步骤,以删除旧的 Controller 节点,并将它替换为新的 Controller 节点。

步骤

  1. 创建一个环境文件 (~/templates/remove-controller.yaml) 来定义要删除的节点索引:

    parameters:
      ControllerRemovalPolicies:
        [{'resource_list': ['1']}]
  2. 运行 overcloud 部署命令,在命令中包含 remove-controller.yaml 环境文件以及所有与您环境相关的其他环境文件:

    (undercloud) $ openstack overcloud deploy --templates \
        -e /home/stack/templates/remove-controller.yaml \
        -e /home/stack/templates/node-info.yaml \
        [OTHER OPTIONS]
    注意

    仅对部署命令的这个实例包含 -e ~/templates/remove-controller.yaml。从后续的部署操作中移除此环境文件。

  3. director 会删除旧节点,创建一个新节点并更新 overcloud 栈。您可以使用以下命令检查 overcloud 栈的状态:

    (undercloud) $ openstack stack list --nested
  4. 一旦部署命令完成,director 会显示旧节点已替换为新节点:

    (undercloud) $ openstack server list -c Name -c Networks
    +------------------------+-----------------------+
    | Name                   | Networks              |
    +------------------------+-----------------------+
    | overcloud-compute-0    | ctlplane=192.168.0.44 |
    | overcloud-controller-0 | ctlplane=192.168.0.47 |
    | overcloud-controller-2 | ctlplane=192.168.0.46 |
    | overcloud-controller-3 | ctlplane=192.168.0.48 |
    +------------------------+-----------------------+

    新节点现在托管运行的控制平面服务。

12.6. Controller 节点替换后清理

完成节点替换后,执行以下步骤来完善 Controller 集群。

步骤

  1. 登录 Controller 节点。
  2. 启用 Galera 集群的 Pacemaker 管理,并在新节点上启动 Galera:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource refresh galera-bundle
    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource manage galera-bundle
  3. 执行最后的状态检查来确保服务在正确运行:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs status
    注意

    如果有任何服务失败,请使用 pcs resource refresh 命令来解决问题并重新启动失败的服务。

  4. 退出 director

    [heat-admin@overcloud-controller-0 ~]$ exit
  5. 查找 overcloudrc 文件,以便您可以跟 overcloud 交互:

    $ source ~/overcloudrc
  6. 检查 overcloud 环境中的网络代理:

    (overcloud) $ openstack network agent list
  7. 如果出现任何旧节点的代理,请删除它们:

    (overcloud) $ for AGENT in $(openstack network agent list --host overcloud-controller-1.localdomain -c ID -f value) ; do openstack network agent delete $AGENT ; done
  8. 如有必要,将您的托管路由器添加到新节点上的 L3 代理。运行以下示例命令并使用 UUID 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4,将托管路由器 r1 添加到 L3 代理:

    (overcloud) $ openstack network agent add router --l3 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4 r1
  9. overcloud 中仍然存在已删除节点的 Compute 服务,需要删除它们。检查已删除节点的 Compute 服务:

    [stack@director ~]$ source ~/overcloudrc
    (overcloud) $ openstack compute service list --host overcloud-controller-1.localdomain
  10. 删除已删除节点的 compute 服务:

    (overcloud) $ for SERVICE in $(openstack compute service list --host overcloud-controller-1.localdomain -c ID -f value ) ; do openstack compute service delete $SERVICE ; done