Red Hat Training

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

第 9 章 扩展 Overcloud

在某些情况下,您可以需要在创建 Overcloud 后添加或删除节点。例如,可能需要为 Overcloud 添加 Compute 节点。在这些情况下,需要更新 Overcloud。

下表介绍了对每个节点类型进行扩展的支持信息:

表 9.1. 每个节点类型的扩展支持

节点类型

扩充

缩小

备注

Controller

N

N

 

Compute

Y

Y

 

Ceph Storage 节点

Y

N

在初始创建的 Overcloud 中最少有一个 Ceph 存储节点。

Block Storage 节点

N

N

 

Object Storage 节点

Y

Y

需要手工进行 ring 管理。相关详情请参阅 第 9.6 节 “替换 Object 存储节点”

重要

在进行 Overcloud 扩展前,需要保证最少有 10 GB 的可用磁盘空间。这些磁盘空间被用来保存镜像转换和缓存。

9.1. 添加额外节点

为 director 的节点池添加更多节点,创建一个包括用来注册新节点信息的 JSON 文件(例如,newnodes.json):

{
  "nodes":[
    {
        "mac":[
            "dd:dd:dd:dd:dd:dd"
        ],
        "cpu":"4",
        "memory":"6144",
        "disk":"40",
        "arch":"x86_64",
        "pm_type":"pxe_ipmitool",
        "pm_user":"admin",
        "pm_password":"p@55w0rd!",
        "pm_addr":"192.0.2.207"
    },
    {
        "mac":[
            "ee:ee:ee:ee:ee:ee"
        ],
        "cpu":"4",
        "memory":"6144",
        "disk":"40",
        "arch":"x86_64",
        "pm_type":"pxe_ipmitool",
        "pm_user":"admin",
        "pm_password":"p@55w0rd!",
        "pm_addr":"192.0.2.208"
    }
  ]
}

如需了解与这些参数相关的信息,请参阅 第 5.1 节 “为 Overcloud 注册节点”

运行以下命令注册这些节点:

$ openstack baremetal import --json newnodes.json

在注册完这些节点后,为它们启动内省进程。为每个新节点运行以下命令:

$ ironic node-set-provision-state [NODE UUID] manage
$ openstack baremetal introspection start [NODE UUID]
$ ironic node-set-provision-state [NODE UUID] provide

这会发现节点,并为它们创建硬件属性的基准数据。

在内省操作完成后,把新节点标记为相应的角色。例如,使用以下命令把节点标记为一个 Compute 节点:

$ ironic node-update [NODE UUID] add properties/capabilities='profile:compute,boot_option:local'

设置部署时使用的引导镜像。找到 bm-deploy-kernelbm-deploy-ramdisk 镜像的 UUID:

$ glance image-list
+--------------------------------------+------------------------+
| ID                                   | Name                   |
+--------------------------------------+------------------------+
| 09b40e3d-0382-4925-a356-3a4b4f36b514 | bm-deploy-kernel       |
| 765a46af-4417-4592-91e5-a300ead3faf6 | bm-deploy-ramdisk      |
| ef793cd0-e65c-456a-a675-63cd57610bd5 | overcloud-full         |
| 9a51a6cb-4670-40de-b64b-b70f4dd44152 | overcloud-full-initrd  |
| 4f7e33f4-d617-47c1-b36f-cbe90f132e5d | overcloud-full-vmlinuz |
+--------------------------------------+------------------------+

在新节点的 deploy_kerneldeploy_ramdisk 设置中使用这些 UUID:

$ ironic node-update [NODE UUID] add driver_info/deploy_kernel='09b40e3d-0382-4925-a356-3a4b4f36b514'
$ ironic node-update [NODE UUID] add driver_info/deploy_ramdisk='765a46af-4417-4592-91e5-a300ead3faf6'

扩展 Overcloud 需要重新运行 openstack overcloud deploy(使用新的节点数量)。例如,扩展到 5 个 Compute 节点:

$ openstack overcloud deploy --templates --compute-scale 5 [OTHER_OPTIONS]

这会更新整个 Overcloud 栈。请注意,这只会更新栈,而不会删除 Overcloud 或替换栈。

重要

确认包括了初始 Overcloud 创建中的所有环境文件和选项。这包括和非 Compute 节点相同的扩展参数。

9.2. 删除 Compute 节点

在某些情况下,您可能需要从 Overcloud 中删除节点。例如,需要替换一个有问题的 Compute 节点。

重要

在从 Overcloud 中删除一个 Compute 节点前,把这个节点上的负载迁移到其它 Compute 节点上。请参阅 第 8.9 节 “从一个 Overcloud Compute 节点中迁移虚拟机”

接下来,在 Overcloud 中禁用节点的 Compute 服务。这会停止在此节点上调度新的实例。

$ source ~/stack/overcloudrc
$ nova service-list
$ nova service-disable [hostname] nova-compute
$ source ~/stack/stackrc

删除 Overcloud 节点需要使用本地模板文件对 director 中的 overcloud 栈进行更新。首先,找到 Overcloud 栈的 UUID:

$ heat stack-list

找到要被删除的节点的 UUID:

$ nova list

运行以下命令来从栈中删除节点,并相应地更新计划:

$ openstack overcloud node delete --stack [STACK_UUID] --templates -e [ENVIRONMENT_FILE] [NODE1_UUID] [NODE2_UUID] [NODE3_UUID]
重要

如果您在创建 Overcloud 时传递了额外的环境变量,使用 -e--environment-file 选项再次传递它们来避免对 Overcloud 的不必要的改变。

重要

在继续进行操作前,请确认 openstack overcloud node delete 命令已运行完。使用 openstack stack list 命令检查 overcloud 栈的状态是否已变为 UPDATE_COMPLETE

最后,删除节点的 Compute 服务:

$ source ~/stack/overcloudrc
$ nova service-delete [service-id]
$ source ~/stack/stackrc

删除节点的 Open vSwitch 代理:

$ source ~/stack/overcloudrc
$ neutron agent-list
$ neutron agent-delete [openvswitch-service-id]
$ source ~/stack/stackrc

现在,可以安全地把节点从 Overcloud 中删除,并用于其它目的。

9.3. 替换 Compute 节点

当一个 Compute 节点出现问题时,您可以使用一个正常的节点替换它。使用以下步骤替换 Compute 节点:

这个过程确保了替换节点的操作不会影响到任何实例的可用性。

9.4. 替换 Controller 节点

在一些情况下,高可用性集群中的 Controller 节点可能会出现故障。在这种情况下,您需要把这个节点从集群中删除,并使用一个新 Controller 节点替换它。另外,还要保证节点可以和集群中的其它节点进行连接。

本节介绍了如何替换 Controller 节点。这个过程包括运行 openstack overcloud deploy 命令来更新需要替换 controller 节点的 Overcloud。请注意,这个过程不是完全自动的,在 Overcloud 栈更新过程中,openstack overcloud deploy 命令会在某个阶段报告一个错误,Overcloud 栈更新的过程会随之停止。这时,需要一些人工的干预后,openstack overcloud deploy 进程才会继续。

9.4.1. 预检查

在替换一个 Overcloud Controller 节点前,需要对 Red Hat OpenStack Platform 环境进行检查。这可以避免在替换 Controller 节点的过程中出现问题。在 Undercloud 中执行以下的预检查操作来决定替换 Controller 节点是否安全。

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

    $ source stackrc
    $ heat stack-list --show-nested

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

  2. 对 Undercloud 数据库进行备份:

    $ mkdir /home/stack/backup
    $ sudo mysqldump --all-databases --quick --single-transaction | gzip > /home/stack/backup/dump_db_undercloud.sql.gz
    $ sudo systemctl stop openstack-ironic-api.service openstack-ironic-conductor.service openstack-ironic-discoverd.service openstack-ironic-discoverd-dnsmasq.service
    $ sudo cp /var/lib/ironic-discoverd/inspector.sqlite /home/stack/backup
    $ sudo systemctl start openstack-ironic-api.service openstack-ironic-conductor.service openstack-ironic-discoverd.service openstack-ironic-discoverd-dnsmasq.service
  3. Undercloud 需要保证最少有 10 GB 的可用磁盘空间。这些磁盘空间被用来保存镜像转换和缓存。
  4. 在运行的 Controller 节点上检查 Pacemaker 的状态。例如,运行的 Controller 节点的 IP 地址是 192.168.0.47,使用以下命令获得 Pacemaker 的状态:

    $ ssh heat-admin@192.168.0.47 'sudo pcs status'

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

  5. 检查 Overcloud 的 MariaDB 集群中的每个节点的以下参数:

    • wsrep_local_state_comment: Synced
    • wsrep_cluster_size: 2

      使用以下命令在每个运行的 Controller 节点上检查这些参数(IP 地址分别为 192.168.0.47 和 192.168.0.46):

      $ for i in 192.168.0.47 192.168.0.46 ; do echo "*** $i ***" ; ssh heat-admin@$i "sudo mysql --exec=\"SHOW STATUS LIKE 'wsrep_local_state_comment'\" ; sudo mysql --exec=\"SHOW STATUS LIKE 'wsrep_cluster_size'\""; done
  6. 检查 RabbitMQ 的状态。例如,一个运行节点的 IP 地址是 192.168.0.47,使用以下命令获得状态值

    $ ssh heat-admin@192.168.0.47 "sudo rabbitmqctl cluster_status"

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

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

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

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

    $ ssh heat-admin@192.168.0.47 "sudo pcs property show stonith-enabled"
  8. 在 director 节点上检查 nova-compute 服务:

    $ sudo systemctl status openstack-nova-compute
    $ nova hypervisor-list

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

  9. 确保所有 Undercloud 服务都在运行:

    $ sudo systemctl -t service

9.4.2. 替换节点

找出要被删除节点的索引。节点索引是 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-controller.yaml),它定义了要被删除的节点索引:

parameters:
  ControllerRemovalPolicies:
    [{'resource_list': ['1']}]
重要

如果替换索引为 0 的节点,在进行替换前,编辑 heat 模板,修改 bootstrap 节点的索引以及节点验证索引。创建 director 的 Heat 模板集合的一个副本(请参阅 第 6.18 节 “使用定制的核心 Heat 模板”),在 overcloud.yaml 文件中运行以下命令:

$ sudo sed -i "s/resource\.0/resource.1/g" ~/templates/my-overcloud/overcloud.yaml

这会修改以下资源的节点索引:

ControllerBootstrapNodeConfig:
  type: OS::TripleO::BootstrapNode::SoftwareConfig
    properties:
      bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
      bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}

以及:

AllNodesValidationConfig:
  type: OS::TripleO::AllNodes::Validation
  properties:
    PingTestIps:
      list_join:
      - ' '
      - - {get_attr: [Controller, resource.0.external_ip_address]}
        - {get_attr: [Controller, resource.0.internal_api_ip_address]}
        - {get_attr: [Controller, resource.0.storage_ip_address]}
        - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
        - {get_attr: [Controller, resource.0.tenant_ip_address]}

在指定节点索引后,重新部署 Overcloud,包括 remove-controller.yaml 环境文件:

[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 -e ~/templates/remove-controller.yaml [OTHER OPTIONS]
重要

如果您在创建 Overcloud 时使用了额外的环境文件或选项,现在则需要再次使用它们来避免对 Overcloud 的不必要的改变。

请注意,-e ~/templates/remove-controller.yaml 在这个实例中只需要一次。

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

[stack@director ~]$ heat stack-list --show-nested

9.4.3. 手工干预

ControllerNodesPostDeployment 阶段,Overcloud 栈更新会在 ControllerLoadBalancerDeployment_Step1 的步骤中出现因为 UPDATE_FAILED 错误而终止执行的情况。这是因为一些 Puppet 模块不支持节点替换。因此,在这个阶段需要一些手工干预。请进行以下步骤:

  1. 获得 Controller 节点的 IP 地址列表。例如:

    [stack@director ~]$ nova list
    ... +------------------------+ ... +-------------------------+
    ... | 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   |
    ... +------------------------+ ... +-------------------------+
  2. 在一个存在节点的 /etc/corosync/corosync.conf 文件中检查删除节点的 nodeid 值。例如,节点 overcloud-controller-0(IP 地址为 192.168.0.47):

    [stack@director ~]$ ssh heat-admin@192.168.0.47 "sudo cat /etc/corosync/corosync.conf"

    这个命令会显示一个 nodelist,它包括了被删除节点(overcloud-controller-1)的 ID:

    nodelist {
      node {
        ring0_addr: overcloud-controller-0
        nodeid: 1
      }
      node {
        ring0_addr: overcloud-controller-1
        nodeid: 2
      }
      node {
        ring0_addr: overcloud-controller-2
        nodeid: 3
      }
    }

    记录下被删除节点的 nodeid 值以供以后使用。在这个示例中,它的值是 2。

  3. 从每个节点的 Corosync 配置中删除失败的节点,并重启 Corosync。对于这个示例,登录到 overcloud-controller-0overcloud-controller-2 并运行以下命令:

    [stack@director] ssh heat-admin@192.168.0.47 "sudo pcs cluster localnode remove overcloud-controller-1"
    [stack@director] ssh heat-admin@192.168.0.47 "sudo pcs cluster reload corosync"
    [stack@director] ssh heat-admin@192.168.0.46 "sudo pcs cluster localnode remove overcloud-controller-1"
    [stack@director] ssh heat-admin@192.168.0.46 "sudo pcs cluster reload corosync"
  4. 登录到剩下的节点之一,使用 crm_node 命令从集群中删除节点:

    [stack@director] ssh heat-admin@192.168.0.47
    [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force

    保持在这个节点的登录。

  5. 从 RabbitMQ 集群中删除故障节点:

    [heat-admin@overcloud-controller-0 ~]$ sudo rabbitmqctl forget_cluster_node rabbit@overcloud-controller-1
  6. 从 MongoDB 中删除失败的节点。首先,找到节点 Interal API 连接的 IP 地址。

    [heat-admin@overcloud-controller-0 ~]$ sudo netstat -tulnp | grep 27017
    tcp        0      0 192.168.0.47:27017    0.0.0.0:*               LISTEN      13415/mongod

    检查这个节点是否是 primary 副本:

    [root@overcloud-controller-0 ~]# echo "db.isMaster()" | mongo --host 192.168.0.47:27017
    MongoDB shell version: 2.6.11
    connecting to: 192.168.0.47:27017/echo
    {
      "setName" : "tripleo",
      "setVersion" : 1,
      "ismaster" : true,
      "secondary" : false,
      "hosts" : [
        "192.168.0.47:27017",
        "192.168.0.46:27017",
        "192.168.0.45:27017"
      ],
      "primary" : "192.168.0.47:27017",
      "me" : "192.168.0.47:27017",
      "electionId" : ObjectId("575919933ea8637676159d28"),
      "maxBsonObjectSize" : 16777216,
      "maxMessageSizeBytes" : 48000000,
      "maxWriteBatchSize" : 1000,
      "localTime" : ISODate("2016-06-09T09:02:43.340Z"),
      "maxWireVersion" : 2,
      "minWireVersion" : 0,
      "ok" : 1
    }
    bye

    从输出中可以判断当前节点是否是 primary 节点。如果不是,使用 primary 所指定节点的 IP 地址。

    从 primary 节点连接到 MongoDB:

    [heat-admin@overcloud-controller-0 ~]$ mongo --host 192.168.0.47
    MongoDB shell version: 2.6.9
    connecting to: 192.168.0.47: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:PRIMARY>

    检查 MongoDB 集群的状态:

    tripleo:PRIMARY> rs.status()

    _id 代表节点,在删除失败的节点时需要使用 name。在这里,我们删除 Node 1,它的 name192.168.0.45:27017

    tripleo:PRIMARY> rs.remove('192.168.0.45:27017')
    重要

    您需要针对 PRIMARY 副本集运行这个命令。如果您可以看到以下信息:

    "replSetReconfig command must be sent to the current replica set primary."

    重新登录到 PRIMARY 节点上的 MongoDB。

    注意

    在删除失败节点的副本集时出现以下输出是正常的:

    2016-05-07T03:57:19.541+0000 DBClientCursor::init call() failed
    2016-05-07T03:57:19.543+0000 Error: error doing query: failed at src/mongo/shell/query.js:81
    2016-05-07T03:57:19.545+0000 trying reconnect to 192.168.0.47:27017 (192.168.0.47) failed
    2016-05-07T03:57:19.547+0000 reconnect 192.168.0.47:27017 (192.168.0.47) ok

    退出 MongoDB:

    tripleo:PRIMARY> exit
  7. 在 Galera 集群中更新节点列表:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource update galera wsrep_cluster_address=gcomm://overcloud-controller-0,overcloud-controller-3,overcloud-controller-2
  8. 为集群添加新节点:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster node add overcloud-controller-3
  9. 检查每个节点上的 /etc/corosync/corosync.conf 文件。如果新节点的 nodeid 和已删除节点的相同,则需要把它更新为一个新的 nodeid 值。例如,/etc/corosync/corosync.conf 文件包括一个新节点(overcloud-controller-3)的项:

    nodelist {
      node {
        ring0_addr: overcloud-controller-0
        nodeid: 1
      }
      node {
        ring0_addr: overcloud-controller-2
        nodeid: 3
      }
      node {
        ring0_addr: overcloud-controller-3
        nodeid: 2
      }
    }

    请注意,新节点使用和被删除节点相同的 nodeid。把这个值更新为一个没有被使用过的节点 ID 值。例如:

    node {
      ring0_addr: overcloud-controller-3
      nodeid: 4
    }

    在包括新节点在内的所有 Controller 节点的 /etc/corosync/corosync.conf 文件中更新这个 nodeid 值。

  10. 只在存在的节点上重启 Corosync 服务。例如,在 overcloud-controller-0 上:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster reload corosync

    overcloud-controller-2 上:

    [heat-admin@overcloud-controller-2 ~]$ sudo pcs cluster reload corosync

    不要在新节点上运行这个命令。

  11. 启动新的 Controller 节点:

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs cluster start overcloud-controller-3
  12. 在新节点上启动 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 地址。要找到这些 IP 地址,使用 ip addr 命令,在以下网络中查找 IP 地址:

    • admin_bind_host - Provisioning 网络
    • public_bind_host - Internal API 网络
    注意

    如果使用一个定制的 ServiceNetMap 参数部署 Overcloud,这些网络可能会不同。

    例如,如果 Provisioning 网络使用 192.168.0.0/24 子网,Internal API 使用 172.17.0.0/24 子网,使用以下命令在这些网络中找出节点的 IP 地址:

    [root@overcloud-controller-3 ~]$ ip addr | grep "192\.168\.0\..*/24"
    [root@overcloud-controller-3 ~]$ ip addr | grep "172\.17\.0\..*/24"
  13. 通过 Pacemaker 启用并重启一些服务。集群当前处于维护模式,您需要临时禁用它来启用服务。例如:

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs property set maintenance-mode=false --wait
  14. 等待 Galera 服务在所有节点上都已启动。

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs status | grep galera -A1
    Master/Slave Set: galera-master [galera]
    Masters: [ overcloud-controller-0 overcloud-controller-2 overcloud-controller-3 ]

    如果需要,在新节点上执行 cleanup

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup galera overcloud-controller-3
  15. 等待 Keystone 服务在所有节点上都已启动。

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs status | grep keystone -A1
    Clone Set: openstack-keystone-clone [openstack-keystone]
    Started: [ overcloud-controller-0 overcloud-controller-2 overcloud-controller-3 ]

    如果需要,在新节点上执行 cleanup

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs resource cleanup openstack-keystone-clone overcloud-controller-3
  16. 把集群切换为维护模式:

    [heat-admin@overcloud-controller-3 ~]$ sudo pcs property set maintenance-mode=true --wait

手工配置已完成。重新运行 Overcloud 部署命令来继续栈的更新:

[stack@director ~]$ openstack overcloud deploy --templates --control-scale 3 [OTHER OPTIONS]
重要

如果您在创建 Overcloud 时使用了额外的环境文件或选项,现在则需要再次使用它们来避免对 Overcloud 的不必要的改变。但是请注意,remove-controller.yaml 文件不再需要。

9.4.4. 完成配置 Overcloud 服务

在 Overcloud 栈更新完成后,还需要一些最终的配置。登录到一个 Controller 节点,使用 Pacemaker 刷新所有停止的服务:

[heat-admin@overcloud-controller-0 ~]$ for i in `sudo pcs status|grep -B2 Stop |grep -v "Stop\|Start"|awk -F"[" '/\[/ {print substr($NF,0,length($NF)-1)}'`; do echo $i; sudo pcs resource cleanup $i; done

执行最后的状态检查来确保服务在正确运行:

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

如果服务失败,在解决相关问题后使用 pcs resource cleanup 命令重启它们。

退出 director

[heat-admin@overcloud-controller-0 ~]$ exit

9.4.5. 完成 L3 代理路由器的配置

Source overcloudrc 文件从而可以和 Overcloud 进行交互。检查您的路由器来确定 Overcloud 环境中的 L3 代理正确地运行了路由器。在这个示例中,使用名为 r1 的路由器:

[stack@director ~]$ source ~/overcloudrc
[stack@director ~]$ neutron l3-agent-list-hosting-router r1

这个命令可能仍然会显示旧节点而不是新节点。要替换它,列出环境中的 L3 网络代理:

[stack@director ~]$ neutron agent-list | grep "neutron-l3-agent"

找出新节点和旧节点上代理的 UUID。把路由添加到新节点上的代理,并从旧节点上删除。例如:

[stack@director ~]$ neutron l3-agent-router-add fd6b3d6e-7d8c-4e1a-831a-4ec1c9ebb965 r1
[stack@director ~]$ neutron l3-agent-router-remove b40020af-c6dd-4f7a-b426-eba7bac9dbc2 r1

在路由器上进行最后的检查,确认所有都已激活:

[stack@director ~]$ neutron l3-agent-list-hosting-router r1

删除那些指向旧的 Controller 节点的 Neutron 代理。例如:

[stack@director ~]$ neutron agent-list -F id -F host | grep overcloud-controller-1
| ddae8e46-3e8e-4a1b-a8b3-c87f13c294eb | overcloud-controller-1.localdomain |
[stack@director ~]$ neutron agent-delete ddae8e46-3e8e-4a1b-a8b3-c87f13c294eb

9.4.6. 完成 Compute 服务配置

被删除节点的 Compute 服务仍然存在于 Overcloud 中,它需要被删除。Source overcloudrc 文件从而可以和 Overcloud 进行交互。检查被删除节点的 compute 服务:

[stack@director ~]$ source ~/overcloudrc
[stack@director ~]$ nova service-list | grep "overcloud-controller-1.localdomain"

删除节点的 compute 服务。例如,overcloud-controller-1.localdomain 节点的 nova-scheduler 服务的 ID 是 5,运行以下命令:

[stack@director ~]$ nova service-delete 5

针对被删除节点的每个服务执行这个操作。

在新节点上检查 openstack-nova-consoleauth 服务。

[stack@director ~]$ nova service-list | grep consoleauth

如果服务没有运行,登录到一个 Controller 节点并重启服务:

[stack@director] ssh heat-admin@192.168.0.47
[heat-admin@overcloud-controller-0 ~]$ pcs resource restart openstack-nova-consoleauth

9.4.7. 结果

失败的 Controller 节点和它的相关服务被一个新节点替代。

重要

如果禁用了 Object Storage 的自动 ring 构建(如 第 9.6 节 “替换 Object 存储节点”),则需要手工为新节点构建 Object Storage ring 文件。如需了解更多与手工构建 ring 文件相关的信息,请参阅 第 9.6 节 “替换 Object 存储节点”

9.5. 替换 Ceph 存储节点

director 提供了一个在 director 创建的集群中替换 Ceph Storage 节点的方法。相关信息可以通过 Red Hat Ceph Storage for the Overcloud 获得。

9.6. 替换 Object 存储节点

要在 Object 存储集群中替换节点,您需要:

  • 更新带有新 Object 存储节点的 Overcloud,防止 Director 创建 ring 文件。
  • 使用 swift-ring-builder 对节点手工添加或删除节点。

以下介绍了在保证集群正常的情况下,如何替换节点的方法。在这个示例中,有一个带有 2 个节点 的 Object 存储集群。我们需要添加一个额外的节点,然后替换有问题的节点。

首先,创建一个包括以下内容的环境文件(名为 ~/templates/swift-ring-prevent.yaml):

parameter_defaults:
  SwiftRingBuild: false
  RingBuild: false
  ObjectStorageCount: 3

SwiftRingBuildRingBuild 参数分别定义了 Overcloud 是否自动为 Object 存储和 Controller 节点构建 ring 文件。ObjectStorageCount 定义了在环境中有多少个 Object 存储节点。在这里,我们把节点数从 2 个扩展为 3 个。

openstack overcloud deploy 命令中包括 swift-ring-prevent.yaml 文件,以及 Overcloud 中的其它环境文件:

$ openstack overcloud deploy --templates [ENVIRONMENT_FILES] -e swift-ring-prevent.yaml
注意

把这个文件添加到环境文件的最后,从而使它的参数可以覆盖前面的环境文件参数。

在部署完成后,Overcloud 就包括了一个额外的 Object 存储节点。但是,这个节点的存储目录还没有创建,用于节点对象存储的 ring 文件也没有构建。这意味着,您需要手工创建存储目录,并手工构建 ring 文件。

注意

使用以下步骤在 Controller 节点上构建 ring 文件。

登录到新节点并创建存储目录:

$ sudo mkdir -p /srv/node/d1
$ sudo chown -R swift:swift /srv/node/d1
注意

您还可以在这个目录中挂载一个外部存储设备。

把存在的 ring 文件复制到节点。以 heat-admin 用户身份登录到一个 Controller 节点,然后切换到超级用户(superuser)。例如,对于一个 IP 地址为 192.168.201.24 的 Controller 节点:

$ ssh heat-admin@192.168.201.24
$ sudo -i

/etc/swift/*.builder 文件从 Controller 节点复制到新的 Object 存储节点的 /etc/swift/ 目录中。如果需要,把文件放到 director 主机上:

[root@overcloud-controller-0 ~]# scp /etc/swift/*.builder stack@192.1.2.1:~/.

然后,把文件放到新节点上:

[stack@director ~]$ scp ~/*.builder heat-admin@192.1.2.24:~/.

heat-admin 用户的身份登录到新的 Object 存储节点上,然后切换到超级用户。例如,对于 IP 地址为 192.168.201.29 的 Object 存储节点:

$ ssh heat-admin@192.168.201.29
$ sudo -i

把文件复制到 /etc/swift 目录:

# cp /home/heat-admin/*.builder /etc/swift/.

把新的 Object 存储节点添加到帐号、容器和对象 ring 中。为新节点运行以下命令:

# swift-ring-builder /etc/swift/account.builder add zX-IP:6002/d1 weight
# swift-ring-builder /etc/swift/container.builder add zX-IP:6001/d1 weight
# swift-ring-builder /etc/swift/object.builder add zX-IP:6000/d1 weight

在这些命令中替换以下值:

zX
使用代表特定区的一个整数替换 X(例如,Zone 1 的值为 1)。
IP
帐号、容器和对象服务要监听的 IP 地址。这应该和每个存储节点的 IP 地址相匹配,特别是和 /etc/swift/object-server.conf/etc/swift/account-server.conf/etc/swift/container-server.conf 中的 DEFAULT 部分中的 bind_ip 的值相匹配。
weight
表示一个设备和其它设备相比较的相对权重。它的值通常是 100
注意

针对 rings 文件运行 swift-ring-builder 命令来检查当前节点存在的值:

# swift-ring-builder /etc/swift/account.builder

删除您需要从账户、容器和对象 ring 中替换的节点。为每个节点运行以下命令:

# swift-ring-builder /etc/swift/account.builder remove IP
# swift-ring-builder /etc/swift/container.builder remove IP
# swift-ring-builder /etc/swift/object.builder remove IP

使用节点的 IP 地址替换 IP

在所有节点间重新分布分区:

# swift-ring-builder /etc/swift/account.builder rebalance
# swift-ring-builder /etc/swift/container.builder rebalance
# swift-ring-builder /etc/swift/object.builder rebalance

/etc/swift/ 的所有者设置改为 root 用户和 swift 组:

# chown -R root:swift /etc/swift

重启 openstack-swift-proxy 服务:

# systemctl restart openstack-swift-proxy.service

到此为止,ring 文件(*.ring.gz 和 *.builder)应该已在新节点上被更新:

/etc/swift/account.builder
/etc/swift/account.ring.gz
/etc/swift/container.builder
/etc/swift/container.ring.gz
/etc/swift/object.builder
/etc/swift/object.ring.gz

把这些文件复制到 Controller 节点和存在的 Object Storage 节点(除去要删除的节点)的 /etc/swift/ 目录中。如果需要,把文件放置到 director 主机:

[root@overcloud-objectstorage-2 swift]# scp *.builder stack@192.1.2.1:~/
[root@overcloud-objectstorage-2 swift]# scp *.ring.gz stack@192.1.2.1:~/

把这个文件复制到每个节点的 /etc/swift/ 中。

在每个节点中,把 /etc/swift/ 的所有者设置改为 root 用户和 swift 组:

# chown -R root:swift /etc/swift

新节点被添加并作为 ring 的一部分。在把旧节点从 ring 中删除前,请确认新节点已完成了一个完整的数据复制过程。

为了从 ring 中删除旧节点,减少 ObjectStorageCount 的值。在这个示例中,我们把它从 3 减为 2:

parameter_defaults:
  SwiftRingBuild: false
  RingBuild: false
  ObjectStorageCount: 2

创建一个环境文件(remove-object-node.yaml)来指定并删除旧的 Object 存储节点。在这个示例中,我们删除 overcloud-objectstorage-1

parameter_defaults:
  ObjectStorageRemovalPolicies:
    [{'resource_list': ['1']}]

在部署命令中包括这两个环境文件:

$ openstack overcloud deploy --templates -e swift-ring-prevent.yaml -e remove-object-node.yaml ...

director 从 Overcloud 中删除 Object 存储节点,并更新 Overcloud 中的其它节点来使删除生效。