添加和移除主机¶
本页讨论如何将节点添加到现有集群或从现有集群中移除节点。具体过程取决于添加或移除的节点类型、正在运行的服务以及它们的配置方式。在这里,我们将考虑两种类型的节点 - 控制器和计算节点。其他类型的节点需要单独考虑。
在使用任何流程之前,都应该在生产环境中进行测试。
添加新主机¶
添加新的控制器¶
可以使用 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