添加和移除主机

本页讨论如何将节点添加到现有集群或从现有集群中移除节点。具体过程取决于添加或移除的节点类型、正在运行的服务以及它们的配置方式。在这里,我们将考虑两种类型的节点 - 控制器和计算节点。其他类型的节点需要单独考虑。

在使用任何流程之前,都应该在生产环境中进行测试。

添加新主机

添加新的控制器

可以使用 bootstrap-servers 命令 来准备要添加到系统中的新主机。它会在新主机的 /etc/hosts 中添加条目,并且某些服务(例如 RabbitMQ)要求在每个控制器上都存在所有控制器的条目。如果使用 --limit 参数,请确保包含所有控制器,例如通过 --limit control。请注意运行 bootstrap-servers 在现有系统上可能存在的 潜在问题

kolla-ansible bootstrap-servers -i <inventory> [ --limit <limit> ]

将容器镜像拉取到新主机。可以使用 --limit 参数,并且只需要包含新主机即可。

kolla-ansible pull -i <inventory> [ --limit <limit> ]

将容器部署到新主机。如果使用 --limit 参数,请确保包含所有控制器,例如通过 --limit control

kolla-ansible deploy -i <inventory> [ --limit <limit> ]

现在已部署新的控制器。此时建议对控制平面进行测试,以验证新的控制器是否正常工作。

某些资源可能不会自动平衡到新的控制器上。手动将这些资源重新平衡到新的控制器上可能会有所帮助。例如,由 Neutron DHCP 代理托管的网络以及由 Neutron L3 代理托管的路由器。 移除现有控制器 部分提供了一个如何执行此操作的示例。

添加新的计算节点

可以使用 bootstrap-servers 命令 来准备要添加到系统中的新主机。请注意运行 bootstrap-servers 在现有系统上可能存在的 潜在问题

kolla-ansible bootstrap-servers -i <inventory> [ --limit <limit> ]

将容器镜像拉取到新主机。可以使用 --limit 参数,并且只需要包含新主机即可。

kolla-ansible pull -i <inventory> [ --limit <limit> ]

在新主机上部署容器。可以使用 --limit 参数,并且只需要包含新主机即可。

kolla-ansible deploy -i <inventory> [ --limit <limit> ]

现在已部署新的计算节点。建议此时对计算节点进行测试,以验证它们是否正常工作。

服务器实例不会自动平衡到新的计算节点上。将一些服务器实例迁移到新主机可能会有所帮助。

openstack server migrate <server> --live-migration --host <target host> --os-compute-api-version 2.30

或者,可以使用诸如 Watcher 之类的服务来自动执行此操作。

移除现有主机

移除现有的控制器

在移除控制器或其他运行集群化服务的宿主机时,请考虑集群中是否仍有足够的主机来形成法定人数。例如,在具有 3 个控制器的系统中,一次只能移除一个。还要考虑这会对冗余产生什么影响。

在从集群中移除现有控制器之前,建议先移动它们托管的资源。在这里,我们将介绍由 Neutron DHCP 代理托管的网络以及由 Neutron L3 代理托管的路由器。根据您的环境和配置,可能需要采取其他操作。

对于要移除的每个主机,找到该主机上的 Neutron 路由器并将其移动。禁用 L3 代理。例如

l3_id=$(openstack network agent list --host <host> --agent-type l3 -f value -c ID)
target_l3_id=$(openstack network agent list --host <target host> --agent-type l3 -f value -c ID)
openstack router list --agent $l3_id -f value -c ID | while read router; do
  openstack network agent remove router $l3_id $router --l3
  openstack network agent add router $target_l3_id $router --l3
done
openstack network agent set $l3_id --disable

对 DHCP 代理重复此操作

dhcp_id=$(openstack network agent list --host <host> --agent-type dhcp -f value -c ID)
target_dhcp_id=$(openstack network agent list --host <target host> --agent-type dhcp -f value -c ID)
openstack network list --agent $dhcp_id -f value -c ID | while read network; do
  openstack network agent remove network $dhcp_id $network --dhcp
  openstack network agent add network $target_dhcp_id $network --dhcp
done

停止正在移除的主机上运行的所有服务

kolla-ansible stop -i <inventory> --yes-i-really-really-mean-it [ --limit <limit> ]

从 Ansible 库存中移除这些主机。

重新配置剩余的控制器,以更新 MariaDB 和 RabbitMQ 等集群的成员资格。使用合适的 limit,例如 --limit control

kolla-ansible deploy -i <inventory> [ --limit <limit> ]

执行测试以验证剩余的集群主机是否正常运行。

对于每个主机,清理其服务

openstack network agent list --host <host> -f value -c ID | while read id; do
  openstack network agent delete $id
done

openstack compute service list --os-compute-api-version 2.53 --host <host> -f value -c ID | while read id; do
  openstack compute service delete --os-compute-api-version 2.53 $id
done

如果该节点也正在运行 etcd 服务,请在 globals.yml 中设置 etcd_remove_deleted_members: "yes",以自动从 etcd 集群中移除已从库存中移除的节点。

或者,可以使用 etcdctl 手动移除 etcd 成员。有关更多详细信息,请参阅正在运行的 etcd 版本的 runtime reconfiguration 文档部分。

移除现有的计算节点

在从系统中移除计算节点时,请考虑剩余计算节点是否有足够的容量来托管正在运行的工作负载。包括可能发生的故障的开销。

在从系统中移除计算节点之前,建议迁移或销毁它们托管的任何实例。

对于每个主机,禁用计算服务以确保没有新的实例被调度到该主机上。

openstack compute service set <host> nova-compute --disable

如果可能,将实例迁移到另一个主机。

openstack server list --all-projects --host <host> -f value -c ID | while read server; do
  openstack server migrate --live-migration $server
done

验证迁移是否成功。

停止正在移除的主机上运行的所有服务

kolla-ansible stop -i <inventory> --yes-i-really-really-mean-it [ --limit <limit> ]

从 Ansible 库存中移除这些主机。

执行测试以验证剩余的集群主机是否正常运行。

对于每个主机,清理其服务

openstack network agent list --host <host> -f value -c ID | while read id; do
  openstack network agent delete $id
done

openstack compute service list --os-compute-api-version 2.53 --host <host> -f value -c ID | while read id; do
  openstack compute service delete --os-compute-api-version 2.53 $id
done