使用 Red Hat OpenStack Platform director Operator 环境
使用 Red Hat OpenStack Platform director Operator 环境到 OpenShift 18.0 数据平面上的 Red Hat OpenStack Services
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。
使用 Create Issue 表单在 OpenShift (RHOSO)或更早版本的 Red Hat OpenStack Platform (RHOSP)上提供有关 Red Hat OpenStack Services 文档的反馈。当您为 RHOSO 或 RHOSP 文档创建问题时,这个问题将在 RHOSO Jira 项目中记录,您可以在其中跟踪您的反馈的进度。
要完成 Create Issue 表单,请确保您已登录到 JIRA。如果您没有红帽 JIRA 帐户,您可以在 https://issues.redhat.com 创建一个帐户。
- 点击以下链接打开 Create Issue 页面: Create Issue
- 完成 Summary 和 Description 字段。在 Description 字段中,包含文档 URL、章节号以及问题的详细描述。不要修改表单中的任何其他字段。
- 点 Create。
第 1 章 Red Hat OpenStack Services on OpenShift 18.0 采用概述 复制链接链接已复制到粘贴板!
采用是将 Red Hat OpenStack Platform (RHOSP) 17.1 control plane 迁移到 OpenShift 18.0 上的 Red Hat OpenStack Services,然后完成数据平面的原位升级。您可以保留现有的基础架构投资,并在容器化 Red Hat OpenShift Container Platform (RHOCP)基础上部署 RHOSP。要确保您了解整个采用过程以及如何足够准备 RHOSP 环境,请查看先决条件、采用过程和后选项任务。
在开始采用前,请阅读整个采用指南,以确保您了解该流程。提前为每个 RHOSP 服务准备必要的配置片断,并在将迁移应用到生产环境前在代表测试环境中测试迁移。
1.1. 采用限制 复制链接链接已复制到粘贴板!
在进行采用前,请检查哪些功能是技术预览或不支持的。
- 技术预览
以下功能是技术预览,在 Red Hat OpenStack Services on OpenShift 的上下文中没有测试:
- 共享文件系统服务(manila)的 NFS Ganesha 后端
- 用于块存储服务(cinder)的 iSCSI 和 FC 驱动程序.
Image Service (glance)的块存储服务后端
以下 Compute 服务(nova)功能是技术预览:
-
在 NFS 上使用
/var/lib/nova/instances的计算主机 - NUMA 感知 vswitches
- PCI 透传(根据类别)
- SR-IOV 可信虚拟功能
- vGPU
- 模拟虚拟可信平台模块(vTPM)
- UEFI
- AMD SEV
- 从 Rados 块设备(RBD)直接下载
- 文件备份内存
-
在 YAML 文件中定义自定义资源清单
provider.yaml
- 不支持的功能
采用过程不支持以下功能:
- 实例高可用性(instanceHA)
- 分布式 Compute 节点架构(DCN)
- dns-as-a-service (designate)
- 负载均衡服务(octavia)
- 边框网关协议(BGP)
- 采用联邦信息处理标准(FIPS)环境
- Key Manager 服务只支持简单的加密插件
1.2. 采用先决条件 复制链接链接已复制到粘贴板!
在开始使用过程前,请完成以下先决条件:
- 规划信息
- 查看 采用限制。
- 查看 Red Hat OpenShift Container Platform (RHOCP)要求、data plane 节点要求、Compute 节点要求等。如需更多信息,请参阅 规划部署。
- 查看特定于采用的网络要求。如需更多信息,请参阅为 RHOSO 部署配置网络。
- 查看针对采用的存储要求。如需更多信息,请参阅 存储要求。
- 查看如何使用您的环境所需的服务自定义部署的 control plane。如需更多信息,请参阅在 OpenShift 部署中自定义 Red Hat OpenStack Services。
- 熟悉断开连接的环境部署。如需更多信息,请参阅使用 director Operator 在 Red Hat OpenShift Container Platform 集群中部署 overcloud 中的 配置 airgapped 环境。
熟悉采用过程中使用的以下 RHOCP 概念:
- 熟悉将 RHOSO 版本映射到 OpenStack Operator 和 OpenStackVersion 自定义资源(CR)。如需更多信息,请参阅红帽知识库文章 RHOSO 版本如何映射到 OpenStack Operator 和 OpenStackVersion CR。
- 备份信息
使用以下选项之一备份 Red Hat OpenStack Platform (RHOSP) 17.1 环境:
- Relax-and-Recover 工具。有关更多信息,请参阅使用 Relax-and-Recover 工具备份和恢复 undercloud 和 control plane 节点 中的 备份 undercloud 和 control plane 节点。
- 快照和 Revert 工具。有关更多信息,请参阅使用 快照和 Revert 工具备份 Red Hat OpenStack Platform 集群,以 备份和恢复 undercloud 和 control plane 节点。
- 第三方备份和恢复工具。有关认证备份和恢复工具的更多信息,请参阅 红帽生态系统目录。
- 在文件系统上备份 RHOSP 服务和 director Operator 的配置文件。如需更多信息,请参阅从 director Operator 部署中提取配置。
- Compute
- 将 Compute 节点升级到 Red Hat Enterprise Linux 9.2。如需更多信息,请参阅 Framework 中 将所有 Compute 节点升级到 RHEL 9.2 (16.2 到 17.1)。
-
在 Compute 主机上,必须安装
systemd-container软件包,并且systemd-machined服务必须正在运行。有关如何验证软件包是否已安装并且服务是否正在运行,请参阅在 Compute 主机上安装systemd-container软件包。
- ML2/OVS
- 如果您将 Modular Layer 2 插件与 Open vSwitch 机制驱动程序(ML2/OVS)搭配使用,请将其迁移到带有 Open Virtual Networking (ML2/OVN)机制驱动程序的 Modular Layer 2 插件。如需更多信息,请参阅 迁移到 OVN 机制驱动程序。
- 工具
- oc 和 podman 命令行工具已安装在您的工作站上。
- 确保设置要运行命令的正确 RHOSO 项目命名空间。
在 director Operator 的采用中,源 Red Hat OpenStack Platform 17.1 命名空间是
openstack。要成功采用 RHOSP 17.1 环境,目标 RHOSO 18.0 命名空间必须有所不同,例如rhoso。$ oc project rhoso
- RHOSP 17.1 发行版本
- RHOSP 17.1 云更新至 17.1.4 或更高版本。如需更多信息,请参阅 执行 Red Hat OpenStack Platform 的次要更新。
- RHOSP 17.1 主机
- RHOSP 17.1 云的所有 control plane 和数据平面主机都已启动并运行,并在整个采用过程中继续运行。
1.3. 规划采用指南 复制链接链接已复制到粘贴板!
当计划在 OpenShift (RHOSO) 18.0 环境中采用 Red Hat OpenStack Services 时,请考虑更改的范围。采用范围与数据中心升级类似。不同的固件级别、硬件厂商、硬件配置文件、网络接口、存储接口等影响采用过程,并可能导致在采用过程中行为的变化。
查看以下指南以正确计划采用,并增加您成功完成采用的机会:
采用文档中的所有命令都是示例。在不了解命令的作用的情况下,不要复制并粘贴命令。
- 要最小化采用失败的风险,请减少暂存环境和生产站点之间的环境差异。
- 如果暂存环境不代表生产环境站点,或者暂存环境不可用,您必须计划在采用失败时包括应急时间。
查看每个主发行版本中的自定义 Red Hat OpenStack Platform (RHOSP)服务配置。
- 每个主版本都通过多个 OpenStack 版本进行升级。
- 每个主发行版本可能会弃用配置选项或更改配置的格式。
- 准备特定于您的环境的流程(MOP)方法,以减少运行采用过程中差异或忽略的步骤的风险。
您可以在暂存环境中使用代表硬件准备 MOP 并验证任何内容更改。
- 包括跨固件版本、其他接口或设备硬件以及代表暂存环境中的任何其他软件,以确保它能够广泛代表生产环境中存在的不同。
- 确保您在代表的暂存环境中验证任何 Red Hat Enterprise Linux 更新或升级。
- 使用 Satellite 在您的 data plane 节点所在的本地化和版本固定 RPM 内容。
- 在生产环境中,使用您在暂存环境中测试的内容。
1.4. 迁移过程概述 复制链接链接已复制到粘贴板!
熟悉采用过程的步骤和可选的 post-adoption 任务。
- 主要采用过程
- 升级后的任务
- 可选:运行 tempest 以验证整个采用过程是否正常工作。如需更多信息,请参阅验证和故障排除部署的云。
- 可选:执行从 RHEL 9.2 到 9.4 的次要更新。在完成采用过程后,您可以随时执行次要更新。如需更多信息,请参阅将您的环境更新至最新的维护版本。
- 可选:验证您是否从 Controller 节点迁移了所有服务,然后关闭节点。如果任何服务仍然在 Controller 节点上运行,如 Open Virtual Networking (ML2/OVN)、Object Storage 服务(swift)或 Red Hat Ceph Storage,请不要关闭节点。
1.5. 在 Compute 主机上安装 systemd-container 软件包 复制链接链接已复制到粘贴板!
在 OpenShift (RHOSO)数据平面上使用 Red Hat OpenStack Services 之前,您必须先验证 systemd-container 软件包是否已安装,并且所有 Compute 主机上运行 systemd-machined。您必须在没有此软件包的每个 Compute 主机上安装 systemd-container 软件包。
流程
- 以具有适当权限的用户身份登录 Compute 节点主机。
列出主机上运行的实例:
$ sudo machinectl list- 输出示例
MACHINE CLASS SERVICE OS VERSION ADDRESSES qemu-1-instance-000000b9 vm libvirt-qemu - - - qemu-2-instance-000000c2 vm libvirt-qemu - - - 2 machines listed.
验证
systemd-machined服务是否正在运行:$ sudo systemctl status systemd-machined.service- 输出示例
systemd-machined.service - Virtual Machine and Container Registration Service Loaded: loaded (/usr/lib/systemd/system/systemd-machined.service; static) Active: active (running) since Mon 2025-06-16 11:42:07 EDT; 2min 48s ago Docs: man:systemd-machined.service(8) man:org.freedesktop.machine1(5) Main PID: 136614 (systemd-machine) Status: "Processing requests..." Tasks: 1 (limit: 838860) Memory: 1.4M CPU: 33ms CGroup: /system.slice/systemd-machined.service └─136614 /usr/lib/systemd/systemd-machined Jun 16 11:42:07 computehost001 systemd[1]: Starting Virtual Machine and Container Registration Service... Jun 16 11:42:07 computehost001 systemd[1]: Started Virtual Machine and Container Registration Service. Jun 16 11:43:44 computehost001 systemd-machined[136614]: New machine qemu-1-instance-000000b9. Jun 16 11:43:51 computehost001 systemd-machined[136614]: New machine qemu-2-instance-000000c2.重要如果
systemd-machined服务正在运行,请跳过这个过程的其余部分。确保您验证systemd-machined服务是否正在运行集群中的每个 Compute 节点主机。
-
如果
systemd-machined服务没有运行,在安装systemd-container软件包之前,先从主机实时迁移所有虚拟机。有关实时迁移的更多信息,请参阅 执行 Red Hat OpenStack Platform 次要更新中的重新启动计算节点。https://docs.redhat.com/en/documentation/red_hat_openstack_platform/17.1/html/performing_a_minor_update_of_red_hat_openstack_platform/assembly_rebooting-the-overcloud_keeping-updated#proc_rebooting-compute-nodes_rebooting-the-overcloud 在主机上安装
systemd-container:-
如果您从早期版本的 Red Hat OpenStack Platform 升级了您的环境,请重启 Compute 主机来自动安装
systemd-container。 如果您部署了新的 RHOSO 环境,请使用以下命令手动安装
systemd-container。不需要重新引导 Compute 主机:$ sudo dnf -y install systemd-container注意如果您的 Compute 主机没有运行虚拟机,您可以自动安装
systemd-container或手动安装。
-
如果您从早期版本的 Red Hat OpenStack Platform 升级了您的环境,请重启 Compute 主机来自动安装
-
在
systemd-machined服务没有运行的集群中,在集群中的每个 Compute 主机上重复此步骤。
1.6. Identity 服务身份验证 复制链接链接已复制到粘贴板!
如果您启用了自定义策略,请完成以下步骤进行采用:
- 删除自定义策略。
- 运行采用。
- 使用新的 SRBAC 语法重新添加自定义策略。
红帽不支持自定义角色或策略。语法错误或错误应用授权可能会对安全性或可用性造成负面影响。如果在生产环境中需要自定义角色或策略,请在开始采用前联系红帽支持例外。
在将基于 director Operator 的 OpenStack 部署到 OpenShift 部署上的 Red Hat OpenStack Services 后,Identity 服务使用 Secure RBAC (SRBAC)执行用户身份验证和授权。如果已经启用了 SRBAC,则不会改变如何执行操作。如果禁用 SRBAC,则使用基于 director Operator 的 OpenStack 部署可能会更改因为 API 访问策略的变化来执行操作。
如需有关 SRBAC 的更多信息,请参阅 执行 安全操作中的 Red Hat OpenStack Services 中的安全基于角色的访问控制。
1.7. 在 OpenShift 部署中为 Red Hat OpenStack Services 配置网络 复制链接链接已复制到粘贴板!
在 OpenShift (RHOSO)部署中采用新的 Red Hat OpenStack Services 时,您必须将网络配置与采用的集群保持一致,以保持现有工作负载的连接。
执行以下任务,以纳入现有网络配置:
- 配置 Red Hat OpenShift Container Platform (RHOCP) worker 节点,使 VLAN 标签和 IP 地址管理(IPAM)配置与现有部署保持一致。
- 配置 control plane 服务,以将兼容 IP 范围用于服务和负载平衡 IP 地址。
- 配置 data plane 节点,为 VLAN 标签和 IPAM 使用对应的兼容配置。
在配置节点和服务时,常规方法如下:
- 对于 IPAM,您可以重复使用现有部署的子网范围,或者现有子网中有可用 IP 地址,请为新的 control plane 服务定义新范围。如果定义新范围,您可以在旧范围和新范围之间配置 IP 路由。如需更多信息,请参阅 规划您的 IPAM 配置。
- 对于 VLAN 标签,始终从现有部署重复使用配置。
如需有关网络架构和配置的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 为 Red Hat OpenStack Services 准备 网络,以及网络 中的 About 网络 。
有关 newtork 架构和配置带有边框网关协议(BGP)环境的 RHOSO 动态路由的更多信息,请参阅部署动态路由环境中的 OpenShift 中的 为 Red Hat OpenStack Services 准备网络。
1.7.1. 从现有部署检索网络配置 复制链接链接已复制到粘贴板!
您必须确定现有部署中定义的隔离网络。检索网络配置后,您具有以下信息:
- 在现有部署中使用的隔离网络列表。
- 对于每个隔离的网络,用于动态地址分配的 VLAN 标签和 IP 范围。
- 环境中使用的现有 IP 地址分配列表。当重复使用现有子网范围来托管新的 control plane 服务时,这些地址将不包括在对应的分配池中。
如需有关 director Operator 网络配置的更多信息,请参阅使用 director Operator 在 Red Hat OpenShift Container Platform 集群中使用 director Operator 创建网络。
流程
在
network_data.yaml文件中找到网络配置。例如:- name: InternalApi mtu: 1500 vip: true vlan: 20 name_lower: internal_api dns_domain: internal.mydomain.tld. service_net_map_replace: internal subnets: internal_api_subnet: ip_subnet: '172.17.0.0/24' allocation_pools: [{'start': '172.17.0.4', 'end': '172.17.0.250'}]-
检索
vlan键中使用的 VLAN 标签,以及每个隔离的网络的ip_subnet键中的 IP 范围,来自network_data.yaml文件。当从新的 control plane 服务的现有部署中重复使用子网范围时,范围将分成单独的池,用于 control plane 服务和负载均衡器 IP 地址。 使用
tripleo-ansible-inventory.yaml文件来确定已在采用的环境中使用的 IP 地址列表。对于文件中列出的每个主机,记下节点消耗的 IP 和 VIP 地址。例如:Standalone: hosts: standalone: ... internal_api_ip: 172.17.0.100 ... ... standalone: children: Standalone: {} vars: ... internal_api_vip: 172.17.0.2 ...注意在本例中,会使用
172.17.0.2和172.17.0.100值,在采用完前,新的 control plane 服务将不可用。- 对配置中的每个隔离网络和每个主机重复此步骤。
1.7.2. 规划您的 IPAM 配置 复制链接链接已复制到粘贴板!
在 OpenShift 上的 Red Hat OpenStack Services (RHOSO)部署中,部署在 Red Hat OpenShift Container Platform (RHOCP) worker 节点上的每个服务都需要 IP 地址管理(IPAM)池。在 Red Hat OpenStack Platform (RHOSP)部署中,托管在 Controller 节点上的所有服务共享相同的 IP 地址。
RHOSO control plane 对为服务提供的 IP 地址数量有不同的要求。根据现有 RHOSO 部署中使用的 IP 范围大小,您可以为 RHOSO control plane 重复使用这些范围。
每个隔离网络中新 control plane 服务所需的 IP 地址总数计算为以下网络的总和:
-
RHOCP worker 节点数量。每个 worker 节点都需要
NodeNetworkConfigurationPolicy自定义资源(CR)中的一个 IP 地址。 -
data plane 节点所需的 IP 地址数量。每个节点都需要来自
NetConfigCR 的 IP 地址。 -
control plane 服务所需的 IP 地址数量。每个服务都需要来自
NetworkAttachmentDefinitionCR 的 IP 地址。这个数量取决于每个服务的副本数。 -
负载均衡器 IP 地址所需的 IP 地址数量。每个服务都需要来自
IPAddressPoolCR 的虚拟 IP 地址。
例如,使用 Red Hat OpenShift Local 简单的 worker 节点 RHOCP 部署为 internalapi 网络定义了以下 IP 范围:
- 单个 worker 节点的 IP 地址
- data plane 节点的 IP 地址
-
control plane 服务的
NetworkAttachmentDefinitionCR:X.X.X.30-X.X.X.70(41 addresses) -
负载均衡器 IP 的
IPAllocationPoolCR:X.X.X.80-X.X.X.90(11 地址)
本例显示了分配给 internalapi 分配池的 54 个 IP 地址。
要求可能会根据要部署的 RHOSP 服务列表、其副本数以及 RHOCP worker 节点和数据平面节点的数量而有所不同。
在以后的 RHOSP 发行版本中可能需要额外的 IP 地址,因此您必须为新环境中使用的每个分配池规划一些额外的容量。
在为新部署确定所需的 IP 池大小后,您可以选择定义新的 IP 地址范围或重复使用现有的 IP 地址范围。无论场景如何,现有部署中的 VLAN 标签都会在新部署中重复使用。确保新配置中正确保留 VLAN 标签。如需更多信息,请参阅配置隔离网络。
1.7.2.1. 配置新子网范围 复制链接链接已复制到粘贴板!
如果您在大多数情况下使用 IPv6,则可以重复使用现有的子网范围。有关现有子网范围的更多信息,请参阅 重复使用现有子网范围。
您可以为属于集群中没有使用的不同子网的 control plane 服务定义新的 IP 范围。然后,您可以配置现有子网和新子网之间的链接本地 IP 路由,以启用现有的和新服务部署进行通信。这涉及在预采用的集群中使用 director Operator 机制来配置额外的链接本地路由。这可让数据平面部署使用现有子网地址连接到 Red Hat OpenStack Platform (RHOSP)节点。您可以将新子网范围用于任何现有子网配置,当现有集群子网范围没有足够可用 IP 地址用于新的 control plane 服务时。
您必须正确调整新子网的大小,以适应新的 control plane 服务。RHOSP 环境已消耗的现有部署分配池没有特定要求。
不支持为存储和存储管理定义新子网,因为计算服务(nova)和 Red Hat Ceph Storage 不允许在采用期间修改这些网络。
在以下步骤中,您要将 NetworkAttachmentDefinition 自定义资源(CR)配置为使用与同一网络的 OpenStackDataPlaneNodeSet CR 的 network_config 部分中配置的不同子网。NetworkAttachmentDefinition CR 中的新范围用于 control plane 服务,而 OpenStackDataPlaneNodeSet CR 中的现有范围则用于管理数据平面节点的 IP 地址管理(IPAM)。
以下流程中使用的值是示例。使用特定于您的配置的值。
如需有关 director Operator 网络配置的更多信息,请参阅使用 director Operator 在 Red Hat OpenShift Container Platform 集群中使用 director Operator 创建网络。
流程
在现有部署节点上为 control plane 子网配置 link local 路由。这可以通过 director Operator 配置完成:
network_config: - type: ovs_bridge name: br-ctlplane routes: - ip_netmask: 0.0.0.0/0 next_hop: 192.168.1.1 - ip_netmask: 172.31.0.0/241 next_hop: 192.168.1.1002 对需要为部署的新和现有部分使用不同子网的其他网络重复此配置。
将新配置应用到每个 RHOSP 节点:
(undercloud)$ openstack overcloud network provision \ --output <deployment_file> \ [--templates <templates_directory>]/home/stack/templates/<networks_definition_file>(undercloud)$ openstack overcloud node provision \ --stack <stack> \ --network-config \ --output <deployment_file> \ [--templates <templates_directory>]/home/stack/templates/<node_definition_file>-
可选:包含--
templates选项以使用您自己的模板,而不是位于/usr/share/openstack-tripleo-heat-templates中的默认模板。将<templates_directory>替换为包含模板的目录的路径。 -
将
<stack> 替换为置备裸机节点的堆栈的名称。如果未指定,则默认为overcloud。 -
包含
--network-config可选参数,为cli-overcloud-node-network-config.yamlAnsible playbook 提供网络定义。cli-overcloud-node-network-config.yamlplaybook 使用os-net-config工具在部署的节点上应用网络配置。如果不使用 use-network-config提供网络定义,则必须在network-environment.yaml文件中配置{{role.name}}NetworkConfigTemplate参数,否则将使用默认网络定义。 -
将
<deployment_file>替换为用于部署命令生成的 heat 环境文件的名称,如/home/stack/templates/overcloud-baremetal-deployed.yaml。 将
<node_definition_file> 替换为节点定义文件的名称,如overcloud-baremetal-deploy.yaml。确保在节点定义文件中将network_config_update变量设置为true。注意默认不会应用网络配置更改,以避免出现网络中断的风险。您必须在 director Operator 配置文件中设置
StandaloneNetworkConfigUpdate: true来强制实施更改。
-
可选:包含--
确认每个节点上有新的链接本地路由到新子网。例如:
# ip route | grep 172 172.31.0.0/24 via 192.168.122.100 dev br-ctlplane您还必须配置本地路由到 OpenShift (RHOSO) worker 节点上的现有部署。这可以通过为每个网络将
路由条目添加到NodeNetworkConfigurationPolicyCR 来实现。例如:- destination: 192.168.122.0/241 next-hop-interface: ospbr2 因此,在 RHOCP 节点中添加以下路由:
# ip route | grep 192 192.168.122.0/24 dev ospbr proto static scope link之后,在 data plane 采用过程中,在
OpenStackDataPlaneNodeSetCR 的network_config部分中,为新 control plane 子网范围添加相同的链接本地路由。例如:nodeTemplate: ansible: ansibleUser: root ansibleVars: additional_ctlplane_host_routes: - ip_netmask: 172.31.0.0/24 next_hop: '{{ ctlplane_ip }}' edpm_network_config_template: | network_config: - type: ovs_bridge routes: {{ ctlplane_host_routes + additional_ctlplane_host_routes }} ...列出现有部署中用于 data plane 节点的 IP 地址,存为
ansibleHost和fixedIP。例如:nodes: standalone: ansible: ansibleHost: 192.168.122.100 ansibleUser: "" hostName: standalone networks: - defaultRoute: true fixedIP: 192.168.122.100 name: ctlplane subnetName: subnet1重要在采用过程中不要更改 RHOSP 节点 IP 地址。在
OpenStackDataPlaneNodeSetCR 的nodes部分中,列出之前在fixedIP字段中为每个节点条目使用 IP 地址。扩展防火墙配置的 SSH 范围,使其包含两个子网,以允许从两个子网的 SSH 访问 data plane 节点:
edpm_sshd_allowed_ranges: - 192.168.122.0/24 - 172.31.0.0/24这提供了从新子网到 RHOSP 节点以及 RHOSP 子网的 SSH 访问。
1.7.2.2. 重复使用现有子网范围 复制链接链接已复制到粘贴板!
如果现有子网范围有足够的 IP 地址来分配给新的 control plane 服务,您可以重复使用它们。您可以将新的 control plane 服务配置为使用与 Red Hat OpenStack Platform (RHOSP)环境中使用的相同的子网,并配置供新服务使用的分配池,以排除已分配给现有集群节点的 IP 地址。通过重复使用现有子网,您可以避免现有子网和新子网之间的附加本地路由配置。
如果您的现有子网在新的 control plane 服务的现有子网范围内没有足够的 IP 地址,您必须创建新的子网范围。如需更多信息,请参阅使用新子网范围。
不需要特殊的路由配置来重复利用子网范围。但是,您必须确保 RHOSP 服务使用的 IP 地址与 OpenShift control plane 服务上为 Red Hat OpenStack Services 配置的新分配池重叠。
如果您特别受现有子网的大小的限制,您可能必须在为新的 control plane 服务定义分配池时应用详细排除规则。如需更多信息,请参阅配置隔离网络。
1.7.3. 配置隔离网络 复制链接链接已复制到粘贴板!
在开始在 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services 中复制现有的 VLAN 和 IPAM 配置前,您必须为新的 control plane 服务具有以下 IP 地址分配:
-
每个 Red Hat OpenShift Container Platform (RHOCP) worker 节点上每个隔离的网络的 1 个 IP 地址。您可以在 RHOCP worker 节点的
NodeNetworkConfigurationPolicy自定义资源(CR)中配置这些 IP 地址。如需更多信息,请参阅配置 RHOCP worker 节点。 -
每个数据平面节点的每个隔离网络有 1 个 IP 范围。您可以在 data plane 节点的
NetConfigCR 中配置这些范围。如需更多信息,请参阅配置数据平面节点。 -
每个用于 control plane 服务的隔离网络有一个 IP 范围。这些范围在
NetworkAttachmentDefinitionCR 中为隔离的网络启用 pod 连接。如需更多信息,请参阅为 control plane 服务配置网络。 -
每个用于负载均衡器 IP 地址的每个隔离的网络的 IP 范围。这些 IP 范围在
IPAddressPoolCR 中为 MetalLB 定义负载均衡器 IP 地址。如需更多信息,请参阅为 control plane 服务配置网络。
以下流程中隔离网络的确切列表和配置应反映实际 Red Hat OpenStack Platform 环境。隔离网络的数量可能与流程中使用的示例不同。IPAM 方案可能有所不同。仅会显示与配置网络相关的部分配置。以下流程中使用的值是示例。使用特定于您的配置的值。
1.7.3.1. 在 RHOCP worker 节点上配置隔离网络 复制链接链接已复制到粘贴板!
要将服务 pod 连接到运行 Red Hat OpenStack Platform 服务的 Red Hat OpenShift Container Platform (RHOCP) worker 节点上的隔离网络,需要虚拟机监控程序上的物理网络配置。
此配置由 NMState operator 管理,它使用 NodeNetworkConfigurationPolicy 自定义资源(CR)为节点定义所需的网络配置。
流程
对于每个 RHOCP worker 节点,定义一个
NodeNetworkConfigurationPolicyCR,用于描述所需的网络配置。例如:apiVersion: v1 items: - apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy spec: desiredState: interfaces: - description: internalapi vlan interface ipv4: address: - ip: 172.17.0.10 prefix-length: 24 dhcp: false enabled: true ipv6: enabled: false name: enp6s0.20 state: up type: vlan vlan: base-iface: enp6s0 id: 20 reorder-headers: true - description: storage vlan interface ipv4: address: - ip: 172.18.0.10 prefix-length: 24 dhcp: false enabled: true ipv6: enabled: false name: enp6s0.21 state: up type: vlan vlan: base-iface: enp6s0 id: 21 reorder-headers: true - description: tenant vlan interface ipv4: address: - ip: 172.19.0.10 prefix-length: 24 dhcp: false enabled: true ipv6: enabled: false name: enp6s0.22 state: up type: vlan vlan: base-iface: enp6s0 id: 22 reorder-headers: true nodeSelector: kubernetes.io/hostname: ocp-worker-0 node-role.kubernetes.io/worker: ""
1.7.3.2. 在 control plane 服务中配置隔离网络 复制链接链接已复制到粘贴板!
在 NMState Operator 为隔离网络创建所需的 hypervisor 网络配置后,您必须配置 Red Hat OpenStack Platform (RHOSP)服务以使用配置的接口。您可以为每个隔离网络定义一个 NetworkAttachmentDefinition 自定义资源(CR)。在一些集群中,这些 CR 由 Cluster Network Operator 管理,在这种情况下,使用 Network CR。如需更多信息,请参阅 Networking 中的 Cluster Network Operator。
流程
为每个隔离网络定义一个
NetworkAttachmentDefinitionCR。例如:apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: internalapi spec: config: | { "cniVersion": "0.3.1", "name": "internalapi", "type": "macvlan", "master": "enp6s0.20", "ipam": { "type": "whereabouts", "range": "172.17.0.0/24", "range_start": "172.17.0.20", "range_end": "172.17.0.50" } }重要确保接口名称和 IPAM 范围与您在
NodeNetworkConfigurationPolicyCR 中使用的配置匹配。可选: 在重复使用现有 IP 范围时,您可以使用
NetworkAttachmentDefinition池中的exclude参数排除现有部署中使用的范围的一部分。例如:apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: internalapi spec: config: | { "cniVersion": "0.3.1", "name": "internalapi", "type": "macvlan", "master": "enp6s0.20", "ipam": { "type": "whereabouts", "range": "172.17.0.0/24", "range_start": "172.17.0.20",1 "range_end": "172.17.0.50",2 "exclude": [3 "172.17.0.24/32", "172.17.0.44/31" ] } }如果您的 RHOSP 服务需要负载均衡器 IP 地址,请在
IPAddressPoolCR 中定义这些服务的池。例如:注意负载均衡器 IP 地址属于与 control plane 服务相同的 IP 范围,并由 MetalLB 管理。此池也应该与 RHOSP 配置保持一致。
- apiVersion: metallb.io/v1beta1 kind: IPAddressPool spec: addresses: - 172.17.0.60-172.17.0.70为每个需要负载均衡器 IP 地址的隔离网络定义
IPAddressPoolCR。可选: 在重复使用现有 IP 范围时,您可以通过列出
IPAddressPool的 address 部分中的多个条目来排除范围的一部分。例如:- apiVersion: metallb.io/v1beta1 kind: IPAddressPool spec: addresses: - 172.17.0.60-172.17.0.64 - 172.17.0.66-172.17.0.70上面的示例将排除来自分配池的
172.17.0.65地址。
1.7.3.3. 在 data plane 节点上配置隔离网络 复制链接链接已复制到粘贴板!
data plane 节点由 OpenStack Operator 和 OpenStackDataPlaneNodeSet 自定义资源(CR)配置。OpenStackDataPlaneNodeSet CR 为节点定义所需的网络配置。
您的 Red Hat OpenStack Services on OpenShift (RHOSO)网络配置应反映现有的 Red Hat OpenStack Platform (RHOSP)网络设置。您必须从每个 RHOSP 节点拉取 network_data.yaml 文件,并在定义 OpenStackDataPlaneNodeSet CR 时重复使用它们。配置的格式不会改变,因此您可以将网络模板置于 edpm_network_config_template 变量下,可以是所有节点还是每个节点。
流程
使用所需的 VLAN 标签和 IPAM 配置来配置
NetConfigCR。例如:apiVersion: network.openstack.org/v1beta1 kind: NetConfig metadata: name: netconfig spec: networks:1 - name: internalapi dnsDomain: internalapi.example.com subnets: - name: subnet1 allocationRanges: - end: 172.17.0.250 start: 172.17.0.100 cidr: 172.17.0.0/24 vlan: 20 - name: storage dnsDomain: storage.example.com subnets: - name: subnet1 allocationRanges: - end: 172.18.0.250 start: 172.18.0.100 cidr: 172.18.0.0/24 vlan: 21 - name: tenant dnsDomain: tenant.example.com subnets: - name: subnet1 allocationRanges: - end: 172.19.0.250 start: 172.19.0.100 cidr: 172.19.0.0/24 vlan: 22- 1
网络组成必须与源云配置匹配,以避免数据平面连接停机时间。
可选:在
NetConfigCR 中,列出allocationRanges字段的多个范围来排除一些 IP 地址,例如,以适应被采用的环境消耗的 IP 地址:apiVersion: network.openstack.org/v1beta1 kind: NetConfig metadata: name: netconfig spec: networks: - name: internalapi dnsDomain: internalapi.example.com subnets: - name: subnet1 allocationRanges: - end: 172.17.0.199 start: 172.17.0.100 - end: 172.17.0.250 start: 172.17.0.201 cidr: 172.17.0.0/24 vlan: 20本例从池中排除
172.17.0.200地址。
1.8. 存储要求 复制链接链接已复制到粘贴板!
Red Hat OpenStack Platform (RHOSP)部署中的存储指的是以下类型:
- 运行该服务所需的存储
- 服务管理的存储
在 Red Hat OpenStack Services on OpenShift (RHOSO)中部署服务前,您必须检查存储要求,规划您的 Red Hat OpenShift Container Platform (RHOCP)节点选择,准备您的 RHOCP 节点等。
1.8.1. 存储驱动程序认证 复制链接链接已复制到粘贴板!
在将 Red Hat OpenStack Platform 17.1 部署到 OpenShift (RHOSO) 18.0 部署之前,请确认部署的存储驱动程序已认证,以便与 RHOSO 18.0 搭配使用。
有关认证用于 RHOSO 18.0 的软件的详情,请查看 红帽生态系统目录。
1.8.2. 块存储服务指南 复制链接链接已复制到粘贴板!
准备采用您的块存储服务(cinder):
- 记录您使用的块存储服务后端。
- 确定块存储服务后端使用的所有传输协议,如 RBD、iSCSI、FC、NFS、NVMe-TCP 等。当放置块存储服务以及正确的存储传输相关二进制文件在 Red Hat OpenShift Container Platform (RHOCP)节点上运行时,您必须考虑它们。有关每个存储传输协议的更多信息,请参阅 RHOCP 准备块存储服务使用。
使用块存储服务卷服务部署每个块存储服务卷后端。
例如,您有一个 LVM 后端、Ceph 后端,以及
cinderVolumes中的两个条目,并且您无法为所有卷服务设置全局默认值。您必须为每个服务定义一个服务:apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack spec: cinder: enabled: true template: cinderVolumes: lvm: customServiceConfig: | [DEFAULT] debug = True [lvm] < . . . > ceph: customServiceConfig: | [DEFAULT] debug = True [ceph] < . . . >警告检查所有配置选项是否仍对 RHOSO 18.0 版本有效。配置选项可能已弃用、删除或添加。这适用于特定于后端驱动程序的配置选项和其他通用选项。
1.8.3. 使用块存储服务的限制 复制链接链接已复制到粘贴板!
在开始使用块存储服务(cinder)前,请查看以下限制:
-
所有块存储服务卷都没有全局
nodeSelector选项。您必须为每个后端指定nodeSelector。 -
所有块存储服务卷都没有全局
customServiceConfig或customServiceConfigSecrets选项。您必须为每个后端指定这些选项。 - 对需要 Red Hat Enterprise Linux 中包含的内核模块的块存储服务后端的支持没有在 OpenShift (RHOSO)上的 Red Hat OpenStack Services 中测试。
1.8.4. RHOCP 准备块存储服务采用 复制链接链接已复制到粘贴板!
在 Red Hat OpenShift Container Platform (RHOCP)节点中部署 Red Hat OpenStack Platform (RHOSP)之前,请确保网络已就绪,您决定要限制哪些 RHOCP 节点,并对 RHOCP 节点进行任何更改。
- 节点选择
您可能需要限制运行块存储服务卷和备份服务的 RHOCP 节点。
您需要限制特定块存储服务的节点的示例是使用 LVM 驱动程序部署块存储服务时。在这种情况下,卷仅存储在特定主机中的 LVM 数据,因此您需要将块存储卷服务固定到特定的 RHOCP 节点。在任何其他 RHOCP 节点上运行该服务不起作用。您不能使用 RHOCP 主机节点名称来限制 LVM 后端。您需要使用唯一标签、现有标签或新标签来识别 LVM 后端:
$ oc label nodes worker0 lvm=cinder-volumesapiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack spec: secret: osp-secret storageClass: local-storage cinder: enabled: true template: cinderVolumes: lvm-iscsi: nodeSelector: lvm: cinder-volumes < . . . >有关节点选择的更多信息,请参阅关于节点选择器。
注意如果您的节点没有足够的本地磁盘空间用于临时镜像,您可以通过设置额外卷功能
extraMount来使用远程 NFS 位置。- 传输协议
RHOCP 可能需要对存储传输协议进行一些更改:
-
如果您使用
MachineConfig更改 RHOCP 节点,节点将重新引导。 -
检查
cinder.conf文件中的enabled_backends配置选项中列出的后端部分,以确定启用的存储后端部分。 -
根据后端,您可以通过查看
volume_driver或target_protocol配置选项来查找传输协议。 iscsid服务、multipathd服务和NVMe-TCP内核模块在 data plane 节点上自动启动。- NFS
- RHOCP 在不进行其他更改的情况下连接到 NFS 后端。
- RADOS 块设备和 Red Hat Ceph Storage
- RHOCP 无需额外更改即可连接到红帽 Ceph 存储后端。您必须为服务提供凭证和配置文件。
- iSCSI
- 要连接到 iSCSI 卷,iSCSI 启动器必须在运行卷和备份服务的 RHOCP 主机上运行。Linux Open iSCSI 启动器不支持网络命名空间,因此您必须只针对正常的 RHOCP 使用运行一个服务实例,以及 RHOCP CSI 插件和 RHOSP 服务。
如果您还没有在 RHOCP 节点上运行
iscsid,则必须应用MachineConfig。例如:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker service: cinder name: 99-master-cinder-enable-iscsid spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: iscsid.service-
如果使用标签来限制运行块存储服务的节点,则必须使用
MachineConfigPool将MachineConfig的影响限制为服务可能运行的节点。如需更多信息,请参阅关于节点选择器。 -
如果您使用单一节点部署来测试流程,请在
MachineConfig中将worker替换为master。 - 对于使用 iSCSI 卷的生产环境部署,请配置多路径以获得更好的 I/O。
- FC
- 块存储服务卷和块存储服务备份服务必须在具有主机总线适配器(HBA)的 RHOCP 主机中运行。如果某些节点没有 HBA,则使用标签来限制这些服务的运行位置。如需更多信息,请参阅关于节点选择器。
- 如果您有使用 FC 的虚拟化 RHOCP 集群,则需要在虚拟机中公开主机 HBA。
- 对于使用 FC 卷的生产环境部署,请配置多路径以获得更好的 I/O。
- NVMe-TCP
- 要连接到 NVMe-TCP 卷,请在 RHOCP 主机上加载 NVMe-TCP 内核模块。
如果您还没有在运行卷和备份服务的 RHOCP 节点上加载
nvme-fabrics模块,则必须应用MachineConfig。例如:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker service: cinder name: 99-master-cinder-load-nvme-fabrics spec: config: ignition: version: 3.2.0 storage: files: - path: /etc/modules-load.d/nvme_fabrics.conf overwrite: false # Mode must be decimal, this is 0644 mode: 420 user: name: root group: name: root contents: # Source can be a http, https, tftp, s3, gs, or data as defined in rfc2397. # This is the rfc2397 text/plain string format source: data:,nvme-fabrics-
如果使用标签来限制运行块存储服务的节点,请使用
MachineConfigPool将MachineConfig的影响限制为服务运行的节点。如需更多信息,请参阅关于节点选择器。 -
如果使用单一节点部署来测试流程,请在
MachineConfig中将worker替换为master。 -
仅加载
nvme-fabrics模块,因为它根据需要加载特定于传输的模块,如 TCP、RDMA 或 FC。 - 对于使用 NVMe-TCP 卷的生产环境部署,使用多路径来获得更好的 I/O。对于 NVMe-TCP 卷,RHOCP 使用原生多路径,称为 ANA。
在 RHOCP 节点重新引导并加载
nvme-fabrics模块后,您可以通过检查主机来确认操作系统是否已配置,并支持 ANA:$ cat /sys/module/nvme_core/parameters/multipath重要ANA 不使用 Linux 多路径设备映射器,但 RHOCP 需要
multipathd在 Compute 节点上运行,以便计算服务(nova)能够使用多路径。当多路径被置备时,会在 data plane 节点上自动配置多路径。
- 多路径(Multipathing)
对 iSCSI 和 FC 协议使用多路径。要在这些协议中配置多路径,您可以执行以下任务:
- 准备 RHOCP 主机
- 配置块存储服务
- 准备 Compute 服务节点
- 配置 Compute 服务
要准备 RHOCP 主机,请使用
MachineConfig确保在 RHOCP 主机上配置并运行 Linux 多路径设备映射器。例如:# Includes the /etc/multipathd.conf contents and the systemd unit changes apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker service: cinder name: 99-master-cinder-enable-multipathd spec: config: ignition: version: 3.2.0 storage: files: - path: /etc/multipath.conf overwrite: false # Mode must be decimal, this is 0600 mode: 384 user: name: root group: name: root contents: # Source can be a http, https, tftp, s3, gs, or data as defined in rfc2397. # This is the rfc2397 text/plain string format source: data:,defaults%20%7B%0A%20%20user_friendly_names%20no%0A%20%20recheck_wwid%20yes%0A%20%20skip_kpartx%20yes%0A%20%20find_multipaths%20yes%0A%7D%0A%0Ablacklist%20%7B%0A%7D systemd: units: - enabled: true name: multipathd.service-
如果使用标签来限制运行块存储服务的节点,您需要使用
MachineConfigPool将MachineConfig的影响限制为服务运行的节点。如需更多信息,请参阅关于节点选择器。 -
如果您使用单一节点部署来测试流程,请在
MachineConfig中将worker替换为master。 - Cinder 卷和备份默认配置为使用多路径。
-
如果您使用
1.8.5. 转换块存储服务配置 复制链接链接已复制到粘贴板!
在之前的部署中,您将对所有服务使用相同的 cinder.conf 文件。要准备块存储服务(cinder)配置以采用,请将此单文件配置分成各个块存储服务的单个配置。参阅以下信息来指导您完成之前的配置:
-
确定所有块存储服务的配置是通用的,并删除在 Red Hat OpenShift Container Platform (RHOCP)中部署时可能会更改的任何部分,如
[database]部分中的连接,即[DEFAULT]部分中的transport_url和log_dir,整个[coordination]和[barbican]部分。剩余的通用配置进入customServiceConfig选项或Secret自定义资源(CR),然后在cinder: template:level 的customServiceConfigSecrets部分中使用。 -
确定是否有特定于调度程序的配置,并将其添加到
cinder: template: cinderScheduler中的customServiceConfig选项中。 -
确定是否有特定于 API 的配置,并将其添加到
cinder: template: cinderAPI中的customServiceConfig选项中。 -
如果部署了块存储服务备份,请将块存储服务备份配置选项添加到
customServiceConfig选项,或添加到cinder: template: cinderBackup:level 的customServiceConfigSecrets部分的SecretCR 中。删除[DEFAULT]部分中的主机配置,以便稍后支持多个副本。 -
确定每个驱动程序的单个卷后端配置。配置位于特定的驱动程序部分,它使用
[backend_defaults]部分和 FC zoning 部分(如果使用它们)。Block Storage Service operator 不支持所有卷服务的全局customServiceConfig选项。每个后端在cinder: template: cinderVolumes下都有自己的部分,并且配置位于customServiceConfig选项或SecretCR 中,然后在customServiceConfigSecrets部分中使用。 如果任何块存储服务卷驱动程序需要自定义厂商镜像,请在 红帽生态系统目录 中找到镜像的位置,并使用
cinderVolumes部分中的键创建或修改OpenStackVersionCR 来指定自定义镜像。例如,如果您有以下配置:
spec: cinder: enabled: true template: cinderVolume: pure: customServiceConfigSecrets: - openstack-cinder-pure-cfg < . . . >然后,描述该后端容器镜像的
OpenStackVersionCR 类似以下示例:apiVersion: core.openstack.org/v1beta1 kind: OpenStackVersion metadata: name: openstack spec: customContainerImages: cinderVolumeImages: pure: registry.connect.redhat.com/purestorage/openstack-cinder-volume-pure-rhosp-18-0'注意OpenStackVersion的名称必须与OpenStackControlPlaneCR 的名称匹配。如果您的块存储服务使用外部文件(例如,对于自定义策略),或者存储凭证或 SSL 证书颁发机构捆绑包以连接到存储阵列,请将这些文件提供给正确的容器。使用
Secrets或ConfigMap将信息存储在 RHOCP 中,然后存储在extraMounts键中。例如,对于存储在名为ceph-conf-files的Secret中的 Red Hat Ceph Storage 凭证,您可以在OpenstackControlPlaneCR 中修补顶级extraMounts密钥:spec: extraMounts: - extraVol: - extraVolType: Ceph mounts: - mountPath: /etc/ceph name: ceph readOnly: true propagation: - CinderVolume - CinderBackup - Glance volumes: - name: ceph projected: sources: - secret: name: ceph-conf-files对于特定于服务的文件,如 API 策略,您可以在服务本身中添加配置。在以下示例中,您将包含
CinderAPI配置来引用您要从名为my-cinder-conf的ConfigMap添加的策略,其具有策略键,其内容如下:spec: cinder: enabled: true template: cinderAPI: customServiceConfig: | [oslo_policy] policy_file=/etc/cinder/api/policy.yaml extraMounts: - extraVol: - extraVolType: Ceph mounts: - mountPath: /etc/cinder/api name: policy readOnly: true propagation: - CinderAPI volumes: - name: policy projected: sources: - configMap: name: my-cinder-conf items: - key: policy path: policy.yaml
1.8.6. 通过 NFS 更改 CephFS 复制链接链接已复制到粘贴板!
本节中的内容 作为技术预览提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。如需更多信息,请参阅 技术预览。
在开始采用前,请查看以下信息,以了解 Red Hat OpenStack Platform (RHOSP) 17.1 和 OpenShift (RHOSO) 18.0 上的 NFS 通过 NFS 的更改:
-
如果 RHOSP 17.1 部署通过 NFS 作为共享文件系统服务(manila)的后端,则无法将 RHOSP Controller 节点上的
ceph-nfs服务直接导入到 RHOSO 18.0 中。在 RHOSO 18.0 中,共享文件系统服务只支持使用在 Red Hat Ceph Storage 集群上直接管理的集群的 NFS 服务。与ceph-nfs服务搭配使用涉及对现有 NFS 客户端的数据路径中断。 -
在 RHOSP 17.1 上,Pacemaker 控制
ceph-nfs服务的高可用性。此服务分配由 Pacemaker 管理的虚拟 IP (VIP)地址。VIP 通常在隔离的StorageNFS网络上创建。Controller 节点在这个 VIP、ceph-nfs和共享文件系统服务(manila)共享管理器服务之间建立排序和并置限制。在使用共享文件系统服务前,您必须调整 Pacemaker 排序和并置限制来分隔共享管理器服务。这将ceph-nfs与其 VIP 建立为隔离的独立 NFS 服务,您可以在完成 RHOSO 应用后停用。 - 在 Red Hat Ceph Storage 7 中,在使用共享文件系统服务前,必须使用 Ceph Orchestrator 将原生集群的 Ceph NFS 服务部署到 Red Hat Ceph Storage 集群上。这个 NFS 服务最终会替换部署中 RHOSP 17.1 的独立 NFS 服务。当共享文件系统服务采用 RHOSO 18.0 环境时,它会对新的集群的 Ceph NFS 服务建立所有现有导出和客户端限制。客户端可以继续在现有 NFS 共享上读取和写入数据,并且在停用旧的独立 NFS 服务前不会受到影响。在服务停用后,您可以在计划停机期间从新集群的 Ceph NFS 服务重新挂载相同的共享。
-
为确保 NFS 用户不需要对现有工作负载进行任何网络更改,请将同一隔离的
StorageNFS网络中的 IP 地址分配给集群的 Ceph NFS 服务。NFS 用户只需要使用新的导出路径发现和重新挂载其共享。采用完成后,RHOSO 用户可以查询共享文件系统服务 API,以列出现有共享上的导出位置,以识别挂载这些共享的首选路径。这些首选路径与新的集群 Ceph NFS 服务对应,这与继续显示的其他非首选导出路径相反,直到旧的隔离独立 NFS 服务停用为止。
有关设置集群的 NFS 服务的更多信息,请参阅创建 NFS Ganesha 集群。
1.9. Red Hat Ceph Storage 的先决条件 复制链接链接已复制到粘贴板!
在从 Controller 节点迁移 Red Hat Ceph Storage 集群守护进程前,请在 Red Hat OpenStack Platform 17.1 环境中完成以下任务:
- 将 Red Hat Ceph Storage 集群升级到版本 7。如需更多信息,请参阅 在 Framework 中将 Red Hat Ceph Storage 6 升级到 7 (16.2 升级到 17.1)。
-
您的 Red Hat Ceph Storage 7 部署由
cephadm管理。 - undercloud 仍然可用,节点和网络由 director Operator 管理。
-
如果使用外部部署的 Red Hat Ceph Storage 集群,则必须在目标节点中重新创建
ceph-nfs集群,并探测StorageNFS网络。
完成特定 Red Hat Ceph Storage 环境的先决条件:
1.9.1. 使用监控堆栈组件的 Red Hat Ceph Storage 集群完成先决条件 复制链接链接已复制到粘贴板!
在使用监控堆栈组件迁移 Red Hat Ceph Storage 集群前,您必须收集监控堆栈信息,查看和更新容器镜像 registry,并删除 undercloud 容器镜像。
除了更新与监控堆栈相关的容器镜像外,还需要更新与 container_image_base 相关的配置条目。这会影响依赖于 undercloud 镜像的所有 Red Hat Ceph Storage 守护进程。使用 Red Hat Ceph Storage 集群中配置的新镜像 registry 位置部署新的守护进程。
流程
收集监控堆栈的当前状态。当每个守护进程放置评估时,验证主机没有
监控标签或grafana、prometheus或alertmanager:注意整个重定位过程由
cephadm驱动,它依赖于将标签分配给目标节点,其中调度守护进程。有关为节点分配标签的更多信息,请参阅红帽知识库文章 Red Hat Ceph Storage: 支持的配置。[tripleo-admin@controller-0 ~]$ sudo cephadm shell -- ceph orch host ls HOST ADDR LABELS STATUS cephstorage-0.redhat.local 192.168.24.11 osd mds cephstorage-1.redhat.local 192.168.24.12 osd mds cephstorage-2.redhat.local 192.168.24.47 osd mds controller-0.redhat.local 192.168.24.35 _admin mon mgr controller-1.redhat.local 192.168.24.53 mon _admin mgr controller-2.redhat.local 192.168.24.10 mon _admin mgr 6 hosts in cluster确认集群处于健康状态,并且
ceph orch ls和ceph orch ps都返回预期的部署的守护进程数量。检查和更新容器镜像 registry:
注意如果在迁移 Red Hat OpenStack Platform control plane 后运行 Red Hat Ceph Storage 外部化过程,请更新 Red Hat Ceph Storage 集群配置中的容器镜像。当前容器镜像指向 undercloud registry,可能不再可用。由于使用完成后 undercloud 不可用,因此请将 undercloud 提供的镜像替换为替代的 registry。
$ ceph config dump ... ... mgr advanced mgr/cephadm/container_image_alertmanager undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus-alertmanager:v4.10 mgr advanced mgr/cephadm/container_image_base undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhceph mgr advanced mgr/cephadm/container_image_grafana undercloud-0.ctlplane.redhat.local:8787/rh-osbs/grafana:latest mgr advanced mgr/cephadm/container_image_node_exporter undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus-node-exporter:v4.10 mgr advanced mgr/cephadm/container_image_prometheus undercloud-0.ctlplane.redhat.local:8787/rh-osbs/openshift-ose-prometheus:v4.10删除 undercloud 容器镜像:
$ cephadm shell -- ceph config rm mgr mgr/cephadm/container_image_base \ for i in prometheus grafana alertmanager node_exporter; do \ cephadm shell -- ceph config rm mgr mgr/cephadm/container_image_$i \ done
1.9.2. 为 Red Hat Ceph Storage RGW 迁移完成先决条件 复制链接链接已复制到粘贴板!
在开始 Ceph 对象网关(RGW)迁移前,请完成以下先决条件。
流程
检查 Red Hat Ceph Storage 节点的当前状态:
(undercloud) [stack@undercloud-0 ~]$ metalsmith list +------------------------+ +----------------+ | IP Addresses | | Hostname | +------------------------+ +----------------+ | ctlplane=192.168.24.25 | | cephstorage-0 | | ctlplane=192.168.24.10 | | cephstorage-1 | | ctlplane=192.168.24.32 | | cephstorage-2 | | ctlplane=192.168.24.28 | | compute-0 | | ctlplane=192.168.24.26 | | compute-1 | | ctlplane=192.168.24.43 | | controller-0 | | ctlplane=192.168.24.7 | | controller-1 | | ctlplane=192.168.24.41 | | controller-2 | +------------------------+ +----------------+登录到
controller-0,并检查 Pacemaker 状态以识别 RGW 迁移的重要信息:Full List of Resources: * ip-192.168.24.46 (ocf:heartbeat:IPaddr2): Started controller-0 * ip-10.0.0.103 (ocf:heartbeat:IPaddr2): Started controller-1 * ip-172.17.1.129 (ocf:heartbeat:IPaddr2): Started controller-2 * ip-172.17.3.68 (ocf:heartbeat:IPaddr2): Started controller-0 * ip-172.17.4.37 (ocf:heartbeat:IPaddr2): Started controller-1 * Container bundle set: haproxy-bundle [undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp17-openstack-haproxy:pcmklatest]: * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-2 * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-0 * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-1识别存储网络的范围。以下是一个示例,值可能与您环境中的不同:
[heat-admin@controller-0 ~]$ ip -o -4 a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 2: enp1s0 inet 192.168.24.45/24 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever 2: enp1s0 inet 192.168.24.46/32 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever 7: br-ex inet 10.0.0.122/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever1 8: vlan70 inet 172.17.5.22/24 brd 172.17.5.255 scope global vlan70\ valid_lft forever preferred_lft forever 8: vlan70 inet 172.17.5.94/32 brd 172.17.5.255 scope global vlan70\ valid_lft forever preferred_lft forever 9: vlan50 inet 172.17.2.140/24 brd 172.17.2.255 scope global vlan50\ valid_lft forever preferred_lft forever 10: vlan30 inet 172.17.3.73/24 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever2 10: vlan30 inet 172.17.3.68/32 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever 11: vlan20 inet 172.17.1.88/24 brd 172.17.1.255 scope global vlan20\ valid_lft forever preferred_lft forever 12: vlan40 inet 172.17.4.24/24 brd 172.17.4.255 scope global vlan40\ valid_lft forever preferred_lft forever识别您之前在 HAProxy 中具有的网络,并通过 director Operator 传播到 Red Hat Ceph Storage 节点。使用此网络保留由 Red Hat Ceph Storage 拥有的新 VIP,作为 RGW 服务的入口点。
登录到
controller-0,并在当前 HAProxy 配置中找到ceph_rgw部分:$ less /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg ... ... listen ceph_rgw bind 10.0.0.103:8080 transparent bind 172.17.3.68:8080 transparent mode http balance leastconn http-request set-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Forwarded-Proto http if !{ ssl_fc } http-request set-header X-Forwarded-Port %[dst_port] option httpchk GET /swift/healthcheck option httplog option forwardfor server controller-0.storage.redhat.local 172.17.3.73:8080 check fall 5 inter 2000 rise 2 server controller-1.storage.redhat.local 172.17.3.146:8080 check fall 5 inter 2000 rise 2 server controller-2.storage.redhat.local 172.17.3.156:8080 check fall 5 inter 2000 rise 2确认网络已用作 HAProxy 前端。下例演示了
controller-0使用外部网络来公开服务,这不包括在 Red Hat Ceph Storage 节点。您必须通过 director Operator 传播外部网络:[controller-0]$ ip -o -4 a ... 7: br-ex inet 10.0.0.106/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever ...注意如果目标节点不是由 director 管理,则无法使用此流程配置网络。管理员必须手动配置所有必需的网络。
将 HAProxy 前端网络传播到 Red Hat Ceph Storage 节点。
在用来定义
ceph-storage网络接口的 NIC 模板中,在 Red Hat Ceph Storage 网络配置模板文件中添加新配置部分,例如/home/stack/composable_roles/network/nic-configs/ceph-storage.j2:--- network_config: - type: interface name: nic1 use_dhcp: false dns_servers: {{ ctlplane_dns_nameservers }} addresses: - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }} routes: {{ ctlplane_host_routes }} - type: vlan vlan_id: {{ storage_mgmt_vlan_id }} device: nic1 addresses: - ip_netmask: {{ storage_mgmt_ip }}/{{ storage_mgmt_cidr }} routes: {{ storage_mgmt_host_routes }} - type: interface name: nic2 use_dhcp: false defroute: false - type: vlan vlan_id: {{ storage_vlan_id }} device: nic2 addresses: - ip_netmask: {{ storage_ip }}/{{ storage_cidr }} routes: {{ storage_host_routes }} - type: ovs_bridge name: {{ neutron_physical_bridge_name }} dns_servers: {{ ctlplane_dns_nameservers }} domain: {{ dns_search_domains }} use_dhcp: false addresses: - ip_netmask: {{ external_ip }}/{{ external_cidr }} routes: {{ external_host_routes }} members: [] - type: interface name: nic3 primary: true将外部网络添加到裸机文件中,例如:
/home/stack/composable_roles/network/baremetal_deployment.yaml,该文件由metalsmith:注意在触发
os-net-config时,确保为目标节点启用了 network_config_update,以传播到目标节点。- name: CephStorage count: 3 hostname_format: cephstorage-%index% instances: - hostname: cephstorage-0 name: ceph-0 - hostname: cephstorage-1 name: ceph-1 - hostname: cephstorage-2 name: ceph-2 defaults: profile: ceph-storage network_config: template: /home/stack/composable_roles/network/nic-configs/ceph-storage.j2 network_config_update: true networks: - network: ctlplane vif: true - network: storage - network: storage_mgmt - network: external在裸机节点上配置新网络:
(undercloud) [stack@undercloud-0]$ openstack overcloud node provision \ -o overcloud-baremetal-deployed-0.yaml \ --stack overcloud \ --network-config -y \ $PWD/composable_roles/network/baremetal_deployment.yaml验证 Red Hat Ceph Storage 节点上的新网络是否已配置:
[root@cephstorage-0 ~]# ip -o -4 a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 2: enp1s0 inet 192.168.24.54/24 brd 192.168.24.255 scope global enp1s0\ valid_lft forever preferred_lft forever 11: vlan40 inet 172.17.4.43/24 brd 172.17.4.255 scope global vlan40\ valid_lft forever preferred_lft forever 12: vlan30 inet 172.17.3.23/24 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever 14: br-ex inet 10.0.0.133/24 brd 10.0.0.255 scope global br-ex\ valid_lft forever preferred_lft forever
1.9.3. 完成 Red Hat Ceph Storage RBD 迁移的先决条件 复制链接链接已复制到粘贴板!
在开始 Red Hat Ceph Storage Rados 块设备(RBD)迁移前,请完成以下先决条件。
-
目标 CephStorage 或 ComputeHCI 节点都配置为具有
storage和storage_mgmt网络。这可确保使用来自同一节点的 Red Hat Ceph Storage 公共和集群网络。从 Red Hat OpenStack Platform 17.1 及之后的版本,您不必运行堆栈更新。 -
NFS Ganesha 从 director Operator 部署迁移到
cephadm。如需更多信息,请参阅创建 NFS Ganesha 集群。 - Ceph 元数据服务器、监控堆栈、Ceph 对象网关以及 Controller 节点上部署的任何其他守护进程。
- 守护进程分布遵循 Red Hat Ceph Storage 中描述的卡性约束:支持的配置。
-
Red Hat Ceph Storage 集群处于健康状态,
ceph -s命令返回HEALTH_OK。 在裸机节点上运行
os-net-config并配置额外网络:如果目标节点是
CephStorage,请确保在CephStorage节点的裸机文件中定义了网络,例如/home/stack/composable_roles/network/baremetal_deployment.yaml:- name: CephStorage count: 2 instances: - hostname: oc0-ceph-0 name: oc0-ceph-0 - hostname: oc0-ceph-1 name: oc0-ceph-1 defaults: networks: - network: ctlplane vif: true - network: storage_cloud_0 subnet: storage_cloud_0_subnet - network: storage_mgmt_cloud_0 subnet: storage_mgmt_cloud_0_subnet network_config: template: templates/single_nic_vlans/single_nic_vlans_storage.j2添加缺少的网络:
$ openstack overcloud node provision \ -o overcloud-baremetal-deployed-0.yaml --stack overcloud-0 \ /--network-config -y --concurrency 2 /home/stack/metalsmith-0.yaml验证存储网络是否在目标节点上配置:
(undercloud) [stack@undercloud ~]$ ssh heat-admin@192.168.24.14 ip -o -4 a 1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever 5: br-storage inet 192.168.24.14/24 brd 192.168.24.255 scope global br-storage\ valid_lft forever preferred_lft forever 6: vlan1 inet 192.168.24.14/24 brd 192.168.24.255 scope global vlan1\ valid_lft forever preferred_lft forever 7: vlan11 inet 172.16.11.172/24 brd 172.16.11.255 scope global vlan11\ valid_lft forever preferred_lft forever 8: vlan12 inet 172.16.12.46/24 brd 172.16.12.255 scope global vlan12\ valid_lft forever preferred_lft forever
1.9.4. 创建 NFS Ganesha 集群 复制链接链接已复制到粘贴板!
本节中的内容 作为技术预览提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。如需更多信息,请参阅 技术预览。
如果您将 CephFS through NFS 与共享文件系统服务(manila)搭配使用,您必须在 Red Hat Ceph Storage 集群上创建新的集群的 NFS 服务。此服务替换您在 Red Hat OpenStack Platform (RHOSP) 17.1 中使用的独立、由 Pacemaker 控制的 ceph-nfs 服务。
流程
识别 Red Hat Ceph Storage 节点,以部署新的集群 NFS 服务,如
cephstorage-0、cephstorage-1、cephstorage-2。注意您必须在
StorageNFS隔离的网络中部署此服务,以便您可以通过新的 NFS 导出位置挂载现有的共享。您可以在现有 Ceph 存储节点或 HCI 节点上部署新的集群 NFS 服务,也可以在 Red Hat Ceph Storage 集群中注册的新硬件上部署。如果您使用 director Operator 部署 Red Hat Ceph Storage 节点,请将
StorageNFS网络传播到部署ceph-nfs服务的目标节点。注意如果目标节点不是由 director 管理,则无法使用此流程配置网络。管理员必须手动配置所有必需的网络。
-
识别 RHOSP 环境中使用的节点定义文件
overcloud-baremetal-deploy.yaml。有关识别overcloud-baremetal-deploy.yaml文件的更多信息,请参阅 在 OpenShift 部署上自定义 Red Hat OpenStack Services 中的自定义 overcloud 网络。 编辑与 Red Hat Ceph Storage 节点关联的网络,使其包含
StorageNFS网络:- name: CephStorage count: 3 hostname_format: cephstorage-%index% instances: - hostname: cephstorage-0 name: ceph-0 - hostname: cephstorage-1 name: ceph-1 - hostname: cephstorage-2 name: ceph-2 defaults: profile: ceph-storage network_config: template: /home/stack/network/nic-configs/ceph-storage.j2 network_config_update: true networks: - network: ctlplane vif: true - network: storage - network: storage_mgmt - network: storage_nfs编辑 Red Hat Ceph Storage 节点的
/home/stack/network/nic-configs/ceph-storage.j2,使其包含连接到StorageNFS网络的接口:- type: vlan device: nic2 vlan_id: {{ storage_nfs_vlan_id }} addresses: - ip_netmask: {{ storage_nfs_ip }}/{{ storage_nfs_cidr }} routes: {{ storage_nfs_host_routes }}更新 Red Hat Ceph Storage 节点:
$ openstack overcloud node provision \ --stack overcloud \ --network-config -y \ -o overcloud-baremetal-deployed-storage_nfs.yaml \ --concurrency 2 \ /home/stack/network/baremetal_deployment.yaml更新完成后,确保 Red Hat Ceph Storage 节点中创建了一个新接口,并使用与
StorageNFS关联的 VLAN 标记。
-
识别 RHOSP 环境中使用的节点定义文件
识别
StorageNFS网络的 IP 地址,以用作 Ceph NFS 服务的虚拟 IP 地址(VIP):$ openstack port list -c "Fixed IP Addresses" --network storage_nfs在正在运行的
cephadmshell 中,识别 NFS 服务的主机:$ ceph orch host ls标记您确定的每个主机。对您要标记的每个主机重复这个命令:
$ ceph orch host label add <hostname> nfs-
将
<hostname> 替换为您识别的主机的名称。
-
将
创建 NFS 集群:
$ ceph nfs cluster create cephfs \ "label:nfs" \ --ingress \ --virtual-ip=<VIP> \ --ingress-mode=haproxy-protocol将
<VIP> 替换为 Ceph NFS 服务的 VIP。注意您必须将
ingress-mode参数设置为haproxy-protocol。不支持其他 ingress 模式。此入口模式允许您通过共享文件系统服务强制客户端限制。有关部署集群 Ceph NFS 服务的更多信息,请参阅 Red Hat Ceph Storage 7 Operations Guide 中的使用 Ceph Orchestrator (Limited Availability)管理 NFS-Ganesha 网关。
检查 NFS 集群的状态:
$ ceph nfs cluster ls $ ceph nfs cluster info cephfs
1.10. 比较部署之间的配置文件 复制链接链接已复制到粘贴板!
要帮助您管理 director Operator 和 Red Hat OpenStack Platform (RHOSP)服务的配置,您可以使用 os-diff 工具比较 director Operator 部署与 Red Hat OpenStack Services on OpenShift (RHOSO)云之间的配置文件。
OS-diff 目前不支持 director Operator。
先决条件
在您的环境中安装和配置 golang:
dnf install -y golang-github-openstack-k8s-operators-os-diff
流程
根据您的环境配置
/etc/os-diff/os-diff.cfg文件和/etc/os-diff/ssh.config文件。要允许 os-diff 连接到云并从config.yaml文件中描述的服务拉取文件,您必须在os-diff.cfg文件中设置以下选项:[Default] local_config_dir=/tmp/ service_config_file=config.yaml [Tripleo] ssh_cmd=ssh -F ssh.config1 director_host=standalone2 container_engine=podman connection=ssh remote_config_path=/tmp/tripleo local_config_path=/tmp/ [Openshift] ocp_local_config_path=/tmp/ocp connection=local ssh_cmd=""如果您使用主机文件连接到云,请将
ssh.config文件配置为允许 os-diff 访问 RHOSP 环境,例如:Host * IdentitiesOnly yes Host virthost Hostname virthost IdentityFile ~/.ssh/id_rsa User root StrictHostKeyChecking no UserKnownHostsFile=/dev/null Host standalone Hostname standalone IdentityFile <path to SSH key> User root StrictHostKeyChecking no UserKnownHostsFile=/dev/null Host crc Hostname crc IdentityFile ~/.ssh/id_rsa User stack StrictHostKeyChecking no UserKnownHostsFile=/dev/null-
将
<path to SSH key> 替换为 SSH 密钥的路径。您必须为IdentityFile提供值,才能获得对 RHOSP 环境的完整工作访问权限。
-
将
如果使用清单文件连接到云,请从 Ansible 清单生成
ssh.config文件,例如tripleo-ansible-inventory.yaml文件:$ os-diff configure -i tripleo-ansible-inventory.yaml -o ssh.config --yaml
验证
测试您的连接:
$ ssh -F ssh.config standalone
第 2 章 准备 director Operator 进行采用 复制链接链接已复制到粘贴板!
您必须准备现有的 director Operator 环境和 OpenShift (RHOSO)上的 Red Hat OpenStack Services 环境,以便采用。
2.1. 为 director Operator 的使用准备 Controller 节点 复制链接链接已复制到粘贴板!
准备 director Operator (OSPdO)环境中的 Controller 节点,使其用于 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services。
以下流程使用由源 OSPdO 环境和目标 RHOSO 环境共享的单个 Red Hat OpenShift Container Platform (RHOCP)集群。两个 RHOCP 主节点传输到 RHOSO 环境,在采用过程中,将 OSPdO 保留为一个节点。在采用后,RHOSO 环境也可以使用其余节点。
流程
登录到部署 RHOSP OSPdO 的 RHOCP 环境,并更改到托管 RHOSP 部署的项目:
$ oc project openstack定义通用环境变量:
export PASSWORD_FILE="tripleo-passwords.yaml" export RHOSO18_NAMESPACE="rhoso" export OSPDO_NAMESPACE="openstack" export OS_CLIENT="oc exec -c openstackclient -t openstackclient -- " export CONTROLLER_SSH="oc rsh -n $OSPDO_NAMESPACE -c openstackclient openstackclient ssh controller-0.ctlplane" export CONTROLLER1_SSH="oc -n $OSPDO_NAMESPACE rsh -c openstackclient openstackclient ssh controller-0.ctlplane" export CONTROLLER2_SSH= export CONTROLLER3_SSH= export OSPDO_INTERNAL_API_NET="internalapi" export STORAGE_CLASS=$(oc get -n $OSPDO_NAMESPACE pvc openstackclient-hosts -o jsonpath='{.spec.storageClassName}')获取运行当前 RHOSP Controller 虚拟机(VM)的节点的名称:
$ export CONTROLLER_NODE=$(oc -n $OSPDO_NAMESPACE get vmi -ojson | jq -r '.items[0].status.nodeName')如果您将 master/worker 集群与高可用性 OSPdO 环境结合使用,请将 OSPdO 配置为使用单个 RHOSP Controller 节点:
禁用 stonith :
$ stonith_resources=$($CONTROLLER1_SSH sudo pcs stonith status|grep Started|awk '{print $2}') for resource in stonith_resources ;do $CONTROLLER1_SSH sudo pcs stonith disable $resource;done将非Controller 节点置于维护状态:
$CONTROLLER1_SSH sudo pcs node maintenance <controller-1> <controller-2>-
将
<controller-1> 和 <controller-2> 替换为环境中 Controller 节点的名称。
-
将
为单一节点更新仲裁:
$CONTROLLER1_SSH sudo systemctl stop corosync $CONTROLLER2_SSH sudo systemctl stop corosync $CONTROLLER3_SSH sudo systemctl stop corosync $CONTROLLER1_SSH sudo pcs quorum update last_man_standing=1 wait_for_all=1 $CONTROLLER1_SSH sudo systemctl restart corosync重启 Pacemaker 集群:
$CONTROLLER1_SSH sudo pcs cluster stop $CONTROLLER1_SSH sudo pcs cluster start检查是否只启动 Controller-0,并且其他 2 Controller 是否已停止:
$CONTROLLER_SSH sudo pcs status检查 RHOSP control plane 是否仍然可以正常工作:
$OS_CLIENT openstack compute service list注意您可能需要等待几分钟,以便 control plane 正常运行。此时,control plane 响应会减慢。
当 Pacemaker 只管理其中一个控制器时,删除 Controller 虚拟机的 2。以下示例指定了要删除的 Controller-1 和 Controller-2 虚拟机:
$ oc -n "${OSPDO_NAMESPACE}"annotate vm controller-1 osp-director.openstack.org/delete-host=true $ oc -n "${OSPDO_NAMESPACE}"annotate vm controller-2 osp-director.openstack.org/delete-host=true将
OpenStackControlPlaneCR 中的 Controller 角色的roleCount减小到1:$ oc -n "${OSPDO_NAMESPACE}"patch OpenStackControlPlane overcloud --type json -p '[{"op": "replace", "path":"/spec/virtualMachineRoles/controller/roleCount", "value": 1}]'确保
OpenStackClient容器集与剩余的 Controller 虚拟机在同一 RHOCP 节点上运行。如果OpenStackClientpod 没有在同一节点上,则通过封锁到 RHOSO 的两个节点来移动它。然后,您将删除OpenStackClientpod,以便在具有剩余的 Controller 虚拟机的 RHOCP 节点上重新调度。pod 移到正确的节点后,取消协调所有节点:$ oc adm cordon $OSP18_NODE1 $ oc adm cordon $OSP18_NODE2 $ oc delete pod openstackclient $ oc adm uncordon $OSP18_NODE1 $ oc adm uncordon $OSP18_NODE2通过将
nodeSelector放置到包含 Controller 虚拟机的 RHOCP 节点上,从没有运行 Controller 虚拟机的其他两个节点中删除 OSPdO 节点网络配置策略:$ for i in br-ctlplane br-ex br-osp; do oc patch osnetconfig openstacknetconfig --type json -p '[{"op": "replace", "path": "/spec/attachConfigurations/'$i'/nodeNetworkConfigurationPolicy/nodeSelector", "value": {"kubernetes.io/hostname": "'$CONTROLLER_NODE'"}}]'; done
2.2. 为 director Operator 的采用准备 RHOSO 复制链接链接已复制到粘贴板!
当使用两个 Red Hat OpenShift Container Platform (RHOCP) master 节点在 OpenShift (RHOSO)环境中部署 Red Hat OpenStack Services 时,您必须执行以下操作:
- 为 RHOSO 安装创建一个新命名空间。
- 创建自定义节点网络配置策略。
-
为每个隔离网络创建
NetworkAttachmentDefinition自定义资源。 - 安装 RHOSO 操作器.
流程
将剩余的两个节点的主机名保存到
RHOSO_NODES变量中:$ RHOSO_NODES=$(oc get nodes -o name | grep -v $CONTROLLER_NODE | sed 's#node/##g' | tr '\n' ' ')提取要用于 RHOSO 安装和标签节点的节点:
$ export RHOSO18_NODE1=$(echo "${RHOSO_NODES}" | cut -d ' ' -f 1) $ export RHOSO18_NODE2=$(echo "${RHOSO_NODES}" | cut -d ' ' -f 2) $ oc label nodes "${RHOSO18_NODE1}" type=openstack $ oc label nodes "${RHOSO18_NODE2}" type=openstack创建一个新命名空间,用于安装 RHOSO。您必须在与 director Operator (OSPdO)不同的命名空间中安装 RHOSO:
$ oc get namespace ${RHOSO18_NAMESPACE} 2>/dev/null || { oc create namespace ${RHOSO18_NAMESPACE} || { echo "Failed to create namespace ${RHOSO18_NAMESPACE}" exit 1 } oc project ${RHOSO18_NAMESPACE} }为 RHOSO 创建自定义节点网络配置策略:
注意节点网络配置策略使用
nodeSelector属性限制为OSP18_NODE1/2。新节点网络配置策略会镜像现有节点网络配置策略。在以下示例中,子网范围会被重复使用。此外,OSPdO 将网桥用于控制,外部接口会重复。$ oc apply -f - <<EOF apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: labels: osp/interface: enp7s0 name: enp7s0-<RHOSO18_NODE1> spec: desiredState: dns-resolver: config: search: [] server: - 172.22.0.1 interfaces: - description: internalapi vlan interface name: enp7s0.20 state: up type: vlan vlan: base-iface: enp7s0 id: 20 reorder-headers: true ipv4: address: - ip: 172.17.0.5 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: storage vlan interface name: enp7s0.30 state: up type: vlan vlan: base-iface: enp7s0 id: 30 reorder-headers: true ipv4: address: - ip: 172.18.0.5 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: tenant vlan interface name: enp7s0.50 state: up type: vlan vlan: base-iface: enp7s0 id: 50 reorder-headers: true ipv4: address: - ip: 172.19.0.5 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: storagemgmt vlan interface name: enp7s0.40 state: up type: vlan vlan: base-iface: enp7s0 id: 40 reorder-headers: true ipv4: address: - ip: 172.20.0.5 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: Configuring Bridge ospbr with interface enp1s0 name: br-ctlplane mtu: 1500 type: linux-bridge state: up bridge: options: stp: enabled: false port: - name: enp1s0 vlan: {} ipv4: address: - ip: 172.22.0.51 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: external bridge name: br-external type: linux-bridge mtu: 1500 ipv6: enabled: false ipv4: enabled: false bridge: options: stp: enabled: false port: - name: enp6s0 nodeSelector: kubernetes.io/hostname: <RHOSO18_NODE1> node-role.kubernetes.io/worker: "" EOF-
将
<RHOSO18_NODE1> 替换为节点的名称。
-
将
为每个隔离网络应用 RHOSO 的
NetworkAttachmentDefinition自定义资源,以将服务 pod 附加到网络:$ oc apply -f - <<EOF apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: ctlplane spec: config: | { "cniVersion": "0.3.1", "name": "ctlplane", "type": "bridge", "master": "br-ctlplane", "ipam": { "type": "whereabouts", "range": "172.22.0.0/24", "range_start": "172.22.0.30", "range_end": "172.22.0.70" } } --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: internalapi spec: config: | { "cniVersion": "0.3.1", "name": "internalapi", "type": "macvlan", "master": "enp7s0.20", "ipam": { "type": "whereabouts", "range": "172.17.0.0/24", "range_start": "172.17.0.30", "range_end": "172.17.0.70" } } --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: external spec: config: | { "cniVersion": "0.3.1", "name": "external", "type": "macvlan", "master": "br-external", "ipam": { "type": "whereabouts", "range": "10.0.0.0/24", "range_start": "10.0.0.30", "range_end": "10.0.0.70" } } --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: storage spec: config: | { "cniVersion": "0.3.1", "name": "storage", "type": "macvlan", "master": "enp7s0.30", "ipam": { "type": "whereabouts", "range": "172.18.0.0/24", "range_start": "172.18.0.30", "range_end": "172.18.0.70" } } --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: storagemgmt spec: config: | { "cniVersion": "0.3.1", "name": "storagemgmt", "type": "macvlan", "master": "enp7s0.40", "ipam": { "type": "whereabouts", "range": "172.19.0.0/24", "range_start": "172.19.0.30", "range_end": "172.19.0.70" } } --- apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: tenant spec: config: | { "cniVersion": "0.3.1", "name": "tenant", "type": "macvlan", "master": "enp7s0.50", "ipam": { "type": "whereabouts", "range": "172.20.0.0/24", "range_start": "172.20.0.30", "range_end": "172.20.0.70" } } EOF-
将
<RHOSO18_NAMESPACE> 替换为您的 OpenStack 18 命名空间。
-
将
确保
OVNKubernetes IPForwarding字段设置为enabled:$ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge从 OSPdO 中提取并保存密码:
$ oc get secret tripleo-passwords -n $OSPDO_NAMESPACE -o json | jq -r '.data["tripleo-overcloud-passwords.yaml"]' | base64 -d >"${PASSWORD_FILE}" || { echo "ERROR: Failed to extract passwords from OSPdO" exit 1 }- 安装 RHOSO 操作器。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 安装和准备 Operator。
应用与新的 OpenStack 18 部署匹配的
IPAddressPool资源,以配置哪些 IP 可用作虚拟 IP (VIP):$ oc apply -f - <<EOF apiVersion: metallb.io/v1beta1 kind: IPAddressPool ...应用
L2Advertisement资源来定义如何宣布 VIP:$ cat << EOF | oc apply -f - apiVersion: metallb.io/v1beta1 kind: L2Advertisement
第 3 章 将 TLS-e 迁移到 RHOSO 部署 复制链接链接已复制到粘贴板!
如果您在 Red Hat OpenStack Platform (RHOSP) 17.1 部署中启用了 TLS (TLS-e),则必须将 TLS-e 迁移到 OpenShift (RHOSO)部署上的 Red Hat OpenStack Services。
RHOSO 部署使用 cert-manager operator 来发布、跟踪和更新证书。在以下步骤中,您将从您用来在 RHOSP 环境中提供证书的 FreeIPA 实例中提取 CA 签名证书,然后在 RHOSO 环境中将它们导入到 cert-manager 中。因此,您可以最小化 Compute 节点上的中断,因为您不需要安装新的信任链。
然后,您将弃用之前的 FreeIPA 节点,不再使用它来发布证书。如果您使用 IPA 服务器为非 RHOSP 系统发布证书,则可能无法实现。
- 以下流程在 FreeIPA 4.10.1 服务器上被重现。文件和目录的位置可能会根据版本而改变。
- 如果签名密钥存储在硬件安全模块(HSM)中,而不是 NSS 共享数据库(NSSDB)中,并且密钥可以被检索,则可能需要特殊的 HSM 工具。
先决条件
- 您的 RHOSP 部署使用 TLS-e。
- 确保新部署中的后端服务尚未启动。
定义以下 shell 变量:值是示例,引用单节点单机 director Operator 部署。将这些示例值替换为适合您的环境的值:
IPA_SSH="ssh -i <path_to_ssh_key> <admin user>@<freeipa-server-ip-address> sudo"
流程
要找到 CA 证书和密钥,请列出 NSSDB 内的所有证书。如果使用 director-dev-tools 安装 OSPdO,服务器主机将 freeipa 服务器作为容器运行:
$IPA_SSH certutil -L -d /etc/pki/pki-tomcat/alias-
-L选项列出所有证书。 -d选项指定证书的存储位置。该命令生成类似以下示例的输出:
Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI caSigningCert cert-pki-ca CTu,Cu,Cu ocspSigningCert cert-pki-ca u,u,u Server-Cert cert-pki-ca u,u,u subsystemCert cert-pki-ca u,u,u auditSigningCert cert-pki-ca u,u,Pu
-
从
/etc/pki/pki-tomcat/alias目录中导出证书和密钥。以下示例使用caSigningCert cert-pki-ca证书:$IPA_SSH pk12util -o /tmp/freeipa.p12 -n 'caSigningCert\ cert-pki-ca' -d /etc/pki/pki-tomcat/alias -k /etc/pki/pki-tomcat/alias/pwdfile.txt -w /etc/pki/pki-tomcat/alias/pwdfile.txt注意命令生成包含证书和密钥的 P12 文件。
/etc/pki/pki-tomcat/alias/pwdfile.txt文件包含保护密钥的密码。您可以使用密码提取密钥并生成新文件/tmp/freeipa.p12。您还可以选择其他密码。如果为新文件选择了其他密码,请替换-w选项的参数,或者使用-W选项,后跟密码,以明文形式替换。使用该文件,您还可以使用
openssl pkcs12命令获取证书和密钥。创建包含 root CA 的 secret:
$ oc create secret generic rootca-internal从 FreeIPA 导入证书和密钥:
$ oc patch secret rootca-internal -p="{\"data\":{\"ca.crt\": \"`$IPA_SSH openssl pkcs12 -in /tmp/freeipa.p12 -passin file:/etc/pki/pki-tomcat/alias/pwdfile.txt -nokeys | openssl x509 | base64 -w 0`\"}}" $ oc patch secret rootca-internal -p="{\"data\":{\"tls.crt\": \"`$IPA_SSH openssl pkcs12 -in /tmp/freeipa.p12 -passin file:/etc/pki/pki-tomcat/alias/pwdfile.txt -nokeys | openssl x509 | base64 -w 0`\"}}" $ oc patch secret rootca-internal -p="{\"data\":{\"tls.key\": \"`$IPA_SSH openssl pkcs12 -in /tmp/freeipa.p12 -passin file:/etc/pki/pki-tomcat/alias/pwdfile.txt -nocerts -noenc | openssl rsa | base64 -w 0`\"}}"创建 cert-manager 签发者并引用 secret:
$ oc apply -f - <<EOF apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: rootca-internal labels: osp-rootca-issuer-public: "" osp-rootca-issuer-internal: "" osp-rootca-issuer-libvirt: "" osp-rootca-issuer-ovn: "" spec: ca: secretName: rootca-internal EOF删除之前创建的 p12 文件:
$IPA_SSH rm /tmp/freeipa.p12
验证
验证是否已创建所需资源:
$ oc get issuers$ oc get secret rootca-internal -o yaml
采用完成后,cert-manager operator 会发布新证书,并使用新证书更新 secret。因此,control plane 上的 pod 会自动重启,以获取新证书。在数据平面上,您必须手动启动新部署并重启某些进程以使用新证书。旧证书会保持活跃状态,直到 control plane 和 data plane 都获取新证书。
第 4 章 将数据库迁移到 control plane 复制链接链接已复制到粘贴板!
要开始创建 control plane,启用后端服务并从原始 Red Hat OpenStack Platform 17.1 部署中导入数据库。
4.1. 检索特定于拓扑的服务配置 复制链接链接已复制到粘贴板!
在将数据库迁移到 OpenShift (RHOSO) control plane 上的 Red Hat OpenStack Services 之前,请先从 Red Hat OpenStack Platform (RHOSP)环境中检索特定于拓扑的服务配置。您需要此配置,理由如下:
- 检查您当前的数据库是否有不准确
- 要确保在迁移前具有您需要的数据
- 将您的 RHOSP 数据库与采用的 RHOSO 数据库进行比较
先决条件
定义以下 shell 变量:将示例值替换为您的环境正确的值:
注意如果您使用 IPv6,请定义没有方括号的
SOURCE_MARIADB_IP值。例如,SOURCE_MARIADB_IP=fd00:bbbb::2。$ PASSWORD_FILE="$HOME/overcloud-passwords.yaml" $ MARIADB_IMAGE=registry.redhat.io/rhoso/openstack-mariadb-rhel9:18.0 $ declare -A TRIPLEO_PASSWORDS $ CELLS="default" $ for CELL in $(echo $CELLS); do > TRIPLEO_PASSWORDS[$CELL]="$PASSWORD_FILE" > done $ oc get secret tripleo-passwords -o json | jq -r '.data["tripleo-overcloud-passwords.yaml"]' | base64 -d >"${TRIPLEO_PASSWORDS[$CELLS]}" $ declare -A SOURCE_DB_ROOT_PASSWORD $ for CELL in $(echo $CELLS); do > SOURCE_DB_ROOT_PASSWORD[$CELL]=$(cat ${TRIPLEO_PASSWORDS[$CELL]} | grep ' MysqlRootPassword:' | awk -F ': ' '{ print $2; }') > done- 您只能在源云上部署单个 Compute 服务单元。
获取运行 RHOSP Controller 虚拟机的 RHOCP 节点的名称:
$ export CONTROLLER_NODE=$(oc get vmi -ojson | jq -r '.items[0].status.nodeName') $ export SOURCE_OVN_OVSDB_IP=172.17.0.160 # get this from the source OVN DB在
tripleo-exports-defaultConfigMap 的ctlplane-export.yaml部分查找 mysql 服务 IP:$ cpexport=$(oc get cm tripleo-exports-default -o json | jq -r '.data["ctlplane-export.yaml"]') $ declare -A SOURCE_MARIADB_IP $ for CELL in $(echo $CELLS); do > SOURCE_MARIADB_IP[$CELL]=$(echo "$cpexport" | sed -e '0,/ MysqlInternal/d' | sed -n '0,/host_nobrackets/s/^.*host_nobrackets\:\s*\(.*\)$/\1/p') > done $ RUN_OVERRIDES='{ > "apiVersion": "v1", > "metadata": { > "annotations": { > "k8s.v1.cni.cncf.io/networks": "[{\"name\": \"internalapi-static\",\"namespace\": \"openstack\", \"ips\":[\"172.17.0.99/24\"]}]" > } > }, > "spec": { > "nodeName": "'"$CONTROLLER_NODE"'", > "securityContext": { > "allowPrivilegeEscalation": false, > "capabilities": { > "drop": ["ALL"] > }, > "runAsNonRoot": true, > "seccompProfile": { > "type": "RuntimeDefault" > } > } > } > }'-
mariadb-client需要在运行 RHOSP Controller 节点的同一 Red Hat OpenShift Container Platform (RHOCP)节点上运行。另外,内部api-static网络需要附加到 pod。
-
定义以下 shell 变量:将示例值替换为您的环境正确的值:
$ MARIADB_RUN_OVERRIDES="--overrides=${RUN_OVERRIDES} $MARIADB_CLIENT_ANNOTATIONS" $ CONTROLLER1_SSH="oc rsh -c openstackclient openstackclient ssh controller-0.ctlplane" $ oc get secret tripleo-passwords -o json | jq -r '.data["tripleo-overcloud-passwords.yaml"]' | base64 -d >"${PASSWORD_FILE}" $ declare -A SOURCE_MARIADB_IP $ SOURCE_MARIADB_IP[default]=*<galera cluster VIP>*-
为源 director Operator 云的任何非单元控制器提供
CONTROLLER1_SSH设置。 -
对于
CELLS中定义的每个单元,将SOURCE_MARIADB_IP[*]= ...替换为源 director Operator 云的单元名称和 VIP 地址的记录列表,包括源 director Operator 云的单元。 要获取
SOURCE_MARIADB_IP的值,请在 Controller 节点上查询 puppet-generated 配置:$ sudo grep -rI 'listen mysql' -A10 /var/lib/config-data/puppet-generated/ | grep bind注意源云始终对单元数据库使用相同的密码。因此,相同的密码文件用于所有单元堆栈。但是,split-stack 拓扑允许为每个堆栈使用不同的密码文件。
-
为源 director Operator 云的任何非单元控制器提供
流程
导出以下输出的 shell 变量,并测试到 RHOSP 数据库的连接:
$ unset PULL_OPENSTACK_CONFIGURATION_DATABASES $ declare -xA PULL_OPENSTACK_CONFIGURATION_DATABASES $ for CELL in $(echo $CELLS); do > PULL_OPENSTACK_CONFIGURATION_DATABASES[$CELL]=$(oc run mariadb-client-1-$CELL ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql -rsh "${SOURCE_MARIADB_IP[$CELL]}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" -e 'SHOW databases;') > done如果连接成功,则预期的输出不会进行任何操作。
注意nova、nova_api和nova_cell0数据库包含在主 overcloud Orchestration 服务(heat)堆栈的同一数据库主机上。在 RHOSP 数据库上运行
mysqlcheck以检查是否存在不准确:$ unset PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK $ declare -xA PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK $ run_mysqlcheck() { > PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK=$(oc run mariadb-client-2-$1 ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysqlcheck --all-databases -h ${SOURCE_MARIADB_IP[$CELL]} -u root -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" | grep -v OK) > } $ for CELL in $(echo $CELLS); do > run_mysqlcheck $CELL > done $ if [ "$PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK" != "" ]; then > for CELL in $(echo $CELLS); do > MYSQL_UPGRADE=$(oc run mariadb-client-3 ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql_upgrade -v -h ${SOURCE_MARIADB_IP[$CELL]} -u root -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}") > # rerun mysqlcheck to check if problem is resolved > run_mysqlcheck > done > fi获取 Compute 服务(nova)单元映射:
export PULL_OPENSTACK_CONFIGURATION_NOVADB_MAPPED_CELLS=$(oc run mariadb-client-1 ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ mysql -rsh "${SOURCE_MARIADB_IP['default']}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD['default']}" nova_api -e \ 'select uuid,name,transport_url,database_connection,disabled from cell_mappings;')获取注册的 Compute 服务的主机名:
$ unset PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES $ declare -xA PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES $ for CELL in $(echo $CELLS); do > PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES[$CELL]=$(oc run mariadb-client-4-$CELL ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql -rsh "${SOURCE_MARIADB_IP[$CELL]}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" -e \ > "select host from nova.services where services.binary='nova-compute' and deleted=0;") > done获取映射的 Compute 服务单元列表:
export PULL_OPENSTACK_CONFIGURATION_NOVAMANAGE_CELL_MAPPINGS=$($CONTROLLER1_SSH sudo podman exec -it nova_conductor nova-manage cell_v2 list_cells)存储导出的变量以供以后使用:
$ unset SRIOV_AGENTS $ declare -xA SRIOV_AGENTS1 $ for CELL in $(echo $CELLS); do > RCELL=$CELL > [ "$CELL" = "$DEFAULT_CELL_NAME" ] && RCELL=default > cat > ~/.source_cloud_exported_variables_$CELL << EOF > unset PULL_OPENSTACK_CONFIGURATION_DATABASES > unset PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK > unset PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES > declare -xA PULL_OPENSTACK_CONFIGURATION_DATABASES > declare -xA PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK > declare -xA PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES > PULL_OPENSTACK_CONFIGURATION_DATABASES[$CELL]="$(oc run mariadb-client-5-$CELL ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql -rsh ${SOURCE_MARIADB_IP[$RCELL]} -uroot -p${SOURCE_DB_ROOT_PASSWORD[$RCELL]} -e 'SHOW databases;')" > PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK[$CELL]="$(oc run mariadb-client-6-$CELL ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysqlcheck --all-databases -h ${SOURCE_MARIADB_IP[$RCELL]} -u root -p${SOURCE_DB_ROOT_PASSWORD[$RCELL]} | grep -v OK)" > PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES[$CELL]="$(oc run mariadb-client-7-$CELL ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql -rsh ${SOURCE_MARIADB_IP[$RCELL]} -uroot -p${SOURCE_DB_ROOT_PASSWORD[$RCELL]} -e \ > "select host from nova.services where services.binary='nova-compute' and deleted=0;")" > if [ "$RCELL" = "default" ]; then > PULL_OPENSTACK_CONFIGURATION_NOVADB_MAPPED_CELLS="$(oc run mariadb-client-2 ${MARIADB_RUN_OVERRIDES} -q --image ${MARIADB_IMAGE} -i --rm --restart=Never -- \ > mysql -rsh ${SOURCE_MARIADB_IP[$RCELL]} -uroot -p${SOURCE_DB_ROOT_PASSWORD[$RCELL]} nova_api -e \ > 'select uuid,name,transport_url,database_connection,disabled from cell_mappings;')" > PULL_OPENSTACK_CONFIGURATION_NOVAMANAGE_CELL_MAPPINGS="$($CONTROLLER1_SSH sudo podman exec -it nova_conductor nova-manage cell_v2 list_cells)" > fi > EOF > done $ chmod 0600 ~/.source_cloud_exported_variables*- 1
- 如果在 RHOSP 部署中运行
neutron-sriov-nic-agent代理,获取用于数据平面的配置。
后续步骤
之后,在 data plane 采用后检查过程中,需要此配置和导出的值。关闭 RHOSP control plane 服务后,如果任何导出的值丢失,重新运行 export 命令会失败,因为 control plane 服务不再在源云上运行,且无法检索数据。为了避免数据丢失,请在关闭 control plane 服务前保留环境文件中的导出值。
4.2. 部署后端服务 复制链接链接已复制到粘贴板!
使用部署基本后端服务创建 OpenStackControlPlane 自定义资源(CR),并禁用所有 Red Hat OpenStack Platform (RHOSP)服务。此 CR 是 control plane 的基础。
先决条件
- 要采用的云正在运行,它处于 RHOSP 17.1 的最新次要版本。
- 源云的所有 control plane 和数据平面主机都在运行,并在整个采用过程中继续运行。
-
部署
openstack-operator,但未部署OpenStackControlPlane。 - 安装 OpenStack Operator。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 安装和准备 Operator。
-
如果您在 RHOSP 环境中启用了 TLS (TLS-e),您必须将
tlsroot CA 从 RHOSP 环境复制到rootca-internal签发者。 - Galera 和 RabbitMQ 有可用的 PV。
为 control plane 部署设置所需的 admin 密码。这可以是来自您原始部署的管理员密码或不同的密码:
ADMIN_PASSWORD=SomePassword使用现有的 RHOSP 部署密码:
declare -A TRIPLEO_PASSWORDS TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml" ADMIN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' AdminPassword:' | awk -F ': ' '{ print $2; }')设置服务密码变量以匹配原始部署。数据库密码在 control plane 环境中可能会有所不同,但您必须同步服务帐户密码。
例如,在使用 director Operator Standalone 的开发人员环境中,可以提取密码:
AODH_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' AodhPassword:' | awk -F ': ' '{ print $2; }') BARBICAN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' BarbicanPassword:' | awk -F ': ' '{ print $2; }') CEILOMETER_METERING_SECRET=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CeilometerMeteringSecret:' | awk -F ': ' '{ print $2; }') CEILOMETER_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CeilometerPassword:' | awk -F ': ' '{ print $2; }') CINDER_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' CinderPassword:' | awk -F ': ' '{ print $2; }') GLANCE_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' GlancePassword:' | awk -F ': ' '{ print $2; }') HEAT_AUTH_ENCRYPTION_KEY=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatAuthEncryptionKey:' | awk -F ': ' '{ print $2; }') HEAT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatPassword:' | awk -F ': ' '{ print $2; }') HEAT_STACK_DOMAIN_ADMIN_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' HeatStackDomainAdminPassword:' | awk -F ': ' '{ print $2; }') IRONIC_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' IronicPassword:' | awk -F ': ' '{ print $2; }') MANILA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' ManilaPassword:' | awk -F ': ' '{ print $2; }') NEUTRON_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' NeutronPassword:' | awk -F ': ' '{ print $2; }') NOVA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' NovaPassword:' | awk -F ': ' '{ print $2; }') OCTAVIA_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' OctaviaPassword:' | awk -F ': ' '{ print $2; }') PLACEMENT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' PlacementPassword:' | awk -F ': ' '{ print $2; }') SWIFT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' SwiftPassword:' | awk -F ': ' '{ print $2; }')
流程
确保您在使用要部署 control plane 的 Red Hat OpenShift Container Platform (RHOCP)命名空间:
$ oc project openstack- 创建 RHOSP secret。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 为 Red Hat OpenStack Services 提供安全访问 OpenShift 服务。
如果
$ADMIN_PASSWORD与您在osp-secret中设置的密码不同,请修改osp-secret中的AdminPassword键:$ oc set data secret/osp-secret "AdminPassword=$ADMIN_PASSWORD"在
osp-secret中设置服务帐户密码,以匹配原始部署中的服务帐户密码:$ oc set data secret/osp-secret "AodhPassword=$AODH_PASSWORD" $ oc set data secret/osp-secret "BarbicanPassword=$BARBICAN_PASSWORD" $ oc set data secret/osp-secret "CeilometerPassword=$CEILOMETER_PASSWORD" $ oc set data secret/osp-secret "CinderPassword=$CINDER_PASSWORD" $ oc set data secret/osp-secret "GlancePassword=$GLANCE_PASSWORD" $ oc set data secret/osp-secret "HeatAuthEncryptionKey=$HEAT_AUTH_ENCRYPTION_KEY" $ oc set data secret/osp-secret "HeatPassword=$HEAT_PASSWORD" $ oc set data secret/osp-secret "HeatStackDomainAdminPassword=$HEAT_STACK_DOMAIN_ADMIN_PASSWORD" $ oc set data secret/osp-secret "IronicPassword=$IRONIC_PASSWORD" $ oc set data secret/osp-secret "IronicInspectorPassword=$IRONIC_PASSWORD" $ oc set data secret/osp-secret "ManilaPassword=$MANILA_PASSWORD" $ oc set data secret/osp-secret "MetadataSecret=$METADATA_SECRET" $ oc set data secret/osp-secret "NeutronPassword=$NEUTRON_PASSWORD" $ oc set data secret/osp-secret "NovaPassword=$NOVA_PASSWORD" $ oc set data secret/osp-secret "OctaviaPassword=$OCTAVIA_PASSWORD" $ oc set data secret/osp-secret "PlacementPassword=$PLACEMENT_PASSWORD" $ oc set data secret/osp-secret "SwiftPassword=$SWIFT_PASSWORD"部署
OpenStackControlPlaneCR。确保您只启用 DNS、Galera、Memcached 和 RabbitMQ 服务。所有其他服务必须禁用:$ oc apply -f - <<EOF apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack spec: secret: osp-secret storageClass: <storage_class>1 barbican: enabled: false template: barbicanAPI: {} barbicanWorker: {} barbicanKeystoneListener: {} cinder: enabled: false template: cinderAPI: {} cinderScheduler: {} cinderBackup: {} cinderVolumes: {} dns: template: override: service: metadata: annotations: metallb.universe.tf/address-pool: <address_pool>2 metallb.universe.tf/allow-shared-ip: <address_pool> metallb.universe.tf/loadBalancerIPs: <loadBalancer_IP>3 spec: type: LoadBalancer options: - key: server values: - 192.168.122.1 replicas: 1 glance: enabled: false template: glanceAPIs: {} heat: enabled: false template: {} horizon: enabled: false template: {} ironic: enabled: false template: ironicConductors: [] keystone: enabled: false template: {} manila: enabled: false template: manilaAPI: {} manilaScheduler: {} manilaShares: {} galera: enabled: true templates: openstack: secret: osp-secret replicas: 3 storageRequest: 5G openstack-cell1:4 secret: osp-secret replicas: 3 storageRequest: 5G openstack-cell2: secret: osp-secret replicas: 1 storageRequest: 5G openstack-cell3: secret: osp-secret replicas: 1 storageRequest: 5G memcached: enabled: true templates: memcached: replicas: 3 neutron: enabled: false template: {} nova: enabled: false template: {} ovn: enabled: false template: ovnController: networkAttachment: tenant nodeSelector: node: non-existing-node-name ovnNorthd: replicas: 0 ovnDBCluster: ovndbcluster-nb: replicas: 3 dbType: NB networkAttachment: <networkAttachment_name>5 ovndbcluster-sb: replicas: 3 dbType: SB networkAttachment: <networkAttachment_name> placement: enabled: false template: {} rabbitmq: templates: rabbitmq: override: service: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.85 spec: type: LoadBalancer rabbitmq-cell1: persistence: storage: 1G override: service: metadata: annotations: metallb.universe.tf/address-pool: <networkAttachment_name> metallb.universe.tf/loadBalancerIPs: <loadBalancer_IP> spec: type: LoadBalancer rabbitmq-cell2: persistence: storage: 1G override: service: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.87 spec: type: LoadBalancer rabbitmq-cell3: persistence: storage: 1G override: service: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.88 spec: type: LoadBalancer telemetry: enabled: false tls:6 podLevel: enabled: false ingress: enabled: false swift: enabled: false template: swiftRing: ringReplicas: 1 swiftStorage: replicas: 0 swiftProxy: replicas: 1 EOF- 1
- 在 RHOCP 集群中选择一个现有的 <
storage_class>。 - 2
- 将
<address_pool> 替换为网络定义的名称。 - 3
- 将
<loadBalancer_IP> 替换为 LoadBalancer IP 地址。 - 4
- 本例为 3 个计算单元提供所需的基础架构数据库和消息传递服务,名为
cell1、cell2和cell3。根据需要,调整每个 Compute 单元的副本、存储 或等字段的值。storageRequest - 5
- 将
<networkAttachment_name> 替换为您的网络的名称。 - 6
- 如果您在 RHOSP 环境中启用了 TLS-e,在
spec:tls部分将tls设置为以下内容:
spec: ... tls: podLevel: enabled: true internal: ca: customIssuer: rootca-internal libvirt: ca: customIssuer: rootca-internal ovn: ca: customIssuer: rootca-internal ingress: ca: customIssuer: rootca-internal enabled: true
如果使用 IPv6,请将负载均衡器 IP 更改为环境中的 IP,例如:
...
metallb.universe.tf/allow-shared-ip: ctlplane
metallb.universe.tf/loadBalancerIPs: fd00:aaaa::80
...
metallb.universe.tf/address-pool: internalapi
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::85
...
metallb.universe.tf/address-pool: internalapi
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::86
验证
验证所有定义的单元的 Galera 和 RabbitMQ 状态是否为
Running:$ RENAMED_CELLS="cell1 cell2 cell3" $ oc get pod openstack-galera-0 -o jsonpath='{.status.phase}{"\n"}' $ oc get pod rabbitmq-server-0 -o jsonpath='{.status.phase}{"\n"}' $ for CELL in $(echo $RENAMED_CELLS); do > oc get pod openstack-$CELL-galera-0 -o jsonpath='{.status.phase}{"\n"}' > oc get pod rabbitmq-$CELL-server-0 -o jsonpath='{.status.phase}{"\n"}' > done之后,使用环境变量
RENAMED_CELLS会引用给定的单元名称。在数据库迁移过程中,Nova 单元被重命名。RENAMED_CELLS变量代表 RHOSO 部署中使用的新单元名称。确保所有 Rabbitmq 和 Galera CR 的状态都
完成:$ oc get Rabbitmqs,Galera NAME STATUS MESSAGE rabbitmq.rabbitmq.openstack.org/rabbitmq True Setup complete rabbitmq.rabbitmq.openstack.org/rabbitmq-cell1 True Setup complete NAME READY MESSAGE galera.mariadb.openstack.org/openstack True Setup complete galera.mariadb.openstack.org/openstack-cell1 True Setup complete验证
OpenStackControlPlaneCR 是否已等待openstackclientpod 部署:$ oc get OpenStackControlPlane openstack NAME STATUS MESSAGE openstack Unknown OpenStackControlPlane Client not started
4.3. 配置 Red Hat Ceph Storage 后端 复制链接链接已复制到粘贴板!
如果您的 Red Hat OpenStack Platform (RHOSP) 17.1 部署对任何服务使用 Red Hat Ceph Storage 后端,如 Image Service (glance)、块存储服务(cinder)、计算服务(nova)或共享文件系统服务(manila),您必须配置自定义资源(CR),以便在 OpenShift (RHOSO) 18.0 部署中的 Red Hat OpenStack Services 中使用相同的后端。
要运行 ceph 命令,您必须使用 SSH 连接到 Red Hat Ceph Storage 节点并运行 sudo cephadm shell。这会生成一个 Ceph 编配器容器,供您针对 Red Hat Ceph Storage 集群运行管理命令。如果使用 director Operator 部署 Red Hat Ceph Storage 集群,您可以从 RHOSP Controller 节点启动 cephadm shell。
先决条件
-
OpenStackControlPlaneCR 已创建。 如果您的 RHOSP 17.1 部署使用共享文件系统服务,则会更新 openstack keyring。修改
openstack用户,以便您可以在所有 RHOSP 服务中使用它:ceph auth caps client.openstack \ mgr 'allow *' \ mon 'allow r, profile rbd' \ osd 'profile rbd pool=vms, profile rbd pool=volumes, profile rbd pool=images, allow rw pool manila_data'通过对所有服务使用相同的用户,可以更轻松地创建包含密钥环和
ceph.conf文件的通用 Red Hat Ceph Storage secret,并将 secret 传播到所需的所有服务。定义了以下 shell 变量:将以下示例值替换为您的环境的正确值:
CEPH_SSH="ssh -i <path to SSH key> root@<node IP>" CEPH_KEY=$($CEPH_SSH "cat /etc/ceph/ceph.client.openstack.keyring | base64 -w 0") CEPH_CONF=$($CEPH_SSH "cat /etc/ceph/ceph.conf | base64 -w 0")
流程
创建包含 Red Hat Ceph Storage 配置的
ceph-conf-filessecret:$ oc apply -f - <<EOF apiVersion: v1 data: ceph.client.openstack.keyring: $CEPH_KEY ceph.conf: $CEPH_CONF kind: Secret metadata: name: ceph-conf-files type: Opaque EOF文件的内容应类似以下示例:
apiVersion: v1 kind: Secret metadata: name: ceph-conf-files stringData: ceph.client.openstack.keyring: | [client.openstack] key = <secret key> caps mgr = "allow *" caps mon = "allow r, profile rbd" caps osd = "pool=vms, profile rbd pool=volumes, profile rbd pool=images, allow rw pool manila_data' ceph.conf: | [global] fsid = 7a1719e8-9c59-49e2-ae2b-d7eb08c695d4 mon_host = 10.1.1.2,10.1.1.3,10.1.1.41 - 1
- 如果您使用 IPv6,请将括号用于
mon_host。例如:mon_host = [v2:[fd00:cc::100]:3300/0,v1:[fd00:cccc::100]:6789/0]
在
OpenStackControlPlaneCR 中,将ceph.conf和ceph.client.openstack.keyring注入传播列表中定义的 RHOSP 服务。例如:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: extraMounts: - name: v1 region: r1 extraVol: - propagation: - CinderVolume - CinderBackup - GlanceAPI - ManilaShare extraVolType: Ceph volumes: - name: ceph projected: sources: - secret: name: ceph-conf-files mounts: - name: ceph mountPath: "/etc/ceph" readOnly: true '
4.4. 停止 Red Hat OpenStack Platform 服务 复制链接链接已复制到粘贴板!
在 OpenShift (RHOSO)上启动 Red Hat OpenStack Services 前,您必须停止 Red Hat OpenStack Platform (RHOSP)服务,以避免为 data plane 采用数据不一致。不一致性是由数据库复制到新部署后资源更改造成的。
您不应该停止基础架构管理服务,例如:
- 数据库
- RabbitMQ
- HAProxy Load Balancer
- ceph-nfs
- 计算服务
- 容器化模块 libvirt 守护进程
- Object Storage 服务(swift)后端服务
先决条件
确保没有需要您计划停止的服务的长时间运行任务,如实例实时迁移、卷迁移、卷创建、备份和恢复、附加、分离和其他类似的操作:
$ openstack server list --all-projects -c ID -c Status |grep -E '\| .+ing \|' $ openstack volume list --all-projects -c ID -c Status |grep -E '\| .+ing \|'| grep -vi error $ openstack volume backup list --all-projects -c ID -c Status |grep -E '\| .+ing \|' | grep -vi error $ openstack share list --all-projects -c ID -c Status |grep -E '\| .+ing \|'| grep -vi error $ openstack image list -c ID -c Status |grep -E '\| .+ing \|'- 收集特定于服务拓扑的配置。如需更多信息,请参阅 检索特定于拓扑的服务配置。
定义以下 shell 变量:值是示例,引用单一节点独立 director Operator 部署。将这些示例值替换为适合您的环境的值:
CONTROLLER1_SSH="ssh -i <path to SSH key> root@<controller-1 IP>"1 CONTROLLER2_SSH="ssh -i <path to SSH key> root@<controller-2 IP>" CONTROLLER3_SSH="ssh -i <path to SSH key> root@<controller-3 IP>"指定所有 Controller 节点的 IP 地址,例如:
CONTROLLER1_SSH="ssh -i <path to SSH key> root@<controller-1 IP>"1 CONTROLLER2_SSH="ssh -i <path to SSH key> root@<controller-2 IP>" CONTROLLER3_SSH="ssh -i <path to SSH key> root@<controller-3 IP>" # ...
流程
如果您的部署通过 NFS 作为共享文件系统服务(manila)的后端启用 CephFS,请删除以下 Pacemaker 排序和共同定位约束,以管理
ceph-nfs服务和manila-share服务的虚拟 IP 地址:# check the co-location and ordering constraints concerning "manila-share" sudo pcs constraint list --full # remove these constraints sudo pcs constraint remove colocation-openstack-manila-share-ceph-nfs-INFINITY sudo pcs constraint remove order-ceph-nfs-openstack-manila-share-Optional禁用 RHOSP control plane 服务:
# Update the services list to be stopped ServicesToStop=("tripleo_aodh_api.service" "tripleo_aodh_api_cron.service" "tripleo_aodh_evaluator.service" "tripleo_aodh_listener.service" "tripleo_aodh_notifier.service" "tripleo_ceilometer_agent_central.service" "tripleo_ceilometer_agent_notification.service" "tripleo_octavia_api.service" "tripleo_octavia_health_manager.service" "tripleo_octavia_rsyslog.service" "tripleo_octavia_driver_agent.service" "tripleo_octavia_housekeeping.service" "tripleo_octavia_worker.service" "tripleo_horizon.service" "tripleo_keystone.service" "tripleo_barbican_api.service" "tripleo_barbican_worker.service" "tripleo_barbican_keystone_listener.service" "tripleo_cinder_api.service" "tripleo_cinder_api_cron.service" "tripleo_cinder_scheduler.service" "tripleo_cinder_volume.service" "tripleo_cinder_backup.service" "tripleo_collectd.service" "tripleo_glance_api.service" "tripleo_gnocchi_api.service" "tripleo_gnocchi_metricd.service" "tripleo_gnocchi_statsd.service" "tripleo_manila_api.service" "tripleo_manila_api_cron.service" "tripleo_manila_scheduler.service" "tripleo_neutron_api.service" "tripleo_placement_api.service" "tripleo_nova_api_cron.service" "tripleo_nova_api.service" "tripleo_nova_conductor.service" "tripleo_nova_metadata.service" "tripleo_nova_scheduler.service" "tripleo_nova_vnc_proxy.service" "tripleo_aodh_api.service" "tripleo_aodh_api_cron.service" "tripleo_aodh_evaluator.service" "tripleo_aodh_listener.service" "tripleo_aodh_notifier.service" "tripleo_ceilometer_agent_central.service" "tripleo_ceilometer_agent_compute.service" "tripleo_ceilometer_agent_ipmi.service" "tripleo_ceilometer_agent_notification.service" "tripleo_ovn_cluster_northd.service" "tripleo_ironic_neutron_agent.service" "tripleo_ironic_api.service" "tripleo_ironic_inspector.service" "tripleo_ironic_conductor.service") PacemakerResourcesToStop=("openstack-cinder-volume" "openstack-cinder-backup" "openstack-manila-share") echo "Stopping systemd OpenStack services" for service in ${ServicesToStop[*]}; do SSH_CMD=CONTROLLER_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Stopping the $service in controller $i" if ${!SSH_CMD} sudo systemctl is-active $service; then ${!SSH_CMD} sudo systemctl stop $service fi fi done echo "Checking systemd OpenStack services" for service in ${ServicesToStop[*]}; do for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then if ! ${!SSH_CMD} systemctl show $service | grep ActiveState=inactive >/dev/null; then echo "ERROR: Service $service still running on controller $i" else echo "OK: Service $service is not running on controller $i" fi fi done done echo "Stopping pacemaker OpenStack services" SSH_CMD=CONTROLLER_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Using controller $i to run pacemaker commands" for resource in ${PacemakerResourcesToStop[*]}; do if ${!SSH_CMD} sudo pcs resource config $resource &>/dev/null; then echo "Stopping $resource" ${!SSH_CMD} sudo pcs resource disable $resource else echo "Service $resource not present" fi break fi done echo "Checking pacemaker OpenStack services" SSH_CMD=CONTROLLER_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Using controller $i to run pacemaker commands" for resource in ${PacemakerResourcesToStop[*]}; do if ${!SSH_CMD} sudo pcs resource config $resource &>/dev/null; then if ! ${!SSH_CMD} sudo pcs resource status $resource | grep Started; then echo "OK: Service $resource is stopped" else echo "ERROR: Service $resource is started" fi fi done break fi如果每个服务的状态为
OK,则服务成功停止。
4.5. 将数据库迁移到 MariaDB 实例 复制链接链接已复制到粘贴板!
将您的数据库从原始 Red Hat OpenStack Platform (RHOSP)部署迁移到 Red Hat OpenShift Container Platform (RHOCP)集群中的 MariaDB 实例。
先决条件
- 确保 control plane MariaDB 和 RabbitMQ 正在运行,且没有其他 control plane 服务在运行。
- 检索特定于拓扑的服务配置。如需更多信息,请参阅 检索特定于拓扑的服务配置。
- 停止 RHOSP 服务。如需更多信息,请参阅 停止 Red Hat OpenStack Platform 服务。
- 确保原始 MariaDB 和 control plane 的 MariaDB 之间有网络可路由性。
定义以下 shell 变量:将以下示例值替换为您的环境的正确值:
$ STORAGE_CLASS=local-storage $ MARIADB_IMAGE=registry.redhat.io/rhoso/openstack-mariadb-rhel9:18.0 $ OSPDO_MARIADB_CLIENT_ANNOTATIONS='[{"name": "internalapi-static","ips": ["172.17.0.99/24"]}]' $ MARIADB_RUN_OVERRIDES="$OSPDO_MARIADB_CLIENT_ANNOTATIONS" $ CELLS="default"1 $ DEFAULT_CELL_NAME="cell1" $ RENAMED_CELLS="$DEFAULT_CELL_NAME" $ CHARACTER_SET=utf82 $ COLLATION=utf8_general_ci $ declare -A PODIFIED_DB_ROOT_PASSWORD $ for CELL in $(echo "super $RENAMED_CELLS"); do > PODIFIED_DB_ROOT_PASSWORD[$CELL]=$(oc get -o json secret/osp-secret | jq -r .data.DbRootPassword | base64 -d) > done $ declare -A PODIFIED_MARIADB_IP $ for CELL in $(echo "super $RENAMED_CELLS"); do > if [ "$CELL" = "super" ]; then > PODIFIED_MARIADB_IP[$CELL]=$(oc get svc --selector "mariadb/name=openstack" -ojsonpath='{.items[0].spec.clusterIP}') > else > PODIFIED_MARIADB_IP[$CELL]=$(oc get svc --selector "mariadb/name=openstack-$CELL" -ojsonpath='{.items[0].spec.clusterIP}') > fi > done $ declare -A TRIPLEO_PASSWORDS $ for CELL in $(echo $CELLS); do > if [ "$CELL" = "default" ]; then > TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml" > else > # in a split-stack source cloud, it should take a stack-specific passwords file instead > TRIPLEO_PASSWORDS[$CELL]="$HOME/overcloud-passwords.yaml" > fi > done $ declare -A SOURCE_DB_ROOT_PASSWORD $ for CELL in $(echo $CELLS); do > SOURCE_DB_ROOT_PASSWORD[$CELL]=$(cat ${TRIPLEO_PASSWORDS[$CELL]} | grep ' MysqlRootPassword:' | awk -F ': ' '{ print $2; }') > done $ declare -A SOURCE_MARIADB_IP $ SOURCE_MARIADB_IP[default]=*<galera cluster VIP>*3 $ SOURCE_MARIADB_IP[cell1]=*<galera cell1 cluster VIP>*4 $ SOURCE_MARIADB_IP[cell2]=*<galera cell2 cluster VIP>*5 # ... $ declare -A SOURCE_GALERA_MEMBERS_DEFAULT $ SOURCE_GALERA_MEMBERS_DEFAULT=( > ["standalone.localdomain"]=172.17.0.1006 > # [...]=... > ) $ declare -A SOURCE_GALERA_MEMBERS_CELL1 $ SOURCE_GALERA_MEMBERS_CELL1=( > # ... > ) $ declare -A SOURCE_GALERA_MEMBERS_CELL2 $ SOURCE_GALERA_MEMBERS_CELL2=( > # ... > )- 1
CELLS和RENAMED_CELLS代表在导入数据库后要进行的更改。默认单元使用来自DEFAULT_CELL_NAME的新名称。在多单元采用场景中,默认的单元也可能会保留其原始的默认名称。- 2
CHARACTER_SET变量和 collation 应与源数据库匹配。如果不匹配,则以后创建的任何表的外键关系中断作为数据库同步的一部分。- 3
- 在
SOURCE_MARIADB_IP[*]= ...中为CELLS中定义的每个单元添加数据。为 MariaDB Galera 集群的单元名称和 VIP 地址提供记录。 - 4
- 使用 galera cell1 集群的 VIP 替换
。 - 5
- 使用 galera cell2 集群的 VIP 替换
,以此类推。 - 6
- 对于在
SOURCE_GALERA_MEMBER中定义的每个单元,添加 MariaDB Galera 集群成员及其 IP 地址的名称。将S_CELL<X>["standalone.localdomain"]="172.17.0.100"替换为实际主机数据。
独立 director Operator 环境只 创建一个默认的 单元,这应该是本例中唯一的 CELLS 值。DEFAULT_CELL_NAME 值应该是 cell1。
超级 是顶级范围的 Nova API upcall 数据库实例。超级编排器连接到该数据库。在后续示例中,upcall 和 cells 数据库使用与 osp-secret 中定义的相同密码。旧密码只需要准备数据导出。
要获取
SOURCE_MARIADB_IP的值,请查询 Controller 和 CellController 节点上的 puppet 生成的配置:$ sudo grep -rI 'listen mysql' -A10 /var/lib/config-data/puppet-generated/ | grep bind要获取
SOURCE_GALERA_MEMBERS platforms的值,请查询 Controller 和 CellController 节点上的 puppet 生成的配置:$ sudo grep -rI 'listen mysql' -A10 /var/lib/config-data/puppet-generated/ | grep server源云始终对单元数据库使用相同的密码。因此,相同的密码文件用于所有单元堆栈。但是,split-stack 拓扑允许为每个堆栈使用不同的密码文件。
准备 MariaDB 的采用帮助程序 pod:
为数据库数据复制创建一个临时卷声明和 pod。如果需要,编辑卷声明存储请求,为 overcloud 数据库提供足够空间:
$ oc apply -f - <<EOF --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mariadb-data spec: storageClassName: $STORAGE_CLASS accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- apiVersion: v1 kind: Pod metadata: name: mariadb-copy-data annotations: openshift.io/scc: anyuid k8s.v1.cni.cncf.io/networks: '[{"name": internalapi-static, "ips": ["10.2.120.9/24"]}]' labels: app: adoption spec: nodeName: <$CONTROLLER_NODE> containers: - image: $MARIADB_IMAGE command: [ "sh", "-c", "sleep infinity"] name: adoption volumeMounts: - mountPath: /backup name: mariadb-data securityContext: allowPrivilegeEscalation: false capabilities: drop: ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: mariadb-data persistentVolumeClaim: claimName: mariadb-data EOF等待 pod 就绪:
$ oc wait --for condition=Ready pod/mariadb-copy-data --timeout=30s
流程
检查每个单元中的源 Galera 数据库集群是否在线并同步:
$ for CELL in $(echo $CELLS); do > MEMBERS=SOURCE_GALERA_MEMBERS_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')[@] > for i in "${!MEMBERS}"; do > echo "Checking for the database node $i WSREP status Synced" > oc rsh mariadb-copy-data mysql \ > -h "$i" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" \ > -e "show global status like 'wsrep_local_state_comment'" | \ > grep -qE "\bSynced\b" > done > done每个额外的 Compute 服务(nova) v2 单元运行一个专用的 Galera 数据库集群,因此命令会检查每个单元。
获取具有
NOK(not-OK)状态的源数据库计数:$ for CELL in $(echo $CELLS); do > oc rsh mariadb-copy-data mysql -h "${SOURCE_MARIADB_IP[$CELL]}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" -e "SHOW databases;" > end检查
mysqlcheck是否没有错误:$ for CELL in $(echo $CELLS); do > set +u > . ~/.source_cloud_exported_variables_$CELL > set -u > done $ test -z "$PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK" || [ "x$PULL_OPENSTACK_CONFIGURATION_MYSQLCHECK_NOK" = "x " ] && echo "OK" || echo "CHECK FAILED"测试到 control plane upcall 和 cells 数据库的连接:
$ for CELL in $(echo "super $RENAMED_CELLS"); do > oc run mariadb-client --image $MARIADB_IMAGE -i --rm --restart=Never -- \ > mysql -rsh "${PODIFIED_MARIADB_IP[$CELL]}" -uroot -p"${PODIFIED_DB_ROOT_PASSWORD[$CELL]}" -e 'SHOW databases;' > done注意您必须通过从
cell1开始,删除单元数据库中的旧服务记录,将稍后导入的 Compute 服务转换为超级编排器架构。新记录注册了由 Compute 服务操作器提供的不同主机名。除 Compute 代理外的所有 Compute 服务都没有内部状态,您可以安全地删除其服务记录。您还需要将前一个默认的单元重命名为DEFAULT_CELL_NAME。创建原始数据库的转储:
$ for CELL in $(echo $CELLS); do > oc rsh mariadb-copy-data << EOF > mysql -h"${SOURCE_MARIADB_IP[$CELL]}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" \ > -N -e "show databases" | grep -E -v "schema|mysql|gnocchi|aodh" | \ > while read dbname; do > echo "Dumping $CELL cell \${dbname}"; > mysqldump -h"${SOURCE_MARIADB_IP[$CELL]}" -uroot -p"${SOURCE_DB_ROOT_PASSWORD[$CELL]}" \ > --single-transaction --complete-insert --skip-lock-tables --lock-tables=0 \ > "\${dbname}" > /backup/"${CELL}.\${dbname}".sql; > done > EOF > done请注意,过滤信息和性能模式表。Gnocchi 不再用作指标存储
将数据库从
.sql文件恢复到 control plane MariaDB 中:$ for CELL in $(echo $CELLS); do > RCELL=$CELL > [ "$CELL" = "default" ] && RCELL=$DEFAULT_CELL_NAME > oc rsh mariadb-copy-data << EOF > declare -A db_name_map1 > db_name_map['nova']="nova_$RCELL" > db_name_map['ovs_neutron']='neutron' > db_name_map['ironic-inspector']='ironic_inspector' > declare -A db_cell_map2 > db_cell_map['nova']="nova_$DEFAULT_CELL_NAME" > db_cell_map["nova_$RCELL"]="nova_$RCELL"3 > declare -A db_server_map4 > db_server_map['default']=${PODIFIED_MARIADB_IP['super']} > db_server_map["nova"]=${PODIFIED_MARIADB_IP[$DEFAULT_CELL_NAME]} > db_server_map["nova_$RCELL"]=${PODIFIED_MARIADB_IP[$RCELL]} > declare -A db_server_password_map5 > db_server_password_map['default']=${PODIFIED_DB_ROOT_PASSWORD['super']} > db_server_password_map["nova"]=${PODIFIED_DB_ROOT_PASSWORD[$DEFAULT_CELL_NAME]} > db_server_password_map["nova_$RCELL"]=${PODIFIED_DB_ROOT_PASSWORD[$RCELL]} > cd /backup > for db_file in \$(ls ${CELL}.*.sql); do > db_name=\$(echo \${db_file} | awk -F'.' '{ print \$2; }') > [[ "$CELL" != "default" && ! -v "db_cell_map[\${db_name}]" ]] && continue > if [[ "$CELL" == "default" && -v "db_cell_map[\${db_name}]" ]] ; then > target=$DEFAULT_CELL_NAME > elif [[ "$CELL" == "default" && ! -v "db_cell_map[\${db_name}]" ]] ; then > target=super > else > target=$RCELL > fi6 > renamed_db_file="\${target}_new.\${db_name}.sql" > mv -f \${db_file} \${renamed_db_file} > if [[ -v "db_name_map[\${db_name}]" ]]; then > echo "renaming $CELL cell \${db_name} to \$target \${db_name_map[\${db_name}]}" > db_name=\${db_name_map[\${db_name}]} > fi > db_server=\${db_server_map["default"]} > if [[ -v "db_server_map[\${db_name}]" ]]; then > db_server=\${db_server_map[\${db_name}]} > fi > db_password=\${db_server_password_map['default']} > if [[ -v "db_server_password_map[\${db_name}]" ]]; then > db_password=\${db_server_password_map[\${db_name}]} > fi > echo "creating $CELL cell \${db_name} in \$target \${db_server}" > mysql -h"\${db_server}" -uroot "-p\${db_password}" -e \ > "CREATE DATABASE IF NOT EXISTS \${db_name} DEFAULT \ > CHARACTER SET ${CHARACTER_SET} DEFAULT COLLATE ${COLLATION};" > echo "importing $CELL cell \${db_name} into \$target \${db_server} from \${renamed_db_file}" > mysql -h "\${db_server}" -uroot "-p\${db_password}" "\${db_name}" < "\${renamed_db_file}" > done > if [ "$CELL" = "default" ] ; then > mysql -h "\${db_server_map['default']}" -uroot -p"\${db_server_password_map['default']}" -e \ > "update nova_api.cell_mappings set name='$DEFAULT_CELL_NAME' where name='default';" > fi > mysql -h "\${db_server_map["nova_$RCELL"]}" -uroot -p"\${db_server_password_map["nova_$RCELL"]}" -e \ > "delete from nova_${RCELL}.services where host not like '%nova_${RCELL}-%' and services.binary != 'nova-compute';" > EOF > done
验证
将以下输出与特定于拓扑的服务配置进行比较。如需更多信息,请参阅 检索特定于拓扑的服务配置。
检查数据库是否已正确导入:
$ set +u $ . ~/.source_cloud_exported_variables_default $ set -u $ dbs=$(oc exec openstack-galera-0 -c galera -- mysql -rs -uroot -p"${PODIFIED_DB_ROOT_PASSWORD['super']}" -e 'SHOW databases;') $ echo $dbs | grep -Eq '\bkeystone\b' && echo "OK" || echo "CHECK FAILED" $ echo $dbs | grep -Eq '\bneutron\b' && echo "OK" || echo "CHECK FAILED" $ echo "${PULL_OPENSTACK_CONFIGURATION_DATABASES[@]}" | grep -Eq '\bovs_neutron\b' && echo "OK" || echo "CHECK FAILED"1 $ novadb_mapped_cells=$(oc exec openstack-galera-0 -c galera -- mysql -rs -uroot -p"${PODIFIED_DB_ROOT_PASSWORD['super']}" \ > nova_api -e 'select uuid,name,transport_url,database_connection,disabled from cell_mappings;')2 $ uuidf='\S{8,}-\S{4,}-\S{4,}-\S{4,}-\S{12,}' $ default=$(printf "%s\n" "$PULL_OPENSTACK_CONFIGURATION_NOVADB_MAPPED_CELLS" | sed -rn "s/^($uuidf)\s+default\b.*$/\1/p") $ difference=$(diff -ZNua \ > <(printf "%s\n" "$PULL_OPENSTACK_CONFIGURATION_NOVADB_MAPPED_CELLS") \ > <(printf "%s\n" "$novadb_mapped_cells")) || true $ if [ "$DEFAULT_CELL_NAME" != "default" ]; then > printf "%s\n" "$difference" | grep -qE "^\-$default\s+default\b" && echo "OK" || echo "CHECK FAILED" > printf "%s\n" "$difference" | grep -qE "^\+$default\s+$DEFAULT_CELL_NAME\b" && echo "OK" || echo "CHECK FAILED" > [ $(grep -E "^[-\+]$uuidf" <<<"$difference" | wc -l) -eq 2 ] && echo "OK" || echo "CHECK FAILED" > else > [ "x$difference" = "x" ] && echo "OK" || echo "CHECK FAILED" > fi $ for CELL in $(echo $RENAMED_CELLS); do3 > RCELL=$CELL > [ "$CELL" = "$DEFAULT_CELL_NAME" ] && RCELL=default > set +u > . ~/.source_cloud_exported_variables_$RCELL > set -u > c1dbs=$(oc exec openstack-$CELL-galera-0 -c galera -- mysql -rs -uroot -p${PODIFIED_DB_ROOT_PASSWORD[$CELL]} -e 'SHOW databases;')4 > echo $c1dbs | grep -Eq "\bnova_${CELL}\b" && echo "OK" || echo "CHECK FAILED" > novadb_svc_records=$(oc exec openstack-$CELL-galera-0 -c galera -- mysql -rs -uroot -p${PODIFIED_DB_ROOT_PASSWORD[$CELL]} \ > nova_$CELL -e "select host from services where services.binary='nova-compute' and deleted=0 order by host asc;") > diff -Z <(echo "x$novadb_svc_records") <(echo "x${PULL_OPENSTACK_CONFIGURATION_NOVA_COMPUTE_HOSTNAMES[@]}") && echo "OK" || echo "CHECK FAILED"5 > done删除
mariadb-datapod 和mariadb-copy-data持久性卷声明,其中包含数据库备份:注意在删除前,请考虑为它们执行快照。
$ oc delete pod mariadb-copy-data $ oc delete pvc mariadb-data
在预检查和后检查过程中,mariadb-client pod 可能会返回与 restricted:latest 安全性上下文约束相关的 pod 安全警告。这个警告是因为默认安全性上下文约束,不会阻止准入控制器创建 pod。您会看到一个针对短期 pod 的警告,但它不会影响到功能。如需更多信息,请参阅关于 pod 安全标准和警告。
4.6. 迁移 OVN 数据 复制链接链接已复制到粘贴板!
将 OVN 数据库中的数据从原始 Red Hat OpenStack Platform 部署迁移到 Red Hat OpenShift Container Platform (RHOCP)集群中运行的 ovsdb-server 实例。
先决条件
-
OpenStackControlPlane资源已创建。 -
定义原始集群的
NetworkAttachmentDefinition自定义资源(CR)。具体来说,定义了internalapi网络。 -
原始网络服务(neutron)和 OVN
northd未运行。 - control plane 服务和采用的集群之间存在网络弹性。
- 云迁移到带有 Open Virtual Networking (ML2/OVN)机制驱动程序的 Modular Layer 2 插件。
定义以下 shell 变量:将示例值替换为您的环境正确的值:
STORAGE_CLASS=local-storage OVSDB_IMAGE=registry.redhat.io/rhoso/openstack-ovn-base-rhel9:18.0 SOURCE_OVSDB_IP=172.17.0.100 # For IPv4 SOURCE_OVSDB_IP=[fd00:bbbb::100] # For IPv6将
SOURCE_OVSDB_IP的 IP 地址值更新为与剩余的 RHOSP 17 控制器虚拟机关联的内部Api IP 地址。使用以下命令检索 IP 地址:
$ $CONTROLLER_SSH ip a s enp4s0
** Select the non /32 IP address
如果您使用断开连接的环境 director Operator 部署,请使用 OVSDB_IMAGE=registry.redhat.io/rhoso/openstack-ovn-base-rhel9@sha256:967046c6bdb8f55c236085b5c5f9667f0dbb9f3ac52a6560dd36a6bfac051e1f。如需更多信息,请参阅使用 director Operator 在 Red Hat OpenShift Container Platform 集群中部署 overcloud 中的 配置 airgapped 环境。
流程
获取包含 RHOSP Controller 节点的 RHOCP master 节点:
$ oc get vmi -n $<ospdo_namespace> -o jsonpath='{.items[0].metadata.labels.kubevirt\.io/nodeName}'-
将
<ospdo_namespace> 替换为您的 OSPdO 命名空间。
-
将
为 OVN 备份准备临时
PersistentVolume声明和 helper pod。如果需要,调整大型数据库的存储请求:$ oc apply -f - <<EOF --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: ovn-data-cert spec: commonName: ovn-data-cert secretName: ovn-data-cert issuerRef: name: rootca-internal --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: $OSPDO_NAMESPACE name: ovn-data spec: storageClassName: $STORAGE_CLASS accessModes: - ReadWriteOnce resources: requests: storage: 10Gi --- apiVersion: v1 kind: Pod metadata: name: ovn-copy-data annotations: openshift.io/scc: anyuid '[{"name": "internalapi-static", "namespace": $<ospdo_namespace>, "ips": ["<internalapi-static-ips>"]}]' labels: app: adoption namespace: $OSPDO_NAMESPACE spec: nodeName: '{{ <ocp_node_holding_controller> }}'1 containers: - image: $OVSDB_IMAGE command: [ "sh", "-c", "sleep infinity"] name: adoption volumeMounts: - mountPath: /backup name: ovn-data - mountPath: /etc/pki/tls/misc name: ovn-data-cert readOnly: true securityContext: allowPrivilegeEscalation: false capabilities: drop: ALL runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: ovn-data persistentVolumeClaim: claimName: ovn-data - name: ovn-data-cert secret: secretName: ovn-data-cert EOF- 1
- 将
<ocp_node_holding_controller> 替换为包含 Controller 节点的 RHOSP 节点。
等待 pod 就绪:
$ oc wait --for=condition=Ready -n $OSPDO_NAMESPACE pod/ovn-copy-data --timeout=30s如果 podified internalapi cidr 与源 internalapi cidr 不同,请在 Controller 节点上添加 iptables accept 规则:
$ $CONTROLLER1_SSH sudo iptables -I INPUT -s {PODIFIED_INTERNALAPI_NETWORK} -p tcp -m tcp --dport 6641 -m conntrack --ctstate NEW -j ACCEPT $ $CONTROLLER1_SSH sudo iptables -I INPUT -s {PODIFIED_INTERNALAPI_NETWORK} -p tcp -m tcp --dport 6642 -m conntrack --ctstate NEW -j ACCEPT备份 OVN 数据库:
如果您没有在任何位置启用 TLS,请运行以下命令:
$ oc exec -n $OSPDO_NAMESPACE ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6641 > /backup/ovs-nb.db" $ oc exec -n $OSPDO_NAMESPACE ovn-copy-data -- bash -c "ovsdb-client backup tcp:$SOURCE_OVSDB_IP:6642 > /backup/ovs-sb.db"如果您随处启用 TLS,请运行以下命令:
$ oc exec ovn-copy-data -- bash -c "ovsdb-client backup --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$SOURCE_OVSDB_IP:6641 > /backup/ovs-nb.db" $ oc exec ovn-copy-data -- bash -c "ovsdb-client backup --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$SOURCE_OVSDB_IP:6642 > /backup/ovs-sb.db"
在导入前启动 control plane OVN 数据库服务,禁用
northd:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ovn: enabled: true template: ovnDBCluster: ovndbcluster-nb: replicas: 3 dbType: NB storageRequest: 10G networkAttachment: internalapi ovndbcluster-sb: replicas: 3 dbType: SB storageRequest: 10G networkAttachment: internalapi ovnNorthd: replicas: 0 '等待 OVN 数据库服务进入
Running阶段:$ oc wait --for=jsonpath='{.status.phase}'=Running pod --selector=service=ovsdbserver-nb $ oc wait --for=jsonpath='{.status.phase}'=Running pod --selector=service=ovsdbserver-sb在
clusterIP服务网络上获取 OVN 数据库 IP 地址:PODIFIED_OVSDB_NB_IP=$(oc get svc --selector "statefulset.kubernetes.io/pod-name=ovsdbserver-nb-0" -ojsonpath='{.items[0].spec.clusterIP}') PODIFIED_OVSDB_SB_IP=$(oc get svc --selector "statefulset.kubernetes.io/pod-name=ovsdbserver-sb-0" -ojsonpath='{.items[0].spec.clusterIP}')如果您使用 IPv6,请将地址调整为
ovsdbchannel 工具期望的格式:PODIFIED_OVSDB_NB_IP=[$PODIFIED_OVSDB_NB_IP] PODIFIED_OVSDB_SB_IP=[$PODIFIED_OVSDB_SB_IP]升级备份文件的数据库模式:
如果您没有在任何位置启用 TLS,请使用以下命令:
$ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema tcp:$PODIFIED_OVSDB_NB_IP:6641 > /backup/ovs-nb.ovsschema && ovsdb-tool convert /backup/ovs-nb.db /backup/ovs-nb.ovsschema" $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema tcp:$PODIFIED_OVSDB_SB_IP:6642 > /backup/ovs-sb.ovsschema && ovsdb-tool convert /backup/ovs-sb.db /backup/ovs-sb.ovsschema"如果您随处启用 TLS,请使用以下命令:
$ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_NB_IP:6641 > /backup/ovs-nb.ovsschema && ovsdb-tool convert /backup/ovs-nb.db /backup/ovs-nb.ovsschema" $ oc exec ovn-copy-data -- bash -c "ovsdb-client get-schema --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_SB_IP:6642 > /backup/ovs-sb.ovsschema && ovsdb-tool convert /backup/ovs-sb.db /backup/ovs-sb.ovsschema"
将数据库备份恢复到新的 OVN 数据库服务器:
如果您没有在任何位置启用 TLS,请使用以下命令:
如果您随处启用 TLS,请使用以下命令:
$ oc exec ovn-copy-data -- bash -c "ovsdb-client restore --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_NB_IP:6641 < /backup/ovs-nb.db" $ oc exec ovn-copy-data -- bash -c "ovsdb-client restore --ca-cert=/etc/pki/tls/misc/ca.crt --private-key=/etc/pki/tls/misc/tls.key --certificate=/etc/pki/tls/misc/tls.crt ssl:$PODIFIED_OVSDB_SB_IP:6642 < /backup/ovs-sb.db"
通过针对新的数据库服务器运行以下命令来检查数据是否已成功迁移,例如:
$ oc exec -it ovsdbserver-nb-0 -- ovn-nbctl show $ oc exec -it ovsdbserver-sb-0 -- ovn-sbctl list Chassis启动 control plane
ovn-northd服务,以便两个 OVN 数据库保持同步:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ovn: enabled: true template: ovnNorthd: replicas: 1 '如果您在 RHOCP 节点上运行 OVN 网关服务,请启用 control plane
ovn-controller服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ovn: enabled: true template: ovnController: nicMappings: physNet: NIC1 - 1
physnet是物理网络的名称。NIC是连接到您的物理网络的物理接口的名称。
注意在 RHOCP 节点上运行 OVN 网关,在 Open vSwitch 升级过程中可能会容易出现数据平面停机时间。考虑在专用的
Networkerdata plane 节点上运行 OVN 网关,用于生产环境部署。删除
ovn-datahelper pod 和用于存储 OVN 数据库备份文件的临时PersistentVolumeClaim:$ oc delete --ignore-not-found=true pod ovn-copy-data $ oc delete --ignore-not-found=true pvc ovn-data注意在删除
ovn-datahelper pod 和临时PersistentVolumeClaim前,请考虑为它们执行快照。如需更多信息,请参阅 OpenShift Container Platform 存储概述 中的 关于卷快照。停止采用的 OVN 数据库服务器:
ServicesToStop=("tripleo_ovn_cluster_north_db_server.service" "tripleo_ovn_cluster_south_db_server.service") echo "Stopping systemd OpenStack services" for service in ${ServicesToStop[*]}; do SSH_CMD=CONTROLLER_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Stopping the $service in controller $i" if ${!SSH_CMD} sudo systemctl is-active $service; then ${!SSH_CMD} sudo systemctl stop $service fi fi done echo "Checking systemd OpenStack services" for service in ${ServicesToStop[*]}; do SSH_CMD=CONTROLLER_SSH if [ ! -z "${!SSH_CMD}" ]; then if ! ${!SSH_CMD} systemctl show $service | grep ActiveState=inactive >/dev/null; then echo "ERROR: Service $service still running on controller $i" else echo "OK: Service $service is not running on controller $i" fi fi done
第 5 章 缩减 director Operator 资源 复制链接链接已复制到粘贴板!
在将数据库迁移到 control plane 之前,您必须缩减和删除 OpenStack director Operator (OSPdO)资源,才能使用 OpenShift (RHOSO)资源。
您必须执行以下操作:
- 从现有 RHOSP 17.1 集群中转储所选数据。您可以使用此数据为 data plane 采用构建自定义资源。
- 提取并保存数据后,删除 OSPdO control plane 和 Operator。
流程
下载 NIC 模板:
# Make temp directory if doesn't exist mkdir -p temp cd temp echo "Extract nic templates" oc get -n "${OSPDO_NAMESPACE}" cm tripleo-tarball -ojson | jq -r '.binaryData."tripleo-tarball.tar.gz"' | base64 -d | tar xzvf - # Revert back to original directory cd -获取用于访问数据平面节点的 SSH 密钥:
# Make temp directory if doesn't exist mkdir -p temp # Get the SSH key from the openstackclient (osp 17) # to be used later to create the SSH secret for dataplane adoption $OS_CLIENT cat /home/cloud-admin/.ssh/id_rsa > temp/ssh.private $OS_CLIENT cat /home/cloud-admin/.ssh/id_rsa.pub > temp/ssh.pub echo "SSH private and public keys saved in temp/ssh.private and temp/ssh.pub"从每个 Compute 节点角色
OpenStackBaremetalSet获取 OVN 配置。稍后使用这个配置来构建OpenStackDataPlaneNodeSet(s)。为每个OpenStackBaremetalSet重复此步骤:# Make temp directory if doesn't exist mkdir -p temp # # Query the first node in OSBMS # IP=$(oc -n "${OSPDO_NAMESPACE}" get openstackbaremetalsets.osp-director.openstack.org <<OSBMS-NAME>> -ojson | jq -r '.status.baremetalHosts| keys[] as $k | .[$k].ipaddresses["ctlplane"]'| awk -F'/' '{print $1}') # Get the OVN parameters oc -n "${OSPDO_NAMESPACE}" exec -c openstackclient openstackclient -- \ ssh cloud-admin@${IP} sudo ovs-vsctl -f json --columns=external_ids list Open | jq -r '.data[0][0][1][]|join("=")' | sed -n -E 's/^(ovn.*)+=(.*)+/edpm_\1: \2/p' | grep -v -e ovn-remote -e encap-tos -e openflow -e ofctrl > temp/<<OSBMS-NAME>>.txt# Create temp directory if it does not exist mkdir -p temp for name in $(oc -n "${OSPDO_NAMESPACE}" get openstackbaremetalsets.osp-director.openstack.org | awk 'NR > 1 {print $1}'); do oc -n "${OSPDO_NAMESPACE}" get openstackbaremetalsets.osp-director.openstack.org $name -ojson | jq -r '.status.baremetalHosts| "nodes:", keys[] as $k | .[$k].ipaddresses as $a | " \($k):", " hostName: \($k)", " ansible:", " ansibleHost: \($a["ctlplane"] | sub("/\\d+"; ""))", " networks:", ($a | to_entries[] | " - name: \(.key) \n fixedIP: \(.value | sub("/\\d+"; ""))\n subnetName: subnet1")' > temp/${name}-nodes.txt done从所有 Compute 主机中删除冲突的存储库和软件包。定义必须停止的 OSPdO 和 RHOSP 17.1 Pacemaker 服务:
PacemakerResourcesToStop_dataplane=( "galera-bundle" "haproxy-bundle" "rabbitmq-bundle") # Stop these PCM services after adopting control # plane, but before starting deletion of OSPD0 (osp17) env echo "Stopping pacemaker OpenStack services" SSH_CMD=CONTROLLER_SSH if [ -n "${!SSH_CMD}" ]; then echo "Using controller 0 to run pacemaker commands " for resource in "${PacemakerResourcesToStop_dataplane[@]}"; do if ${!SSH_CMD} sudo pcs resource config "$resource" &>/dev/null; then echo "Stopping $resource" ${!SSH_CMD} sudo pcs resource disable "$resource" else echo "Service $resource not present" fi done fi将 RHOSO OpenStack Operator
controller-manager缩减为 0 个副本,并临时删除OpenStackControlPlaneOpenStackClientpod,以便您可以使用 OSPdOcontroller-manager清理其一些资源。需要清理,以避免 OSPdO OpenStackClient 和 RHOSO OpenStackClient 之间的 pod 名称冲突。$ oc patch csv -n openstack-operators openstack-operator.v1.0.5 --type json -p="[{"op": "replace", "path": "/spec/install/spec/deployments/0/spec/replicas", "value": "0"}]" $ oc delete openstackclients.client.openstack.org --all- 将 CSV 版本替换为集群中部署的 CSV 版本。
删除 OSPdO
OpenStackControlPlane自定义资源(CR):$ oc delete openstackcontrolplanes.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all删除 OSPdO
OpenStackNetConfigCR,以删除关联的节点网络配置策略:$ oc delete osnetconfig -n "${OSPDO_NAMESPACE}" --all标记包含 OSPdO 虚拟机(VM)的 RHOCP 节点:
$ oc label nodes <ospdo_vm_master_node> type=openstack-
将
<ospdo_vm_master_node> 替换为包含 OSPdO 虚拟机的剩余 master 节点。
-
将
为第三个 RHOCP 节点创建节点网络配置策略。例如:
$ cat << EOF > /tmp/node3_nncp.yaml apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: labels: osp/interface: enp7s0 name: <ostest-master-node> spec: desiredState: dns-resolver: config: search: [] server: - 172.22.0.1 interfaces: - description: internalapi vlan interface name: enp7s0.20 state: up type: vlan vlan: base-iface: enp7s0 id: 20 reorder-headers: true ipv4: address: - ip: 172.17.0.7 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: storage vlan interface name: enp7s0.30 state: up type: vlan vlan: base-iface: enp7s0 id: 30 reorder-headers: true ipv4: address: - ip: 172.18.0.7 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: storagemgmt vlan interface name: enp7s0.40 state: up type: vlan vlan: base-iface: enp7s0 id: 40 reorder-headers: true ipv4: address: - ip: 172.19.0.7 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: tenant vlan interface name: enp7s0.50 state: up type: vlan vlan: base-iface: enp7s0 id: 50 reorder-headers: true ipv4: address: - ip: 172.20.0.7 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - description: Configuring Bridge br-ctlplane with interface enp7s0 name: br-ctlplane mtu: 1500 type: linux-bridge state: up bridge: options: stp: enabled: false port: - name: enp1s0 vlan: {} ipv4: address: - ip: 172.22.0.53 prefix-length: 24 enabled: true dhcp: false ipv6: enabled: false - bridge: options: stp: enabled: false port: - name: enp6s0 description: Linux bridge with enp6s0 as a port ipv4: enabled: false ipv6: enabled: false mtu: 1500 name: br-external state: up type: linux-bridge nodeSelector: kubernetes.io/hostname: <ostest-master-node> node-role.kubernetes.io/worker: "" EOF $ oc apply -f /tmp/node3_nncp.yaml删除剩余的 OSPdO 资源。不要删除
OpenStackBaremetalSets和OpenStackProvisionServer资源:$ for i in $(oc get crd | grep osp-director | grep -v baremetalset | grep -v provisionserver | awk {'print $1'}); do echo Deleting $i...; oc delete $i -n "${OSPDO_NAMESPACE}" --all; done将 OSPdO 缩减为 0 个副本:
$ ospdo_csv_ver=$(oc get csv -n "${OSPDO_NAMESPACE}" -l operators.coreos.com/osp-director-operator.openstack -o json | jq -r '.items[0].metadata.name') $ oc patch csv -n "${OSPDO_NAMESPACE}" $ospdo_csv_ver --type json -p="[{"op": "replace", "path": "/spec/install/spec/deployments/0/spec/replicas", "value": "0"}]"从 OSPdO 中删除 webhook:
$ oc patch csv $ospdo_csv_ver -n "${OSPDO_NAMESPACE}" --type json -p="[{"op": "remove", "path": "/spec/webhookdefinitions"}]"从 OSPdO
OpenStackBaremetalSet资源中删除终结器:$ oc patch openstackbaremetalsets.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" compute --type json -p="[{"op": "remove", "path": "/metadata/finalizers"}]"删除
OpenStackBaremetalSet和OpenStackProvisionServer资源:$ oc delete openstackbaremetalsets.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all $ oc delete openstackprovisionservers.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all注解每个 RHOSP Compute
BareMetalHost资源,以便 Metal3 不会启动节点:$ compute_bmh_list=$(oc get bmh -n openshift-machine-api |grep compute|awk '{printf $1 " "}') $ for bmh_compute in $compute_bmh_list;do oc annotate bmh -n openshift-machine-api $bmh_compute baremetalhost.metal3.io/detached="";\ oc -n openshift-machine-api wait bmh/$bmh_compute --for=jsonpath='{.status.operationalStatus}'=detached --timeout=30s || { echo "ERROR: BMH did not enter detatched state" exit 1 } done在其操作状态被分离后删除
BareMetalHost资源:for bmh_compute in $compute_bmh_list;do \ oc -n openshift-machine-api delete bmh $bmh_compute; \ done删除 OSPdO Operator Lifecycle Manager 资源以删除 OSPdO:
$ oc delete subscription osp-director-operator -n "${OSPDO_NAMESPACE}" $ oc delete operatorgroup osp-director-operator -n "${OSPDO_NAMESPACE}" $ oc delete catalogsource osp-director-operator-index -n "${OSPDO_NAMESPACE}" $ oc delete csv $ospdo_csv_ver -n "${OSPDO_NAMESPACE}"将 RHOSO OpenStack Operator
controller-manager扩展为 1 个副本,以便协调关联的OpenStackControlPlaneCR,并重新创建其OpenStackClientpod:$ oc patch csv -n "${OSPDO_NAMESPACE}"-operators openstack-operator.v0.0.1 --type json -p="[{"op": "replace", "path": "/spec/install/spec/deployments/0/spec/replicas", "value": "1"}]"
第 6 章 使用 Red Hat OpenStack Platform control plane 服务 复制链接链接已复制到粘贴板!
采用 Red Hat OpenStack Platform 17.1 control plane 服务在 OpenShift (RHOSO) 18.0 control plane 上的 Red Hat OpenStack Services 中部署。
6.1. 使用 Identity 服务 复制链接链接已复制到粘贴板!
要采用 Identity 服务(keystone),您可以修补禁用 Identity 服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
先决条件
创建包含从 RHOSP 环境复制的 Fernet 密钥的 keystone secret:
$ oc apply -f - <<EOF apiVersion: v1 data: CredentialKeys0: $($CONTROLLER1_SSH sudo cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/credential-keys/0 | base64 -w 0) CredentialKeys1: $($CONTROLLER1_SSH sudo cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/credential-keys/1 | base64 -w 0) FernetKeys0: $($CONTROLLER1_SSH sudo cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/0 | base64 -w 0) FernetKeys1: $($CONTROLLER1_SSH sudo cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/1 | base64 -w 0) kind: Secret metadata: name: keystone type: Opaque EOF
流程
对
OpenStackControlPlaneCR 进行补丁来部署 Identity 服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' \ spec: \ keystone: \ enabled: true \ apiOverride: \ route: {} \ template: \ override: \ service: \ internal: \ metadata: \ annotations: \ metallb.universe.tf/address-pool: internalapi \ metallb.universe.tf/allow-shared-ip: internalapi \ metallb.universe.tf/loadBalancerIPs: 172.17.0.80 \1 spec: \ type: LoadBalancer \ databaseInstance: openstack \ secret: osp-secret \ '- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
在 OpenShift (RHOSO)部署中的 Red Hat OpenStack Services 中创建一个别名来使用
openstack命令:$ alias openstack="oc exec -t openstackclient -- openstack"删除仍指向 RHOSP control plane 的服务和端点,不包括 Identity 服务及其端点:
$ openstack endpoint list | grep keystone | awk '/admin/{ print $2; }' | xargs ${BASH_ALIASES[openstack]} endpoint delete || true $ for service in aodh heat heat-cfn barbican cinderv3 glance gnocchi manila manilav2 neutron nova placement swift ironic-inspector ironic octavia; do openstack service list | awk "/ $service /{ print \$2; }" | xargs -r ${BASH_ALIASES[openstack]} service delete || true \ done
验证
-
验证您可以访问
OpenStackClient容器集。如需更多信息,请参阅在 OpenShift 部署中 访问 Red Hat OpenStack Services 中的访问 OpenStackClient pod。 确认定义了 Identity 服务端点,并指向 control plane FQDN:
$ openstack endpoint list | grep keystone等待
OpenStackControlPlane资源变为Ready:$ oc wait --for=condition=Ready --timeout=1m OpenStackControlPlane openstack
6.2. 使用密钥管理器服务 复制链接链接已复制到粘贴板!
要采用 Key Manager 服务(barbican),您可以修补禁用 Key Manager 服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
如果您看到以下结果,则 Key Manager 服务采用已完成:
-
BarbicanAPI、BBarbicanWorker和BarbicanKeystoneListener服务已启动并在运行。 - Keystone 端点已更新,源云的同一加密插件也可用。
此流程将 Key Manager 服务配置为使用 simple_crypto 后端。OpenShift (RHOSO)上的 Red Hat OpenStack Services 目前不支持额外的后端,如 PKCS11 和 DogTag。
流程
添加 kek secret:
$ oc set data secret/osp-secret "BarbicanSimpleCryptoKEK=$($CONTROLLER1_SSH "python3 -c \"import configparser; c = configparser.ConfigParser(); c.read('/var/lib/config-data/puppet-generated/barbican/etc/barbican/barbican.conf'); print(c['simple_crypto_plugin']['kek'])\"")"对
OpenStackControlPlaneCR 进行补丁来部署 Key Manager 服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: barbican: enabled: true apiOverride: route: {} template: databaseInstance: openstack databaseAccount: barbican rabbitMqClusterName: rabbitmq secret: osp-secret simpleCryptoBackendSecret: osp-secret serviceAccount: barbican serviceUser: barbican passwordSelectors: service: BarbicanPassword simplecryptokek: BarbicanSimpleCryptoKEK barbicanAPI: replicas: 1 override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer barbicanWorker: replicas: 1 barbicanKeystoneListener: replicas: 1 '- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
验证
确保定义了 Identity 服务(keystone)端点,并指向 control plane FQDN:
$ openstack endpoint list | grep key-manager确定在 Identity 服务中注册 Barbican API 服务:
$ openstack service list | grep key-manager$ openstack endpoint list | grep key-manager列出 secret:
$ openstack secret list
6.3. 使用网络服务 复制链接链接已复制到粘贴板!
要采用 Networking 服务(neutron),您可以修补禁用网络服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
如果您看到以下结果,网络服务采用已完成:
-
NeutronAPI服务正在运行。 - Identity 服务(keystone)端点已更新,源云的同一后端可用。
先决条件
- 确保单节点 OpenShift 或 OpenShift Local 在 Red Hat OpenShift Container Platform (RHOCP)集群中运行。
- 采用 Identity 服务。如需更多信息,请参阅 使用 Identity 服务。
-
将 OVN 数据库迁移到 Red Hat OpenShift Container Platform (RHOCP)集群中运行的
ovsdb-server实例。如需更多信息,请参阅 迁移 OVN 数据。
流程
对
OpenStackControlPlaneCR 进行补丁来部署网络服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: neutron: enabled: true apiOverride: route: {} template: override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer databaseInstance: openstack databaseAccount: neutron secret: osp-secret networkAttachments: - internalapi '- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
注意如果您在 RHOSP 17.1 部署中使用了
neutron-dhcp-agent,并且您仍需要在使用后使用它,则必须为neutron-api服务启用dhcp_agent_notification:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: neutron: template: customServiceConfig: | [DEFAULT] dhcp_agent_notification = True '
验证
检查生成的网络服务 pod:
$ oc get pods -l service=neutron确保
Neutron API服务在 Identity 服务中注册:$ openstack service list | grep network$ openstack endpoint list | grep network | 6a805bd6c9f54658ad2f24e5a0ae0ab6 | regionOne | neutron | network | True | public | http://neutron-public-openstack.apps-crc.testing | | b943243e596847a9a317c8ce1800fa98 | regionOne | neutron | network | True | internal | http://neutron-internal.openstack.svc:9696 |创建示例资源,以便您可以测试用户是否可以创建网络、子网、端口或路由器:
$ openstack network create net $ openstack subnet create --network net --subnet-range 10.0.0.0/24 subnet $ openstack router create router
6.4. 使用对象存储服务 复制链接链接已复制到粘贴板!
如果您将 Object Storage 用作服务,请将 Object Storage 服务(swift)纳入 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services。如果您使用 Ceph 对象网关(RGW)的 Object Storage API,请跳过以下步骤。
先决条件
- 对象存储服务存储后端服务在 Red Hat OpenStack Platform (RHOSP)部署中运行。
- 在 Red Hat OpenShift Container Platform (RHOCP)集群中正确配置了存储网络。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 为 OpenShift 上的 Red Hat OpenStack Services 准备 Red Hat OpenShift Container Platform。
流程
创建包含对象存储服务哈希路径后缀和前缀的
swift-confsecret:$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: swift-conf type: Opaque data: swift.conf: $($CONTROLLER1_SSH sudo cat /var/lib/config-data/puppet-generated/swift/etc/swift/swift.conf | base64 -w0) EOF创建包含对象存储服务 ring 文件的
swift-ring-filesConfigMap:$ oc apply -f - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: swift-ring-files binaryData: swiftrings.tar.gz: $($CONTROLLER1_SSH "cd /var/lib/config-data/puppet-generated/swift/etc/swift && tar cz *.builder *.ring.gz backups/ | base64 -w0") account.ring.gz: $($CONTROLLER1_SSH "base64 -w0 /var/lib/config-data/puppet-generated/swift/etc/swift/account.ring.gz") container.ring.gz: $($CONTROLLER1_SSH "base64 -w0 /var/lib/config-data/puppet-generated/swift/etc/swift/container.ring.gz") object.ring.gz: $($CONTROLLER1_SSH "base64 -w0 /var/lib/config-data/puppet-generated/swift/etc/swift/object.ring.gz") EOF修补
OpenStackControlPlane自定义资源来部署对象存储服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: swift: enabled: true template: memcachedInstance: memcached swiftRing: ringReplicas: 1 swiftStorage: replicas: 0 networkAttachments: - storage storageClass: local-storage1 storageRequest: 10Gi swiftProxy: secret: osp-secret replicas: 1 passwordSelectors: service: SwiftPassword serviceUser: swift override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.802 spec: type: LoadBalancer networkAttachments:3 - storage '
验证
检查生成的对象存储服务 pod:
$ oc get pods -l component=swift-proxy验证 Object Storage 代理服务是否在 Identity 服务(keystone)中注册:
$ openstack service list | grep swift | b5b9b1d3c79241aa867fa2d05f2bbd52 | swift | object-store |$ openstack endpoint list | grep swift | 32ee4bd555414ab48f2dc90a19e1bcd5 | regionOne | swift | object-store | True | public | https://swift-public-openstack.apps-crc.testing/v1/AUTH_%(tenant_id)s | | db4b8547d3ae4e7999154b203c6a5bed | regionOne | swift | object-store | True | internal | http://swift-internal.openstack.svc:8080/v1/AUTH_%(tenant_id)s |验证您是否能够上传和下载对象:
$ openstack container create test +---------------------------------------+-----------+------------------------------------+ | account | container | x-trans-id | +---------------------------------------+-----------+------------------------------------+ | AUTH_4d9be0a9193e4577820d187acdd2714a | test | txe5f9a10ce21e4cddad473-0065ce41b9 | +---------------------------------------+-----------+------------------------------------+ $ openstack object create test --name obj <(echo "Hello World!") +--------+-----------+----------------------------------+ | object | container | etag | +--------+-----------+----------------------------------+ | obj | test | d41d8cd98f00b204e9800998ecf8427e | +--------+-----------+----------------------------------+ $ openstack object save test obj --file - Hello World!
Object Storage 数据仍然存储在现有的 RHOSP 节点上。有关将实际数据从 RHOSP 部署迁移到 RHOSO 部署的更多信息,请参阅将 Object Storage 服务(swift)数据从 RHOSP 迁移到 OpenShift (RHOSO)节点上的 Red Hat OpenStack Services。
6.5. 使用镜像服务 复制链接链接已复制到粘贴板!
要采用镜像服务(glance),您可以修补禁用了镜像服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
如果您看到以下结果,则镜像服务的采用已完成:
-
GlanceAPI服务已启动且正在运行。 - Identity 服务端点被更新,源云的后端可用。
要完成镜像服务的采用,请确保您的环境满足以下条件:
- 您有一个正在运行的 director Operator 环境(源云)。
- 您有一个在 Red Hat OpenShift Container Platform (RHOCP)集群中运行的单节点 OpenShift 或 OpenShift Local。
-
可选:您可以通过
crc和 director Operator 访问内部/外部Ceph集群。
如果您在 RHOSP 17.1 中有镜像配额,则这些配额会传送到 OpenShift 上的 Red Hat OpenStack Services (RHOSO) 18.0,因为默认情况下禁用了 18.0 中的镜像配额系统。有关在 18.0 中启用镜像配额的更多信息,请参阅自定义持久性存储 中的 配置镜像配额。如果您在 RHOSO 18.0 中启用镜像配额,新配额会替换 RHOSP 17.1 中的旧配额。
6.5.1. 使用对象存储服务后端部署的镜像服务 复制链接链接已复制到粘贴板!
采用您在 Red Hat OpenStack Platform (RHOSP)环境中使用 Object Storage 服务(swift)后端部署的 Image Service (glance)。control plane glanceAPI 实例使用以下配置进行部署。您可以在使用对象存储后端部署镜像服务的补丁清单中使用此配置:
..
spec
glance:
...
customServiceConfig: |
[DEFAULT]
enabled_backends = default_backend:swift
[glance_store]
default_backend = default_backend
[default_backend]
swift_store_create_container_on_put = True
swift_store_auth_version = 3
swift_store_auth_address = {{ .KeystoneInternalURL }}
swift_store_endpoint_type = internalURL
swift_store_user = service:glance
swift_store_key = {{ .ServicePassword }}
先决条件
- 您已完成了以前的采用步骤。
流程
创建一个新文件,如
glance_swift.patch,并包含以下内容:spec: glance: enabled: true apiOverride: route: {} template: secret: osp-secret databaseInstance: openstack storage: storageRequest: 10G customServiceConfig: | [DEFAULT] enabled_backends = default_backend:swift [glance_store] default_backend = default_backend [default_backend] swift_store_create_container_on_put = True swift_store_auth_version = 3 swift_store_auth_address = {{ .KeystoneInternalURL }} swift_store_endpoint_type = internalURL swift_store_user = service:glance swift_store_key = {{ .ServicePassword }} glanceAPIs: default: replicas: 1 override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer networkAttachments: - storage- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
注意对象存储服务作为后端与镜像服务建立依赖项。如果镜像服务配置了在
OpenStackControlPlane自定义资源中不可用的对象存储服务,则任何部署的GlanceAPI实例都无法正常工作。在 Object Storage 服务以及特定的SwiftProxy之后,您可以继续进行GlanceAPI的采用。如需更多信息,请参阅 使用对象存储服务。验证
SwiftProxy是否可用:$ oc get pod -l component=swift-proxy | grep Running swift-proxy-75cb47f65-92rxq 3/3 Running 0对 control plane 中部署的
GlanceAPI服务进行补丁:$ oc patch openstackcontrolplane openstack --type=merge --patch-file=glance_swift.patch
6.5.2. 使用块存储服务后端部署的镜像服务 复制链接链接已复制到粘贴板!
本节中的内容 作为技术预览提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。如需更多信息,请参阅 技术预览。
采用您在 Red Hat OpenStack Platform (RHOSP)环境中使用块存储服务(cinder)后端部署的 Image Service (glance)。control plane glanceAPI 实例使用以下配置进行部署。您可以在使用块存储后端部署镜像服务的补丁清单中使用此配置:
..
spec
glance:
...
customServiceConfig: |
[DEFAULT]
enabled_backends = default_backend:cinder
[glance_store]
default_backend = default_backend
[default_backend]
description = Default cinder backend
cinder_store_auth_address = {{ .KeystoneInternalURL }}
cinder_store_user_name = {{ .ServiceUser }}
cinder_store_password = {{ .ServicePassword }}
cinder_store_project_name = service
cinder_catalog_info = volumev3::internalURL
cinder_use_multipath = true
[oslo_concurrency]
lock_path = /var/lib/glance/tmp
先决条件
- 您已完成了以前的采用步骤。
流程
创建一个新文件,如
glance_cinder.patch,并包含以下内容:spec: glance: enabled: true apiOverride: route: {} template: secret: osp-secret databaseInstance: openstack storage: storageRequest: 10G customServiceConfig: | [DEFAULT] enabled_backends = default_backend:cinder [glance_store] default_backend = default_backend [default_backend] description = Default cinder backend cinder_store_auth_address = {{ .KeystoneInternalURL }} cinder_store_user_name = {{ .ServiceUser }} cinder_store_password = {{ .ServicePassword }} cinder_store_project_name = service cinder_catalog_info = volumev3::internalURL cinder_use_multipath = true [oslo_concurrency] lock_path = /var/lib/glance/tmp glanceAPIs: default: replicas: 1 override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer networkAttachments: - storage- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
注意块存储服务作为后端与镜像服务建立依赖项。如果镜像服务配置了
OpenStackControlPlane自定义资源中不可用的块存储服务,则任何部署的GlanceAPI实例都无法正常工作。在块存储服务以及特定的CinderVolume应用之后,您可以继续采用GlanceAPI。如需更多信息,请参阅 使用块存储服务。验证
CinderVolume是否可用:$ oc get pod -l component=cinder-volume | grep Running cinder-volume-75cb47f65-92rxq 3/3 Running 0对 control plane 中部署的
GlanceAPI服务进行补丁:$ oc patch openstackcontrolplane openstack --type=merge --patch-file=glance_cinder.patch
6.5.3. 使用 NFS 后端部署的镜像服务 复制链接链接已复制到粘贴板!
采用您使用 NFS 后端部署的 Image Service (glance)。要完成以下步骤,请确保您的环境满足以下条件:
- Storage 网络被传播到 Red Hat OpenStack Platform (RHOSP) control plane。
-
镜像服务可以访问存储网络,并通过端口
2049连接到 nfs-server。
先决条件
- 您已完成了以前的采用步骤。
在源云中,验证 overcloud 用来配置镜像服务后端的 NFS 参数。具体来说,在您的director Operator heat 模板中,找到以下变量来覆盖
/usr/share/openstack-tripleo-heat-templates/environments/storage目录中的glance-nfs.yaml文件提供的默认内容:GlanceBackend: file GlanceNfsEnabled: true GlanceNfsShare: 192.168.24.1:/var/nfs注意在本例中,GlanceBackend 变量显示镜像服务没有 NFS 后端的概念。
变量使用文件驱动程序,并在后台使用filesystem_store_datadir。filesystem_store_datadir映射到GlanceNfsShare变量提供的导出值,而不是/var/lib/glance/images/。如果您没有通过传播到 OpenShift (RHOSO)控制平面上的红帽 OpenStack 服务的网络导出GlanceNfsShare,则必须停止nfs-server并将导出重新映射到存储网络。在这样做前,请确保镜像服务在源 Controller 节点上停止。在 control plane 中,镜像服务附加到 Storage 网络,然后通过关联的
NetworkAttachmentsDefinition自定义资源(CR)传播,生成的 pod 已具有通过此网络处理镜像服务流量的正确权限。在部署的 RHOSP control plane 中,您可以通过检查NodeNetworkConfigPolicy(nncp)和NetworkAttachmentDefinition(net-attach-def)来验证网络映射是否与基于 director Operator 的环境中部署的相匹配。以下是您应该在 Red Hat OpenShift Container Platform (RHOCP)环境中检查的输出示例,以确保传播网络没有问题:$ oc get nncp NAME STATUS REASON enp6s0-crc-8cf2w-master-0 Available SuccessfullyConfigured $ oc get net-attach-def NAME ctlplane internalapi storage tenant $ oc get ipaddresspool -n metallb-system NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES ctlplane true false ["192.168.122.80-192.168.122.90"] internalapi true false ["172.17.0.80-172.17.0.90"] storage true false ["172.18.0.80-172.18.0.90"] tenant true false ["172.19.0.80-172.19.0.90"]
流程
采用镜像服务,再创建一个新的
默认GlanceAPI实例,该实例与现有 NFS 共享连接:$ cat << EOF > glance_nfs_patch.yaml spec: extraMounts: - extraVol: - extraVolType: Nfs mounts: - mountPath: /var/lib/glance/images name: nfs propagation: - Glance volumes: - name: nfs nfs: path: <exported_path>1 server: <ip_address>2 name: r1 region: r1 glance: enabled: true template: databaseInstance: openstack customServiceConfig: | [DEFAULT] enabled_backends = default_backend:file [glance_store] default_backend = default_backend [default_backend] filesystem_store_datadir = /var/lib/glance/images/ storage: storageRequest: 10G keystoneEndpoint: nfs glanceAPIs: nfs: replicas: 3 type: single override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.803 spec: type: LoadBalancer networkAttachments: - storage EOF修补
OpenStackControlPlaneCR,以使用 NFS 后端部署镜像服务:$ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_nfs_patch.yaml修补
OpenStackControlPlaneCR 以删除默认镜像服务:$ oc patch openstackcontrolplane openstack --type=json -p="[{'op': 'remove', 'path': '/spec/glance/template/glanceAPIs/default'}]"
验证
当
GlanceAPI处于活跃状态时,请确认您可以看到单个 API 实例:$ oc get pods -l service=glance NAME READY STATUS RESTARTS glance-nfs-single-0 2/2 Running 0 glance-nfs-single-1 2/2 Running 0 glance-nfs-single-2 2/2 Running 0确保 pod 的描述报告以下输出:
Mounts: ... nfs: Type: NFS (an NFS mount that lasts the lifetime of a pod) Server: {{ server ip address }} Path: {{ nfs export path }} ReadOnly: false ...检查指向
/var/lib/glance/images的挂载点是否已映射到您在新的默认GlanceAPI实例中定义的预期:nfs 服务器 ip和 nfs 路径$ oc rsh -c glance-api glance-default-single-0 sh-5.1# mount ... ... {{ ip address }}:/var/nfs on /var/lib/glance/images type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.18.0.5,local_lock=none,addr=172.18.0.5) ... ...确认 UUID 已在 NFS 节点上的导出的目录中创建。例如:
$ oc rsh openstackclient $ openstack image list sh-5.1$ curl -L -o /tmp/cirros-0.6.3-x86_64-disk.img http://download.cirros-cloud.net/0.6.3/cirros-0.6.3-x86_64-disk.img ... ... sh-5.1$ openstack image create --container-format bare --disk-format raw --file /tmp/cirros-0.6.3-x86_64-disk.img cirros ... ... sh-5.1$ openstack image list +--------------------------------------+--------+--------+ | ID | Name | Status | +--------------------------------------+--------+--------+ | 634482ca-4002-4a6d-b1d5-64502ad02630 | cirros | active | +--------------------------------------+--------+--------+在
nfs-server节点上,相同的uuid位于导出的/var/nfs中:$ ls /var/nfs/ 634482ca-4002-4a6d-b1d5-64502ad02630
6.5.4. 采用使用 Red Hat Ceph Storage 后端部署的镜像服务 复制链接链接已复制到粘贴板!
采用您使用 Red Hat Ceph Storage 后端部署的 Image Service (glance)。使用 customServiceConfig 参数将正确的配置注入 GlanceAPI 实例。
先决条件
- 您已完成了以前的采用步骤。
确保在
openstack命名空间中创建了与 Ceph 相关的 secret (ceph-conf-files),并且OpenStackControlPlane自定义资源(CR)的extraMounts属性已正确配置。有关更多信息 ,请参阅配置 Ceph 后端。$ cat << EOF > glance_patch.yaml spec: glance: enabled: true template: databaseInstance: openstack customServiceConfig: | [DEFAULT] enabled_backends=default_backend:rbd [glance_store] default_backend=default_backend [default_backend] rbd_store_ceph_conf=/etc/ceph/ceph.conf rbd_store_user=openstack rbd_store_pool=images store_description=Ceph glance store backend. storage: storageRequest: 10G glanceAPIs: default: replicas: 0 override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer networkAttachments: - storage EOF- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
如果您从原始环境中备份了 Red Hat OpenStack Platform (RHOSP)服务配置文件,您可以将它与您采用的 confgiuration 文件进行比较,并确保配置正确。如需更多信息,请参阅从 director Operator 部署中提取配置。
OS-diff 目前不支持 director Operator。
os-diff diff /tmp/collect_tripleo_configs/glance/etc/glance/glance-api.conf glance_patch.yaml --crd
此命令产生两个 ini 配置文件之间的区别。
流程
修补
OpenStackControlPlaneCR,以使用 Red Hat Ceph Storage 后端部署镜像服务:$ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_patch.yaml
6.5.5. 验证镜像服务的采用 复制链接链接已复制到粘贴板!
验证您是否将 Image Service (glance)添加至 OpenShift (RHOSO) 18.0 部署上的 Red Hat OpenStack Services 中。
流程
通过 Red Hat OpenStack Platform CLI 测试镜像服务。您可以比较并确保配置应用到镜像服务 pod:
$ os-diff diff /etc/glance/glance.conf.d/02-config.conf glance_patch.yaml --frompod -p glance-api如果没有显示行,则配置正确。
检查生成的镜像服务 pod:
GLANCE_POD=`oc get pod |grep glance-default | cut -f 1 -d' ' | head -n 1` oc exec -t $GLANCE_POD -c glance-api -- cat /etc/glance/glance.conf.d/02-config.conf [DEFAULT] enabled_backends=default_backend:rbd [glance_store] default_backend=default_backend [default_backend] rbd_store_ceph_conf=/etc/ceph/ceph.conf rbd_store_user=openstack rbd_store_pool=images store_description=Ceph glance store backend.如果使用 Red Hat Ceph Storage 后端,请确保挂载 Red Hat Ceph Storage secret:
$ oc exec -t $GLANCE_POD -c glance-api -- ls /etc/ceph ceph.client.openstack.keyring ceph.conf检查服务是否活跃,并在 RHOSP CLI 中更新端点:
$ oc rsh openstackclient $ openstack service list | grep image | fc52dbffef36434d906eeb99adfc6186 | glance | image | $ openstack endpoint list | grep image | 569ed81064f84d4a91e0d2d807e4c1f1 | regionOne | glance | image | True | internal | http://glance-internal-openstack.apps-crc.testing | | 5843fae70cba4e73b29d4aff3e8b616c | regionOne | glance | image | True | public | http://glance-public-openstack.apps-crc.testing |检查您之前在源云中列出的镜像是否在采用的服务中可用:
$ openstack image list +--------------------------------------+--------+--------+ | ID | Name | Status | +--------------------------------------+--------+--------+ | c3158cad-d50b-452f-bec1-f250562f5c1f | cirros | active | +--------------------------------------+--------+--------+
6.6. 使用放置服务 复制链接链接已复制到粘贴板!
要采用放置服务,您可以修补禁用放置服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
先决条件
- 您可以将数据库导入到 control plane 上的 MariaDB 实例。如需更多信息,请参阅将 数据库迁移到 MariaDB 实例。
- 您采用 Identity 服务(keystone)。如需更多信息,请参阅 使用 Identity 服务。
流程
对
OpenStackControlPlaneCR 进行补丁来部署放置服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' > spec: > placement: > enabled: true > apiOverride: > route: {} > template: > databaseInstance: openstack > databaseAccount: placement > secret: osp-secret > override: > service: > internal: > metadata: > annotations: > metallb.universe.tf/address-pool: internalapi > metallb.universe.tf/allow-shared-ip: internalapi > metallb.universe.tf/loadBalancerIPs: 172.17.0.801 > spec: > type: LoadBalancer >'- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
验证
检查 Placement 服务端点是否已定义并指向 control plane FQDN,以及 Placement API 响应:
$ alias openstack="oc exec -t openstackclient -- openstack" $ openstack endpoint list | grep placement # Without OpenStack CLI placement plugin installed: PLACEMENT_PUBLIC_URL=$(openstack endpoint list -c 'Service Name' -c 'Service Type' -c URL | grep placement | grep public | awk '{ print $6; }') $ oc exec -t openstackclient -- curl "$PLACEMENT_PUBLIC_URL" # With OpenStack CLI placement plugin installed: $ openstack resource class list
6.7. 使用裸机置备服务 复制链接链接已复制到粘贴板!
查看有关裸机置备服务(ironic)配置的信息,然后将裸机置备服务用于 OpenShift control plane 上的 Red Hat OpenStack Services。
6.7.1. 裸机置备服务配置 复制链接链接已复制到粘贴板!
您可以使用配置片断配置裸机置备服务(ironic)。有关使用裸机置备服务配置 control plane 的更多信息,请参阅在 OpenShift 部署中自定义 Red Hat OpenStack Services。
一些 Bare Metal Provisioning 服务配置在 director Operator 中被覆盖,例如,PXE Loader 文件名通常在中间层被覆盖。您必须注意您在 OpenShift (RHOSO)部署中的 Red Hat OpenStack Services 中的设置。ironic-operator 应用合理的正常工作的默认配置,但如果您使用之前的配置覆盖它们,您的体验可能不是理想的选择,或者新的裸机置备服务无法操作。同样,可能需要其他配置,例如,如果您在 ironic.conf 文件中启用并使用额外的硬件类型。
合理的默认值模型包括常用的硬件类型和驱动程序接口。例如,redfish-virtual-media 引导接口和 ramdisk 部署接口会被默认启用。如果在使用完成后添加新裸机节点,则驱动程序接口选择会根据配置中的优先级顺序进行。如果您没有在节点创建请求或 ironic.conf 文件中作为已建立的默认值,则驱动程序接口选择会根据配置中的优先级顺序进行。
某些配置参数不需要在单独节点级别设置,如网络 UUID 值,或者在 ironic.conf 文件中集中配置,因为设置控制安全行为。
务必要维护您在之前部署到新部署时配置并格式化为 [section] 和参数名称的以下参数。如果设置,则管理之前配置中底层的行为和值的参数将使用特定的值。
- [neutron]cleaning_network
- [neutron]provisioning_network
- [neutron]rescuing_network
- [neutron]inspection_network
- [conductor]automated_clean
- [deploy]erase_devices_priority
- [deploy]erase_devices_metadata_priority
- [conductor]force_power_state_during_sync
您可以在节点上单独设置以下参数。但是,您可以选择使用嵌入式配置选项来避免在创建和管理裸机节点时单独设置参数。检查您之前的 ironic.conf 文件以查找这些参数,如果设置,请应用特定的覆盖配置。
- [conductor]bootloader
- [conductor]rescue_ramdisk
- [conductor]rescue_kernel
- [conductor]deploy_kernel
- [conductor]deploy_ramdisk
kernel_append_params (以前在 [pxe] 和 [redfish] 配置部分中的 pxe_append_params )的实例用来为部署 ramdisk 应用 "console" 等引导选项,因此通常必须更改。
您不能迁移使用 ironic.conf 文件 enabled_hardware_types 参数设置的硬件类型,以及以 staging- 开头的硬件类型驱动程序接口。
6.7.2. 部署裸机置备服务 复制链接链接已复制到粘贴板!
要部署裸机置备服务(ironic),您可以修补禁用 Bare Metal Provisioning 服务的现有 OpenStackControlPlane 自定义资源(CR)。ironic-operator 应用配置并启动裸机置备服务。在服务运行后,裸机置备服务会自动开始轮询它所管理的裸机节点的电源状态。
默认情况下,裸机置备服务的 RHOSO 版本 18.0 及更新的版本包括新的多租户感知基于角色的访问控制(RBAC)模型。因此,在采用 Bare Metal Provisioning 服务后,运行 openstack baremetal node list 命令时可能会缺少裸机节点。您的节点不会被删除。由于 RBAC 模型中的访问限制增加,您必须识别哪个项目拥有缺少的裸机节点,并设置每个缺少的裸机节点上的 owner 字段。
先决条件
- 您已将服务数据库导入到 control plane 数据库中。
在 RHOSO 18.0 中禁用了裸机置备服务。以下命令应该返回字符串
false:$ oc get openstackcontrolplanes.core.openstack.org <name> -o jsonpath='{.spec.ironic.enabled}'-
将
<name> 替换为现有OpenStackControlPlaneCR 的名称,如openstack-control-plane。
-
将
Identity 服务(keystone)、网络服务(neutron)和镜像服务(glance)正常运行。
注意如果您在裸机作为服务配置中使用裸机置备服务,在采用裸机置备服务前不要采用 Compute 服务(nova)。
- 对于裸机置备服务编排器服务,服务必须能够访问配置为由裸机置备服务管理的硬件的 Baseboard Management Controller。如果此硬件无法访问,节点可能会进入 "maintenance" 状态,并在稍后恢复连接前不可用。
您已在本地下载
ironic.conf文件:$CONTROLLER1_SSH cat /var/lib/config-data/puppet-generated/ironic/etc/ironic/ironic.conf > ironic.conf注意此配置文件必须来自其中一个 Controller 节点,而不是 director Operator undercloud 节点。director Operator undercloud 节点使用不同的配置进行操作,这些配置在采用 Overcloud Ironic 部署时不适用。
-
如果使用 Ironic Inspector 服务,则需要
IronicInspectorSubnetsdirector Operator 参数的值。使用相同的值在 RHOSO 环境中填充dhcpRanges参数。 您已定义以下 shell 变量:将以下示例值替换为应用到您的环境的值:
$ alias openstack="oc exec -t openstackclient -- openstack"
流程
修补
OpenStackControlPlane自定义资源(CR)以部署裸机置备服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ironic: enabled: true template: rpcTransport: oslo databaseInstance: openstack ironicAPI: replicas: 1 override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer ironicConductors: - replicas: 1 networkAttachments: - baremetal provisionNetwork: baremetal storageRequest: 10G customServiceConfig: | [neutron] cleaning_network=<cleaning network uuid> provisioning_network=<provisioning network uuid> rescuing_network=<rescuing network uuid> inspection_network=<introspection network uuid> [conductor] automated_clean=true ironicInspector: replicas: 1 inspectionNetwork: baremetal networkAttachments: - baremetal dhcpRanges: - name: inspector-0 cidr: 172.20.1.0/24 start: 172.20.1.190 end: 172.20.1.199 gateway: 172.20.1.1 serviceUser: ironic-inspector databaseAccount: ironic-inspector passwordSelectors: database: IronicInspectorDatabasePassword service: IronicInspectorPassword ironicNeutronAgent: replicas: 1 rabbitMqClusterName: rabbitmq secret: osp-secret '- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
等待裸机置备服务 control plane 服务 CR 就绪:
$ oc wait --for condition=Ready --timeout=300s ironics.ironic.openstack.org ironic验证单个服务是否已就绪:
$ oc wait --for condition=Ready --timeout=300s ironicapis.ironic.openstack.org ironic-api $ oc wait --for condition=Ready --timeout=300s ironicconductors.ironic.openstack.org ironic-conductor $ oc wait --for condition=Ready --timeout=300s ironicinspectors.ironic.openstack.org ironic-inspector $ oc wait --for condition=Ready --timeout=300s ironicneutronagents.ironic.openstack.org ironic-ironic-neutron-agent更新 provisioning、清理和救援网络上的 DNS Nameservers:
注意要使名称解析用于裸机置备服务操作,您必须将 DNS 名称服务器设置为使用 RHOSO control plane 中的内部 DNS 服务器:
$ openstack subnet set --dns-nameserver 192.168.122.80 provisioning-subnet验证节点列表中没有裸机置备服务节点:
$ openstack baremetal node list重要如果
openstack baremetal node list命令输出报告了不正确的电源状态,请等待几分钟,然后重新运行命令以查看输出是否与被管理的硬件的实际状态同步。Bare Metal Provisioning 服务检查和协调裸机节点的电源状态所需的时间取决于通过replicas参数的操作编排器,并在采用裸机置备服务部署中存在这些时间。如果
openstack baremetal node list命令中缺少任何裸机置备服务节点,请临时禁用新的 RBAC 策略来再次查看节点:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ironic: enabled: true template: databaseInstance: openstack ironicAPI: replicas: 1 customServiceConfig: | [oslo_policy] enforce_scope=false enforce_new_defaults=false '应用此配置后,Operator 会重启 Ironic API 服务,并禁用默认启用的新 RBAC 策略。
查看没有分配所有者的裸机节点:
$ openstack baremetal node list --long -c UUID -c Owner -c 'Provisioning State'将没有所有者的所有裸机节点分配给新项目,如 admin 项目:
ADMIN_PROJECT_ID=$(openstack project show -c id -f value --domain default admin) for node in $(openstack baremetal node list -f json -c UUID -c Owner | jq -r '.[] | select(.Owner == null) | .UUID'); do openstack baremetal node set --owner $ADMIN_PROJECT_ID $node; done通过删除
customServiceConfig部分或将customServiceConfig部分中的以下值设置为true来重新应用默认 RBAC。例如:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: ironic: enabled: true template: databaseInstance: openstack ironicAPI: replicas: 1 customServiceConfig: | [oslo_policy] enforce_scope=true enforce_new_defaults=true '
验证
验证端点列表:
$ openstack endpoint list |grep ironic验证裸机节点列表:
$ openstack baremetal node list
6.8. 使用 Compute 服务 复制链接链接已复制到粘贴板!
要采用 Compute 服务(nova),您可以修补禁用 Compute 服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。以下流程描述了单单元设置。
先决条件
- 您已完成了以前的采用步骤。
您已定义以下 shell 变量:将以下示例值替换为您的环境的正确值:
alias openstack="oc exec -t openstackclient -- openstack" DEFAULT_CELL_NAME="cell3" RENAMED_CELLS="cell1 cell2 $DEFAULT_CELL_NAME"-
源云
默认单元使用一个新的$DEFAULT_CELL_NAME。在多单元采用场景中,默认的 单元可能会保留其原始名称DEFAULT_CELL_NAME=default,或者被重命名为免费使用的单元。除了默认的,请不要将其他现有的单元名称用于DEFAULT_CELL_NAME。 如果您使用
默认单元部署源云,并希望在采用过程中重命名它,请定义您要使用的新名称,如下例所示:DEFAULT_CELL_NAME="cell1" RENAMED_CELLS="cell1"
-
源云
流程
对
OpenStackControlPlaneCR 进行补丁来部署 Compute 服务:注意此流程假设 Compute 服务元数据部署在顶层,而不是在每个单元级别。如果 RHOSP 部署有每单元元数据部署,请根据需要调整以下补丁。您不能在
cell0中运行元数据服务。要启用本地单元的元数据服务,请在OpenStackControlPlaneCR 中的 local cell 的metadataServiceTemplate字段中将enabled属性设置为true。$ rm -f celltemplates $ for CELL in $(echo $RENAMED_CELLS); do $ cat >> celltemplates << EOF ${CELL}: hasAPIAccess: true1 cellDatabaseAccount: nova-$CELL cellDatabaseInstance: openstack-$CELL2 cellMessageBusInstance: rabbitmq-$CELL3 metadataServiceTemplate: enabled: false override: service: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.$(( 79 + ${CELL##*cell} )) spec: type: LoadBalancer customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true conductorServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true EOF done $ cat > oscp-patch.yaml << EOF spec: nova: enabled: true apiOverride: route: {} template: secret: osp-secret apiDatabaseAccount: nova-api apiServiceTemplate: override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.804 spec: type: LoadBalancer customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true metadataServiceTemplate: enabled: true override: service: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.80 spec: type: LoadBalancer customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true schedulerServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true cellTemplates: cell0: hasAPIAccess: true cellDatabaseAccount: nova-cell0 cellDatabaseInstance: openstack cellMessageBusInstance: rabbitmq conductorServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=true EOF $ cat celltemplates >> oscp-patch.yaml $ oc patch openstackcontrolplane openstack --type=merge --patch-file=oscp-patch.yaml- 1
- 在源云中,单元总是配置有主要 Nova API 数据库访问。您可以通过将
hasAPIAccess设置为false来禁用对 API 的 upcall 访问。但是,在采用过程中不要更改 API。 - 2
- 单元使用的数据库实例。在部署后端服务时,数据库实例名称必须与您在部署后端服务时创建的
OpenStackControlPlaneCR 中定义的名称匹配,如 部署后端服务 中所述。 - 3
- 单元使用的消息总线实例。消息总线实例名称必须与
OpenStackControlPlaneCR 中定义的名称匹配。 - 4
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
如果您使用 Compute 服务与 Bare Metal Provisioning 服务(ironic),请在 Compute 服务 CR 补丁中的每个单元格中附加
novaComputeTemplates字段。例如:cell1: novaComputeTemplates: standalone: customServiceConfig: | [DEFAULT] host = <hostname> [workarounds] disable_compute_service_check_for_ffu=true computeDriver: ironic.IronicDriver ...-
将
<hostname> 替换为在源云中运行ironicCompute 驱动程序的节点主机名。
-
将
等待 CR 就绪计算 control plane 服务:
$ oc wait --for condition=Ready --timeout=300s Nova/nova注意每个单元启动本地 Conductor 服务,而超级编排器在
cell0中运行。请注意,disable_compute_service_check_for_ffu对所有导入的 Compute 服务是必须的,直到导入外部数据平面前,直到 Compute 服务被快速升级为止。如需更多信息,请参阅将 Compute 服务部署到 RHOSO 数据平面 ,并对计算服务执行快速升级。
验证
检查计算服务端点是否已定义并指向 control plane FQDN,并且 Nova API 是否响应:
$ openstack endpoint list | grep nova $ openstack server list- 将输出与 Retrieving topology-specific service configuration 中的特定于拓扑的配置进行比较。
查询超级编排器,以检查预期的单元是否存在,并将其与其预选项值进行比较:
$ for CELL in $(echo $CELLS); do set +u . ~/.source_cloud_exported_variables_$CELL set -u RCELL=$CELL [ "$CELL" = "default" ] && RCELL=$DEFAULT_CELL_NAME echo "comparing $CELL to $RCELL" echo $PULL_OPENSTACK_CONFIGURATION_NOVAMANAGE_CELL_MAPPINGS | grep -F "| $CELL |" $ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 list_cells | grep -F "| $RCELL |" done每个单元都应该有以下更改:
-
cellXnova数据库和用户名变为nova_cellX。 -
默认单元重命名为DEFAULT_CELL_NAME。如果有多个单元,默认单元可能会保留原始名称。 -
RabbitMQ 传输 URL 不再使用
客户机。
-
此时,计算服务 control plane 服务不控制现有的计算服务工作负载。control plane 仅在数据采用过程完成后管理数据平面。如需更多信息,请参阅将 Compute 服务部署到 RHOSO 数据平面。
要将外部 Compute 服务导入到 RHOSO 数据平面,您必须首先升级它们。如需更多信息,请参阅将 Compute 服务部署到 RHOSO 数据平面,以及对 计算服务执行快速升级。
6.9. 使用块存储服务 复制链接链接已复制到粘贴板!
要采用 director Operator 部署的块存储服务(cinder),根据现有的 cinder.conf 文件创建清单,部署块存储服务,并验证新部署。
先决条件
- 您已查看了块存储服务限制。如需更多信息,请参阅 使用块存储服务的限制。
- 您已计划放置块存储服务。
- 您已准备了运行卷和备份服务的 Red Hat OpenShift Container Platform (RHOCP)节点。如需更多信息,请参阅 使用 块存储服务的 RHOCP 准备。
- Block Storage 服务(cinder)已停止。
- 服务数据库导入到 control plane MariaDB 中。
- 采用 Identity 服务(keystone)和密钥管理器服务(barbican)。
- RHOCP 集群上正确配置了存储网络。
cinder.conf文件的内容。下载该文件以便您可以在本地访问该文件:$CONTROLLER1_SSH cat /var/lib/config-data/puppet-generated/cinder/etc/cinder/cinder.conf > cinder.conf
流程
创建新文件,如
cinder_api.patch,并应用配置:$ oc patch openstackcontrolplane openstack --type=merge --patch-file=<patch_name>将
<patch_name> 替换为补丁文件的名称。以下示例显示了
cinder_api.patch文件:spec: extraMounts: - extraVol: - extraVolType: Ceph mounts: - mountPath: /etc/ceph name: ceph readOnly: true propagation: - CinderVolume - CinderBackup - Glance volumes: - name: ceph projected: sources: - secret: name: ceph-conf-files cinder: enabled: true apiOverride: route: {} template: databaseInstance: openstack databaseAccount: cinder secret: osp-secret cinderAPI: override: service: internal: metadata: annotations: metallb.universe.tf/address-pool: internalapi metallb.universe.tf/allow-shared-ip: internalapi metallb.universe.tf/loadBalancerIPs: 172.17.0.801 spec: type: LoadBalancer replicas: 1 customServiceConfig: | [DEFAULT] default_volume_type=tripleo cinderScheduler: replicas: 0 cinderBackup: networkAttachments: - storage replicas: 0 cinderVolumes: ceph: networkAttachments: - storage replicas: 0- 1
- 如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如
metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80。
检索之前调度程序和备份服务的列表:
$ openstack volume service list +------------------+------------------------+------+---------+-------+----------------------------+ | Binary | Host | Zone | Status | State | Updated At | +------------------+------------------------+------+---------+-------+----------------------------+ | cinder-scheduler | standalone.localdomain | nova | enabled | down | 2024-11-04T17:47:14.000000 | | cinder-backup | standalone.localdomain | nova | enabled | down | 2024-11-04T17:47:14.000000 | | cinder-volume | hostgroup@tripleo_ceph | nova | enabled | down | 2024-11-04T17:47:14.000000 | +------------------+------------------------+------+---------+-------+----------------------------+删除处于
down状态的主机的服务:$ oc exec -t cinder-api-0 -c cinder-api -- cinder-manage service remove <service_binary> <service_host>-
将
<service_binary> 替换为二进制名称,如cinder-backup。 -
将
<service_host> 替换为主机名,如cinder-backup-0。
-
将
部署调度程序、备份和卷服务:
创建另一个文件,如
cinder_services.patch,并应用配置:$ oc patch openstackcontrolplane openstack --type=merge --patch-file=<patch_name>-
将
<patch_name> 替换为补丁文件的名称。 以下示例显示了 Ceph RBD 部署的
cinder_services.patch文件:spec: cinder: enabled: true template: cinderScheduler: replicas: 1 cinderBackup: networkAttachments: - storage replicas: 1 customServiceConfig: | [DEFAULT] backup_driver=cinder.backup.drivers.ceph.CephBackupDriver backup_ceph_conf=/etc/ceph/ceph.conf backup_ceph_user=openstack backup_ceph_pool=backups cinderVolumes: ceph: networkAttachments: - storage replicas: 1 customServiceConfig: | [tripleo_ceph] backend_host=hostgroup volume_backend_name=tripleo_ceph volume_driver=cinder.volume.drivers.rbd.RBDDriver rbd_ceph_conf=/etc/ceph/ceph.conf rbd_user=openstack rbd_pool=volumes rbd_flatten_volume_from_snapshot=False report_discard_supported=True注意确保源集群中使用的驱动程序使用相同的配置组名称。在本例中,
customServiceConfig中的驱动程序配置组名为tripleo_ceph,因为它反映源 OpenStack 集群的cinder.conf文件中的配置组名称的值。
配置 NetApp NFS 块存储卷服务:
创建 secret,使其包含用于访问第三方 NetApp NFS 存储的敏感信息,如主机名、密码和用户名。您可以在从 director Operator 部署生成的
cinder.conf文件中找到凭证。$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: labels: service: cinder component: cinder-volume name: cinder-volume-ontap-secrets type: Opaque stringData: ontap-cinder-secrets: | [tripleo_netapp] netapp_login= netapp_username netapp_password= netapp_password netapp_vserver= netapp_vserver nas_host= netapp_nfsip nas_share_path=/netapp_nfspath netapp_pool_name_search_pattern=(netapp_poolpattern) EOF对
OpenStackControlPlaneCR 进行补丁,以部署 NetApp NFS Block Storage 卷后端:$ oc patch openstackcontrolplane openstack --type=merge --patch-file=<cinder_netappNFS.patch>以下示例显示了配置 NetApp NFS Block Storage 卷服务的
cinder_netappNFS.patch文件:spec: cinder: enabled: true template: cinderVolumes: ontap-nfs: networkAttachments: - storage customServiceConfig: | [tripleo_netapp] volume_backend_name=ontap-nfs volume_driver=cinder.volume.drivers.netapp.common.NetAppDriver nfs_snapshot_support=true nas_secure_file_operations=false nas_secure_file_permissions=false netapp_server_hostname= netapp_backendip netapp_server_port=80 netapp_storage_protocol=nfs netapp_storage_family=ontap_cluster customServiceConfigSecrets: - cinder-volume-ontap-secrets
检查所有服务是否已启动并正在运行:
$ openstack volume service list +------------------+--------------------------+------+---------+-------+----------------------------+ | Binary | Host | Zone | Status | State | Updated At | +------------------+--------------------------+------+---------+-------+----------------------------+ | cinder-volume | hostgroup@tripleo_netapp | nova | enabled | up | 2023-06-28T17:00:03.000000 | | cinder-scheduler | cinder-scheduler-0 | nova | enabled | up | 2023-06-28T17:00:02.000000 | | cinder-backup | cinder-backup-0 | nova | enabled | up | 2023-06-28T17:00:01.000000 | +------------------+--------------------------+------+---------+-------+----------------------------+应用 DB 数据迁移:
注意您不需要在此步骤中运行数据迁移,但您必须在下一次升级前运行它们。但是,对于采用,您可以现在运行迁移以确保在部署上运行生产工作负载前没有问题。
$ oc exec -it cinder-scheduler-0 -- cinder-manage db online_data_migrations
验证
确保定义了
openstack别名:$ alias openstack="oc exec -t openstackclient -- openstack"确认定义了块存储服务端点并指向 control plane FQDN:
$ openstack endpoint list --service <endpoint>-
将
<endpoint> 替换为您要确认的端点的名称。
-
将
确认块存储服务正在运行:
$ openstack volume service list注意Cinder API 服务不会出现在列表中。但是,如果您从
openstack volume service list命令获得响应,这表示至少有一个 cinder API 服务正在运行。确认已有以前的卷类型、卷、快照和备份:
$ openstack volume type list $ openstack volume list $ openstack volume snapshot list $ openstack volume backup list要确认配置是否正常工作,请执行以下步骤:
从镜像创建卷,以检查与镜像服务(glance)的连接是否正常工作:
$ openstack volume create --image cirros --bootable --size 1 disk_new备份之前附加的卷:
$ openstack --os-volume-api-version 3.47 volume create --backup <backup_name>将
<backup_name> 替换为新备份位置的名称。注意您不能使用新卷从镜像启动计算服务(nova)实例,或者尝试分离上一个卷,因为计算服务和块存储服务仍然未连接。
6.10. 使用仪表板服务 复制链接链接已复制到粘贴板!
要采用 Dashboard 服务(horizon),您可以修补禁用 Dashboard 服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用由 Red Hat OpenStack Platform 环境提供的配置参数启动服务。
先决条件
- 您采用 Memcached。如需更多信息,请参阅部署后端服务。
- 您采用了 Identity 服务(keystone)。如需更多信息,请参阅 使用 Identity 服务。
流程
对
OpenStackControlPlaneCR 进行补丁来部署 Dashboard 服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: horizon: enabled: true apiOverride: route: {} template: memcachedInstance: memcached secret: osp-secret '
验证
验证 Dashboard 服务实例是否已成功部署并就绪:
$ oc get horizon确认 Dashboard 服务可访问并返回
200状态代码:PUBLIC_URL=$(oc get horizon horizon -o jsonpath='{.status.endpoint}') curl --silent --output /dev/stderr --head --write-out "%{http_code}" "$PUBLIC_URL/dashboard/auth/login/?next=/dashboard/" -k | grep 200
6.12. 使用编排服务 复制链接链接已复制到粘贴板!
要采用编排服务(heat),您可以修补现有的 OpenStackControlPlane 自定义资源(CR),其中禁用了编排服务。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。
完成采用过程后,在 Identity 服务(keystone)中具有 Heat、HeatAPI、HeatEngine 和 HeatCFNAPI 和端点的 CR,以促进这些服务。
先决条件
- 源 director Operator 环境正在运行。
- 目标 Red Hat OpenShift Container Platform (RHOCP)环境正在运行。
- 您采用 MariaDB 和 Identity 服务。
- 如果您的现有编排服务堆栈包含来自网络服务(neutron)、计算服务(nova)、对象存储服务(swift)等其他服务的资源,请在采用编排服务前采用这些信号。
流程
检索现有的
auth_encryption_key和service密码。您可以使用这些密码来修补osp-secret。在以下示例中,auth_encryption_key用作HeatAuthEncryptionKey,服务密码用作HeatPassword:[stack@rhosp17 ~]$ grep -E 'HeatPassword|HeatAuth|HeatStackDomainAdmin' ~/overcloud-deploy/overcloud/overcloud-passwords.yaml HeatAuthEncryptionKey: Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2 HeatPassword: dU2N0Vr2bdelYH7eQonAwPfI3 HeatStackDomainAdminPassword: dU2N0Vr2bdelYH7eQonAwPfI3登录到 Controller 节点,并验证正在使用的
auth_encryption_key值:[stack@rhosp17 ~]$ ansible -i overcloud-deploy/overcloud/config-download/overcloud/tripleo-ansible-inventory.yaml overcloud-controller-0 -m shell -a "grep auth_encryption_key /var/lib/config-data/puppet-generated/heat/etc/heat/heat.conf | grep -Ev '^#|^$'" -b overcloud-controller-0 | CHANGED | rc=0 >> auth_encryption_key=Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2将密码编码为 Base64 格式:
$ echo Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2 | base64 UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzIK对
osp-secret进行补丁,以更新HeatAuthEncryptionKey和HeatPassword参数。这些值必须与 director Operator Orchestration 服务配置中的值匹配:$ oc patch secret osp-secret --type='json' -p='[{"op" : "replace" ,"path" : "/data/HeatAuthEncryptionKey" ,"value" : "UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzIK"}]' secret/osp-secret patched对
OpenStackControlPlaneCR 进行补丁来部署编排服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: heat: enabled: true apiOverride: route: {} template: databaseInstance: openstack databaseAccount: heat secret: osp-secret memcachedInstance: memcached passwordSelectors: authEncryptionKey: HeatAuthEncryptionKey service: HeatPassword stackDomainAdminPassword: HeatStackDomainAdminPassword '
验证
确保所有 CR 的状态都是
Setup complete:$ oc get Heat,HeatAPI,HeatEngine,HeatCFNAPI NAME STATUS MESSAGE heat.heat.openstack.org/heat True Setup complete NAME STATUS MESSAGE heatapi.heat.openstack.org/heat-api True Setup complete NAME STATUS MESSAGE heatengine.heat.openstack.org/heat-engine True Setup complete NAME STATUS MESSAGE heatcfnapi.heat.openstack.org/heat-cfnapi True Setup complete检查编排服务是否在 Identity 服务中注册:
$ oc exec -it openstackclient -- openstack service list -c Name -c Type +------------+----------------+ | Name | Type | +------------+----------------+ | heat | orchestration | | glance | image | | heat-cfn | cloudformation | | ceilometer | Ceilometer | | keystone | identity | | placement | placement | | cinderv3 | volumev3 | | nova | compute | | neutron | network | +------------+----------------+$ oc exec -it openstackclient -- openstack endpoint list --service=heat -f yaml - Enabled: true ID: 1da7df5b25b94d1cae85e3ad736b25a5 Interface: public Region: regionOne Service Name: heat Service Type: orchestration URL: http://heat-api-public-openstack-operators.apps.okd.bne-shift.net/v1/%(tenant_id)s - Enabled: true ID: 414dd03d8e9d462988113ea0e3a330b0 Interface: internal Region: regionOne Service Name: heat Service Type: orchestration URL: http://heat-api-internal.openstack-operators.svc:8004/v1/%(tenant_id)s检查编排服务引擎服务是否正在运行:
$ oc exec -it openstackclient -- openstack orchestration service list -f yaml - Binary: heat-engine Engine ID: b16ad899-815a-4b0c-9f2e-e6d9c74aa200 Host: heat-engine-6d47856868-p7pzz Hostname: heat-engine-6d47856868-p7pzz Status: up Topic: engine Updated At: '2023-10-11T21:48:01.000000' - Binary: heat-engine Engine ID: 887ed392-0799-4310-b95c-ac2d3e6f965f Host: heat-engine-6d47856868-p7pzz Hostname: heat-engine-6d47856868-p7pzz Status: up Topic: engine Updated At: '2023-10-11T21:48:00.000000' - Binary: heat-engine Engine ID: 26ed9668-b3f2-48aa-92e8-2862252485ea Host: heat-engine-6d47856868-p7pzz Hostname: heat-engine-6d47856868-p7pzz Status: up Topic: engine Updated At: '2023-10-11T21:48:00.000000' - Binary: heat-engine Engine ID: 1011943b-9fea-4f53-b543-d841297245fd Host: heat-engine-6d47856868-p7pzz Hostname: heat-engine-6d47856868-p7pzz Status: up Topic: engine Updated At: '2023-10-11T21:48:01.000000'验证您是否可以看到您的编配服务堆栈:
$ openstack stack list -f yaml - Creation Time: '2023-10-11T22:03:20Z' ID: 20f95925-7443-49cb-9561-a1ab736749ba Project: 4eacd0d1cab04427bc315805c28e66c9 Stack Name: test-networks Stack Status: CREATE_COMPLETE Updated Time: null
6.13. 使用 Telemetry 服务 复制链接链接已复制到粘贴板!
要采用 Telemetry 服务,您可以修补禁用 Telemetry 服务的现有 OpenStackControlPlane 自定义资源(CR),以使用由 Red Hat OpenStack Platform (RHOSP) 17.1 环境提供的配置参数启动该服务。
如果您采用 Telemetry 服务,RHOSP 17.1 环境(Service Telemetry Framework)中使用的可观察性解决方案将从集群中移除。新解决方案部署在 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services 中,允许指标(可选)日志被检索并存储在新的后端中。
您无法自动迁移旧数据,因为使用了不同的后端。指标和日志被视为短期的数据,不应迁移到 RHOSO 环境。有关将旧的自动扩展堆栈模板用于 RHOSO 环境的详情,请参考 采用自动扩展服务。
先决条件
- director Operator 环境正在运行(源云)。
- 单节点 OpenShift 或 OpenShift Local 在 Red Hat OpenShift Container Platform (RHOCP)集群中运行。
- 以前的采用步骤已完成。
流程
对
OpenStackControlPlaneCR 进行补丁来部署cluster-observability-operator:$ oc create -f - <<EOF apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: cluster-observability-operator namespace: openshift-operators spec: channel: stable installPlanApproval: Automatic name: cluster-observability-operator source: redhat-operators sourceNamespace: openshift-marketplace EOF等待安装成功:
$ oc wait --for jsonpath="{.status.phase}"=Succeeded csv --namespace=openshift-operators -l operators.coreos.com/cluster-observability-operator.openshift-operators修补
OpenStackControlPlaneCR 来部署 Ceilometer 服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: telemetry: enabled: true template: ceilometer: passwordSelector: ceilometerService: CeilometerPassword enabled: true secret: osp-secret serviceUser: ceilometer '启用 metrics 存储后端:
$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: telemetry: template: metricStorage: enabled: true monitoringStack: alertingEnabled: true scrapeInterval: 30s storage: strategy: persistent retention: 24h persistent: pvcStorageRequest: 20G '
验证
验证
alertmanager和prometheuspod 是否可用:$ oc get pods -l alertmanager=metric-storage NAME READY STATUS RESTARTS AGE alertmanager-metric-storage-0 2/2 Running 0 46s alertmanager-metric-storage-1 2/2 Running 0 46s $ oc get pods -l prometheus=metric-storage NAME READY STATUS RESTARTS AGE prometheus-metric-storage-0 3/3 Running 0 46s检查生成的 Ceilometer pod:
CEILOMETETR_POD=`oc get pods -l service=ceilometer | tail -n 1 | cut -f 1 -d' '` oc exec -t $CEILOMETETR_POD -c ceilometer-central-agent -- cat /etc/ceilometer/ceilometer.conf检查已启用的 pollsters:
$ oc get secret ceilometer-config-data -o jsonpath="{.data['polling\.yaml\.j2']}" | base64 -d可选:根据环境要求覆盖默认 pollsters:
$ oc patch openstackcontrolplane controlplane --type=merge --patch ' spec: telemetry: template: ceilometer: defaultConfigOverwrite: polling.yaml.j2: | --- sources: - name: pollsters interval: 100 meters: - volume.* - image.size enabled: true secret: osp-secret '
后续步骤
可选:对
OpenStackControlPlaneCR 进行补丁,使其包含日志记录:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: telemetry: template: logging: enabled: false ipaddr: 172.17.0.80 port: 10514 cloNamespace: openshift-logging '
6.14. 使用自动扩展服务 复制链接链接已复制到粘贴板!
要采用启用自动扩展的服务,您可以修补禁用 Alarming 服务(aodh)的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用由 Red Hat OpenStack Platform 环境提供的配置参数启动服务。
先决条件
- 源 director Operator 环境正在运行。
- 单节点 OpenShift 或 OpenShift Local 在 Red Hat OpenShift Container Platform (RHOCP)集群中运行。
您已采用了以下服务:
- MariaDB
- Identity 服务 (keystone)
- 编配服务(heat)
- Telemetry 服务
流程
对
OpenStackControlPlaneCR 进行补丁来部署自动扩展服务:$ oc patch openstackcontrolplane openstack --type=merge --patch ' spec: telemetry: enabled: true template: autoscaling: enabled: true aodh: passwordSelector: aodhService: AodhPassword databaseAccount: aodh databaseInstance: openstack secret: osp-secret serviceUser: aodh heatInstance: heat '检查 aodh pod:
$ AODH_POD=`oc get pods -l service=aodh | tail -n 1 | cut -f 1 -d' '` $ oc exec -t $AODH_POD -c aodh-api -- cat /etc/aodh/aodh.conf检查 aodh API 服务是否在 Identity 服务中注册:
$ openstack endpoint list | grep aodh | d05d120153cd4f9b8310ac396b572926 | regionOne | aodh | alarming | True | internal | http://aodh-internal.openstack.svc:8042 | | d6daee0183494d7a9a5faee681c79046 | regionOne | aodh | alarming | True | public | http://aodh-public.openstack.svc:8042 |可选:使用
PrometheusAlarm警报类型创建 aodh 警报:注意您必须使用
PrometheusAlarm警报类型,而不是GnocchiAggregationByResourcesAlarm。$ openstack alarm create --name high_cpu_alarm \ --type prometheus \ --query "(rate(ceilometer_cpu{resource_name=~'cirros'})) * 100" \ --alarm-action 'log://' \ --granularity 15 \ --evaluation-periods 3 \ --comparison-operator gt \ --threshold 7000000000验证警报是否已启用:
$ openstack alarm list +--------------------------------------+------------+------------------+-------------------+----------+ | alarm_id | type | name | state | severity | enabled | +--------------------------------------+------------+------------------+-------------------+----------+ | 209dc2e9-f9d6-40e5-aecc-e767ce50e9c0 | prometheus | prometheus_alarm | ok | low | True | +--------------------------------------+------------+------------------+-------------------+----------+
6.15. 从 director Operator 部署拉取配置 复制链接链接已复制到粘贴板!
在启动 data plane 采用工作流前,从 Red Hat OpenStack Platform (RHOSP)服务和 director Operator 备份配置。然后,您可以在配置所采用的服务期间使用文件,以确保不会丢失或错误配置。
先决条件
- 已安装并配置 os-diff 工具。如需更多信息,请参阅 对比部署之间的配置文件。
流程
根据您的环境在
os-diff.cfg中更新您的 ssh 参数。os-diff 使用 ssh 参数连接到 director Operator 节点,然后查询并下载配置文件:ssh_cmd=ssh -F ssh.config standalone container_engine=podman connection=ssh remote_config_path=/tmp/tripleo确保您在
ssh_cmd参数中提供的 ssh 命令正确,并包含密钥身份验证。启用您要包含在
/etc/os-diff/config.yaml文件中的服务,并禁用您要从文件中排除的服务。确保具有编辑文件的正确权限:$ chown ospng:ospng /etc/os-diff/config.yaml以下示例允许默认 Identity 服务(keystone)包含在
/etc/os-diff/config.yaml文件中:# service name and file location services: # Service name keystone: # Bool to enable/disable a service (not implemented yet) enable: true # Pod name, in both OCP and podman context. # It could be strict match or will only just grep the podman_name # and work with all the pods which matched with pod_name. # To enable/disable use strict_pod_name_match: true/false podman_name: keystone pod_name: keystone container_name: keystone-api # pod options # strict match for getting pod id in TripleO and podman context strict_pod_name_match: false # Path of the config files you want to analyze. # It could be whatever path you want: # /etc/<service_name> or /etc or /usr/share/<something> or even / # @TODO: need to implement loop over path to support multiple paths such as: # - /etc # - /usr/share path: - /etc/ - /etc/keystone - /etc/keystone/keystone.conf - /etc/keystone/logging.conf对您要禁用或启用的每个 RHOSP 服务重复此步骤。
如果您使用非容器化服务,如
ovs-external-ids,请拉取配置或命令输出。例如:services: ovs_external_ids: hosts:1 - standalone service_command: "ovs-vsctl list Open_vSwitch . | grep external_ids | awk -F ': ' '{ print $2; }'"2 cat_output: true3 path: - ovs_external_ids.json config_mapping:4 ovn-bridge-mappings: edpm_ovn_bridge_mappings5 ovn-bridge: edpm_ovn_bridge ovn-encap-type: edpm_ovn_encap_type ovn-monitor-all: ovn_monitor_all ovn-remote-probe-interval: edpm_ovn_remote_probe_interval ovn-ofctrl-wait-before-clear: edpm_ovn_ofctrl_wait_before_clear注意您必须正确配置 SSH 配置文件或相当于非标准服务,如 OVS。
ovs_external_ids服务不在容器中运行,并且 OVS 数据存储在云的每个主机上,如controller_1/controller_2/等。- 1
- 主机列表,如
compute-1、compute-2。 - 2
- 针对主机运行的命令。
- 3
- os-diff 获取命令的输出,并将输出存储在由密钥路径指定的文件中。
- 4
- 在这个示例中,在 data plane 自定义资源定义和
ovs-vsctl输出之间提供一个映射。 - 5
edpm_ovn_bridge_mappings变量必须是字符串列表,如["datacentre:br-ex"]。比较值:
$ os-diff diff ovs_external_ids.json edpm.crd --crd --service ovs_external_ids例如,要在每台主机上检查
/etc/yum.conf,您必须将以下语句放在config.yaml文件中。以下示例使用一个名为yum_config的文件:services: yum_config: hosts: - undercloud - controller_1 - compute_1 - compute_2 service_command: "cat /etc/yum.conf" cat_output: true path: - yum.conf
拉取配置:
注意以下命令拉取
/etc/os-diff/config.yaml文件中包含的所有配置文件。您可以使用--update 或--update-only 选项,将 os-diff 配置为根据运行的环境自动更新此文件。这些选项将 podman 信息设置为所有正在运行的容器的config.yaml中。当所有 Red Hat OpenStack Platform 服务都已关闭时,podman 信息可能会很有用。请注意,当
config.yaml文件自动填充时,您必须手动为每个服务提供配置路径。# will only update the /etc/os-diff/config.yaml os-diff pull --update-only# will update the /etc/os-diff/config.yaml and pull configuration os-diff pull --update# will update the /etc/os-diff/config.yaml and pull configuration os-diff pull配置默认拉取并存储在以下目录中:
/tmp/tripleo/
验证
验证您是否在本地路径中都有每个服务配置的目录:
▾ tmp/ ▾ tripleo/ ▾ glance/ ▾ keystone/
6.16. 回滚 control plane 采用 复制链接链接已复制到粘贴板!
如果您遇到问题,且无法完成 Red Hat OpenStack Platform (RHOSP) control plane 服务的使用,您可以回滚 control plane。
如果您以任何方式更改 data plane 节点,则不要尝试回滚。只有在更改 control plane 时,您只能回滚 control plane 的采用。
在 control plane 采用过程中,RHOSP control plane 上的服务会停止但不被删除。在采用过程中,RHOSP control plane 上的数据库不会被编辑。control plane 上的 Red Hat OpenStack Services (RHOSO) control plane 接收原始 control plane 数据库的副本。回滚过程假定 data plane 尚未由采用过程修改,它仍然连接到 RHOSP control plane。
回滚过程由以下步骤组成:
- 恢复 RHOSP control plane 的功能。
- 删除部分或完全部署的 RHOSO control plane。
流程
要将源云恢复到工作状态,请启动之前在采用过程中停止的 RHOSP control plane 服务:
ServicesToStart=("tripleo_horizon.service" "tripleo_keystone.service" "tripleo_barbican_api.service" "tripleo_barbican_worker.service" "tripleo_barbican_keystone_listener.service" "tripleo_cinder_api.service" "tripleo_cinder_api_cron.service" "tripleo_cinder_scheduler.service" "tripleo_cinder_volume.service" "tripleo_cinder_backup.service" "tripleo_glance_api.service" "tripleo_manila_api.service" "tripleo_manila_api_cron.service" "tripleo_manila_scheduler.service" "tripleo_neutron_api.service" "tripleo_placement_api.service" "tripleo_nova_api_cron.service" "tripleo_nova_api.service" "tripleo_nova_conductor.service" "tripleo_nova_metadata.service" "tripleo_nova_scheduler.service" "tripleo_nova_vnc_proxy.service" "tripleo_aodh_api.service" "tripleo_aodh_api_cron.service" "tripleo_aodh_evaluator.service" "tripleo_aodh_listener.service" "tripleo_aodh_notifier.service" "tripleo_ceilometer_agent_central.service" "tripleo_ceilometer_agent_compute.service" "tripleo_ceilometer_agent_ipmi.service" "tripleo_ceilometer_agent_notification.service" "tripleo_ovn_cluster_north_db_server.service" "tripleo_ovn_cluster_south_db_server.service" "tripleo_ovn_cluster_northd.service" "tripleo_octavia_api.service" "tripleo_octavia_health_manager.service" "tripleo_octavia_rsyslog.service" "tripleo_octavia_driver_agent.service" "tripleo_octavia_housekeeping.service" "tripleo_octavia_worker.service") PacemakerResourcesToStart=("galera-bundle" "haproxy-bundle" "rabbitmq-bundle" "openstack-cinder-volume" "openstack-cinder-backup" "openstack-manila-share") echo "Starting systemd OpenStack services" for service in ${ServicesToStart[*]}; do for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then if ${!SSH_CMD} sudo systemctl is-enabled $service &> /dev/null; then echo "Starting the $service in controller $i" ${!SSH_CMD} sudo systemctl start $service fi fi done done echo "Checking systemd OpenStack services" for service in ${ServicesToStart[*]}; do for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then if ${!SSH_CMD} sudo systemctl is-enabled $service &> /dev/null; then if ! ${!SSH_CMD} systemctl show $service | grep ActiveState=active >/dev/null; then echo "ERROR: Service $service is not running on controller $i" else echo "OK: Service $service is running in controller $i" fi fi fi done done echo "Starting pacemaker OpenStack services" for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Using controller $i to run pacemaker commands" for resource in ${PacemakerResourcesToStart[*]}; do if ${!SSH_CMD} sudo pcs resource config $resource &>/dev/null; then echo "Starting $resource" ${!SSH_CMD} sudo pcs resource enable $resource else echo "Service $resource not present" fi done break fi done echo "Checking pacemaker OpenStack services" for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Using controller $i to run pacemaker commands" for resource in ${PacemakerResourcesToStop[*]}; do if ${!SSH_CMD} sudo pcs resource config $resource &>/dev/null; then if ${!SSH_CMD} sudo pcs resource status $resource | grep Started >/dev/null; then echo "OK: Service $resource is started" else echo "ERROR: Service $resource is stopped" fi fi done break fi done如果 Ceph NFS 服务在作为共享文件系统服务(manila)后端部署上运行,您必须为
openstack-manila-share服务恢复 Pacemaker 顺序和 colocation 约束:$ sudo pcs constraint order start ceph-nfs then openstack-manila-share kind=Optional id=order-ceph-nfs-openstack-manila-share-Optional $ sudo pcs constraint colocation add openstack-manila-share with ceph-nfs score=INFINITY id=colocation-openstack-manila-share-ceph-nfs-INFINITY-
验证源云是否可再次运行,例如,您可以运行
openstackCLI 命令,如openstack server list,或检查您可以访问 Dashboard 服务(horizon)。 删除部分或完全部署的 control plane,以便以后可以再次尝试采用:
$ oc delete --ignore-not-found=true --wait=false openstackcontrolplane/openstack $ oc patch openstackcontrolplane openstack --type=merge --patch ' metadata: finalizers: [] ' || true while oc get pod | grep rabbitmq-server-0; do sleep 2 done while oc get pod | grep openstack-galera-0; do sleep 2 done $ oc delete --ignore-not-found=true --wait=false pod mariadb-copy-data $ oc delete --ignore-not-found=true --wait=false pvc mariadb-data $ oc delete --ignore-not-found=true --wait=false pod ovn-copy-data $ oc delete --ignore-not-found=true secret osp-secret
后续步骤
恢复 RHOSP control plane 服务后,其内部状态可能会改变。在重试采用过程前,请验证所有 control plane 资源是否已移除,并且没有影响以下采用过程尝试的保留。您不能在另一个采用尝试中使用之前创建的数据库内容副本。您必须生成原始源数据库内容最新状态的新副本。有关生成数据库新副本的更多信息,请参阅将 数据库迁移到 control plane。
第 7 章 使用数据平面 复制链接链接已复制到粘贴板!
在 OpenShift (RHOSO)数据平面上使用 Red Hat OpenStack Services 涉及以下步骤:
- 部署所需的自定义资源。
- 对从 RHOSP 17.1 到 RHOSO 18.0 的 Compute 服务执行快速升级。
- 采用 Networker 服务到 RHOSO 数据平面。
在 RHOSO control plane 管理新部署的数据平面后,不得在 RHOSP 17.1 control plane 和数据平面上重新启用服务。如果您重新启用服务,工作负载由两个 control plane 或两个数据平面管理,从而导致数据崩溃、现有工作负载的丢失、无法启动新工作负载或其他问题。
7.1. 停止基础架构管理和计算服务 复制链接链接已复制到粘贴板!
您必须停止 Red Hat OpenStack Platform 17.1 control plane 上的云数据库节点和消息传递节点。不要停止运行以下角色的节点:
- Compute
- 存储
- Networker
-
运行
OVN Controller 网关代理网络代理控制器
以下流程适用于独立 director Operator 部署。您必须停止主机上的 Pacemaker 服务,以便在将 Compute 角色用作数据平面节点时安装 libvirt 软件包。模块 libvirt 守护进程不再在 data plane 节点上的 podman 容器中运行。
先决条件
定义 shell 变量。将以下示例值替换为应用到您的环境的值:
CONTROLLER1_SSH="ssh -i <path_to_SSH_key> root@<controller-1 IP>" # ... # ...1 EDPM_PRIVATEKEY_PATH="<path_to_SSH_key>"2
流程
停止 Pacemaker 服务:
PacemakerResourcesToStop=( "galera-bundle" "haproxy-bundle" "rabbitmq-bundle") echo "Stopping pacemaker services" for i in {1..3}; do SSH_CMD=CONTROLLER${i}_SSH if [ ! -z "${!SSH_CMD}" ]; then echo "Using controller $i to run pacemaker commands" for resource in ${PacemakerResourcesToStop[*]}; do if ${!SSH_CMD} sudo pcs resource config $resource; then ${!SSH_CMD} sudo pcs resource disable $resource fi done break fi done
7.2. 将计算服务到 RHOSO 数据平面 复制链接链接已复制到粘贴板!
将您的 Compute (nova)服务纳入 OpenShift (RHOSO)数据平面上的 Red Hat OpenStack 服务。
先决条件
- 您已在 Compute 服务(nova)主机上停止剩余的 control plane 节点、存储库和软件包。如需更多信息,请参阅 停止基础架构管理和计算服务。
-
您已为
NovaLibvirt服务配置了 Ceph 后端。有关更多信息 ,请参阅配置 Ceph 后端。 您已配置了 IP 地址管理(IPAM):
$ oc apply -f - <<EOF apiVersion: network.openstack.org/v1beta1 kind: NetConfig metadata: name: netconfig spec: networks: - name: ctlplane dnsDomain: ctlplane.example.com subnets: - name: subnet1 allocationRanges: - end: 192.168.122.120 start: 192.168.122.100 - end: 192.168.122.200 start: 192.168.122.150 cidr: 192.168.122.0/24 gateway: 192.168.122.1 - name: internalapi dnsDomain: internalapi.example.com subnets: - name: subnet1 allocationRanges: - end: 172.17.0.250 start: 172.17.0.100 cidr: 172.17.0.0/24 vlan: 20 - name: External dnsDomain: external.example.com subnets: - name: subnet1 allocationRanges: - end: 10.0.0.250 start: 10.0.0.100 cidr: 10.0.0.0/24 gateway: 10.0.0.1 - name: storage dnsDomain: storage.example.com subnets: - name: subnet1 allocationRanges: - end: 172.18.0.250 start: 172.18.0.100 cidr: 172.18.0.0/24 vlan: 21 - name: storagemgmt dnsDomain: storagemgmt.example.com subnets: - name: subnet1 allocationRanges: - end: 172.20.0.250 start: 172.20.0.100 cidr: 172.20.0.0/24 vlan: 23 - name: tenant dnsDomain: tenant.example.com subnets: - name: subnet1 allocationRanges: - end: 172.19.0.250 start: 172.19.0.100 cidr: 172.19.0.0/24 vlan: 22 EOF-
如果在 Compute 服务节点上运行
neutron-sriov-nic-agent,请确保物理设备映射与OpenStackDataPlaneNodeSet自定义资源(CR)中定义的值匹配。如需更多信息,请参阅从 director Operator 部署中提取配置。 您已定义 shell 变量来运行运行升级的脚本:
$ CEPH_FSID=$(oc get secret ceph-conf-files -o json | jq -r '.data."ceph.conf"' | base64 -d | grep fsid | sed -e 's/fsid = //') $ alias openstack="oc exec -t openstackclient -- openstack" $ DEFAULT_CELL_NAME="cell3"1 $ RENAMED_CELLS="cell1 cell2 $DEFAULT_CELL_NAME" $ declare -A COMPUTES_CELL1 $ export COMPUTES_CELL1=(2 ["standalone.localdomain"]="192.168.122.100"3 # <compute1>4 # <compute2> # <compute3> ) $ declare -A COMPUTES_CELL2 $ export COMPUTES_CELL2=( # ... ) $ declare -A COMPUTES_CELL3 $ export COMPUTES_CELL3=( # ...5 ) # ... $ declare -A COMPUTES_API_CELL1 $ export COMPUTES_API_CELL1=(6 ["standalone.localdomain"]="172.17.0.100" # ... ) # ... $ NODESETS="" $ for CELL in $(echo $RENAMED_CELLS); do ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')" eval names=\${!${ref}[@]} [ -z "$names" ] && continue NODESETS="'openstack-${CELL}', $NODESETS"7 done $ NODESETS="[${NODESETS%,*}]"- 1
- 源云
默认单元在采用后获取目标云上的新的DEFAULT_CELL_NAME。在多单元采用场景中,您可以通过提供源云中最后单元的索引来保留原始名称、默认或 创建新单元默认名称。例如,如果最后一个单元的递增索引是cell5,新的单元默认名称是cell6。 - 2
- 对于每个单元,使用连接到
ctlplane和internalapi网络的 Compute 服务节点的名称和 IP地址更新 <["standalone.localdomain"]="x.x.x">值以及COMPUTES_CELL<X> 值。不要为每个网络指定一个真实的 FQDN。始终对 Compute 节点的每个连接的网络使用相同的主机名。根据需要,提供源云其余网络上的 IP 地址和主机名称。或者,您可以手动调整在此流程的第 9 步中生成的文件。 - 3
- 如果您的部署有自定义 DNS 域,请在节点的 FQDN 值中指定它。此值用于 data plane 节点设置
spec.nodes.<NODE NAME>.hostName。 - 4
- 将源云
单元1单元中的所有 Compute 服务节点分配给COMPUTES_CELL1,以此类推。将<compute1> , <compute2> , 和 <compute3> 替换为 Compute 服务节点的名称。 - 5
- 将源云
默认单元中的所有 Compute 服务节点分配给COMPUTES_CELL<X>和COMPUTES_API_CELL<X>',其中<X> 是DEFAULT_CELL_NAME环境变量值。在本例中,DEFAULT_CELL_NAME环境变量值等于cell3。 - 6
- 对于每个单元,使用连接到
ctlplane和internalapi网络的 Compute 服务节点的 name 和COMPUTES_API_CELL值更新 <["standalone.localdomain"]="192.168.122.100">值以及 COMPUTES_API_CELL 值。不要为每个网络指定一个真实的 FQDN。为每个连接的网络使用相同的主机名。根据需要,提供源云其余网络上的 IP 地址和主机名称。或者,您可以手动调整在此流程的第 9 步中生成的文件。 - 7
- 此模板中省略了不包含 Compute 节点的单元,因为没有为单元创建节点集。
注意如果您使用
默认单元部署源云,并希望在采用过程中重命名它,请定义您要使用的新名称,如下例所示:$ DEFAULT_CELL_NAME="cell1" $ RENAMED_CELLS="cell1"
如果本地存储后端由 libvirt 的 Compute 服务配置,则不要为 CEPH_FSID 参数设置值。存储后端必须与源云存储后端匹配。您不能在采用过程中更改存储后端。
流程
为 data plane 节点创建 SSH 身份验证 secret:
$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: dataplane-adoption-secret data: ssh-privatekey: | $(cat <path_to_SSH_key> | base64 | sed 's/^/ /') EOF-
将
<path_to_SSH_key> 替换为 SSH 密钥的路径。
-
将
生成 ssh 密钥对
nova-migration-ssh-keysecret:$ cd "$(mktemp -d)" $ ssh-keygen -f ./id -t ecdsa-sha2-nistp521 -N '' $ oc get secret nova-migration-ssh-key || oc create secret generic nova-migration-ssh-key \ --from-file=ssh-privatekey=id \ --from-file=ssh-publickey=id.pub \ --type kubernetes.io/ssh-auth $ rm -f id* $ cd -如果启用了 TLS Everywhere,将
LIBVIRT_PASSWORD设置为与现有的 RHOSP 部署密码匹配:declare -A TRIPLEO_PASSWORDS TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml" LIBVIRT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' LibvirtTLSPassword:' | awk -F ': ' '{ print $2; }') LIBVIRT_PASSWORD_BASE64=$(echo -n "$LIBVIRT_PASSWORD" | base64)启用 TLS-e 时创建 libvirt-secret:
$ oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: libvirt-secret type: Opaque data: LibvirtPassword: ${LIBVIRT_PASSWORD_BASE64} EOF
创建一个配置映射,用于所有单元来为 libvirt 配置本地存储后端:
$ oc apply -f - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: nova-cells-global-config data:1 99-nova-compute-cells-workarounds.conf: |2 [workarounds] disable_compute_service_check_for_ffu=true EOF注意如果您采用 live 云,您可能需要执行存储在 cell1 默认
配置映射中的默认 nova data plane 服务的额外配置。不要删除或覆盖分配给nova-extra-confignova的cell1默认nova-extra-config配置映射中的现有配置。覆盖配置可能会破坏依赖于nova-extra-config配置映射特定内容的数据位置服务。为 libvirt 配置 Red Hat Ceph Storage 后端:
$ oc apply -f - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: nova-cells-global-config data: 99-nova-compute-cells-workarounds.conf: | [workarounds] disable_compute_service_check_for_ffu=true 03-ceph-nova.conf: | [libvirt] images_type=rbd images_rbd_pool=vms images_rbd_ceph_conf=/etc/ceph/ceph.conf images_rbd_glance_store_name=default_backend images_rbd_glance_copy_poll_interval=15 images_rbd_glance_copy_timeout=600 rbd_user=openstack rbd_secret_uuid=$CEPH_FSID EOF注意对于带有多单元配置的 Red Hat Ceph Storage 环境,您必须命名配置映射和 Red Hat OpenStack Platform 数据平面服务,如下例所示:
nova-custom-ceph-cellX和nova-compute-extraconfig-cellX。为 Compute 服务单元创建 data plane 服务以启用预升级临时解决方案,并为您选择的存储后端配置 Compute 服务:
for CELL in $(echo $RENAMED_CELLS); do $ oc apply -f - <<EOF --- apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-$CELL spec: dataSources:1 - secretRef: name: nova-$CELL-compute-config2 - secretRef: name: nova-migration-ssh-key3 - configMapRef: name: nova-cells-global-config playbook: osp.edpm.nova caCerts: combined-ca-bundle edpmServiceType: nova containerImageFields: - NovaComputeImage - EdpmIscsidImage EOF done如果启用了 TLS Everywhere,请将以下内容附加到
OpenStackDataPlaneServiceCR 中:tlsCerts: contents: - dnsnames - ips networks: - ctlplane issuer: osp-rootca-issuer-internal edpmRoleServiceName: nova caCerts: combined-ca-bundle edpmServiceType: nova- 1
- 要为 cell<X> 启用本地元数据服务,请附加
spec.dataSources.secretRef来引用额外的自动生成的nova-cell<X>-metadata-neutron-configsecret。您还应该在OpenStackControlPlane/openstackCR 中设置spec.nova.template.cellTemplates.cell<X>.metadataServiceTemplate.enable,如 Adopt ing the Compute 服务 中所述。您可以配置单个顶级元数据,或者定义每个单元的元数据。 - 2
- 每个单元格的 secret
nova-cell<X>-compute-configauto-generates。 - 3
- 您必须为每个与 Compute 服务相关的自定义
OpenStackDataPlaneServiceCR 附加nova-cell<X>-compute-config和nova-migration-ssh-key引用。
注意为 Compute 服务单元创建数据平面服务时,请查看以下注意事项:
-
在本例中,相同的
nova-migration-ssh-key键在单元格之间共享。但是,您应该对不同的单元使用不同的键。 -
对于简单的配置覆盖,您不需要自定义数据平面服务。但是,要重新配置单元
cell1,st 选项是创建自定义服务和专用配置映射。 -
单元
cell1已使用名为nova及其nova-extra-config配置映射的默认OpenStackDataPlaneServiceCR 管理。不要更改默认的 data plane 服务nova定义。当使用 OLM 更新 RHOSO Operator 时,这些更改将会丢失。 -
当单元跨越多个节点集时,为自定义
OpenStackDataPlaneService资源提供与节点集合相关的名称,如nova-cell1-nfv和nova-cell1-enterprise。然后,自动生成的配置映射命名为nova-cell1-nfv-extra-config和nova-cell1-enterprise-extra-config。 - 也支持同一单元的多个节点集合中节点的不同配置,但本指南中不阐述。
为订阅管理器创建 secret:
$ oc create secret generic subscription-manager \ --from-literal rhc_auth='{"login": {"username": "<subscription_manager_username>", "password": "<subscription_manager_password>"}}'-
将
<subscription_manager_username> 替换为适用的用户名。 -
将
<subscription_manager_password> 替换为适用的密码。
-
将
为 Red Hat registry 创建 secret:
$ oc create secret generic redhat-registry \ --from-literal edpm_container_registry_logins='{"registry.redhat.io": {"<registry_username>": "<registry_password>"}}'-
将
<registry_username> 替换为适用的用户名。 将
<registry_password> 替换为适用的密码。注意您不需要在
OpenStackDataPlaneServiceCR 的dataSources字段中引用subscription-managersecret。secret 已通过nodeTemplate字段中ansibleVarsFrom属性中的特定于节点的OpenStackDataPlaneNodeSetCR 传递。
-
将
为每个单元创建 data plane 节点设置定义:
$ declare -A names $ for CELL in $(echo $RENAMED_CELLS); do ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')" eval names=\${!${ref}[@]} ref_api="COMPUTES_API_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')" [ -z "$names" ] && continue ind=0 rm -f computes-$CELL for compute in $names; do ip="${ref}['$compute']" ip_api="${ref_api}['$compute']" cat >> computes-$CELL << EOF ${compute}: hostName: $compute1 ansible: ansibleHost: $compute networks:2 - defaultRoute: true fixedIP: ${!ip} name: ctlplane subnetName: subnet1 - name: internalapi subnetName: subnet1 fixedIP: ${!ip_api} - name: storage subnetName: subnet1 - name: tenant subnetName: subnet1 EOF ind=$(( ind + 1 )) done test -f computes-$CELL || continue cat > nodeset-${CELL}.yaml <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-$CELL3 spec: tlsEnabled: false4 networkAttachments: - ctlplane preProvisioned: true services: - redhat - bootstrap - download-cache - configure-network - validate-network - install-os - configure-os - ssh-known-hosts - run-os - reboot-os - install-certs - ovn - neutron-metadata - libvirt - nova-$CELL - telemetry5 env: - name: ANSIBLE_CALLBACKS_ENABLED value: "profile_tasks" - name: ANSIBLE_FORCE_COLOR value: "True" - name: ANSIBLE_VERBOSITY value: '3' nodeTemplate: ansibleSSHPrivateKeySecret: dataplane-adoption-secret ansible: ansibleUser: root ansibleVarsFrom: - secretRef: name: subscription-manager - secretRef: name: redhat-registry ansibleVars: rhc_release: 9.2 rhc_repositories: - {name: "*", state: disabled} - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled} - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled} - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled} - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled} - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled} - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled} edpm_bootstrap_release_version_package: [] # edpm_network_config # Default nic config template for a EDPM node # These vars are edpm_network_config role vars edpm_network_config_template: | --- {% set mtu_list = [ctlplane_mtu] %} {% for network in nodeset_networks %} {% set _ = mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) %} {%- endfor %} {% set min_viable_mtu = mtu_list | max %} network_config: - type: ovs_bridge name: {{ neutron_physical_bridge_name }} mtu: {{ min_viable_mtu }} use_dhcp: false dns_servers: {{ ctlplane_dns_nameservers }} domain: {{ dns_search_domains }} addresses: - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }} routes: {{ ctlplane_host_routes }} members: - type: interface name: nic1 mtu: {{ min_viable_mtu }} # force the MAC address of the bridge to this interface primary: true {% for network in nodeset_networks %} - type: vlan mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }} vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }} addresses: - ip_netmask: {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }} routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }} {% endfor %} edpm_network_config_nmstate: false # Control resolv.conf management by NetworkManager # false = disable NetworkManager resolv.conf update (default) # true = enable NetworkManager resolv.conf update edpm_bootstrap_network_resolvconf_update: false edpm_network_config_hide_sensitive_logs: false # # These vars are for the network config templates themselves and are # considered EDPM network defaults. neutron_physical_bridge_name: br-ctlplane6 neutron_public_interface_name: eth0 # edpm_nodes_validation edpm_nodes_validation_validate_controllers_icmp: false edpm_nodes_validation_validate_gateway_icmp: false # edpm ovn-controller configuration edpm_ovn_bridge_mappings: <bridge_mappings>7 edpm_ovn_bridge: br-int edpm_ovn_encap_type: geneve ovn_monitor_all: true edpm_ovn_remote_probe_interval: 60000 edpm_ovn_ofctrl_wait_before_clear: 8000 timesync_ntp_servers: - hostname: clock.redhat.com - hostname: clock2.redhat.com edpm_bootstrap_command: | # FIXME: perform dnf upgrade for other packages in EDPM ansible # here we only ensuring that decontainerized libvirt can start dnf -y upgrade openstack-selinux rm -f /run/virtlogd.pid gather_facts: false # edpm firewall, change the allowed CIDR if needed edpm_sshd_configure_firewall: true edpm_sshd_allowed_ranges: ['192.168.122.0/24'] # Do not attempt OVS major upgrades here edpm_ovs_packages: - openvswitch3.3 edpm_default_mounts:8 - path: /dev/hugepages<size> opts: pagesize=<size> fstype: hugetlbfs group: hugetlbfs nodes: EOF cat computes-$CELL >> nodeset-${CELL}.yaml done- 1
- 如果您的部署有一个自定义 DNS 域,请指定节点的 FQDN。
- 2
- 网络组成必须与源云配置匹配,以避免数据平面连接停机时间。
ctlplane网络必须首先出现。命令仅保留ctlplane和internalapi网络上的主机的 IP 地址。对其他隔离网络重复此步骤,或者手动更新生成的文件。 - 3
- 使用节点集名称,如
openstack-cell1、openstack-cell2。仅为包含 Compute 节点的单元创建节点集。 - 4
- 如果启用了 TLS Everywhere,请将
tlsEnabled更改为true。 - 5
- 如果没有使用 telemetry 服务,请从 services 列表中省略它。
- 6
- 网桥名称和其他 OVN 和网络服务特定值必须与源云配置匹配,以避免数据平面连接停机时间。
- 7
- 将
<bridge_mappings> 替换为您的配置中网桥映射的值,如"datacentre:br-ctlplane"。 - 8
- 要配置巨页,将 <
;size> 替换为页面的大小。要配置多大小巨页,请在列表中创建更多项目。请注意,挂载点必须与源云配置匹配。
注意在采用前,请确保在 Compute 服务节点中使用的
OpenStackDataPlaneNodeSetCR 中使用相同的ovn-controller设置。此配置存储在 Open vSwitch 数据库的Open_vSwitch表中的external_ids列中:$ ovs-vsctl list Open . ... external_ids : {hostname=standalone.localdomain, ovn-bridge=br-int, ovn-bridge-mappings=<bridge_mappings>, ovn-chassis-mac-mappings="datacentre:1e:0a:bb:e6:7c:ad", ovn-encap-ip="172.19.0.100", ovn-encap-tos="0", ovn-encap-type=geneve, ovn-match-northd-version=False, ovn-monitor-all=True, ovn-ofctrl-wait-before-clear="8000", ovn-openflow-probe-interval="60", ovn-remote="tcp:ovsdbserver-sb.openstack.svc:6642", ovn-remote-probe-interval="60000", rundir="/var/run/openvswitch", system-id="2eec68e6-aa21-4c95-a868-31aeafc11736"} ...为每个 Compute 单元部署
OpenStackDataPlaneNodeSetCR:$ for CELL in $(echo $RENAMED_CELLS); do > test -f nodeset-${CELL}.yaml || continue > oc apply -f nodeset-${CELL}.yaml > done如果将 Red Hat Ceph Storage 后端用于块存储服务(cinder),请准备采用的 data plane 工作负载:
$ for CELL in $(echo $RENAMED_CELLS); do test -f nodeset-${CELL}.yaml || continue $ oc patch osdpns/openstack-$CELL --type=merge --patch " spec: services: - redhat - bootstrap - download-cache - configure-network - validate-network - install-os - configure-os - ssh-known-hosts - run-os - reboot-os - ceph-client - install-certs - ovn - neutron-metadata - libvirt - nova-$CELL - telemetry nodeTemplate: extraMounts: - extraVolType: Ceph volumes: - name: ceph secret: secretName: ceph-conf-files mounts: - name: ceph mountPath: "/etc/ceph" readOnly: true " done注意确保使用与原始
OpenStackDataPlaneNodeSetCR 相同的服务列表,但ceph-client和ceph-hci-pre服务除外。可选:在
OpenStackDataPlaneNodeSetCR 中启用neutron-sriov-nic-agent:$ for CELL in $(echo $RENAMED_CELLS); do test -f nodeset-${CELL}.yaml || continue $ oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[ { "op": "add", "path": "/spec/services/-", "value": "neutron-sriov" }, { "op": "add", "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_physical_device_mappings", "value": "dummy_sriov_net:dummy-dev" }, { "op": "add", "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_bandwidths", "value": "dummy-dev:40000000:40000000" }, { "op": "add", "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_hypervisors", "value": "dummy-dev:standalone.localdomain" }]' done可选:在
OpenStackDataPlaneNodeSetCR 中启用neutron-dhcp:$ for CELL in $(echo $RENAMED_CELLS); do test -f nodeset-${CELL}.yaml || continue $ oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[ { "op": "add", "path": "/spec/services/-", "value": "neutron-dhcp" }]' done注意要将
neutron-dhcp与 OVN 用于裸机置备服务(ironic),您必须将 Networking 服务(neutron)的disable_ovn_dhcp_for_baremetal_ports配置选项设为true。您可以在NeutronAPIspec 中设置此配置:.. spec: serviceUser: neutron ... customServiceConfig: | [DEFAULT] dhcp_agent_notification = True [ovn] disable_ovn_dhcp_for_baremetal_ports = true运行 pre-adoption 验证:
创建验证服务:
$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: pre-adoption-validation spec: playbook: osp.edpm.pre_adoption_validation EOF创建仅运行验证的
OpenStackDataPlaneDeploymentCR:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-pre-adoption spec: nodeSets: $NODESETS servicesOverride: - pre-adoption-validation EOF注意如果您为不同的
OpenStackDataPlaneServiceCR 创建不同的迁移 SSH 密钥,则也应该为代表单元的每个节点设置或节点集定义一个单独的OpenStackDataPlaneDeploymentCR。验证完成后,确认 Ansible EE pod 的状态为
Completed:$ watch oc get pod -l app=openstackansibleee$ oc logs -l app=openstackansibleee -f --max-log-requests 20等待部署变为
Ready状态:$ oc wait --for condition=Ready openstackdataplanedeployment/openstack-pre-adoption --timeout=10m重要如果任何 openstack-pre-adoption 验证失败,您必须引用 Ansible 日志来确定哪些失败,然后尝试以下故障排除选项:
-
如果主机名验证失败,请检查 data plane 节点的主机名是否在
OpenStackDataPlaneNodeSetCR 中正确列出。 -
如果内核参数检查失败,请确保
OpenStackDataPlaneNodeSetCR 中的edpm_kernel_args和edpm_kernel_hugepages变量中的内核参数配置与您在 Red Hat OpenStack Platform (RHOSP) 17.1 节点中使用的内核参数配置相同。 -
如果 tuned 配置集检查失败,请确保
OpenStackDataPlaneNodeSetCR 中的edpm_tuned_profile变量配置为使用与 RHOSP 17.1 节点上的设置相同的配置集。
-
如果主机名验证失败,请检查 data plane 节点的主机名是否在
删除剩余的 director Operator 服务:
创建
OpenStackDataPlaneServiceCR 来清理您正在使用的数据平面服务:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: tripleo-cleanup spec: playbook: osp.edpm.tripleo_cleanup EOF创建
OpenStackDataPlaneDeploymentCR 以运行清理:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: tripleo-cleanup spec: nodeSets: $NODESETS servicesOverride: - tripleo-cleanup EOF
完成清理后,部署
OpenStackDataPlaneDeploymentCR:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack spec: nodeSets: $NODESETS EOF注意如果将其他节点设置为要部署的,如 Networker 节点,您可以在此步骤的
nodeSets列表中添加它们,或者稍后创建单独的OpenStackDataPlaneDeploymentCR。您不能在部署后将新节点设置为OpenStackDataPlaneDeploymentCR。
验证
确认所有 Ansible EE pod 都到达
Completed状态:$ watch oc get pod -l app=openstackansibleee$ oc logs -l app=openstackansibleee -f --max-log-requests 20等待 data plane 节点设置为
Ready状态:$ for CELL in $(echo $RENAMED_CELLS); do > oc wait --for condition=Ready osdpns/openstack-$CELL --timeout=30m > done验证 Networking 服务(neutron)代理是否正在运行:
$ oc exec openstackclient -- openstack network agent list +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+ | 174fc099-5cc9-4348-b8fc-59ed44fcfb0e | DHCP agent | standalone.localdomain | nova | :-) | UP | neutron-dhcp-agent | | 10482583-2130-5b0d-958f-3430da21b929 | OVN Metadata agent | standalone.localdomain | | :-) | UP | neutron-ovn-metadata-agent | | a4f1b584-16f1-4937-b2b0-28102a3f6eaa | OVN Controller agent | standalone.localdomain | | :-) | UP | ovn-controller | +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+
从 director Operator 单元控制器中删除所有服务后,您可以取消单元控制器。要创建新的单元 Compute 节点,您可以将分离的控制器重新置备为新的数据平面主机,并将它们添加到对应或新单元的节点集合中。
后续步骤
- 您必须在计算服务上执行快速升级。如需更多信息,请参阅在计算服务上执行快速升级。
7.3. 在计算服务上执行快速升级 复制链接链接已复制到粘贴板!
您必须完成以下任务,将 control plane 和数据平面上的 Red Hat OpenStack Platform 17.1 升级到 OpenShift (RHOSO) 18.0 上的 Compute 服务:
- 更新 cell1 Compute data plane 服务版本。
- 从 Compute control plane 服务和计算数据平面服务中删除前向升级临时解决方案。
- 运行 Compute 数据库在线迁移以更新实时数据。
先决条件
定义为每个 Compute 服务单元应用快速转发升级命令所需的 shell 变量。
DEFAULT_CELL_NAME="cell1" RENAMED_CELLS="$DEFAULT_CELL_NAME" declare -A PODIFIED_DB_ROOT_PASSWORD for CELL in $(echo "super $RENAMED_CELLS"); do PODIFIED_DB_ROOT_PASSWORD[$CELL]=$(oc get -o json secret/osp-secret | jq -r .data.DbRootPassword | base64 -d) done- 完成 将计算服务到 RHOSO 数据平面 的步骤。
流程
等待 Compute 服务数据平面服务版本为所有单元更新:
$ for CELL in $(echo $RENAMED_CELLS); do > oc exec openstack-$CELL-galera-0 -c galera -- mysql -rs -uroot -p"${PODIFIED_DB_ROOT_PASSWORD[$CELL]}" \ > -e "select a.version from nova_${CELL}.services a join nova_${CELL}.services b where a.version!=b.version and a.binary='nova-compute' and a.deleted=0;" > done注意更新完成后,查询会返回空结果。对于虚拟机工作负载,预计不会停机。
查看 data plane 上的 nova Compute 代理日志中的任何错误,以及 control plane 上的
nova-conductor日志记录。对
OpenStackControlPlaneCR 进行补丁,以删除 Compute control plane 服务中的前向升级临时解决方案:$ rm -f celltemplates $ for CELL in $(echo $RENAMED_CELLS); do $ cat >> celltemplates << EOF ${CELL}: metadataServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false conductorServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false EOF done $ cat > oscp-patch.yaml << EOF spec: nova: template: apiServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false metadataServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false schedulerServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false cellTemplates: cell0: conductorServiceTemplate: customServiceConfig: | [workarounds] disable_compute_service_check_for_ffu=false EOF $ cat celltemplates >> oscp-patch.yaml如果您使用 Compute 服务与裸机置备服务(ironic),请在 Compute 服务 CR 补丁的
cell<X> 部分中追加以下novaComputeTemplates:cell<X>: novaComputeTemplates: <hostname>:1 customServiceConfig: | [DEFAULT] host = <hostname> [workarounds] disable_compute_service_check_for_ffu=true computeDriver: ironic.IronicDriver ...- 1
- 将
<hostname> 替换为在cell<X> 源云中运行。ironicCompute 驱动程序的节点主机名
应用补丁文件:
$ oc patch openstackcontrolplane openstack --type=merge --patch-file=oscp-patch.yaml等待 Compute control plane 服务 CR 就绪:
$ oc wait --for condition=Ready --timeout=300s Nova/nova从 Compute data plane 服务中删除预先转发的升级临时解决方案:
$ oc patch cm nova-cells-global-config --type=json -p='[{"op": "replace", "path": "/data/99-nova-compute-cells-workarounds.conf", "value": "[workarounds]\n"}]' $ for CELL in $(echo $RENAMED_CELLS); do $ oc get Openstackdataplanenodeset openstack-${CELL} || continue $ oc apply -f - <<EOF --- apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-nova-compute-ffu-$CELL spec: nodeSets: - openstack-${CELL} servicesOverride: - nova-${CELL} backoffLimit: 3 EOF done等待 Compute data plane 服务准备所有单元:
$ oc wait --for condition=Ready openstackdataplanedeployments --all --timeout=5m运行 Compute 数据库在线迁移来完成升级:
$ oc exec -it nova-cell0-conductor-0 -- nova-manage db online_data_migrations $ for CELL in $(echo $RENAMED_CELLS); do $ oc exec -it nova-${CELL}-conductor-0 -- nova-manage db online_data_migrations done在单元格中发现 Compute 主机:
$ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose验证现有测试虚拟机实例是否正在运行:
${BASH_ALIASES[openstack]} server --os-compute-api-version 2.48 show --diagnostics test 2>&1 || echo FAIL验证 Compute 服务是否可以停止现有的测试虚拟机实例:
${BASH_ALIASES[openstack]} server list -c Name -c Status -f value | grep -qF "test ACTIVE" && ${BASH_ALIASES[openstack]} server stop test || echo PASS ${BASH_ALIASES[openstack]} server list -c Name -c Status -f value | grep -qF "test SHUTOFF" || echo FAIL ${BASH_ALIASES[openstack]} server --os-compute-api-version 2.48 show --diagnostics test 2>&1 || echo PASS验证 Compute 服务是否可以启动现有的测试虚拟机实例:
${BASH_ALIASES[openstack]} server list -c Name -c Status -f value | grep -qF "test SHUTOFF" && ${BASH_ALIASES[openstack]} server start test || echo PASS ${BASH_ALIASES[openstack]} server list -c Name -c Status -f value | grep -qF "test ACTIVE" && \ ${BASH_ALIASES[openstack]} server --os-compute-api-version 2.48 show --diagnostics test --fit-width -f json | jq -r '.state' | grep running || echo FAIL
后续步骤
在 data plane 采用后,计算主机将继续运行 Red Hat Enterprise Linux (RHEL) 9.2。要利用 RHEL 9.4,请在完成采用过程后执行次要更新过程。
7.4. 将网络服务用于 RHOSO 数据平面 复制链接链接已复制到粘贴板!
将现有 Red Hat OpenStack Platform 中的 Networker 服务部署到 OpenShift (RHOSO)数据平面上的 Red Hat OpenStack Services 中。Networker 服务可以在 Controller 节点或专用 Networker 节点上运行。您决定要在 Networker 节点上运行哪些服务,并为 Networker 节点创建单独的 OpenStackDataPlaneNodeSet 自定义资源(CR)。如果选项适用于您的环境,您可能还决定实现以下选项:
-
根据您的拓扑,您可能需要在节点上运行
neutron-metadata服务,特别是为 Compute 节点上托管的 SR-IOV 端口提供元数据时。 -
如果要在 Networker 节点上运行 OVN 网关服务,请在要部署的列表中保留
ovn服务。 -
可选:您可以在 Networker 节点上运行
neutron-dhcp服务,而不是在 Compute 节点上运行。除非部署使用 DHCP 转发或 dnsmasq 支持的高级 DHCP 选项,否则您可能不需要将neutron-dhcp与 OVN DHCP 实施一起使用。
当节点设置为 OVN chassis 网关时,将现有 Red Hat OpenStack Platform 部署中的每个 Controller 或 Networker 节点采用到 OpenShift 上的 Red Hat OpenStack Services (RHOSO)。任何参数设置为 enable-chassis-as-gw 的节点都被视为 OVN 网关机箱。在这种情况下,此类节点将在使用后成为 edpm 网络器节点。
检查运行
OVN Controller 网关代理的节点。代理列表因您启用的服务而异:$ oc exec openstackclient -- openstack network agent list +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | e5075ee0-9dd9-4f0a-a42a-6bbdf1a6111c | OVN Controller Gateway agent | controller-0.localdomain | | XXX | UP | ovn-controller | | f3112349-054c-403a-b00a-e219238192b8 | OVN Controller agent | compute-0.localdomain | | XXX | UP | ovn-controller | | af9dae2d-1c1c-55a8-a743-f84719f6406d | OVN Metadata agent | compute-0.localdomain | | XXX | UP | neutron-ovn-metadata-agent | | 51a11df8-a66e-47a2-aec0-52eb8589626c | OVN Controller Gateway agent | controller-1.localdomain | | XXX | UP | ovn-controller | | bb817e5e-7832-410a-9e67-934dac8c602f | OVN Controller Gateway agent | controller-2.localdomain | | XXX | UP | ovn-controller | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
先决条件
定义 shell 变量。根据上面的代理列表输出,controller-0、controller-1、controller-2 是我们的目标主机。如果您有
Controller和Networker节点都运行 networker 服务,那么请在下面添加所有这些主机。declare -A networkers networkers+=( ["controller-0.localdomain"]="192.168.122.100" ["controller-1.localdomain"]="192.168.122.101" ["controller-2.localdomain"]="192.168.122.102" # ... )-
根据您的环境,将
["<node-name>"]="192.168.122.100"替换为相应 Networker 或 Controller 节点的名称和 IP 地址。
-
根据您的环境,将
流程
为您的节点部署
OpenStackDataPlaneNodeSetCR:注意您可以重复使用为 Compute 节点指定的
OpenStackDataPlaneNodeSetCR 中的大多数nodeTemplate部分。您可以省略一些变量,因为 Networker 节点上运行的一组有限服务。$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-networker spec: tlsEnabled: false1 networkAttachments: - ctlplane preProvisioned: true services: - redhat - bootstrap - download-cache - configure-network - validate-network - install-os - configure-os - ssh-known-hosts - run-os - install-certs - ovn env: - name: ANSIBLE_CALLBACKS_ENABLED value: "profile_tasks" - name: ANSIBLE_FORCE_COLOR value: "True" nodes: controller-0: hostName: controller-0 ansible: ansibleHost: ${networkers[controller-0.localdomain]} networks: - defaultRoute: true fixedIP: ${networkers[controller-0.localdomain]} name: ctlplane subnetName: subnet1 - name: internalapi subnetName: subnet1 - name: storage subnetName: subnet1 - name: tenant subnetName: subnet1 controller-1: hostName: controller-1 ansible: ansibleHost: ${networkers[controller-1.localdomain]} networks: - defaultRoute: true fixedIP: ${networkers[controller-1.localdomain]} name: ctlplane subnetName: subnet1 - name: internalapi subnetName: subnet1 - name: storage subnetName: subnet1 - name: tenant subnetName: subnet1 controller-2: hostName: controller-2 ansible: ansibleHost: ${networkers[controller-2.localdomain]} networks: - defaultRoute: true fixedIP: ${networkers[controller-2.localdomain]} name: ctlplane subnetName: subnet1 - name: internalapi subnetName: subnet1 - name: storage subnetName: subnet1 - name: tenant subnetName: subnet1 nodeTemplate: ansibleSSHPrivateKeySecret: dataplane-adoption-secret ansible: ansibleUser: root ansibleVarsFrom: - secretRef: name: subscription-manager - secretRef: name: redhat-registry ansibleVars: rhc_release: 9.2 rhc_repositories: - {name: "*", state: disabled} - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled} - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled} - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled} - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled} - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled} - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled} edpm_bootstrap_release_version_package: [] # edpm_network_config # Default nic config template for a EDPM node # These vars are edpm_network_config role vars edpm_network_config_template: | --- {% set mtu_list = [ctlplane_mtu] %} {% for network in nodeset_networks %} {% set _ = mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) %} {%- endfor %} {% set min_viable_mtu = mtu_list | max %} network_config: - type: ovs_bridge name: {{ neutron_physical_bridge_name }} mtu: {{ min_viable_mtu }} use_dhcp: false dns_servers: {{ ctlplane_dns_nameservers }} domain: {{ dns_search_domains }} addresses: - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }} routes: {{ ctlplane_host_routes }} members: - type: interface name: nic1 mtu: {{ min_viable_mtu }} # force the MAC address of the bridge to this interface primary: true {% for network in nodeset_networks %} - type: vlan mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }} vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }} addresses: - ip_netmask: {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }} routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }} {% endfor %} edpm_network_config_hide_sensitive_logs: false # # These vars are for the network config templates themselves and are # considered EDPM network defaults. neutron_physical_bridge_name: br-ctlplane neutron_public_interface_name: eth0 # edpm_nodes_validation edpm_nodes_validation_validate_controllers_icmp: false edpm_nodes_validation_validate_gateway_icmp: false # edpm ovn-controller configuration edpm_ovn_bridge_mappings: <bridge_mappings>2 edpm_ovn_bridge: br-int edpm_ovn_encap_type: geneve ovn_monitor_all: true edpm_ovn_remote_probe_interval: 60000 edpm_ovn_ofctrl_wait_before_clear: 8000 # serve as a OVN gateway edpm_enable_chassis_gw: true3 timesync_ntp_servers: - hostname: clock.redhat.com - hostname: clock2.redhat.com gather_facts: false enable_debug: false # edpm firewall, change the allowed CIDR if needed edpm_sshd_configure_firewall: true edpm_sshd_allowed_ranges: ['192.168.122.0/24'] # SELinux module edpm_selinux_mode: enforcing # Do not attempt OVS major upgrades here edpm_ovs_packages: - openvswitch3.3 EOF在采用前,请确保在 Networker 节点中使用的
OpenStackDataPlaneNodeSetCR 中使用相同的ovn-controller设置。此配置存储在 Open vSwitch 数据库的Open_vSwitch表中的external_ids列中:ovs-vsctl list Open . ... external_ids : {hostname=controller-0.localdomain, ovn-bridge=br-int, ovn-bridge-mappings=<bridge_mappings>, ovn-chassis-mac-mappings="datacentre:1e:0a:bb:e6:7c:ad", ovn-cms-options=enable-chassis-as-gw, ovn-encap-ip="172.19.0.100", ovn-encap-tos="0", ovn-encap-type=geneve, ovn-match-northd-version=False, ovn-monitor-all=True, ovn-ofctrl-wait-before-clear="8000", ovn-openflow-probe-interval="60", ovn-remote="tcp:ovsdbserver-sb.openstack.svc:6642", ovn-remote-probe-interval="60000", rundir="/var/run/openvswitch", system-id="2eec68e6-aa21-4c95-a868-31aeafc11736"} ...-
将
<bridge_mappings> 替换为您的配置中网桥映射的值,如"datacentre:br-ctlplane"。
-
将
可选:在
OpenStackDataPlaneNodeSetCR 中启用neutron-metadata:$ oc patch openstackdataplanenodeset <networker_CR_name> --type='json' --patch='[ { "op": "add", "path": "/spec/services/-", "value": "neutron-metadata" }]'-
将
<networker_CR_name> 替换为您为 Networker 节点部署的 CR 名称,如openstack-networker。
-
将
可选:在
OpenStackDataPlaneNodeSetCR 中启用neutron-dhcp:$ oc patch openstackdataplanenodeset <networker_CR_name> --type='json' --patch='[ { "op": "add", "path": "/spec/services/-", "value": "neutron-dhcp" }]'为 Networker 节点运行
pre-adoption-validation服务:创建仅运行验证的
OpenStackDataPlaneDeploymentCR:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-pre-adoption-networker spec: nodeSets: - openstack-networker servicesOverride: - pre-adoption-validation EOF验证完成后,确认 Ansible EE pod 的状态为
Completed:$ watch oc get pod -l app=openstackansibleee$ oc logs -l app=openstackansibleee -f --max-log-requests 20等待部署变为
Ready状态:$ oc wait --for condition=Ready openstackdataplanedeployment/openstack-pre-adoption-networker --timeout=10m
为 Networker 节点部署
OpenStackDataPlaneDeploymentCR:$ oc apply -f - <<EOF apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneDeployment metadata: name: openstack-networker spec: nodeSets: - openstack-networker EOF注意另外,在部署主
OpenStackDataPlaneDeploymentCR 前,您可以在nodeSets列表中包含 Networker 节点。您不能在部署后将新节点设置为OpenStackDataPlaneDeploymentCR。清理不再运行的任何网络服务(neutron)代理。
注意在某些情况下,来自被替换或停用的旧数据平面的代理保留在 RHOSO 中。提供的这些代理可能由 RHOSO 中运行的新代理提供,或者功能可能被其他组件替代。例如,可能不再需要 DHCP 代理,因为 RHOSO 中的 OVN DHCP 可以提供此功能。
列出代理:
$ oc exec openstackclient -- openstack network agent list +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | e5075ee0-9dd9-4f0a-a42a-6bbdf1a6111c | OVN Controller Gateway agent | controller-0.localdomain | | :-) | UP | ovn-controller | | 856960f0-5530-46c7-a331-6eadcba362da | DHCP agent | controller-1.localdomain | nova | XXX | UP | neutron-dhcp-agent | | 8bd22720-789f-45b8-8d7d-006dee862bf9 | DHCP agent | controller-2.localdomain | nova | XXX | UP | neutron-dhcp-agent | | e584e00d-be4c-4e98-a11a-4ecd87d21be7 | DHCP agent | controller-0.localdomain | nova | XXX | UP | neutron-dhcp-agent | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+如果列表中的任何代理在
Alive字段中显示XXX,请验证 Host 和 Agent Type,如果不再需要此代理,且代理已在 Red Hat OpenStack Platform 主机上永久停止。然后,删除代理:$ oc exec openstackclient -- openstack network agent <agent_id>-
将
<agent_id> 替换为要删除的代理 ID,例如856960f0-5530-46c7-a331-6eadcba362da。
-
将
验证
确认所有 Ansible EE pod 都到达
Completed状态:$ watch oc get pod -l app=openstackansibleee$ oc logs -l app=openstackansibleee -f --max-log-requests 20等待 data plane 节点设置为
Ready状态:$ oc wait --for condition=Ready osdpns/<networker_CR_name> --timeout=30m-
将
<networker_CR_name> 替换为您为 Networker 节点部署的 CR 名称,如openstack-networker。
-
将
验证 Networking 服务(neutron)代理是否正在运行。代理列表因您启用的服务而异:
$ oc exec openstackclient -- openstack network agent list +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | ID | Agent Type | Host | Availability Zone | Alive | State | Binary | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+ | e5075ee0-9dd9-4f0a-a42a-6bbdf1a6111c | OVN Controller Gateway agent | controller-0.localdomain | | :-) | UP | ovn-controller | | f3112349-054c-403a-b00a-e219238192b8 | OVN Controller agent | compute-0.localdomain | | :-) | UP | ovn-controller | | af9dae2d-1c1c-55a8-a743-f84719f6406d | OVN Metadata agent | compute-0.localdomain | | :-) | UP | neutron-ovn-metadata-agent | | 51a11df8-a66e-47a2-aec0-52eb8589626c | OVN Controller Gateway agent | controller-1.localdomain | | :-) | UP | ovn-controller | | bb817e5e-7832-410a-9e67-934dac8c602f | OVN Controller Gateway agent | controller-2.localdomain | | :-) | UP | ovn-controller | +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
如果将 Red Hat OpenStack Platform Object Storage 服务(swift)用作对象存储服务,您必须将 Object Storage 服务迁移到 OpenShift 节点上的 Red Hat OpenStack Services。
如果您使用 Ceph 对象网关(RGW)的 Object Storage API,您可以跳过本章并迁移 Red Hat Ceph Storage 集群。有关更多信息,请参阅 迁移 Red Hat Ceph Storage 集群。如果您不规划从 Controller 节点迁移 Ceph 守护进程,您必须执行 部署 Ceph ingress 守护进程和 创建或更新 Object Storage 服务端点 中描述的步骤。
数据迁移按副本发生。例如,如果您有 3 个副本,请一次移动它们,以确保其他 2 个副本仍在运行,这样可允许您在迁移期间继续使用 Object Storage 服务。
数据迁移到新部署是一个长时间运行的进程,主要在后台执行。对象存储服务 replicators 将数据从旧节点移到新节点,这可能需要很长时间,具体取决于所使用的存储量。要减少停机时间,如果节点正在运行,可以在等待迁移完成时继续使用其他服务,则可以使用它们。由于网络中的复制流量数量,性能可能会降低。
8.1. 将对象存储服务数据从 RHOSP 迁移到 RHOSO 节点 复制链接链接已复制到粘贴板!
Object Storage 服务(swift)迁移涉及以下步骤:
- 将新节点添加到对象存储服务环中。
- 将现有节点的 weight 设置为 0。
- 通过移动一个副本来重新平衡环。
- 将 ring 复制到旧节点并重新启动服务。
- 检查复制状态并重复前面的两个步骤,直到旧节点排空为止。
- 从环中删除旧节点。
先决条件
- 采用对象存储服务。如需更多信息,请参阅 使用对象存储服务。
对于 DNS 服务器,请确保所有现有节点能够解析 Red Hat OpenShift Container Platform (RHOCP) pod 的主机名,例如,将 DNSMasq 服务的外部 IP 用作
/etc/resolv.conf中的名称服务器:$ oc get service dnsmasq-dns -o jsonpath="{.status.loadBalancer.ingress[0].ip}" | $CONTROLLER1_SSH sudo tee /etc/resolv.conf使用
swift-dispersion工具跟踪复制的当前状态:$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-dispersion-populate'命令可能需要几分钟时间来完成。它创建在对象存储服务部署中分发的 0 字节对象,之后您可以使用
swift-dispersion-report来显示当前的复制状态:$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-dispersion-report'swift-dispersion-report命令的输出类似如下:Queried 1024 containers for dispersion reporting, 5s, 0 retries 100.00% of container copies found (3072 of 3072) Sample represents 100.00% of the container partition space Queried 1024 objects for dispersion reporting, 4s, 0 retries There were 1024 partitions missing 0 copies. 100.00% of object copies found (3072 of 3072) Sample represents 100.00% of the object partition space
流程
通过将 SwiftStorage 资源从 0 扩展到 3 来添加新节点:
$ oc patch openstackcontrolplane openstack --type=merge -p='{"spec":{"swift":{"template":{"swiftStorage":{"replicas": 3}}}}}'此命令在使用持久性卷声明的 Red Hat OpenShift Container Platform (RHOCP)集群上创建三个存储实例。
等待所有三个 pod 都在运行,且环包括新设备:
$ oc wait pods --for condition=Ready -l component=swift-storage $ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-ring-builder object.builder search --device pv'从当前的环中,获取节点的存储管理 IP 地址以排空:
$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-ring-builder object.builder search _' | tail -n +2 | awk '{print $4}' | sort -u输出结果类似如下:
172.20.0.100 swift-storage-0.swift-storage.openstack.svc swift-storage-1.swift-storage.openstack.svc swift-storage-2.swift-storage.openstack.svc排空旧节点。在以下示例中,旧节点
172.20.0.100排空:$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c ' swift-ring-tool get swift-ring-tool drain 172.20.0.100 swift-ring-tool rebalance swift-ring-tool push'根据您的部署,您可能在命令中包含更多节点。
将更新的环复制到原始节点。为存储对象存储服务数据的现有节点运行 ssh 命令:
$ oc extract --confirm cm/swift-ring-files $CONTROLLER1_SSH "tar -C /var/lib/config-data/puppet-generated/swift/etc/swift/ -xzf -" < swiftrings.tar.gz $CONTROLLER1_SSH "systemctl restart tripleo_swift_*"使用
swift-dispersion-report工具跟踪复制进度:$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c "swift-ring-tool get && swift-dispersion-report"输出显示找到的副本的 100% 少。重复该命令,直到找到所有容器和对象副本:
Queried 1024 containers for dispersion reporting, 6s, 0 retries There were 5 partitions missing 1 copy. 99.84% of container copies found (3067 of 3072) Sample represents 100.00% of the container partition space Queried 1024 objects for dispersion reporting, 7s, 0 retries There were 739 partitions missing 1 copy. There were 285 partitions missing 0 copies. 75.94% of object copies found (2333 of 3072) Sample represents 100.00% of the object partition space通过重新平衡并分发环,将下一个副本移到新节点:
$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c ' swift-ring-tool get swift-ring-tool rebalance swift-ring-tool push' $ oc extract --confirm cm/swift-ring-files $CONTROLLER1_SSH "tar -C /var/lib/config-data/puppet-generated/swift/etc/swift/ -xzf -" < swiftrings.tar.gz $CONTROLLER1_SSH "systemctl restart tripleo_swift_*"再次监控
swift-dispersion-report输出,等待所有副本都找到,然后重复这个步骤,直到所有副本都移到新节点。从环移除节点:
$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c ' swift-ring-tool get swift-ring-tool remove 172.20.0.100 swift-ring-tool rebalance swift-ring-tool push'注意即使所有副本都位于新节点上,而
swift-dispersion-report命令也会报告找到副本的 100%,可能仍然是旧节点上的数据。replicators 删除这个数据,但可能需要更长的时间。
验证
检查集群中的所有磁盘的磁盘用量:
$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-recon -d'确认节点上的
/srv/node目录中没有更多文件:\*.db或 5.2.data$CONTROLLER1_SSH "find /srv/node/ -type f -name '*.db' -o -name '*.data' | wc -l"
8.2. 对象存储服务迁移故障排除 复制链接链接已复制到粘贴板!
您可以对 Object Storage 服务(swift)迁移问题进行故障排除。
如果复制无法正常工作,且
swift-dispersion-report没有返回到 100% 的可用性,请检查 replicator 进度以帮助您进行调试:$ CONTROLLER1_SSH tail /var/log/containers/swift/swift.log | grep object-server下面显示了一个输出示例:
Mar 14 06:05:30 standalone object-server[652216]: <f+++++++++ 4e2/9cbea55c47e243994b0b10d8957184e2/1710395823.58025.data Mar 14 06:05:30 standalone object-server[652216]: Successful rsync of /srv/node/vdd/objects/626/4e2 to swift-storage-1.swift-storage.openstack.svc::object/d1/objects/626 (0.094) Mar 14 06:05:30 standalone object-server[652216]: Removing partition: /srv/node/vdd/objects/626 Mar 14 06:05:31 standalone object-server[652216]: <f+++++++++ 85f/cf53b5a048e5b19049e05a548cde185f/1710395796.70868.data Mar 14 06:05:31 standalone object-server[652216]: Successful rsync of /srv/node/vdb/objects/829/85f to swift-storage-2.swift-storage.openstack.svc::object/d1/objects/829 (0.095) Mar 14 06:05:31 standalone object-server[652216]: Removing partition: /srv/node/vdb/objects/829您还可以检查环一致性和副本状态:
$ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-recon -r --md5'在推送新环后,输出可能会显示 md5 不匹配,直到大约 2 分钟为止。2 分钟后,输出类似以下示例:
[...] Oldest completion was 2024-03-14 16:53:27 (3 minutes ago) by 172.20.0.100:6000. Most recent completion was 2024-03-14 16:56:38 (12 seconds ago) by swift-storage-0.swift-storage.openstack.svc:6200. =============================================================================== [2024-03-14 16:56:50] Checking ring md5sums 4/4 hosts matched, 0 error[s] while checking hosts. [...]
第 9 章 迁移 Red Hat Ceph Storage 集群 复制链接链接已复制到粘贴板!
在 data plane 采用中,其中 Red Hat OpenStack Platform (RHOSP)服务在 Red Hat OpenShift Container Platform (RHOCP)中重新部署,您可以使用名为 "externalizing" Red Hat Ceph Storage 集群来迁移 director Operator 部署的 Red Hat Ceph Storage 集群。
有两个部署拓扑,其中包括一个内部的 Red Hat Ceph Storage 集群:
- RHOSP 包括专用的 Red Hat Ceph Storage 节点,用于托管对象存储守护进程(OSD)
- 超融合基础架构(HCI),其中计算和存储服务位于超融合节点上
在这两种情况下,在 RHOSP Controller 节点上部署一些 Red Hat Ceph Storage 进程:Red Hat Ceph Storage monitor、Ceph Object Gateway (RGW)、Rados 块设备(RBD)、Ceph 元数据服务器(MDS)、Ceph Dashboard 和 NFS Ganesha。要迁移 Red Hat Ceph Storage 集群,您必须停用 Controller 节点,并将 Red Hat Ceph Storage 守护进程移到已属于 Red Hat Ceph Storage 集群一部分的目标节点上。
先决条件
- 完成 Red Hat OpenStack Platform 17.1 环境中的任务。有关更多信息,请参阅 Red Hat Ceph Storage 先决条件。
9.1. Red Hat Ceph Storage 守护进程卡 复制链接链接已复制到粘贴板!
Red Hat Ceph Storage 7 及更新的版本应用严格的限制,以守护进程在同一节点上并置。有关更多信息,请参阅红帽知识库文章 Red Hat Ceph Storage: 支持的配置。您的拓扑取决于您停用的 Controller 节点中的可用硬件和 Red Hat Ceph Storage 服务的数量。您可以迁移的服务量取决于集群中可用节点的数量。下图显示了在需要至少 3 个节点的 Red Hat Ceph Storage 节点上分发 Red Hat Ceph Storage 守护进程。
以下场景只包含 RGW 和 RBD,没有 Red Hat Ceph Storage 仪表板:
| | | | |----|---------------------|-------------| | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | rgw/ingress |使用 Red Hat Ceph Storage 仪表板,但没有共享文件系统服务(manila),至少需要 4 个节点。Red Hat Ceph Storage 仪表板没有故障切换:
| | | | |-----|---------------------|-------------| | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | dashboard/grafana | | osd | rgw/ingress | (free) |使用 Red Hat Ceph Storage 仪表板和共享文件系统服务,至少需要 5 个节点,Red Hat Ceph Storage 仪表板没有故障转移:
| | | | |-----|---------------------|-------------------------| | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | rgw/ingress | | osd | mon/mgr/crash | mds/ganesha/ingress | | osd | rgw/ingress | mds/ganesha/ingress | | osd | mds/ganesha/ingress | dashboard/grafana |
9.2. 将监控堆栈组件迁移到现有 Red Hat Ceph Storage 集群中的新节点 复制链接链接已复制到粘贴板!
Red Hat Ceph Storage Dashboard 模块向 Ceph Manager 添加基于 Web 的监控和管理。通过 director Operator 部署的 Red Hat Ceph Storage 仪表板,Red Hat Ceph Storage Dashboard 作为 overcloud 部署的一部分启用,它由以下组件组成:
- Ceph Manager 模块
- Grafana
- Prometheus
- Alertmanager
- 节点导出器
Red Hat Ceph Storage Dashboard 容器通过 tripleo-container-image-prepare 参数包括,高可用性(HA)依赖于 HAProxy 和 Pacemaker 部署到 Red Hat OpenStack Platform (RHOSP)环境中。对于外部 Red Hat Ceph Storage 集群,不支持 HA。
在此过程中,您将迁移 Ceph 监控组件并重新定位到释放 Controller 节点。
先决条件
- 完成 Red Hat OpenStack Platform 17.1 环境中的任务。有关更多信息,请参阅 Red Hat Ceph Storage 先决条件。
9.2.1. 将监控堆栈迁移到目标节点 复制链接链接已复制到粘贴板!
要将监控堆栈迁移到目标节点,您要将监控标签添加到现有节点,并更新每个守护进程的配置。您不需要迁移节点导出器。这些守护进程在作为 Red Hat Ceph Storage 集群一部分的节点间部署(放置为 '*')。
先决条件
- 确认防火墙规则已就位,并且端口对于给定的监控堆栈服务打开。
根据目标节点和部署或活跃的守护进程数量,您可以将现有容器重新定位到目标节点,或者选择托管监控堆栈守护进程的节点子集。不支持高可用性(HA)。通过 count: 1 减少放置,允许您在不影响其他服务的情况下迁移超融合基础架构或硬件限制中的现有守护进程。
9.2.1.1. 将现有守护进程迁移到目标节点 复制链接链接已复制到粘贴板!
以下流程是具有 3 个 Red Hat Ceph Storage 节点或 ComputeHCI 节点的环境示例。此场景将监控标签扩展到属于集群的所有 Red Hat Ceph Storage 或 ComputeHCI 节点。这意味着您要为目标节点保留 3 个放置。
流程
将监控标签添加到集群中的所有 Red Hat Ceph Storage 或 ComputeHCI 节点:
for item in $(sudo cephadm shell -- ceph orch host ls --format json | jq -r '.[].hostname'); do sudo cephadm shell -- ceph orch host label add $item monitoring; done验证目标节点上的所有主机是否具有监控标签:
[tripleo-admin@controller-0 ~]$ sudo cephadm shell -- ceph orch host ls HOST ADDR LABELS cephstorage-0.redhat.local 192.168.24.11 osd monitoring cephstorage-1.redhat.local 192.168.24.12 osd monitoring cephstorage-2.redhat.local 192.168.24.47 osd monitoring controller-0.redhat.local 192.168.24.35 _admin mon mgr monitoring controller-1.redhat.local 192.168.24.53 mon _admin mgr monitoring controller-2.redhat.local 192.168.24.10 mon _admin mgr monitoring从 Controller 节点中删除标签:
$ for i in 0 1 2; do sudo cephadm shell -- ceph orch host label rm "controller-$i.redhat.local" monitoring; done Removed label monitoring from host controller-0.redhat.local Removed label monitoring from host controller-1.redhat.local Removed label monitoring from host controller-2.redhat.local转储当前的监控堆栈规格:
function export_spec { local component="$1" local target_dir="$2" sudo cephadm shell -- ceph orch ls --export "$component" > "$target_dir/$component" } SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} mkdir -p ${SPEC_DIR} for m in grafana prometheus alertmanager; do export_spec "$m" "$SPEC_DIR" done对于每个守护进程,编辑当前的 spec,并将
placement.hosts:部分替换为placement.label:部分,例如:service_type: grafana service_name: grafana placement: label: monitoring networks: - 172.17.3.0/24 spec: port: 3100此步骤也适用于 Prometheus 和 Alertmanager 规格。
应用新的监控 spec 来重新定位监控堆栈守护进程:
SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} function migrate_daemon { local component="$1" local target_dir="$2" sudo cephadm shell -m "$target_dir" -- ceph orch apply -i /mnt/ceph_specs/$component } for m in grafana prometheus alertmanager; do migrate_daemon "$m" "$SPEC_DIR" done验证守护进程是否已部署到预期的节点上:
[ceph: root@controller-0 /]# ceph orch ps | grep -iE "(prome|alert|grafa)" alertmanager.cephstorage-2 cephstorage-2.redhat.local 172.17.3.144:9093,9094 grafana.cephstorage-0 cephstorage-0.redhat.local 172.17.3.83:3100 prometheus.cephstorage-1 cephstorage-1.redhat.local 172.17.3.53:9092注意迁移监控堆栈后,您会丢失高可用性。监控堆栈守护进程不再具有虚拟 IP 地址和 HAProxy。节点导出器仍然在所有节点上运行。
检查 Red Hat Ceph Storage 配置,以确保它与目标节点上的配置一致。特别是,请关注以下配置条目:
[ceph: root@controller-0 /]# ceph config dump | grep -i dashboard ... mgr advanced mgr/dashboard/ALERTMANAGER_API_HOST http://172.17.3.83:9093 mgr advanced mgr/dashboard/GRAFANA_API_URL https://172.17.3.144:3100 mgr advanced mgr/dashboard/PROMETHEUS_API_HOST http://172.17.3.83:9092 mgr advanced mgr/dashboard/controller-0.ycokob/server_addr 172.17.3.33 mgr advanced mgr/dashboard/controller-1.lmzpuc/server_addr 172.17.3.147 mgr advanced mgr/dashboard/controller-2.xpdgfl/server_addr 172.17.3.138验证
grafana、alertmanager和prometheus服务的API_HOST/URL指向每个守护进程重新定位节点的存储网络上的 IP 地址:[ceph: root@controller-0 /]# ceph orch ps | grep -iE "(prome|alert|grafa)" alertmanager.cephstorage-0 cephstorage-0.redhat.local 172.17.3.83:9093,9094 alertmanager.cephstorage-1 cephstorage-1.redhat.local 172.17.3.53:9093,9094 alertmanager.cephstorage-2 cephstorage-2.redhat.local 172.17.3.144:9093,9094 grafana.cephstorage-0 cephstorage-0.redhat.local 172.17.3.83:3100 grafana.cephstorage-1 cephstorage-1.redhat.local 172.17.3.53:3100 grafana.cephstorage-2 cephstorage-2.redhat.local 172.17.3.144:3100 prometheus.cephstorage-0 cephstorage-0.redhat.local 172.17.3.83:9092 prometheus.cephstorage-1 cephstorage-1.redhat.local 172.17.3.53:9092 prometheus.cephstorage-2 cephstorage-2.redhat.local 172.17.3.144:9092[ceph: root@controller-0 /]# ceph config dump ... ... mgr advanced mgr/dashboard/ALERTMANAGER_API_HOST http://172.17.3.83:9093 mgr advanced mgr/dashboard/PROMETHEUS_API_HOST http://172.17.3.83:9092 mgr advanced mgr/dashboard/GRAFANA_API_URL https://172.17.3.144:3100注意Ceph 控制面板,作为 Ceph
mgr提供的服务,不受重新定位的影响。当迁移活跃mgr守护进程或强制失败时,您可能会遇到影响。但是,您可以在 Ceph Manager 配置中定义 3 个副本,将请求重定向到不同的实例。
9.3. 将 Red Hat Ceph Storage MDS 迁移到现有集群中的新节点 复制链接链接已复制到粘贴板!
您可以在使用 cephfs-native 或 ceph-nfs 后端部署的共享文件系统服务(manila)时迁移 MDS 守护进程是 overcloud 部署的一部分。MDS 迁移由 cephadm 执行,您可以将守护进程放置从基于主机的方法移到基于标签的方法。这样可确保您可以使用 ceph orch host 命令视觉化集群的状态,以及放置守护进程的位置。您还可以对守护进程在给定主机上并置的一般视图,如红帽知识库文章 Red Hat Ceph Storage:支持的配置 中所述。
先决条件
- 完成 Red Hat OpenStack Platform 17.1 环境中的任务。有关更多信息,请参阅 Red Hat Ceph Storage 先决条件。
流程
验证 Red Hat Ceph Storage 集群是否健康并检查 MDS 状态:
$ sudo cephadm shell -- ceph fs ls name: cephfs, metadata pool: manila_metadata, data pools: [manila_data ] $ sudo cephadm shell -- ceph mds stat cephfs:1 {0=mds.controller-2.oebubl=up:active} 2 up:standby $ sudo cephadm shell -- ceph fs status cephfs cephfs - 0 clients ====== RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS 0 active mds.controller-2.oebubl Reqs: 0 /s 696 196 173 0 POOL TYPE USED AVAIL manila_metadata metadata 152M 141G manila_data data 3072M 141G STANDBY MDS mds.controller-0.anwiwd mds.controller-1.cwzhog检索有关 Ceph 文件系统(CephFS) MDS 状态的更多详细信息:
$ sudo cephadm shell -- ceph fs dump e8 enable_multiple, ever_enabled_multiple: 1,1 default compat: compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=no anchor table,9=file layout v2,10=snaprealm v2} legacy client fscid: 1 Filesystem 'cephfs' (1) fs_name cephfs epoch 5 flags 12 joinable allow_snaps allow_multimds_snaps created 2024-01-18T19:04:01.633820+0000 modified 2024-01-18T19:04:05.393046+0000 tableserver 0 root 0 session_timeout 60 session_autoclose 300 max_file_size 1099511627776 required_client_features {} last_failure 0 last_failure_osd_epoch 0 compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,7=mds uses inline data,8=no anchor table,9=file layout v2,10=snaprealm v2} max_mds 1 in 0 up {0=24553} failed damaged stopped data_pools [7] metadata_pool 9 inline_data disabled balancer standby_count_wanted 1 [mds.mds.controller-2.oebubl{0:24553} state up:active seq 2 addr [v2:172.17.3.114:6800/680266012,v1:172.17.3.114:6801/680266012] compat {c=[1],r=[1],i=[7ff]}] Standby daemons: [mds.mds.controller-0.anwiwd{-1:14715} state up:standby seq 1 addr [v2:172.17.3.20:6802/3969145800,v1:172.17.3.20:6803/3969145800] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.controller-1.cwzhog{-1:24566} state up:standby seq 1 addr [v2:172.17.3.43:6800/2227381308,v1:172.17.3.43:6801/2227381308] compat {c=[1],r=[1],i=[7ff]}] dumped fsmap epoch 8检查 OSD 块列表并清理客户端列表:
$ sudo cephadm shell -- ceph osd blocklist ls $ for item in $(sudo cephadm shell -- ceph osd blocklist ls | awk '{print $1}'); do > sudo cephadm shell -- ceph osd blocklist rm $item; > done注意当文件系统客户端不响应或行为不当时,对文件系统的访问可能会强制终止。此过程称为驱除。驱除 CephFS 客户端会阻止它进一步与 MDS 守护进程和 OSD 守护进程通信。
通常,列入黑名单的客户端无法重新连接到服务器;您必须卸载,然后重新挂载客户端。但是,允许被驱除的客户端尝试重新连接客户端很有用。由于 CephFS 使用 RADOS OSD 块列表来控制客户端驱除,因此您可以通过从 blocklist 中删除它们来允许 CephFS 客户端重新连接。
获取当前属于 Red Hat Ceph Storage 集群的主机:
[ceph: root@controller-0 /]# ceph orch host ls HOST ADDR LABELS STATUS cephstorage-0.redhat.local 192.168.24.25 osd cephstorage-1.redhat.local 192.168.24.50 osd cephstorage-2.redhat.local 192.168.24.47 osd controller-0.redhat.local 192.168.24.24 _admin mgr mon controller-1.redhat.local 192.168.24.42 mgr _admin mon controller-2.redhat.local 192.168.24.37 mgr _admin mon 6 hosts in cluster将 MDS 标签应用到目标节点:
for item in $(sudo cephadm shell -- ceph orch host ls --format json | jq -r '.[].hostname'); do sudo cephadm shell -- ceph orch host label add $item mds; done验证所有主机是否具有 MDS 标签:
$ sudo cephadm shell -- ceph orch host ls HOST ADDR LABELS cephstorage-0.redhat.local 192.168.24.11 osd mds cephstorage-1.redhat.local 192.168.24.12 osd mds cephstorage-2.redhat.local 192.168.24.47 osd mds controller-0.redhat.local 192.168.24.35 _admin mon mgr mds controller-1.redhat.local 192.168.24.53 mon _admin mgr mds controller-2.redhat.local 192.168.24.10 mon _admin mgr mds转储当前的 MDS 规格:
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ mkdir -p ${SPEC_DIR} $ sudo cephadm shell -- ceph orch ls --export mds > ${SPEC_DIR}/mds编辑检索到的 spec,并将
placement.hosts部分替换为placement.label:service_type: mds service_id: mds service_name: mds.mds placement: label: mds使用
ceph 编配器应用新的 MDS 规格:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/mds -- ceph orch apply -i /mnt/mds Scheduling new mds deployment ...这会增加 MDS 守护进程的数量。
检查临时添加到 CephFS 中的新备用守护进程:
$ sudo cephadm shell -- ceph fs dump Active standby_count_wanted 1 [mds.mds.controller-0.awzplm{0:463158} state up:active seq 307 join_fscid=1 addr [v2:172.17.3.20:6802/51565420,v1:172.17.3.20:6803/51565420] compat {c=[1],r=[1],i=[7ff]}] Standby daemons: [mds.mds.cephstorage-1.jkvomp{-1:463800} state up:standby seq 1 join_fscid=1 addr [v2:172.17.3.135:6820/2075903648,v1:172.17.3.135:6821/2075903648] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.controller-2.gfrqvc{-1:475945} state up:standby seq 1 addr [v2:172.17.3.114:6800/2452517189,v1:172.17.3.114:6801/2452517189] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.cephstorage-0.fqcshx{-1:476503} state up:standby seq 1 join_fscid=1 addr [v2:172.17.3.92:6820/4120523799,v1:172.17.3.92:6821/4120523799] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.cephstorage-2.gnfhfe{-1:499067} state up:standby seq 1 addr [v2:172.17.3.79:6820/2448613348,v1:172.17.3.79:6821/2448613348] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.controller-1.tyiziq{-1:499136} state up:standby seq 1 addr [v2:172.17.3.43:6800/3615018301,v1:172.17.3.43:6801/3615018301] compat {c=[1],r=[1],i=[7ff]}]要将 MDS 迁移到目标节点,请设置管理 MDS 故障转移的 MDS 关联性:
注意可以为特定文件系统选择专用 MDS 作为"主动"要配置此首选项,
CephFS为名为mds_join_fs的 MDS 提供了配置选项,它强制执行这个关联性。当 MDS 守护进程失败时,集群监控器首选使用mds_join_fs与带有失败等级的文件系统名称相等的待机守护进程。如果没有与文件系统名称相等的mds_join_fs的待机,它会选择非限定备用作为替换。$ sudo cephadm shell -- ceph config set mds.mds.cephstorage-0.fqcshx mds_join_fs cephfs-
将
mds.mds.cephstorage-0.fqcshx替换为上一步中检索的cephstorage-0上部署的守护进程。
-
将
从 Controller 节点中删除标签,并强制 MDS 故障切换到目标节点:
$ for i in 0 1 2; do sudo cephadm shell -- ceph orch host label rm "controller-$i.redhat.local" mds; done Removed label mds from host controller-0.redhat.local Removed label mds from host controller-1.redhat.local Removed label mds from host controller-2.redhat.local切换到目标节点在后台发生。新的活跃 MDS 是您使用
mds_join_fs命令设置的 MDS。检查故障转移和新部署的守护进程的结果:
$ sudo cephadm shell -- ceph fs dump … … standby_count_wanted 1 [mds.mds.cephstorage-0.fqcshx{0:476503} state up:active seq 168 join_fscid=1 addr [v2:172.17.3.92:6820/4120523799,v1:172.17.3.92:6821/4120523799] compat {c=[1],r=[1],i=[7ff]}] Standby daemons: [mds.mds.cephstorage-2.gnfhfe{-1:499067} state up:standby seq 1 addr [v2:172.17.3.79:6820/2448613348,v1:172.17.3.79:6821/2448613348] compat {c=[1],r=[1],i=[7ff]}] [mds.mds.cephstorage-1.jkvomp{-1:499760} state up:standby seq 1 join_fscid=1 addr [v2:172.17.3.135:6820/452139733,v1:172.17.3.135:6821/452139733] compat {c=[1],r=[1],i=[7ff]}] $ sudo cephadm shell -- ceph orch ls NAME PORTS RUNNING REFRESHED AGE PLACEMENT crash 6/6 10m ago 10d * mds.mds 3/3 10m ago 32m label:mds $ sudo cephadm shell -- ceph orch ps | grep mds mds.mds.cephstorage-0.fqcshx cephstorage-0.redhat.local running (79m) 3m ago 79m 27.2M - 17.2.6-100.el9cp 1af7b794f353 2a2dc5ba6d57 mds.mds.cephstorage-1.jkvomp cephstorage-1.redhat.local running (79m) 3m ago 79m 21.5M - 17.2.6-100.el9cp 1af7b794f353 7198b87104c8 mds.mds.cephstorage-2.gnfhfe cephstorage-2.redhat.local running (79m) 3m ago 79m 24.2M - 17.2.6-100.el9cp 1af7b794f353 f3cb859e2a15
9.4. 将 Red Hat Ceph Storage RGW 迁移到外部 RHEL 节点 复制链接链接已复制到粘贴板!
对于超融合基础架构(HCI)或专用存储节点,您必须将 Red Hat OpenStack Platform Controller 节点中包含的 Ceph 对象网关(RGW)守护进程迁移到现有的外部 Red Hat Enterprise Linux (RHEL)节点。外部 RHEL 节点通常包括 HCI 环境或 Red Hat Ceph Storage 节点的 Compute 节点。您的环境必须具有 Red Hat Ceph Storage 7 或更高版本,并由 cephadm 或 Ceph Orchestrator 管理。
先决条件
- 完成 Red Hat OpenStack Platform 17.1 环境中的任务。有关更多信息,请参阅 Red Hat Ceph Storage 先决条件。
9.4.1. 迁移 Red Hat Ceph Storage RGW 后端 复制链接链接已复制到粘贴板!
您必须将 Ceph 对象网关(RGW)后端从 Controller 节点迁移到 Red Hat Ceph Storage 节点。为确保将正确数量的服务分发到可用的节点,您可以使用 cephadm 标签来引用部署了给定守护进程类型的一组节点。有关卡图的更多信息,请参阅 Red Hat Ceph Storage 守护进程卡。以下流程假设您有三个目标节点 cephstorage-0、cephstorage-1、cephstorage-2。
流程
将 RGW 标签添加到您要将 RGW 后端迁移到的 Red Hat Ceph Storage 节点:
$ sudo cephadm shell -- ceph orch host label add cephstorage-0 rgw; $ sudo cephadm shell -- ceph orch host label add cephstorage-1 rgw; $ sudo cephadm shell -- ceph orch host label add cephstorage-2 rgw; Added label rgw to host cephstorage-0 Added label rgw to host cephstorage-1 Added label rgw to host cephstorage-2 $ sudo cephadm shell -- ceph orch host ls HOST ADDR LABELS STATUS cephstorage-0 192.168.24.54 osd rgw cephstorage-1 192.168.24.44 osd rgw cephstorage-2 192.168.24.30 osd rgw controller-0 192.168.24.45 _admin mon mgr controller-1 192.168.24.11 _admin mon mgr controller-2 192.168.24.38 _admin mon mgr 6 hosts in cluster在 spec 目录中找到 RGW spec 和 dump :
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ mkdir -p ${SPEC_DIR} $ sudo cephadm shell -- ceph orch ls --export rgw > ${SPEC_DIR}/rgw $ cat ${SPEC_DIR}/rgwnetworks: - 172.17.3.0/24 placement: hosts: - controller-0 - controller-1 - controller-2 service_id: rgw service_name: rgw.rgw service_type: rgw spec: rgw_frontend_port: 8080 rgw_realm: default rgw_zone: default本例假定
172.17.3.0/24是存储网络。在
placement部分中,确保设置了标签和rgw_frontend_port值:--- networks: - 172.17.3.0/241 placement: label: rgw2 service_id: rgw service_name: rgw.rgw service_type: rgw spec: rgw_frontend_port: 80903 rgw_realm: default rgw_zone: default rgw_frontend_ssl_certificate: ...4 ssl: true使用编配器 CLI 应用新的 RGW 规格:
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/rgw -- ceph orch apply -i /mnt/rgw此命令触发重新部署,例如:
... osd.9 cephstorage-2 rgw.rgw.cephstorage-0.wsjlgx cephstorage-0 172.17.3.23:8090 starting rgw.rgw.cephstorage-1.qynkan cephstorage-1 172.17.3.26:8090 starting rgw.rgw.cephstorage-2.krycit cephstorage-2 172.17.3.81:8090 starting rgw.rgw.controller-1.eyvrzw controller-1 172.17.3.146:8080 running (5h) rgw.rgw.controller-2.navbxa controller-2 172.17.3.66:8080 running (5h) ... osd.9 cephstorage-2 rgw.rgw.cephstorage-0.wsjlgx cephstorage-0 172.17.3.23:8090 running (19s) rgw.rgw.cephstorage-1.qynkan cephstorage-1 172.17.3.26:8090 running (16s) rgw.rgw.cephstorage-2.krycit cephstorage-2 172.17.3.81:8090 running (13s)确保新的 RGW 后端可以在新端口上访问,以便稍后在端口
8080上启用入口守护进程。登录到包含 RGW 的每个 Red Hat Ceph Storage 节点,并添加iptables规则,以允许连接到 Red Hat Ceph Storage 节点上的 8080 和 8090 端口:$ iptables -I INPUT -p tcp -m tcp --dport 8080 -m conntrack --ctstate NEW -m comment --comment "ceph rgw ingress" -j ACCEPT $ iptables -I INPUT -p tcp -m tcp --dport 8090 -m conntrack --ctstate NEW -m comment --comment "ceph rgw backends" -j ACCEPT $ sudo iptables-save $ sudo systemctl restart iptables如果在现有部署中使用了
nftables,请编辑/etc/nftables/tripleo-rules.nft并添加以下内容:# 100 ceph_rgw {'dport': ['8080','8090']} add rule inet filter TRIPLEO_INPUT tcp dport { 8080,8090 } ct state new counter accept comment "100 ceph_rgw"- 保存该文件。
重启
nftables服务:$ sudo systemctl restart nftables验证是否应用了规则:
$ sudo nft list ruleset | grep ceph_rgw从 Controller 节点(如
controller-0)尝试访问 RGW 后端:$ curl http://cephstorage-0.storage:8090;您应该观察以下输出:
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>对部署 RGW 守护进程的每个节点重复验证。
如果您将 RGW 后端迁移到 Red Hat Ceph Storage 节点,则没有
internalAPI网络,除了 HCI 节点的情况。您必须重新配置 RGW keystone 端点,以指向您传播的外部网络:[ceph: root@controller-0 /]# ceph config dump | grep keystone global basic rgw_keystone_url http://172.16.1.111:5000 [ceph: root@controller-0 /]# ceph config set global rgw_keystone_url http://<keystone_endpoint>:5000-
在采用 Identity 服务时,将 <
keystone_endpoint> 替换为在OpenStackControlPlaneCR 中部署的服务的 Identity 服务(keystone)内部端点。如需更多信息,请参阅 使用 Identity 服务。
-
在采用 Identity 服务时,将 <
9.4.2. 部署 Red Hat Ceph Storage ingress 守护进程 复制链接链接已复制到粘贴板!
要部署 Ceph ingress 守护进程,您可以执行以下操作:
-
移除现有的
ceph_rgw配置。 - 清理 director Operator 创建的配置。
- 重新部署 Object Storage 服务(swift)。
部署 ingress 守护进程时,会创建两个新容器:
- HAProxy,用于访问后端。
- keepalived,用于拥有虚拟 IP 地址。
您可以使用 rgw 标签将入口守护进程分发到托管 Ceph 对象网关(RGW)守护进程的节点数量。有关在节点上分发守护进程的更多信息,请参阅 Red Hat Ceph Storage 守护进程卡。
完成此步骤后,您可以从 ingress 守护进程访问 RGW 后端,并通过对象存储服务 CLI 使用 RGW。
流程
登录到每个 Controller 节点,并从
/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg文件中删除以下配置:listen ceph_rgw bind 10.0.0.103:8080 transparent mode http balance leastconn http-request set-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Forwarded-Proto http if !{ ssl_fc } http-request set-header X-Forwarded-Port %[dst_port] option httpchk GET /swift/healthcheck option httplog option forwardfor server controller-0.storage.redhat.local 172.17.3.73:8080 check fall 5 inter 2000 rise 2 server controller-1.storage.redhat.local 172.17.3.146:8080 check fall 5 inter 2000 rise 2 server controller-2.storage.redhat.local 172.17.3.156:8080 check fall 5 inter 2000 rise 2重启
haproxy-bundle并确认它已启动:[root@controller-0 ~]# sudo pcs resource restart haproxy-bundle haproxy-bundle successfully restarted [root@controller-0 ~]# sudo pcs status | grep haproxy * Container bundle set: haproxy-bundle [undercloud-0.ctlplane.redhat.local:8787/rh-osbs/rhosp17-openstack-haproxy:pcmklatest]: * haproxy-bundle-podman-0 (ocf:heartbeat:podman): Started controller-0 * haproxy-bundle-podman-1 (ocf:heartbeat:podman): Started controller-1 * haproxy-bundle-podman-2 (ocf:heartbeat:podman): Started controller-2确认没有进程连接到端口 8080:
[root@controller-0 ~]# ss -antop | grep 8080 [root@controller-0 ~]#您可以预期 Object Storage 服务(swift) CLI 无法建立连接:
(overcloud) [root@cephstorage-0 ~]# swift list HTTPConnectionPool(host='10.0.0.103', port=8080): Max retries exceeded with url: /swift/v1/AUTH_852f24425bb54fa896476af48cbe35d3?format=json (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fc41beb0430>: Failed to establish a new connection: [Errno 111] Connection refused'))为 HAProxy 和 Keepalived 设置所需的镜像:
[ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_haproxy registry.redhat.io/rhceph/rhceph-haproxy-rhel9:latest [ceph: root@controller-0 /]# ceph config set mgr mgr/cephadm/container_image_keepalived registry.redhat.io/rhceph/keepalived-rhel9:latest在
controller-0中创建一个名为rgw_ingress的文件:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ vim ${SPEC_DIR}/rgw_ingress将以下内容粘贴到
rgw_ingress文件中:--- service_type: ingress service_id: rgw.rgw placement: label: rgw spec: backend_service: rgw.rgw virtual_ip: 10.0.0.89/24 frontend_port: 8080 monitor_port: 8898 virtual_interface_networks: - <external_network> ssl_cert: ...-
将
<external_network>替换为您的外部网络,如10.0.0.0/24。如需更多信息,请参阅 迁移 Red Hat Ceph Storage RGW 的先决条件。 - 如果启用了 TLS,请添加 SSL 证书和密钥串联,如 配置持久存储 中的 为外部 Red Hat Ceph Storage 集群配置 RGW 所述。
-
将
使用 Ceph 编配器 CLI 应用
rgw_ingressspec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ cephadm shell -m ${SPEC_DIR}/rgw_ingress -- ceph orch apply -i /mnt/rgw_ingress等待 ingress 部署并查询生成的端点:
$ sudo cephadm shell -- ceph orch ls NAME PORTS RUNNING REFRESHED AGE PLACEMENT crash 6/6 6m ago 3d * ingress.rgw.rgw 10.0.0.89:8080,8898 6/6 37s ago 60s label:rgw mds.mds 3/3 6m ago 3d controller-0;controller-1;controller-2 mgr 3/3 6m ago 3d controller-0;controller-1;controller-2 mon 3/3 6m ago 3d controller-0;controller-1;controller-2 osd.default_drive_group 15 37s ago 3d cephstorage-0;cephstorage-1;cephstorage-2 rgw.rgw ?:8090 3/3 37s ago 4m label:rgw$ curl 10.0.0.89:8080 --- <?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>[ceph: root@controller-0 /]# —
9.4.3. 创建或更新 Object Storage 服务端点 复制链接链接已复制到粘贴板!
您必须创建或更新 Object Storage 服务(swift)端点,来配置您在用于部署 RGW ingress 的同一网络上保留的新虚拟 IP 地址(VIP)。
流程
列出当前的 swift 端点和服务:
$ oc rsh openstackclient openstack endpoint list | grep 'swift.*object' $ oc rsh openstackclient openstack service list | grep 'swift.*object'如果服务和端点不存在,请创建缺少的 swift 资源:
$ oc rsh openstackclient openstack service create --name swift --description 'OpenStack Object Storage' object-store $ oc rsh openstackclient openstack role add --user swift --project service member $ oc rsh openstackclient openstack role add --user swift --project service admin > for i in public internal; do > oc rsh openstackclient endpoint create --region regionOne object-store $i http://<RGW_VIP>:8080/swift/v1/AUTH_%\(tenant_id\)s > done $ oc rsh openstackclient openstack role add --project admin --user admin swiftoperator-
将
<RGW_VIP> 替换为 Ceph RGW 入口 VIP。
-
将
如果端点存在,请更新端点以指向正确的 RGW 入口 VIP:
$ oc rsh openstackclient openstack endpoint set --url http://<RGW_VIP>:8080/swift/v1/AUTH_%\(tenant_id\)s <swift_public_endpoint_uuid> $ oc rsh openstackclient openstack endpoint set --url http://<RGW_VIP>:8080/swift/v1/AUTH_%\(tenant_id\)s <swift_internal_endpoint_uuid> $ oc rsh openstackclient openstack endpoint list | grep object | 0d682ad71b564cf386f974f90f80de0d | regionOne | swift | object-store | True | public | http://172.18.0.100:8080/swift/v1/AUTH_%(tenant_id)s | | b311349c305346f39d005feefe464fb1 | regionOne | swift | object-store | True | internal | http://172.18.0.100:8080/swift/v1/AUTH_%(tenant_id)s |-
将
<swift_public_endpoint_uuid> 替换为 swift 公共端点的 UUID。 -
将
<swift_internal_endpoint_uuid> 替换为 swift 内部端点的 UUID。
-
将
测试迁移的服务:
$ oc rsh openstackclient openstack container list --debug ... ... ... REQ: curl -g -i -X GET http://keystone-public-openstack.apps.ocp.openstack.lab -H "Accept: application/json" -H "User-Agent: openstacksdk/1.0.2 keystoneauth1/5.1.3 python-requests/2.25.1 CPython/3.9.23" Starting new HTTP connection (1): keystone-public-openstack.apps.ocp.openstack.lab:80 http://keystone-public-openstack.apps.ocp.openstack.lab:80 "GET / HTTP/1.1" 300 298 RESP: [300] content-length: 298 content-type: application/json date: Mon, 14 Jul 2025 17:41:29 GMT location: http://keystone-public-openstack.apps.ocp.openstack.lab/v3/ server: Apache set-cookie: b5697f82cf3c19ece8be533395142512=d5c6a9ee2 267c4b63e9f656ad7565270; path=/; HttpOnly vary: X-Auth-Token x-openstack-request-id: req-452e42c5-e60f-440f-a6e8-fe1b9ea89055 RESP BODY: {"versions": {"values": [{"id": "v3.14", "status": "stable", "updated": "2020-04-07T00:00:00Z", "links": [{"rel": "self", "href": "http://keystone-public-openstack.apps.ocp.openstack.lab/v3/"}], "media-types": [{"base": "applic ation/json", "type": "application/vnd.openstack.identity-v3+json"}]}]}} GET call to http://keystone-public-openstack.apps.ocp.openstack.lab/ used request id req-452e42c5-e60f-440f-a6e8-fe1b9ea89055 ... REQ: curl -g -i -X GET "http://172.18.0.100:8080/swift/v1/AUTH_44477474b0dc4b5b8911ceec23a22246?format=json" -H "User-Agent: openstacksdk/1.0.2 keystoneauth1/5.1.3 python-requests/2.25.1 CPython/3.9.23" -H "X-Auth-Token: {SHA256}ec5deca0be37bd8bfe659f132b9cdf396b8f409db5dc16972d50cbf3f28474d4" Starting new HTTP connection (1): 172.18.0.100:8080 http://172.18.0.100:8080 "GET /swift/v1/AUTH_44477474b0dc4b5b8911ceec23a22246?format=json HTTP/1.1" 200 2 RESP: [200] accept-ranges: bytes content-length: 2 content-type: application/json; charset=utf-8 date: Mon, 14 Jul 2025 17:41:31 GMT x-account-bytes-used: 0 x-account-bytes-used-actual: 0 x-account-container-count: 0 x-account-object-count: 0 x-account-storage-policy-default-placement-bytes-used: 0 x-account-storage-policy-default-placement-bytes-used-actual: 0 x-account-storage-policy-default-placement-container-count: 0 x-account-storage-policy-default-placement-object-count: 0 x-openstack-request-id: tx000001e95361131ccf694-006875414a-7753-default x-timestamp: 1752514891.25991 x-trans-id: tx000001e95361131ccf694-006875414a-7753-default RESP BODY: [] GET call to http://172.18.0.100:8080/swift/v1/AUTH_44477474b0dc4b5b8911ceec23a22246?format=json used request id tx000001e95361131ccf694-006875414a-7753-default clean_up ListContainer: END return value: 0
9.5. 将 Red Hat Ceph Storage RBD 迁移到外部 RHEL 节点 复制链接链接已复制到粘贴板!
对于运行 Red Hat Ceph Storage 7 或更高版本的超融合基础架构(HCI)或专用存储节点,您必须将 Red Hat OpenStack Platform control plane 中包含的守护进程迁移到现有的外部 Red Hat Enterprise Linux (RHEL)节点。外部 RHEL 节点通常包括 HCI 环境或专用存储节点的 Compute 节点。
先决条件
- 完成 Red Hat OpenStack Platform 17.1 环境中的任务。有关更多信息,请参阅 Red Hat Ceph Storage 先决条件。
9.5.1. 将 Ceph Manager 守护进程迁移到 Red Hat Ceph Storage 节点 复制链接链接已复制到粘贴板!
您必须将 Ceph Manager 守护进程从 Red Hat OpenStack Platform (RHOSP) Controller 节点迁移到一组目标节点。如果 Red Hat Ceph Storage 由带有 Hyperconverged Infrastructure (HCI)拓扑的 director Operator 部署,则目标节点可以是现有的 Red Hat Ceph Storage 节点,或 RHOSP Compute 节点。
以下流程使用 cephadm 和 Ceph Orchestrator 来驱动 Ceph Manager 迁移,使用 Ceph spec 修改放置并重新调度 Ceph Manager 守护进程。Ceph 管理器以主动/被动状态运行。它还提供许多模块,包括 Ceph 编排器。ceph-mgr 提供的每个潜在的模块(如 Ceph 控制面板)都会隐式迁移 Ceph Manager。
流程
SSH 到目标节点,并启用访问 Ceph Manager 服务所需的防火墙规则:
dports="6800:7300" ssh heat-admin@<target_node> sudo iptables -I INPUT \ -p tcp --match multiport --dports $dports -j ACCEPT;将
<target_node> 替换为 Red Hat Ceph Storage 环境中列出的主机的主机名。运行ceph orch host ls以查看主机列表。为每个目标节点重复此步骤。
检查规则是否已正确应用到目标节点并保留它们:
$ sudo iptables-save $ sudo systemctl restart iptables如果在现有部署中使用了
nftables,请编辑/etc/nftables/tripleo-rules.nft并添加以下内容:# 113 ceph_mgr {'dport': ['6800-7300', 8444]} add rule inet filter TRIPLEO_INPUT tcp dport { 6800-7300,8444 } ct state new counter accept comment "113 ceph_mgr"- 保存该文件。
重启
nftables服务:$ sudo systemctl restart nftables验证是否应用了规则:
$ sudo nft list ruleset | grep ceph_mgr准备目标节点以托管新的 Ceph Manager 守护进程,并将
mgr标签添加到目标节点:$ sudo cephadm shell -- ceph orch host label add <target_node> mgr- 对托管 Ceph Manager 守护进程的每个目标节点重复步骤 1-7。
获取 Ceph Manager 规格:
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ mkdir -p ${SPEC_DIR} $ sudo cephadm shell -- ceph orch ls --export mgr > ${SPEC_DIR}/mgr编辑检索到的 spec,并将
label: mgr部分添加到placement部分:service_type: mgr service_id: mgr placement: label: mgr- 保存 spec。
使用 Ceph 编排器应用带有
cephadm的 spec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/mgr -- ceph orch apply -i /mnt/mgr
验证
验证目标节点上是否创建了新的 Ceph Manager 守护进程:
$ sudo cephadm shell -- ceph orch ps | grep -i mgr $ sudo cephadm shell -- ceph -sCeph 管理器守护进程计数应当与添加
mgr标签的主机数量匹配。注意迁移不会缩小 Ceph Manager 守护进程。计数由目标节点数量增加,并将 Ceph Monitor 守护进程迁移到 Red Hat Ceph Storage 节点停用 Ceph 管理器实例。有关更多信息,请参阅将 Ceph Monitor 守护进程迁移到 Red Hat Ceph Storage 节点。
9.5.2. 将 Ceph Monitor 守护进程迁移到 Red Hat Ceph Storage 节点 复制链接链接已复制到粘贴板!
您必须将 Ceph Monitor 守护进程从 Red Hat OpenStack Platform (RHOSP) Controller 节点移到一组目标节点。如果 Red Hat Ceph Storage 由带有 Hyperconverged Infrastructure (HCI)拓扑的 director Operator 部署,则目标节点可以是现有的 Red Hat Ceph Storage 节点,或 RHOSP Compute 节点。额外的 Ceph 监控器部署到目标节点上,它们被提升为 _admin 节点,您可以使用它们来管理 Red Hat Ceph Storage 集群并执行第 2 天操作。
要迁移 Ceph Monitor 守护进程,您必须执行以下高级别步骤:
对托管 Ceph 监控器的任何其他 Controller 节点重复这些步骤,直到您将所有 Ceph Monitor 守护进程迁移到目标节点。
9.5.2.1. 为 Ceph 监控迁移配置目标节点 复制链接链接已复制到粘贴板!
通过执行以下操作,为 Ceph Monitor 迁移准备目标 Red Hat Ceph Storage 节点:
- 在目标节点中启用防火墙规则并保留它们。
-
创建一个基于标签的 spec,并使用
cephadm应用它。 - 确保在迁移过程中维护 Ceph Monitor 仲裁。
流程
SSH 到目标节点,并启用访问 Ceph 监控服务所需的防火墙规则:
$ for port in 3300 6789; { ssh heat-admin@<target_node> sudo iptables -I INPUT \ -p tcp -m tcp --dport $port -m conntrack --ctstate NEW \ -j ACCEPT; }-
将
<target_node> 替换为托管新 Ceph Monitor 的节点的主机名。
-
将
检查规则是否已正确应用到目标节点并保留它们:
$ sudo iptables-save $ sudo systemctl restart iptables如果在现有部署中使用了
nftables,请编辑/etc/nftables/tripleo-rules.nft并添加以下内容:# 110 ceph_mon {'dport': [6789, 3300, '9100']} add rule inet filter TRIPLEO_INPUT tcp dport { 6789,3300,9100 } ct state new counter accept comment "110 ceph_mon"- 保存该文件。
重启
nftables服务:$ sudo systemctl restart nftables验证是否应用了规则:
$ sudo nft list ruleset | grep ceph_mon要将现有的 Ceph Monitor 迁移到目标 Red Hat Ceph Storage 节点,请从第一个 Ceph Monitor 或第一个 Controller 节点检索 Red Hat Ceph Storage mon spec:
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ mkdir -p ${SPEC_DIR} $ sudo cephadm shell -- ceph orch ls --export mon > ${SPEC_DIR}/mon在
placement部分添加label:mon部分:service_type: mon service_id: mon placement: label: mon- 保存 spec。
使用 Ceph 编排器应用带有
cephadm的 spec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/mon -- ceph orch apply -i /mnt/mon将
mon标签扩展到剩余的 Red Hat Ceph Storage 目标节点,以确保在迁移过程中维护仲裁:for item in $(sudo cephadm shell -- ceph orch host ls --format json | jq -r '.[].hostname'); do sudo cephadm shell -- ceph orch host label add $item mon; sudo cephadm shell -- ceph orch host label add $item _admin; done注意应用
monspec 允许现有策略使用标签,而不是主机。因此,任何具有mon标签的节点都可以托管 Ceph Monitor 守护进程。仅执行此步骤一次,以避免在迁移多个 Ceph monitor 时进行多次迭代。检查 Red Hat Ceph Storage 和 Ceph 编排器守护进程列表的状态。确保 Ceph 监控器位于仲裁中,并由
ceph orch命令列出:$ sudo cephadm shell -- ceph -s cluster: id: f6ec3ebe-26f7-56c8-985d-eb974e8e08e3 health: HEALTH_OK services: mon: 6 daemons, quorum controller-0,controller-1,controller-2,ceph-0,ceph-1,ceph-2 (age 19m) mgr: controller-0.xzgtvo(active, since 32m), standbys: controller-1.mtxohd, controller-2.ahrgsk osd: 8 osds: 8 up (since 12m), 8 in (since 18m); 1 remapped pgs data: pools: 1 pools, 1 pgs objects: 0 objects, 0 B usage: 43 MiB used, 400 GiB / 400 GiB avail pgs: 1 active+clean$ sudo cephadm shell -- ceph orch host ls HOST ADDR LABELS STATUS ceph-0 192.168.24.14 osd mon mgr _admin ceph-1 192.168.24.7 osd mon mgr _admin ceph-2 192.168.24.8 osd mon mgr _admin controller-0 192.168.24.15 _admin mgr mon controller-1 192.168.24.23 _admin mgr mon controller-2 192.168.24.13 _admin mgr mon在剩余的流程过程中使用的第一个 Controller 节点设置 Ceph 客户端,以便与 Red Hat Ceph Storage 交互。在存储网络上设置一个额外的 IP 地址,在第一个 Controller 节点停用时用于与 Red Hat Ceph Storage 交互:
备份
ceph_client_backup目录中/etc/ceph的内容。$ mkdir -p $HOME/ceph_client_backup $ sudo cp -R /etc/ceph/* $HOME/ceph_client_backup-
在属于存储网络的 VLAN 上的 IP 地址后,编辑
/etc/os-net-config/config.yaml和 add- ip_netmask: 172.17.3.200。将172.17.3.200替换为存储网络上的任何其他可用 IP 地址,这些 IP 地址可静态分配给controller-0。 保存文件并刷新
controller-0网络配置:$ sudo os-net-config -c /etc/os-net-config/config.yaml验证 Controller 节点中是否存在 IP 地址:
$ ip -o a | grep 172.17.3.200Ping IP 地址,并确认它可以访问:
$ ping -c 3 172.17.3.200验证您可以与 Red Hat Ceph Storage 集群交互:
$ sudo cephadm shell -c $HOME/ceph_client_backup/ceph.conf -k $HOME/ceph_client_backup/ceph.client.admin.keyring -- ceph -s
后续步骤
继续下一步 Draining 源节点。
9.5.2.2. 排空源节点 复制链接链接已复制到粘贴板!
排空源节点,并从 Red Hat Ceph Storage 集群中删除源节点主机。
流程
在源节点上,备份
/etc/ceph/目录,以运行cephadm,并从源节点获取 Red Hat Ceph Storage 集群的 shell:$ mkdir -p $HOME/ceph_client_backup $ sudo cp -R /etc/ceph $HOME/ceph_client_backup确定活跃的
ceph-mgr实例:$ sudo cephadm shell -- ceph mgr stat如果
ceph-mgr在源节点上活跃,则失败:$ sudo cephadm shell -- ceph mgr fail <mgr_instance>-
将
<mgr_instance> 替换为 Ceph Manager 守护进程失败。
-
将
在
cephadmshell 中,删除源节点上的标签:$ for label in mon mgr _admin; do sudo cephadm shell -- ceph orch host label rm <source_node> $label; done-
将
<source_node> 替换为源节点的主机名。
-
将
可选:如果 Ceph Monitor 守护进程仍在运行,请确保从源节点中删除 Ceph Monitor 守护进程:
$ sudo cephadm shell -- ceph orch daemon rm mon.<source_node> --force排空源节点以删除所有剩余的守护进程:
$ sudo cephadm shell -- ceph orch host drain <source_node>从 Red Hat Ceph Storage 集群中删除源节点主机:
$ sudo cephadm shell -- ceph orch host rm <source_node> --force注意源节点不再是集群的一部分,在运行
sudo cephadm shell -- ceph orch host ls时,不应出现在 Red Hat Ceph Storage 主机列表中。但是,如果您在源节点上运行sudo podman ps,则列表可能会显示 Ceph 监控器和 Ceph 管理器仍然在运行。[root@controller-1 ~]# sudo podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5c1ad36472bc registry.redhat.io/ceph/rhceph@sha256:320c364dcc8fc8120e2a42f54eb39ecdba12401a2546763b7bef15b02ce93bc4 -n mon.contro... 35 minutes ago Up 35 minutes ago ceph-f6ec3ebe-26f7-56c8-985d-eb974e8e08e3-mon-controller-1 3b14cc7bf4dd registry.redhat.io/ceph/rhceph@sha256:320c364dcc8fc8120e2a42f54eb39ecdba12401a2546763b7bef15b02ce93bc4 -n mgr.contro... 35 minutes ago Up 35 minutes ago ceph-f6ec3ebe-26f7-56c8-985d-eb974e8e08e3-mgr-controller-1-mtxohd要清理现有容器并从源节点中删除
cephadm数据,请联系红帽支持。确认 mons 仍在仲裁中:
$ sudo cephadm shell -- ceph -s $ sudo cephadm shell -- ceph orch ps | grep -i mon
后续步骤
继续下一步 迁移 Ceph Monitor IP 地址。
9.5.2.3. 迁移 Ceph 监控 IP 地址 复制链接链接已复制到粘贴板!
您必须将 Ceph Monitor IP 地址迁移到目标 Red Hat Ceph Storage 节点。IP 地址迁移假定目标节点最初由 director Operator 部署,并且网络配置由 os-net-config 管理。
流程
从
mon_host行上的$HOME/ceph_client_backup/ceph.conf文件获取原始 Ceph Monitor IP 地址,例如:mon_host = [v2:172.17.3.60:3300/0,v1:172.17.3.60:6789/0] [v2:172.17.3.29:3300/0,v1:172.17.3.29:6789/0] [v2:172.17.3.53:3300/0,v1:172.17.3.53:6789/0]将上一步中检索到的 IP 地址与源节点上的存储网络 IP 地址匹配,并查找 Ceph Monitor IP 地址:
[tripleo-admin@controller-0 ~]$ ip -o -4 a | grep 172.17.3 9: vlan30 inet 172.17.3.60/24 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever 9: vlan30 inet 172.17.3.13/32 brd 172.17.3.255 scope global vlan30\ valid_lft forever preferred_lft forever确认位于源节点上的
/etc/目录中的 os-net-config 配置中存在 Ceph Monitor IP 地址:os-net-config[tripleo-admin@controller-0 ~]$ grep "172.17.3.60" /etc/os-net-config/config.yaml - ip_netmask: 172.17.3.60/24-
编辑
/etc/os-net-config/config.yaml文件并删除ip_netmask行。 保存文件并刷新节点网络配置:
$ sudo os-net-config -c /etc/os-net-config/config.yaml验证源节点中不存在 IP 地址,例如:
[controller-0]$ ip -o a | grep 172.17.3.60-
SSH 到目标节点,如
cephstorage-0,再为新 Ceph 监控器添加 IP 地址。 -
在目标节点上,编辑
/etc/os-net-config/config.yaml,并添加您在源节点中删除的ip_netmask: 172.17.3.60行。 保存文件并刷新节点网络配置:
$ sudo os-net-config -c /etc/os-net-config/config.yaml验证目标节点中是否存在 IP 地址。
$ ip -o a | grep 172.17.3.60从 Ceph 客户端节点
controller-0,ping 迁移到目标节点的 IP 地址,并确认它仍然可以被访问:[controller-0]$ ping -c 3 172.17.3.60
后续步骤
继续下一步 ,在目标节点上重新部署 Ceph Monitor。
9.5.2.4. 在目标节点上重新部署 Ceph Monitor 复制链接链接已复制到粘贴板!
您可以使用迁移到目标节点的 IP 地址在目标节点上重新部署 Ceph Monitor。
流程
从 Ceph 客户端节点(如
controller-0)获取 Ceph mon spec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -- ceph orch ls --export mon > ${SPEC_DIR}/mon编辑检索到的 spec,并添加
unmanaged: true关键字:service_type: mon service_id: mon placement: label: mon unmanaged: true- 保存 spec。
使用 Ceph 编排器应用带有
cephadm的 spec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/mon -- ceph orch apply -i /mnt/monCeph 监控守护进程标记为
非受管,您现在可以重新部署现有的守护进程并将其绑定到迁移的 IP 地址。删除目标节点上现有的 Ceph Monitor:
$ sudo cephadm shell -- ceph orch daemon rm mon.<target_node> --force-
将
<target_node> 替换为 Red Hat Ceph Storage 集群中包含的目标节点的主机名。
-
将
使用迁移的 IP 地址在目标节点上重新部署新的 Ceph Monitor:
$ sudo cephadm shell -- ceph orch daemon add mon <target_node>:<ip_address>-
将
<ip_address> 替换为迁移的 IP 地址的 IP 地址。
-
将
获取 Ceph Monitor 规格:
$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -- ceph orch ls --export mon > ${SPEC_DIR}/mon编辑检索到的 spec,并将
unmanaged关键字设置为false:service_type: mon service_id: mon placement: label: mon unmanaged: false- 保存 spec。
使用 Ceph 编排器应用带有
cephadm的 spec:$ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"} $ sudo cephadm shell -m ${SPEC_DIR}/mon -- ceph orch apply -i /mnt/mon新的 Ceph 监控器在带有原始 IP 地址的目标节点上运行。
确定正在运行的
mgr:$ sudo cephadm shell -- ceph mgr stat通过强制失败来刷新 Ceph Manager 信息:
$ sudo cephadm shell -- ceph mgr fail刷新
OSD信息:$ sudo cephadm shell -- ceph orch reconfig osd.default_drive_group
后续步骤
重复从第 Drain 开始的步骤,为要停用的每个节点重复源 节点。在 Ceph 监控迁移后,继续执行验证 Red Hat Ceph Storage 集群的 下一步。
9.5.2.5. 在 Ceph 监控迁移后验证 Red Hat Ceph Storage 集群 复制链接链接已复制到粘贴板!
将 Ceph Monitor 守护进程迁移到目标节点后,验证 Red Hat Ceph Storage 集群是否正常运行。
流程
验证 Red Hat Ceph Storage 集群是否健康:
$ ceph -s cluster: id: f6ec3ebe-26f7-56c8-985d-eb974e8e08e3 health: HEALTH_OK ... ...验证 Red Hat Ceph Storage mons 是否使用旧 IP 地址运行。SSH 到目标节点,并验证 Ceph 监控守护进程是否已绑定到预期的 IP 和端口:
$ netstat -tulpn | grep 3300
9.6. 更新 Red Hat Ceph Storage 集群 Ceph 仪表板配置 复制链接链接已复制到粘贴板!
如果 Ceph 控制面板是启用的 Ceph Manager 模块的一部分,您需要重新配置故障转移设置。
流程
重新生成以下 Red Hat Ceph Storage 配置键以指向正确的
mgr容器:mgr advanced mgr/dashboard/controller-0.ycokob/server_addr 172.17.3.33 mgr advanced mgr/dashboard/controller-1.lmzpuc/server_addr 172.17.3.147 mgr advanced mgr/dashboard/controller-2.xpdgfl/server_addr 172.17.3.138$ sudo cephadm shell $ ceph orch ps | awk '/mgr./ {print $1}'对于每个检索到的
mgr守护进程,更新 Red Hat Ceph Storage 配置中的对应条目:$ ceph config set mgr mgr/dashboard/<>/server_addr/<ip addr>