使用 Red Hat OpenStack Platform director Operator 环境


Red Hat OpenStack Services on OpenShift 18.0

使用 Red Hat OpenStack Platform director Operator 环境到 OpenShift 18.0 数据平面上的 Red Hat OpenStack Services

OpenStack Documentation Team

摘要

您可以将现有的 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 创建一个帐户。

  1. 点击以下链接打开 Create Issue 页面: Create Issue
  2. 完成 SummaryDescription 字段。在 Description 字段中,包含文档 URL、章节号以及问题的详细描述。不要修改表单中的任何其他字段。
  3. Create

采用是将 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. 采用先决条件

在开始使用过程前,请完成以下先决条件:

规划信息
备份信息
Compute
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 主机
  • 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,请不要关闭节点。

在 OpenShift (RHOSO)数据平面上使用 Red Hat OpenStack Services 之前,您必须先验证 systemd-container 软件包是否已安装,并且所有 Compute 主机上运行 systemd-machined。您必须在没有此软件包的每个 Compute 主机上安装 systemd-container 软件包。

流程

  1. 以具有适当权限的用户身份登录 Compute 节点主机。
  2. 列出主机上运行的实例:

    $ 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.
  3. 验证 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 节点主机。

  4. 如果 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
  5. 在主机上安装 systemd-container:

    • 如果您从早期版本的 Red Hat OpenStack Platform 升级了您的环境,请重启 Compute 主机来自动安装 systemd-container
    • 如果您部署了新的 RHOSO 环境,请使用以下命令手动安装 systemd-container。不需要重新引导 Compute 主机:

      $ sudo dnf -y install systemd-container
      注意

      如果您的 Compute 主机没有运行虚拟机,您可以自动安装 systemd-container 或手动安装。

  6. systemd-machined 服务没有运行的集群中,在集群中的每个 Compute 主机上重复此步骤。

1.6. Identity 服务身份验证

如果您启用了自定义策略,请完成以下步骤进行采用:

  1. 删除自定义策略。
  2. 运行采用。
  3. 使用新的 SRBAC 语法重新添加自定义策略。
重要

红帽不支持自定义角色或策略。语法错误或错误应用授权可能会对安全性或可用性造成负面影响。如果在生产环境中需要自定义角色或策略,请在开始采用前联系红帽支持例外。

在将基于 director Operator 的 OpenStack 部署到 OpenShift 部署上的 Red Hat OpenStack Services 后,Identity 服务使用 Secure RBAC (SRBAC)执行用户身份验证和授权。如果已经启用了 SRBAC,则不会改变如何执行操作。如果禁用 SRBAC,则使用基于 director Operator 的 OpenStack 部署可能会更改因为 API 访问策略的变化来执行操作。

如需有关 SRBAC 的更多信息,请参阅 执行 安全操作中的 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 OperatorRed Hat OpenShift Container Platform 集群中使用 director Operator 创建网络

流程

  1. 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'}]
  2. 检索 vlan 键中使用的 VLAN 标签,以及每个隔离的网络的 ip_subnet 键中的 IP 范围,来自 network_data.yaml 文件。当从新的 control plane 服务的现有部署中重复使用子网范围时,范围将分成单独的池,用于 control plane 服务和负载均衡器 IP 地址。
  3. 使用 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.2172.17.0.100 值,在采用完前,新的 control plane 服务将不可用。

  4. 对配置中的每个隔离网络和每个主机重复此步骤。

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 地址数量。每个节点都需要来自 NetConfig CR 的 IP 地址。
  • control plane 服务所需的 IP 地址数量。每个服务都需要来自 NetworkAttachmentDefinition CR 的 IP 地址。这个数量取决于每个服务的副本数。
  • 负载均衡器 IP 地址所需的 IP 地址数量。每个服务都需要来自 IPAddressPool CR 的虚拟 IP 地址。

例如,使用 Red Hat OpenShift Local 简单的 worker 节点 RHOCP 部署为 internalapi 网络定义了以下 IP 范围:

  • 单个 worker 节点的 IP 地址
  • data plane 节点的 IP 地址
  • control plane 服务的 NetworkAttachmentDefinition CR: X.X.X.30-X.X.X.70 (41 addresses)
  • 负载均衡器 IP 的 IPAllocationPool CR: 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 OperatorRed Hat OpenShift Container Platform 集群中使用 director Operator 创建网络

流程

  1. 在现有部署节点上为 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/24 
    1
    
          next_hop: 192.168.1.100 
    2
    1
    新的 control plane 子网。
    2
    现有数据平面节点的 control plane IP 地址。

    对需要为部署的新和现有部分使用不同子网的其他网络重复此配置。

  2. 将新配置应用到每个 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> 替换为包含模板的目录的路径。
    • & lt;stack> 替换为置备裸机节点的堆栈的名称。如果未指定,则默认为 overcloud
    • 包含 --network-config 可选参数,为 cli-overcloud-node-network-config.yaml Ansible playbook 提供网络定义。cli-overcloud-node-network-config.yaml playbook 使用 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 来强制实施更改。

  3. 确认每个节点上有新的链接本地路由到新子网。例如:

    # ip route | grep 172
    172.31.0.0/24 via 192.168.122.100 dev br-ctlplane
  4. 您还必须配置本地路由到 OpenShift (RHOSO) worker 节点上的现有部署。这可以通过为每个网络将 路由 条目添加到 NodeNetworkConfigurationPolicy CR 来实现。例如:

      - destination: 192.168.122.0/24 
    1
    
        next-hop-interface: ospbr 
    2
    1
    数据平面上隔离网络的原始子网。
    2
    与数据平面上的隔离网络对应的 Red Hat OpenShift Container Platform (RHOCP) worker 网络接口。

    因此,在 RHOCP 节点中添加以下路由:

    # ip route | grep 192
    192.168.122.0/24 dev ospbr proto static scope link
  5. 之后,在 data plane 采用过程中,在 OpenStackDataPlaneNodeSet CR 的 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 }}
                ...
  6. 列出现有部署中用于 data plane 节点的 IP 地址,存为 ansibleHostfixedIP。例如:

      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 地址。在 OpenStackDataPlaneNodeSet CR 的 nodes 部分中,列出之前在 fixedIP 字段中为每个节点条目使用 IP 地址。

  7. 扩展防火墙配置的 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 节点的 NetConfig CR 中配置这些范围。如需更多信息,请参阅配置数据平面节点
  • 每个用于 control plane 服务的隔离网络有一个 IP 范围。这些范围在 NetworkAttachmentDefinition CR 中为隔离的网络启用 pod 连接。如需更多信息,请参阅为 control plane 服务配置网络
  • 每个用于负载均衡器 IP 地址的每个隔离的网络的 IP 范围。这些 IP 范围在 IPAddressPool CR 中为 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 节点,定义一个 NodeNetworkConfigurationPolicy CR,用于描述所需的网络配置。例如:

    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

流程

  1. 为每个隔离网络定义一个 NetworkAttachmentDefinition CR。例如:

    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 范围与您在 NodeNetworkConfigurationPolicy CR 中使用的配置匹配。

  2. 可选: 在重复使用现有 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"
            ]
          }
        }
    1
    定义 IP 范围的开头。
    2
    定义 IP 范围的末尾。
    3
    排除 IP 范围的一部分。本例从分配池中排除 IP 地址 172.17.0.24/32172.17.0.44/31
  3. 如果您的 RHOSP 服务需要负载均衡器 IP 地址,请在 IPAddressPool CR 中定义这些服务的池。例如:

    注意

    负载均衡器 IP 地址属于与 control plane 服务相同的 IP 范围,并由 MetalLB 管理。此池也应该与 RHOSP 配置保持一致。

    - apiVersion: metallb.io/v1beta1
      kind: IPAddressPool
      spec:
        addresses:
        - 172.17.0.60-172.17.0.70

    为每个需要负载均衡器 IP 地址的隔离网络定义 IPAddressPool CR。

  4. 可选: 在重复使用现有 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 变量下,可以是所有节点还是每个节点。

流程

  1. 使用所需的 VLAN 标签和 IPAM 配置来配置 NetConfig CR。例如:

    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
    网络 组成必须与源云配置匹配,以避免数据平面连接停机时间。
  2. 可选:在 NetConfig CR 中,列出 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
  • 所有块存储服务卷都没有全局 customServiceConfigcustomServiceConfigSecrets 选项。您必须为每个后端指定这些选项。
  • 对需要 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-volumes
apiVersion: 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_drivertarget_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
    • 如果使用标签来限制运行块存储服务的节点,则必须使用 MachineConfigPoolMachineConfig 的影响限制为服务可能运行的节点。如需更多信息,请参阅关于节点选择器
    • 如果您使用单一节点部署来测试流程,请在 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
    • 如果使用标签来限制运行块存储服务的节点,请使用 MachineConfigPoolMachineConfig 的影响限制为服务运行的节点。如需更多信息,请参阅关于节点选择器
    • 如果使用单一节点部署来测试流程,请在 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
    • 如果使用标签来限制运行块存储服务的节点,您需要使用 MachineConfigPoolMachineConfig 的影响限制为服务运行的节点。如需更多信息,请参阅关于节点选择器
    • 如果您使用单一节点部署来测试流程,请在 MachineConfig 中将 worker 替换为 master
    • Cinder 卷和备份默认配置为使用多路径。

1.8.5. 转换块存储服务配置

在之前的部署中,您将对所有服务使用相同的 cinder.conf 文件。要准备块存储服务(cinder)配置以采用,请将此单文件配置分成各个块存储服务的单个配置。参阅以下信息来指导您完成之前的配置:

  • 确定所有块存储服务的配置是通用的,并删除在 Red Hat OpenShift Container Platform (RHOCP)中部署时可能会更改的任何部分,如 [database] 部分中的 连接,即 [DEFAULT] 部分中的 transport_urllog_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 部分的 Secret CR 中。删除 [DEFAULT] 部分中的主机配置,以便稍后支持多个副本。
  • 确定每个驱动程序的单个卷后端配置。配置位于特定的驱动程序部分,它使用 [backend_defaults] 部分和 FC zoning 部分(如果使用它们)。Block Storage Service operator 不支持所有卷服务的全局 customServiceConfig 选项。每个后端在 cinder: template: cinderVolumes 下都有自己的部分,并且配置位于 customServiceConfig 选项或 Secret CR 中,然后在 customServiceConfigSecrets 部分中使用。
  • 如果任何块存储服务卷驱动程序需要自定义厂商镜像,请在 红帽生态系统目录 中找到镜像的位置,并使用 cinderVolumes 部分中的键创建或修改 OpenStackVersion CR 来指定自定义镜像。

    例如,如果您有以下配置:

    spec:
      cinder:
        enabled: true
        template:
          cinderVolume:
            pure:
              customServiceConfigSecrets:
                - openstack-cinder-pure-cfg
    < . . . >

    然后,描述该后端容器镜像的 OpenStackVersion CR 类似以下示例:

    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 的名称必须与 OpenStackControlPlane CR 的名称匹配。

  • 如果您的块存储服务使用外部文件(例如,对于自定义策略),或者存储凭证或 SSL 证书颁发机构捆绑包以连接到存储阵列,请将这些文件提供给正确的容器。使用 SecretsConfigMap 将信息存储在 RHOCP 中,然后存储在 extraMounts 键中。例如,对于存储在名为 ceph-conf-filesSecret 中的 Red Hat Ceph Storage 凭证,您可以在 OpenstackControlPlane CR 中修补顶级 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-confConfigMap 添加 的策略,其具有策略 键,其内容如下:

    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 环境的先决条件:

在使用监控堆栈组件迁移 Red Hat Ceph Storage 集群前,您必须收集监控堆栈信息,查看和更新容器镜像 registry,并删除 undercloud 容器镜像。

注意

除了更新与监控堆栈相关的容器镜像外,还需要更新与 container_image_base 相关的配置条目。这会影响依赖于 undercloud 镜像的所有 Red Hat Ceph Storage 守护进程。使用 Red Hat Ceph Storage 集群中配置的新镜像 registry 位置部署新的守护进程。

流程

  1. 收集监控堆栈的当前状态。当每个守护进程放置评估时,验证主机没有 监控 标签或 grafanaprometheusalertmanager

    注意

    整个重定位过程由 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 lsceph orch ps 都返回预期的部署的守护进程数量。

  2. 检查和更新容器镜像 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
  3. 删除 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

在开始 Ceph 对象网关(RGW)迁移前,请完成以下先决条件。

流程

  1. 检查 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   |
        +------------------------+    +----------------+
  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
  3. 识别存储网络的范围。以下是一个示例,值可能与您环境中的不同:

    [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 forever 
    1
    
    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 forever 
    2
    
    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
    1
    br-ex 代表外部网络,在当前环境中,HAProxy 已分配前端虚拟 IP (VIP)。
    2
    vlan30 代表存储网络,应在 Red Hat Ceph Storage 节点上启动新的 RGW 实例。
  4. 识别您之前在 HAProxy 中具有的网络,并通过 director Operator 传播到 Red Hat Ceph Storage 节点。使用此网络保留由 Red Hat Ceph Storage 拥有的新 VIP,作为 RGW 服务的入口点。

    1. 登录到 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
    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 管理,则无法使用此流程配置网络。管理员必须手动配置所有必需的网络。

  5. 将 HAProxy 前端网络传播到 Red Hat Ceph Storage 节点。

    1. 在用来定义 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
    2. 将外部网络添加到裸机文件中,例如: /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
    3. 在裸机节点上配置新网络:

      (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
    4. 验证 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

在开始 Red Hat Ceph Storage Rados 块设备(RBD)迁移前,请完成以下先决条件。

  • 目标 CephStorage 或 ComputeHCI 节点都配置为具有 storagestorage_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 并配置额外网络:

    1. 如果目标节点是 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
    2. 添加缺少的网络:

      $ openstack overcloud node provision \
      -o overcloud-baremetal-deployed-0.yaml --stack overcloud-0 \
      /--network-config -y --concurrency 2 /home/stack/metalsmith-0.yaml
    3. 验证存储网络是否在目标节点上配置:

      (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 服务。

流程

  1. 识别 Red Hat Ceph Storage 节点,以部署新的集群 NFS 服务,如 cephstorage-0cephstorage-1cephstorage-2

    注意

    您必须在 StorageNFS 隔离的网络中部署此服务,以便您可以通过新的 NFS 导出位置挂载现有的共享。您可以在现有 Ceph 存储节点或 HCI 节点上部署新的集群 NFS 服务,也可以在 Red Hat Ceph Storage 集群中注册的新硬件上部署。

  2. 如果您使用 director Operator 部署 Red Hat Ceph Storage 节点,请将 StorageNFS 网络传播到部署 ceph-nfs 服务的目标节点。

    注意

    如果目标节点不是由 director 管理,则无法使用此流程配置网络。管理员必须手动配置所有必需的网络。

    1. 识别 RHOSP 环境中使用的节点定义文件 overcloud-baremetal-deploy.yaml。有关识别 overcloud-baremetal-deploy.yaml 文件的更多信息,请参阅 OpenShift 部署上自定义 Red Hat OpenStack Services 中的自定义 overcloud 网络
    2. 编辑与 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
    3. 编辑 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 }}
    4. 更新 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 标记。

  3. 识别 StorageNFS 网络的 IP 地址,以用作 Ceph NFS 服务的虚拟 IP 地址(VIP):

    $ openstack port list -c "Fixed IP Addresses" --network storage_nfs
  4. 在正在运行的 cephadm shell 中,识别 NFS 服务的主机:

    $ ceph orch host ls
  5. 标记您确定的每个主机。对您要标记的每个主机重复这个命令:

    $ ceph orch host label add <hostname> nfs
    • <hostname > 替换为您识别的主机的名称。
  6. 创建 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 网关

  7. 检查 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

流程

  1. 根据您的环境配置 /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.config 
    1
    
    director_host=standalone 
    2
    
    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=""
    1
    指示 os-diff 通过 SSH 访问 director Operator 主机。默认值为 ssh -F ssh.config。但是,您可以在不使用 ssh.config 文件的情况下设置值,例如 ssh -i /home/user/.ssh/id_rsa stack@my.undercloud.local
    2
    用于访问云的主机,并且 podman/docker 二进制文件已安装,并允许与正在运行的容器交互。您可以将此键留空。
  2. 如果您使用主机文件连接到云,请将 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 环境的完整工作访问权限。
  3. 如果使用清单文件连接到云,请从 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 环境,以便采用。

准备 director Operator (OSPdO)环境中的 Controller 节点,使其用于 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services。

注意

以下流程使用由源 OSPdO 环境和目标 RHOSO 环境共享的单个 Red Hat OpenShift Container Platform (RHOCP)集群。两个 RHOCP 主节点传输到 RHOSO 环境,在采用过程中,将 OSPdO 保留为一个节点。在采用后,RHOSO 环境也可以使用其余节点。

流程

  1. 登录到部署 RHOSP OSPdO 的 RHOCP 环境,并更改到托管 RHOSP 部署的项目:

    $ oc project openstack
  2. 定义通用环境变量:

    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}')
  3. 获取运行当前 RHOSP Controller 虚拟机(VM)的节点的名称:

    $ export CONTROLLER_NODE=$(oc -n $OSPDO_NAMESPACE get vmi -ojson | jq -r '.items[0].status.nodeName')
  4. 如果您将 master/worker 集群与高可用性 OSPdO 环境结合使用,请将 OSPdO 配置为使用单个 RHOSP Controller 节点:

    1. 禁用 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
    2. 将非Controller 节点置于维护状态:

      $CONTROLLER1_SSH sudo pcs node maintenance <controller-1> <controller-2>
      • <controller -1& gt; 和 & lt;controller-2> 替换为环境中 Controller 节点的名称。
    3. 为单一节点更新仲裁:

      $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
    4. 重启 Pacemaker 集群:

      $CONTROLLER1_SSH sudo pcs cluster stop
      $CONTROLLER1_SSH sudo pcs cluster start
    5. 检查是否只启动 Controller-0,并且其他 2 Controller 是否已停止:

      $CONTROLLER_SSH sudo pcs status
    6. 检查 RHOSP control plane 是否仍然可以正常工作:

      $OS_CLIENT openstack compute service list
      注意

      您可能需要等待几分钟,以便 control plane 正常运行。此时,control plane 响应会减慢。

    7. 当 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
    8. OpenStackControlPlane CR 中的 Controller 角色的 roleCount 减小到 1:

      $ oc -n "${OSPDO_NAMESPACE}"patch OpenStackControlPlane overcloud --type json -p '[{"op": "replace", "path":"/spec/virtualMachineRoles/controller/roleCount", "value": 1}]'
    9. 确保 OpenStackClient 容器集与剩余的 Controller 虚拟机在同一 RHOCP 节点上运行。如果 OpenStackClient pod 没有在同一节点上,则通过封锁到 RHOSO 的两个节点来移动它。然后,您将删除 OpenStackClient pod,以便在具有剩余的 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
    10. 通过将 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 操作器.

流程

  1. 将剩余的两个节点的主机名保存到 RHOSO_NODES 变量中:

    $ RHOSO_NODES=$(oc get nodes -o name | grep -v $CONTROLLER_NODE | sed 's#node/##g' | tr '\n' ' ')
  2. 提取要用于 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
  3. 创建一个新命名空间,用于安装 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}
    }
  4. 为 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_NODE 1> 替换为节点的名称。
  5. 为每个隔离网络应用 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& gt; 替换为您的 OpenStack 18 命名空间。
  6. 确保 OVNKubernetes IPForwarding 字段设置为 enabled

    $ oc patch network.operator cluster -p '{"spec":{"defaultNetwork":{"ovnKubernetesConfig":{"gatewayConfig":{"ipForwarding": "Global"}}}}}' --type=merge
  7. 从 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
    }
  8. 安装 RHOSO 操作器。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 安装和准备 Operator
  9. 应用与新的 OpenStack 18 部署匹配的 IPAddressPool 资源,以配置哪些 IP 可用作虚拟 IP (VIP):

    $ oc apply -f - <<EOF
    apiVersion: metallb.io/v1beta1
    kind: IPAddressPool
    ...
  10. 应用 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"

流程

  1. 要找到 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
  2. /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 命令获取证书和密钥。

  3. 创建包含 root CA 的 secret:

    $ oc create secret generic rootca-internal
  4. 从 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`\"}}"
  5. 创建 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
  6. 删除之前创建的 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 数据库进行比较

先决条件

  1. 定义以下 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 服务单元。
  2. 获取运行 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
  3. tripleo-exports-default ConfigMap 的 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。
  4. 定义以下 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 拓扑允许为每个堆栈使用不同的密码文件。

流程

  1. 导出以下输出的 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

    如果连接成功,则预期的输出不会进行任何操作。

    注意

    novanova_apinova_cell0 数据库包含在主 overcloud Orchestration 服务(heat)堆栈的同一数据库主机上。

  2. 在 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
  3. 获取 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;')
  4. 获取注册的 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
  5. 获取映射的 Compute 服务单元列表:

    export PULL_OPENSTACK_CONFIGURATION_NOVAMANAGE_CELL_MAPPINGS=$($CONTROLLER1_SSH sudo podman exec -it nova_conductor nova-manage cell_v2 list_cells)
  6. 存储导出的变量以供以后使用:

    $ unset SRIOV_AGENTS
    $ declare -xA SRIOV_AGENTS 
    1
    
    $ 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),您必须将 tls root 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; }')

流程

  1. 确保您在使用要部署 control plane 的 Red Hat OpenShift Container Platform (RHOCP)命名空间:

    $ oc project openstack
  2. 创建 RHOSP secret。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 为 Red Hat OpenStack Services 提供安全访问 OpenShift 服务
  3. 如果 $ADMIN_PASSWORD 与您在 osp-secret 中设置的密码不同,请修改 osp-secret 中的 AdminPassword 键:

    $ oc set data secret/osp-secret "AdminPassword=$ADMIN_PASSWORD"
  4. 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"
  5. 部署 OpenStackControlPlane CR。确保您只启用 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& gt; 替换为 LoadBalancer IP 地址。
    4
    本例为 3 个计算单元提供所需的基础架构数据库和消息传递服务,名为 cell1、 cell2cell3。根据需要,调整每个 Compute 单元 的副本存储 或storage Request 等字段的值。
    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
  • 验证 OpenStackControlPlane CR 是否已等待 openstackclient pod 部署:

    $ 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。

先决条件

  • OpenStackControlPlane CR 已创建。
  • 如果您的 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")

流程

  1. 创建包含 Red Hat Ceph Storage 配置的 ceph-conf-files secret:

    $ 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.4 
    1
    1
    如果您使用 IPv6,请将括号用于 mon_host。例如: mon_host = [v2:[fd00:cc::100]:3300/0,v1:[fd00:cccc::100]:6789/0]
  2. OpenStackControlPlane CR 中,将 ceph.confceph.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>"
    # ...
    1
    <path_to_SSH_key > 替换为 SSH 密钥的路径。
    1
    将 & lt;controller-<X> IP> 替换为所有 Controller 节点的 IP 地址。

流程

  1. 如果您的部署通过 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
  2. 禁用 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=utf8 
    2
    
    $ 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.100 
    6
    
    >   # [...]=...
    > )
    $ declare -A SOURCE_GALERA_MEMBERS_CELL1
    $ SOURCE_GALERA_MEMBERS_CELL1=(
    >   # ...
    > )
    $ declare -A SOURCE_GALERA_MEMBERS_CELL2
    $ SOURCE_GALERA_MEMBERS_CELL2=(
    >   # ...
    > )
    1
    CELLSRENAMED_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 S _CELL<X> 中定义的每个单元,添加 MariaDB Galera 集群成员及其 IP 地址的名称。将 ["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:

    1. 为数据库数据复制创建一个临时卷声明和 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
    2. 等待 pod 就绪:

      $ oc wait --for condition=Ready pod/mariadb-copy-data --timeout=30s

流程

  1. 检查每个单元中的源 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 数据库集群,因此命令会检查每个单元。

  2. 获取具有 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
  3. 检查 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"
  4. 测试到 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

  5. 创建原始数据库的转储:

    $ 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 不再用作指标存储

  6. 将数据库从 .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_map  
    1
    
    >     db_name_map['nova']="nova_$RCELL"
    >     db_name_map['ovs_neutron']='neutron'
    >     db_name_map['ironic-inspector']='ironic_inspector'
    >     declare -A db_cell_map  
    2
    
    >     db_cell_map['nova']="nova_$DEFAULT_CELL_NAME"
    >     db_cell_map["nova_$RCELL"]="nova_$RCELL"  
    3
    
    >     declare -A db_server_map  
    4
    
    >     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_map  
    5
    
    >     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
    >       fi  
    6
    
    >       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
    1
    定义在导入时要重命名的通用数据库。
    2
    定义要导入的单元数据库,以及如何重命名它们(如果需要)。
    3
    省略了导入单元的特殊 cell0 数据库,因为它的内容在采用过程中无法合并。
    4
    定义要将哪些数据库导入到哪些服务器,通常为单元专用。
    5
    定义数据库服务器的 root 密码映射。现在,您只能使用相同的密码。
    6
    分配在从 默认单元 提取数据库时将哪些数据库导入到哪些主机。

验证

将以下输出与特定于拓扑的服务配置进行比较。如需更多信息,请参阅 检索特定于拓扑的服务配置

  1. 检查数据库是否已正确导入:

    $ 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); do 
    3
    
    >   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
    1
    确保 Networking 服务(neutron)数据库从 ovs_neutron 重命名。
    2
    确保 默认单元 重命名为 $DEFAULT_CELL_NAME,并保留单元 UUID。
    3
    确保注册的 Compute 服务名称没有改变。
    4
    确保计算服务单元数据库提取到单独的数据库服务器,并从 nova 重命名为 nova_cell<X&gt;。
    5
    确保注册的 Compute 服务名称没有改变。
  2. 删除 mariadb-data pod 和 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 环境

流程

  1. 获取包含 RHOSP Controller 节点的 RHOCP master 节点:

    $ oc get vmi -n $<ospdo_namespace> -o jsonpath='{.items[0].metadata.labels.kubevirt\.io/nodeName}'
    • <ospdo_namespace& gt; 替换为您的 OSPdO 命名空间。
  2. 为 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 节点。
  3. 等待 pod 就绪:

    $ oc wait --for=condition=Ready -n $OSPDO_NAMESPACE pod/ovn-copy-data --timeout=30s
  4. 如果 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
  5. 备份 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"
  6. 在导入前启动 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
    '
  7. 等待 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
  8. 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}')
  9. 如果您使用 IPv6,请将地址调整为 ovsdb channel 工具期望的格式:

    PODIFIED_OVSDB_NB_IP=[$PODIFIED_OVSDB_NB_IP]
    PODIFIED_OVSDB_SB_IP=[$PODIFIED_OVSDB_SB_IP]
  10. 升级备份文件的数据库模式:

    1. 如果您没有在任何位置启用 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"
    2. 如果您随处启用 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"
  11. 将数据库备份恢复到新的 OVN 数据库服务器:

    1. 如果您没有在任何位置启用 TLS,请使用以下命令:

    2. 如果您随处启用 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"
  12. 通过针对新的数据库服务器运行以下命令来检查数据是否已成功迁移,例如:

    $ oc exec -it ovsdbserver-nb-0 -- ovn-nbctl show
    $ oc exec -it ovsdbserver-sb-0 -- ovn-sbctl list Chassis
  13. 启动 control plane ovn-northd 服务,以便两个 OVN 数据库保持同步:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      ovn:
        enabled: true
        template:
          ovnNorthd:
            replicas: 1
    '
  14. 如果您在 RHOCP 节点上运行 OVN 网关服务,请启用 control plane ovn-controller 服务:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      ovn:
        enabled: true
        template:
          ovnController:
            nicMappings:
              physNet: NIC 
    1
    1
    physnet 是物理网络的名称。NIC 是连接到您的物理网络的物理接口的名称。
    注意

    在 RHOCP 节点上运行 OVN 网关,在 Open vSwitch 升级过程中可能会容易出现数据平面停机时间。考虑在专用的 Networker data plane 节点上运行 OVN 网关,用于生产环境部署。

  15. 删除 ovn-data helper pod 和用于存储 OVN 数据库备份文件的临时 PersistentVolumeClaim

    $ oc delete --ignore-not-found=true pod ovn-copy-data
    $ oc delete --ignore-not-found=true pvc ovn-data
    注意

    在删除 ovn-data helper pod 和临时 PersistentVolumeClaim 前,请考虑为它们执行快照。如需更多信息,请参阅 OpenShift Container Platform 存储概述 中的 关于卷快照

  16. 停止采用的 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。

流程

  1. 下载 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 -
  2. 获取用于访问数据平面节点的 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"
  3. 从每个 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
  4. 从所有 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
  5. 将 RHOSO OpenStack Operator controller-manager 缩减为 0 个副本,并临时删除 OpenStackControlPlane OpenStackClient pod,以便您可以使用 OSPdO controller-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 版本。
  6. 删除 OSPdO OpenStackControlPlane 自定义资源(CR):

    $ oc delete openstackcontrolplanes.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all
  7. 删除 OSPdO OpenStackNetConfig CR,以删除关联的节点网络配置策略:

    $ oc delete osnetconfig -n "${OSPDO_NAMESPACE}" --all
  8. 标记包含 OSPdO 虚拟机(VM)的 RHOCP 节点:

    $ oc label nodes <ospdo_vm_master_node> type=openstack
    • <ospdo_vm_master_node > 替换为包含 OSPdO 虚拟机的剩余 master 节点。
  9. 为第三个 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
  10. 删除剩余的 OSPdO 资源。不要删除 OpenStackBaremetalSetsOpenStackProvisionServer 资源:

    $ 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
  11. 将 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"}]"
  12. 从 OSPdO 中删除 webhook:

    $ oc patch csv $ospdo_csv_ver -n "${OSPDO_NAMESPACE}" --type json -p="[{"op": "remove", "path": "/spec/webhookdefinitions"}]"
  13. 从 OSPdO OpenStackBaremetalSet 资源中删除终结器:

    $ oc patch openstackbaremetalsets.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" compute --type json -p="[{"op": "remove", "path": "/metadata/finalizers"}]"
  14. 删除 OpenStackBaremetalSetOpenStackProvisionServer 资源:

    $ oc delete openstackbaremetalsets.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all
    $ oc delete openstackprovisionservers.osp-director.openstack.org -n "${OSPDO_NAMESPACE}" --all
  15. 注解每个 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
  16. 在其操作状态被分离后删除 BareMetalHost 资源:

        for bmh_compute in $compute_bmh_list;do \
           oc -n openshift-machine-api delete bmh $bmh_compute; \
        done
  17. 删除 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}"
  18. 将 RHOSO OpenStack Operator controller-manager 扩展为 1 个副本,以便协调关联的 OpenStackControlPlane CR,并重新创建其 OpenStackClient pod:

    $ 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"}]"

采用 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

流程

  1. OpenStackControlPlane CR 进行补丁来部署 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
  2. 在 OpenShift (RHOSO)部署中的 Red Hat OpenStack Services 中创建一个别名来使用 openstack 命令:

    $ alias openstack="oc exec -t openstackclient -- openstack"
  3. 删除仍指向 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

验证

  1. 验证您可以访问 OpenStackClient 容器集。如需更多信息,请参阅在 OpenShift 部署中 访问 Red Hat OpenStack Services 中的访问 OpenStackClient pod
  2. 确认定义了 Identity 服务端点,并指向 control plane FQDN:

    $ openstack endpoint list | grep keystone
  3. 等待 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、BBarbicanWorkerBarbicanKeystoneListener 服务已启动并在运行。
  • Keystone 端点已更新,源云的同一加密插件也可用。
注意

此流程将 Key Manager 服务配置为使用 simple_crypto 后端。OpenShift (RHOSO)上的 Red Hat OpenStack Services 目前不支持额外的后端,如 PKCS11 和 DogTag。

流程

  1. 添加 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'])\"")"
  2. OpenStackControlPlane CR 进行补丁来部署 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.80 
    1
    
                  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 数据

流程

  • OpenStackControlPlane CR 进行补丁来部署网络服务:

    $ 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.80 
    1
    
                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,请跳过以下步骤。

先决条件

流程

  1. 创建包含对象存储服务哈希路径后缀和前缀的 swift-conf secret:

    $ 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
  2. 创建包含对象存储服务 ring 文件的 swift-ring-files ConfigMap

    $ 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
  3. 修补 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-storage 
    1
    
            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.80 
    2
    
                  spec:
                    type: LoadBalancer
            networkAttachments: 
    3
    
            - storage
    '
    1
    必须与 RHOSO 部署存储类匹配。
    2
    如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
    3
    必须与 RHOSP 部署中之前的对象存储服务配置的网络附加匹配。

验证

  • 检查生成的对象存储服务 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 }}

先决条件

  • 您已完成了以前的采用步骤。

流程

  1. 创建一个新文件,如 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.80 
    1
    
                    spec:
                      type: LoadBalancer
              networkAttachments:
                - storage
    1
    如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
    注意

    对象存储服务作为后端与镜像服务建立依赖项。如果镜像服务配置了在 OpenStackControlPlane 自定义资源中不可用的对象存储服务,则任何部署的 GlanceAPI 实例都无法正常工作。在 Object Storage 服务以及特定的 SwiftProxy 之后,您可以继续进行 GlanceAPI 的采用。如需更多信息,请参阅 使用对象存储服务

  2. 验证 SwiftProxy 是否可用:

    $ oc get pod -l component=swift-proxy | grep Running
    swift-proxy-75cb47f65-92rxq   3/3     Running   0
  3. 对 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

先决条件

  • 您已完成了以前的采用步骤。

流程

  1. 创建一个新文件,如 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.80 
    1
    
                    spec:
                      type: LoadBalancer
              networkAttachments:
                - storage
    1
    如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
    注意

    块存储服务作为后端与镜像服务建立依赖项。如果镜像服务配置了 OpenStackControlPlane 自定义资源中不可用的块存储服务,则任何部署的 GlanceAPI 实例都无法正常工作。在块存储服务以及特定的 CinderVolume 应用之后,您可以继续采用 GlanceAPI。如需更多信息,请参阅 使用块存储服务

  2. 验证 CinderVolume 是否可用:

    $ oc get pod -l component=cinder-volume | grep Running
    cinder-volume-75cb47f65-92rxq   3/3     Running   0
  3. 对 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_datadirfilesystem_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"]

流程

  1. 采用镜像服务,再创建一个新的 默认 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.80 
    3
    
                    spec:
                      type: LoadBalancer
              networkAttachments:
              - storage
    EOF
    1
    使用 <exported_path> nfs-server 中导出的路径替换。
    2
    <ip_address > 替换为您要与 nfs-server 通信的 IP 地址。
    3
    如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
  2. 修补 OpenStackControlPlane CR,以使用 NFS 后端部署镜像服务:

    $ oc patch openstackcontrolplane openstack --type=merge --patch-file glance_nfs_patch.yaml
  3. 修补 OpenStackControlPlane CR 以删除默认镜像服务:

    $ 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

采用您使用 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.80 
    1
    
                    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 配置文件之间的区别。

流程

  • 修补 OpenStackControlPlane CR,以使用 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 中。

流程

  1. 通过 Red Hat OpenStack Platform CLI 测试镜像服务。您可以比较并确保配置应用到镜像服务 pod:

    $ os-diff diff /etc/glance/glance.conf.d/02-config.conf glance_patch.yaml --frompod -p glance-api

    如果没有显示行,则配置正确。

  2. 检查生成的镜像服务 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.
  3. 如果使用 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
  4. 检查服务是否活跃,并在 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     |
  5. 检查您之前在源云中列出的镜像是否在采用的服务中可用:

    $ openstack image list
    +--------------------------------------+--------+--------+
    | ID                                   | Name   | Status |
    +--------------------------------------+--------+--------+
    | c3158cad-d50b-452f-bec1-f250562f5c1f | cirros | active |
    +--------------------------------------+--------+--------+

6.6. 使用放置服务

要采用放置服务,您可以修补禁用放置服务的现有 OpenStackControlPlane 自定义资源(CR)。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。

先决条件

流程

  • OpenStackControlPlane CR 进行补丁来部署放置服务:

    $ 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.80 
    1
    
    >            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> 替换为现有 OpenStackControlPlane CR 的名称,如 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 服务,则需要 IronicInspectorSubnets director Operator 参数的值。使用相同的值在 RHOSO 环境中填充 dhcpRanges 参数。
  • 您已定义以下 shell 变量:将以下示例值替换为应用到您的环境的值:

    $ alias openstack="oc exec -t openstackclient -- openstack"

流程

  1. 修补 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.80 
    1
    
                  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
  2. 等待裸机置备服务 control plane 服务 CR 就绪:

    $ oc wait --for condition=Ready --timeout=300s ironics.ironic.openstack.org ironic
  3. 验证单个服务是否已就绪:

    $ 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
  4. 更新 provisioning、清理和救援网络上的 DNS Nameservers:

    注意

    要使名称解析用于裸机置备服务操作,您必须将 DNS 名称服务器设置为使用 RHOSO control plane 中的内部 DNS 服务器:

    $ openstack subnet set --dns-nameserver 192.168.122.80 provisioning-subnet
  5. 验证节点列表中没有裸机置备服务节点:

    $ openstack baremetal node list
    重要

    如果 openstack baremetal node list 命令输出报告了不正确的电源状态,请等待几分钟,然后重新运行命令以查看输出是否与被管理的硬件的实际状态同步。Bare Metal Provisioning 服务检查和协调裸机节点的电源状态所需的时间取决于通过 replicas 参数的操作编排器,并在采用裸机置备服务部署中存在这些时间。

  6. 如果 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 策略。

  7. 查看没有分配所有者的裸机节点:

    $ openstack baremetal node list --long -c UUID -c Owner -c 'Provisioning State'
  8. 将没有所有者的所有裸机节点分配给新项目,如 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
  9. 通过删除 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
    '

验证

  1. 验证端点列表:

    $ openstack endpoint list |grep ironic
  2. 验证裸机节点列表:

    $ 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"

流程

  1. OpenStackControlPlane CR 进行补丁来部署 Compute 服务:

    注意

    此流程假设 Compute 服务元数据部署在顶层,而不是在每个单元级别。如果 RHOSP 部署有每单元元数据部署,请根据需要调整以下补丁。您不能在 cell0 中运行元数据服务。要启用本地单元的元数据服务,请在 OpenStackControlPlane CR 中的 local cell 的 metadataServiceTemplate 字段中将 enabled 属性设置为 true

    $ rm -f celltemplates
    $ for CELL in $(echo $RENAMED_CELLS); do
     $ cat >> celltemplates << EOF
            ${CELL}:
              hasAPIAccess: true 
    1
    
              cellDatabaseAccount: nova-$CELL
              cellDatabaseInstance: openstack-$CELL 
    2
    
              cellMessageBusInstance: rabbitmq-$CELL 
    3
    
              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.80 
    4
    
                  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
    单元使用的数据库实例。在部署后端服务时,数据库实例名称必须与您在部署后端服务时创建的 OpenStackControlPlane CR 中定义的名称匹配,如 部署后端服务 中所述。
    3
    单元使用的消息总线实例。消息总线实例名称必须与 OpenStackControlPlane CR 中定义的名称匹配。
    4
    如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
  2. 如果您使用 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
            ...
    • &lt;hostname> 替换为在源云中运行 ironic Compute 驱动程序的节点主机名。
  3. 等待 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
  • 查询超级编排器,以检查预期的单元是否存在,并将其与其预选项值进行比较:

    $ 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

    每个单元都应该有以下更改:

    • cellX nova 数据库和用户名变为 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

流程

  1. 创建新文件,如 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.80 
      1
      
                    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
  2. 检索之前调度程序和备份服务的列表:

    $ 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 |
    +------------------+------------------------+------+---------+-------+----------------------------+
  3. 删除处于 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
  4. 部署调度程序、备份和卷服务:

    • 创建另一个文件,如 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 文件中的配置组名称的值。

  5. 配置 NetApp NFS 块存储卷服务:

    1. 创建 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
    2. OpenStackControlPlane CR 进行补丁,以部署 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
  6. 检查所有服务是否已启动并正在运行:

    $ 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 |
    +------------------+--------------------------+------+---------+-------+----------------------------+
  7. 应用 DB 数据迁移:

    注意

    您不需要在此步骤中运行数据迁移,但您必须在下一次升级前运行它们。但是,对于采用,您可以现在运行迁移以确保在部署上运行生产工作负载前没有问题。

    $ oc exec -it cinder-scheduler-0 -- cinder-manage db online_data_migrations

验证

  1. 确保定义了 openstack 别名:

    $ alias openstack="oc exec -t openstackclient -- openstack"
  2. 确认定义了块存储服务端点并指向 control plane FQDN:

    $ openstack endpoint list --service <endpoint>
    • <endpoint > 替换为您要确认的端点的名称。
  3. 确认块存储服务正在运行:

    $ openstack volume service list
    注意

    Cinder API 服务不会出现在列表中。但是,如果您从 openstack volume service list 命令获得响应,这表示至少有一个 cinder API 服务正在运行。

  4. 确认已有以前的卷类型、卷、快照和备份:

    $ openstack volume type list
    $ openstack volume list
    $ openstack volume snapshot list
    $ openstack volume backup list
  5. 要确认配置是否正常工作,请执行以下步骤:

    1. 从镜像创建卷,以检查与镜像服务(glance)的连接是否正常工作:

      $ openstack volume create --image cirros --bootable --size 1 disk_new
    2. 备份之前附加的卷:

      $ 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 环境提供的配置参数启动服务。

先决条件

流程

  • OpenStackControlPlane CR 进行补丁来部署 Dashboard 服务:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      horizon:
        enabled: true
        apiOverride:
          route: {}
        template:
          memcachedInstance: memcached
          secret: osp-secret
    '

验证

  1. 验证 Dashboard 服务实例是否已成功部署并就绪:

    $ oc get horizon
  2. 确认 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.11. 使用共享文件系统服务

Red Hat OpenStack Services on OpenShift (RHOSO)中的共享文件系统服务(manila)提供了一个自助服务 API 来创建和管理文件共享。文件共享(或"共享")是为从多个客户端进行并发读写访问而构建的。这使得共享文件系统服务在需要 ReadWriteMany 持久性存储的云环境中至关重要。

RHOSO 中的文件共享需要网络访问。在采用后,确保 Red Hat OpenStack Platform (RHOSP) 17.1 环境中的网络与您的新云的网络计划匹配。这样可确保租户工作负载在采用过程中保持连接到存储。共享文件系统服务 control plane 服务不在数据路径中。关闭 API、调度程序和共享管理器服务不会影响对现有共享文件系统的访问。

通常,存储和存储设备管理是独立的网络。共享文件系统服务只需要访问存储设备管理网络。例如,如果您在部署中使用了 Red Hat Ceph Storage 集群,"storage"网络指的是 Red Hat Ceph Storage 集群的公共网络,并且共享文件系统服务的共享管理器服务需要能够访问它。

共享文件系统服务支持以下存储网络场景:

  • 您可以直接控制相应文件共享的网络。
  • RHOSO 管理员配置存储网络。

6.11.1. 准备共享文件系统服务配置的指南

要在 control plane 上部署共享文件系统服务(manila),您必须从 Red Hat OpenStack Platform 17.1 部署中复制原始配置文件。您必须检查文件中的内容,以确保您在 OpenShift (RHOSO) 18.0 上为 Red Hat OpenStack Services 采用正确的配置。并非所有内容都需要引入新的云环境。

查看以下准则,以准备您的共享文件系统服务配置文件进行采用:

  • 共享文件系统服务 operator 设置以下配置,并可以忽略:

    • 与数据库相关的配置([database])
    • 服务身份验证(auth_strategy,[keystone_authtoken])
    • 消息总线配置(transport_urlcontrol_exchange)
    • 默认粘贴配置(api_paste_config)
    • Inter-service communication configuration ([neutron], [nova], [cinder], [glance] [oslo_messagingvdsm])
  • 忽略 osapi_share_listen 配置。在 OpenShift 上的 Red Hat OpenStack Services (RHOSO) 18.0 中,您依赖 Red Hat OpenShift Container Platform (RHOCP)路由和入口。
  • 检查策略覆盖。在 RHOSO 18.0 中,共享文件系统服务附带安全默认的基于角色的访问控制(RBAC),且可能不需要覆盖。
  • 如果需要自定义策略,则必须将其作为 ConfigMap 提供。以下示例 spec 演示了如何使用名为 policy.yaml 的文件设置名为 manila-policyConfigMap

      spec:
        manila:
          enabled: true
          template:
            manilaAPI:
              customServiceConfig: |
                 [oslo_policy]
                 policy_file=/etc/manila/policy.yaml
            extraMounts:
            - extraVol:
              - extraVolType: Undefined
                mounts:
                - mountPath: /etc/manila/
                  name: policy
                  readOnly: true
                propagation:
                - ManilaAPI
                volumes:
                - name: policy
                  projected:
                    sources:
                    - configMap:
                        name: manila-policy
                        items:
                          - key: policy
                            path: policy.yaml
  • [DEFAULT] 部分下的 host 选项的值必须是 hostgroup
  • 要运行共享文件系统服务 API 服务,您必须将 enabled_share_protocols 选项添加到 manila: template: manilaAPIcustomServiceConfig 部分。
  • 如果您有调度程序覆盖,请将它们添加到 manila: template: manilaScheduler 中的 customServiceConfig 部分。
  • 如果您使用 RHOSP 17.1 配置多个存储后端驱动程序,则需要在部署 RHOSO 18.0 时分割它们。每个存储后端驱动程序都需要使用自己的 manila-share 服务实例。
  • 如果存储后端驱动程序需要自定义容器镜像,请在 Red Hat Ecosystem Catalog 中找到它,并创建或修改 OpenStackVersion 自定义资源(CR),以使用相同的自定义名称来指定 自定义镜像

    以下示例显示了 OpenStackControlPlane CR 中的 manila spec,其中包含多个存储后端驱动程序,其中只有一个使用自定义容器镜像:

      spec:
        manila:
          enabled: true
          template:
            manilaAPI:
              customServiceConfig: |
                [DEFAULT]
                enabled_share_protocols = nfs
              replicas: 3
            manilaScheduler:
              replicas: 3
            manilaShares:
             netapp:
               customServiceConfig: |
                 [DEFAULT]
                 debug = true
                 enabled_share_backends = netapp
                 host = hostgroup
                 [netapp]
                 driver_handles_share_servers = False
                 share_backend_name = netapp
                 share_driver = manila.share.drivers.netapp.common.NetAppDriver
                 netapp_storage_family = ontap_cluster
                 netapp_transport_type = http
               replicas: 1
             pure:
                customServiceConfig: |
                 [DEFAULT]
                 debug = true
                 enabled_share_backends=pure-1
                 host = hostgroup
                 [pure-1]
                 driver_handles_share_servers = False
                 share_backend_name = pure-1
                 share_driver = manila.share.drivers.purestorage.flashblade.FlashBladeShareDriver
                 flashblade_mgmt_vip = 203.0.113.15
                 flashblade_data_vip = 203.0.10.14
                replicas: 1

    以下示例显示了定义自定义容器镜像的 OpenStackVersion CR:

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackVersion
    metadata:
      name: openstack
    spec:
      customContainerImages:
        cinderVolumeImages:
          pure: registry.connect.redhat.com/purestorage/openstack-manila-share-pure-rhosp-18-0

    OpenStackVersion CR 的名称必须与 OpenStackControlPlane CR 的名称匹配。

  • 如果您提供敏感信息,如密码、主机名和用户名,请使用 RHOCP secret 和 customServiceConfigSecrets 密钥。您可以在任意服务中使用 customConfigSecrets。如果您使用需要凭证的第三方存储,请使用 customServiceConfigSecrets 密钥在 manila CR/patch 文件中创建一个 secret。例如:

    1. 创建包含 secret 的文件,如 netapp_secrets.conf

      $ cat << __EOF__ > ~/netapp_secrets.conf
      
      [netapp]
      netapp_server_hostname = 203.0.113.10
      netapp_login = fancy_netapp_user
      netapp_password = secret_netapp_password
      netapp_vserver = mydatavserver
      __EOF__
      $ oc create secret generic osp-secret-manila-netapp --from-file=~/<secret>
      • <secret > 替换为包含 secret 的文件名称,如 netapp_secrets.conf
    2. 将 secret 添加到 customServiceConfigSecrets 部分中的任何共享文件系统服务文件中。以下示例将 osp-secret-manila-netapp secret 添加到 manilaShares 服务中:

        spec:
          manila:
            enabled: true
            template:
              < . . . >
              manilaShares:
               netapp:
                 customServiceConfig: |
                   [DEFAULT]
                   debug = true
                   enabled_share_backends = netapp
                   host = hostgroup
                   [netapp]
                   driver_handles_share_servers = False
                   share_backend_name = netapp
                   share_driver = manila.share.drivers.netapp.common.NetAppDriver
                   netapp_storage_family = ontap_cluster
                   netapp_transport_type = http
                 customServiceConfigSecrets:
                   - osp-secret-manila-netapp
                 replicas: 1
          < . . . >

6.11.2. 在 control plane 上部署共享文件系统服务

从 Red Hat OpenStack Platform (RHOSP) 17.1 部署中复制共享文件系统服务(manila)配置,然后在 control plane 上部署共享文件系统服务。

先决条件

  • 共享文件系统服务 systemd 服务(如 apicron调度程序 )会停止。如需更多信息,请参阅 停止 Red Hat OpenStack Platform 服务
  • 如果部署通过 NFS 将 CephFS 用作存储后端,则调整 Pacemaker 排序和并置限制。如需更多信息,请参阅 停止 Red Hat OpenStack Platform 服务
  • 共享文件系统服务 Pacemaker 服务 Pacemaker 服务(openstack-manila-share)已停止。如需更多信息,请参阅 停止 Red Hat OpenStack Platform 服务
  • 数据库迁移已完成。如需更多信息,请参阅将 数据库迁移到 MariaDB 实例
  • 部署 manila-share 服务的 Red Hat OpenShift Container Platform (RHOCP)节点可以访问存储系统所在的管理网络。
  • 如果部署使用 NFS 作为存储后端,则可通过 Ceph 编排器在 Red Hat Ceph Storage 集群上部署一个新的集群的 Ceph NFS 服务。有关更多信息,请参阅创建 Ceph NFS 集群
  • 在采用共享文件系统服务(keystone)和 memcached 等服务之前,可以使用 Identity 服务(keystone)和 memcached 等服务。
  • 如果您通过设置 driver_handles_share_servers=True 来启用租户驱动的网络,则会部署 Networking 服务(neutron)。
  • CONTROLLER1_SSH 环境变量已定义,并指向 RHOSP 控制器节点。将以下示例值替换为您的环境的正确值:

    $ CONTROLLER1_SSH="ssh -i <path to SSH key> root@<node IP>"

    流程

    1. 从 RHOSP 17.1 复制配置文件以供参考:

      $ CONTROLLER1_SSH cat /var/lib/config-data/puppet-generated/manila/etc/manila/manila.conf | awk '!/^ *#/ && NF' > ~/manila.conf
    2. 查看配置文件以获取从 RHOSP 17.1 开始进行的配置更改。有关在 OpenShift 上为 Red Hat OpenStack Services (RHOSO)准备此文件的更多信息 ,请参阅指南准备共享文件系统服务配置
    3. OpenStackControlPlane CR 创建补丁文件,以部署共享文件系统服务。以下 manila.patch 文件示例使用原生 CephFS:

      $ cat << __EOF__ > ~/manila.patch
      spec:
        manila:
          enabled: true
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            databaseAccount: manila
            secret: osp-secret
            manilaAPI:
              replicas: 3
              customServiceConfig: |
                [DEFAULT]
                enabled_share_protocols = cephfs
              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
            manilaScheduler:
              replicas: 3
            manilaShares:
              cephfs:
                replicas: 1
                customServiceConfig: |
                  [DEFAULT]
                  enabled_share_backends = tripleo_ceph
                  host = hostgroup
                  [cephfs]
                  driver_handles_share_servers=False
                  share_backend_name=cephfs 
      2
      
                  share_driver=manila.share.drivers.cephfs.driver.CephFSDriver
                  cephfs_conf_path=/etc/ceph/ceph.conf
                  cephfs_auth_id=openstack
                  cephfs_cluster_name=ceph
                  cephfs_volume_mode=0755
                  cephfs_protocol_helper_type=CEPHFS
                networkAttachments: 
      3
      
                    - storage
            extraMounts: 
      4
      
            - name: v1
              region: r1
              extraVol:
                - propagation:
                  - ManilaShare
                extraVolType: Ceph
                volumes:
                - name: ceph
                  secret:
                    secretName: ceph-conf-files
                mounts:
                - name: ceph
                  mountPath: "/etc/ceph"
                  readOnly: true
      __EOF__
      1
      如果使用 IPv6,请将负载均衡器 IP 更改为环境中的负载均衡器 IP,如 metallb.universe.tf/loadBalancerIPs: fd00:bbbb::80
      2
      确保后端的名称(share_backend_name)与在 RHOSP 17.1 中相同。
      3
      确保在 networkAttachments 部分中指定适当的存储管理网络。例如,使用 CephFS 后端驱动程序的 manilaShares 实例连接到 存储网络
      4
      如果需要向任意服务添加额外的文件,您可以使用 extraMounts。例如,在使用 Red Hat Ceph Storage 时,您可以添加共享文件系统服务 Ceph 用户的 keyring 文件和 ceph.conf 配置文件。

      以下示例补丁文件通过 NFS 使用 CephFS:

      $ cat << __EOF__ > ~/manila.patch
      spec:
        manila:
          enabled: true
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            secret: osp-secret
            manilaAPI:
              replicas: 3
              customServiceConfig: |
                [DEFAULT]
                enabled_share_protocols = cephfs
              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
                    spec:
                      type: LoadBalancer
            manilaScheduler:
              replicas: 3
            manilaShares:
              cephfs:
                replicas: 1
                customServiceConfig: |
                  [DEFAULT]
                  enabled_share_backends = cephfs
                  host = hostgroup
                  [cephfs]
                  driver_handles_share_servers=False
                  share_backend_name=tripleo_ceph
                  share_driver=manila.share.drivers.cephfs.driver.CephFSDriver
                  cephfs_conf_path=/etc/ceph/ceph.conf
                  cephfs_auth_id=openstack
                  cephfs_cluster_name=ceph
                  cephfs_protocol_helper_type=NFS
                  cephfs_nfs_cluster_id=cephfs
                  cephfs_ganesha_server_ip=172.17.5.47
                networkAttachments:
                    - storage
      __EOF__
  • 在通过 NFS 将 manilaShares 服务用于 CephFS 之前,请确保创建了集群的 Ceph NFS 服务。服务的名称必须是 cephfs_nfs_cluster_idcephfs_nfs_cluster_id 选项使用在 Red Hat Ceph Storage 上创建的 NFS 集群的名称进行设置。
  • cephfs_ganesha_server_ip 选项从 RHOSP 17.1 环境中的配置保留。

    1. OpenStackControlPlane CR 进行补丁:

      $ oc patch openstackcontrolplane openstack --type=merge --patch-file=~/<manila.patch>
  • <manila.patch > 替换为您的补丁文件的名称。

验证

  1. 检查生成的共享文件系统服务 pod:

    $ oc get pods -l service=manila
  2. 检查共享文件系统服务(keystone)中是否已注册了共享文件系统服务(keystone):

    $ openstack service list | grep manila
    $ openstack endpoint list | grep manila
    
    | 1164c70045d34b959e889846f9959c0e | regionOne | manila       | share        | True    | internal  | http://manila-internal.openstack.svc:8786/v1/%(project_id)s        |
    | 63e89296522d4b28a9af56586641590c | regionOne | manilav2     | sharev2      | True    | public    | https://manila-public-openstack.apps-crc.testing/v2                |
    | af36c57adcdf4d50b10f484b616764cc | regionOne | manila       | share        | True    | public    | https://manila-public-openstack.apps-crc.testing/v1/%(project_id)s |
    | d655b4390d7544a29ce4ea356cc2b547 | regionOne | manilav2     | sharev2      | True    | internal  | http://manila-internal.openstack.svc:8786/v2                       |
  3. 测试服务的健康状况:

    $ openstack share service list
    $ openstack share pool list --detail
  4. 检查现有工作负载:

    $ openstack share list
    $ openstack share snapshot list
重要

本节中的内容 作为技术预览提供,因此不受红帽完全支持。它只应用于测试,不应部署在生产环境中。如需更多信息,请参阅 技术预览

如果您的部署通过 NFS 使用 CephFS,则必须停用 Red Hat OpenStack Platform (RHOSP)独立 NFS 服务。由于将来的软件升级不支持之前的 NFS 服务,因此请确保停用周期较短。

先决条件

  • 您可以通过查询共享文件系统服务 API 来识别现有共享的新导出位置。
  • 您卸载并重新挂载每个客户端上的共享文件系统,以使用之前的 NFS 服务器停止。
  • 如果您使用共享文件系统服务与 Red Hat OpenShift Container Platform (RHOCP)的共享文件系统服务 CSI 插件共享,您可以通过缩减应用程序 pod 并扩展它们来迁移共享。
注意

创建新工作负载的客户端无法使用通过以前的 NFS 服务导出的共享。共享文件系统服务不再与之前的 NFS 服务通信,且无法在之前的 NFS 服务中应用或更改导出规则。

流程

  1. manila-share 服务配置中删除 cephfs_ganesha_server_ip 选项:

    注意

    这会重启 manila-share 进程,并从所有共享中删除应用到之前 NFS 服务的导出位置。

    $ cat << __EOF__ > ~/manila.patch
    spec:
      manila:
        enabled: true
        apiOverride:
          route: {}
        template:
          manilaShares:
            cephfs:
              replicas: 1
              customServiceConfig: |
                [DEFAULT]
                enabled_share_backends = cephfs
                host = hostgroup
                [cephfs]
                driver_handles_share_servers=False
                share_backend_name=cephfs
                share_driver=manila.share.drivers.cephfs.driver.CephFSDriver
                cephfs_conf_path=/etc/ceph/ceph.conf
                cephfs_auth_id=openstack
                cephfs_cluster_name=ceph
                cephfs_protocol_helper_type=NFS
                cephfs_nfs_cluster_id=cephfs
              networkAttachments:
                  - storage
    __EOF__
  2. OpenStackControlPlane 自定义资源进行补丁:

    $ oc patch openstackcontrolplane openstack --type=merge --patch-file=~/<manila.patch>
    • <manila.patch > 替换为您的补丁文件的名称。
  3. 通过禁用和删除与服务关联的 Pacemaker 资源,从 RHOSP control plane 节点清理独立 ceph-nfs 服务:

    重要

    您可以延迟此步骤,直到 RHOSO 18.0 正常运行为止。在这个时间中,您无法弃用 Controller 节点。

    $ sudo pcs resource disable ceph-nfs
    $ sudo pcs resource disable ip-<VIP>
    $ sudo pcs resource unmanage ceph-nfs
    $ sudo pcs resource unmanage ip-<VIP>
    • <VIP > 替换为分配给环境中 ceph-nfs 服务的 IP 地址。

6.12. 使用编排服务

要采用编排服务(heat),您可以修补现有的 OpenStackControlPlane 自定义资源(CR),其中禁用了编排服务。补丁使用 Red Hat OpenStack Platform (RHOSP)环境提供的配置参数启动服务。

完成采用过程后,在 Identity 服务(keystone)中具有 HeatHeatAPIHeatEngineHeatCFNAPI 和端点的 CR,以促进这些服务。

先决条件

  • 源 director Operator 环境正在运行。
  • 目标 Red Hat OpenShift Container Platform (RHOCP)环境正在运行。
  • 您采用 MariaDB 和 Identity 服务。
  • 如果您的现有编排服务堆栈包含来自网络服务(neutron)、计算服务(nova)、对象存储服务(swift)等其他服务的资源,请在采用编排服务前采用这些信号。

流程

  1. 检索现有的 auth_encryption_keyservice 密码。您可以使用这些密码来修补 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
  2. 登录到 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
  3. 将密码编码为 Base64 格式:

    $ echo Q60Hj8PqbrDNu2dDCbyIQE2dibpQUPg2 | base64
    UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzIK
  4. osp-secret 进行补丁,以更新 HeatAuthEncryptionKeyHeatPassword 参数。这些值必须与 director Operator Orchestration 服务配置中的值匹配:

    $ oc patch secret osp-secret --type='json' -p='[{"op" : "replace" ,"path" : "/data/HeatAuthEncryptionKey" ,"value" : "UTYwSGo4UHFickROdTJkRENieUlRRTJkaWJwUVVQZzIK"}]'
    secret/osp-secret patched
  5. OpenStackControlPlane CR 进行补丁来部署编排服务:

    $ 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
    '

验证

  1. 确保所有 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
  2. 检查编排服务是否在 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
  3. 检查编排服务引擎服务是否正在运行:

    $ 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'
  4. 验证您是否可以看到您的编配服务堆栈:

    $ 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)集群中运行。
  • 以前的采用步骤已完成。

流程

  1. OpenStackControlPlane CR 进行补丁来部署 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
  2. 等待安装成功:

    $ oc wait --for jsonpath="{.status.phase}"=Succeeded csv --namespace=openshift-operators -l operators.coreos.com/cluster-observability-operator.openshift-operators
  3. 修补 OpenStackControlPlane CR 来部署 Ceilometer 服务:

    $ oc patch openstackcontrolplane openstack --type=merge --patch '
    spec:
      telemetry:
        enabled: true
        template:
          ceilometer:
            passwordSelector:
              ceilometerService: CeilometerPassword
            enabled: true
            secret: osp-secret
            serviceUser: ceilometer
    '
  4. 启用 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
    '

验证

  1. 验证 alertmanagerprometheus pod 是否可用:

    $ 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
  2. 检查生成的 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
  3. 检查已启用的 pollsters:

    $ oc get secret ceilometer-config-data -o jsonpath="{.data['polling\.yaml\.j2']}"  | base64 -d
  4. 可选:根据环境要求覆盖默认 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
    '

后续步骤

  1. 可选:对 OpenStackControlPlane CR 进行补丁,使其包含 日志记录

    $ 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 服务

流程

  1. OpenStackControlPlane CR 进行补丁来部署自动扩展服务:

    $ 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
    '
  2. 检查 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
  3. 检查 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    |
  4. 可选:使用 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
    1. 验证警报是否已启用:

      $ 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 备份配置。然后,您可以在配置所采用的服务期间使用文件,以确保不会丢失或错误配置。

先决条件

流程

  1. 根据您的环境在 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 命令正确,并包含密钥身份验证。

  2. 启用您要包含在 /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 服务重复此步骤。

  3. 如果您使用非容器化服务,如 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: true 
    3
    
        path:
          - ovs_external_ids.json
        config_mapping: 
    4
    
          ovn-bridge-mappings: edpm_ovn_bridge_mappings 
    5
    
          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-1compute-2
    2
    针对主机运行的命令。
    3
    os-diff 获取命令的输出,并将输出存储在由密钥路径指定的文件中。
    4
    在这个示例中,在 data plane 自定义资源定义和 ovs-vsctl 输出之间提供一个映射。
    5
    edpm_ovn_bridge_mappings 变量必须是字符串列表,如 ["datacentre:br-ex "]。
    1. 比较值:

      $ 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
  4. 拉取配置:

    注意

    以下命令拉取 /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。

流程

  1. 要将源云恢复到工作状态,请启动之前在采用过程中停止的 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
  2. 如果 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
  3. 验证源云是否可再次运行,例如,您可以运行 openstack CLI 命令,如 openstack server list,或检查您可以访问 Dashboard 服务(horizon)。
  4. 删除部分或完全部署的 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 涉及以下步骤:

  1. 部署所需的自定义资源。
  2. 对从 RHOSP 17.1 到 RHOSO 18.0 的 Compute 服务执行快速升级。
  3. 采用 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
    1
    CONTROLLER<X>_SSH 设置中,为源 director Operator 云的所有 Controller 节点(包括单元 Controller 节点)提供 SSH 连接详情。
    2
    <path_to_SSH_key > 替换为 SSH 密钥的路径。

流程

  • 停止 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
    对于每个单元,使用连接到 ctlplaneinternalapi 网络的 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& gt; , & lt;compute 2&gt ; , 和 <compute3 > 替换为 Compute 服务节点的名称。
    5
    将源云 默认单元 中的所有 Compute 服务节点分配给 COMPUTES_CELL<X>COMPUTES_API_CELL<X>',其中 <X > 是 DEFAULT_CELL_NAME 环境变量值。在本例中,DEFAULT_CELL_NAME 环境变量值等于 cell3
    6
    对于每个单元,使用连接到 ctlplaneinternalapi 网络的 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 参数设置值。存储后端必须与源云存储后端匹配。您不能在采用过程中更改存储后端。

流程

  1. 为 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 密钥的路径。
  2. 生成 ssh 密钥对 nova-migration-ssh-key secret:

    $ 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 -
  3. 如果启用了 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)
    1. 启用 TLS-e 时创建 libvirt-secret:

      $ oc apply -f - <<EOF
      apiVersion: v1
      kind: Secret
      metadata:
        name: libvirt-secret
      type: Opaque
      data:
        LibvirtPassword: ${LIBVIRT_PASSWORD_BASE64}
      EOF
  4. 创建一个配置映射,用于所有单元来为 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
    1
    ConfigMap 中的 data 资源为所有单元提供配置文件。
    2
    根据优先级将 &lt ;*.conf& gt; 文件从 03 索引为 99。& lt;99636.conf > 文件具有最高的优先级,而以下 03 的索引则保留给内部使用。
    注意

    如果您采用 live 云,您可能需要执行存储在 cell1 默认 nova -extra-config 配置映射中的默认 nova data plane 服务的额外配置。不要删除或覆盖分配给 novacell1 默认 nova-extra-config 配置映射中的现有配置。覆盖配置可能会破坏依赖于 nova-extra-config 配置映射特定内容的数据位置服务。

  5. 为 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-cellXnova-compute-extraconfig-cellX

  6. 为 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-config 
    2
    
        - secretRef:
            name: nova-migration-ssh-key 
    3
    
        - configMapRef:
            name: nova-cells-global-config
      playbook: osp.edpm.nova
      caCerts: combined-ca-bundle
      edpmServiceType: nova
      containerImageFields:
      - NovaComputeImage
      - EdpmIscsidImage
    EOF
      done
    • 如果启用了 TLS Everywhere,请将以下内容附加到 OpenStackDataPlaneService CR 中:

        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-config secret。您还应该在 OpenStackControlPlane/openstack CR 中设置 spec.nova.template.cellTemplates.cell<X>.metadataServiceTemplate.enable,如 Adopt ing the Compute 服务 中所述。您可以配置单个顶级元数据,或者定义每个单元的元数据。
      2
      每个单元格的 secret nova-cell<X>-compute-config auto-generates。
      3
      您必须为每个与 Compute 服务相关的自定义 OpenStackDataPlaneService CR 附加 nova-cell<X>-compute-confignova-migration-ssh-key 引用。
      注意

      为 Compute 服务单元创建数据平面服务时,请查看以下注意事项:

      • 在本例中,相同的 nova-migration-ssh-key 键在单元格之间共享。但是,您应该对不同的单元使用不同的键。
      • 对于简单的配置覆盖,您不需要自定义数据平面服务。但是,要重新配置单元 cell1,st 选项是创建自定义服务和专用配置映射。
      • 单元 cell1 已使用名为 nova 及其 nova-extra-config 配置映射的默认 OpenStackDataPlaneService CR 管理。不要更改默认的 data plane 服务 nova 定义。当使用 OLM 更新 RHOSO Operator 时,这些更改将会丢失。
      • 当单元跨越多个节点集时,为自定义 OpenStackDataPlaneService 资源提供与节点集合相关的名称,如 nova-cell1-nfvnova-cell1-enterprise。然后,自动生成的配置映射命名为 nova-cell1-nfv-extra-confignova-cell1-enterprise-extra-config
      • 也支持同一单元的多个节点集合中节点的不同配置,但本指南中不阐述。
  7. 为订阅管理器创建 secret:

    $ oc create secret generic subscription-manager \
    --from-literal rhc_auth='{"login": {"username": "<subscription_manager_username>", "password": "<subscription_manager_password>"}}'
    • <subscription_manager_username& gt; 替换为适用的用户名。
    • <subscription_manager_password& gt; 替换为适用的密码。
  8. 为 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& gt; 替换为适用的用户名。
    • <registry_password& gt; 替换为适用的密码。

      注意

      您不需要在 OpenStackDataPlaneService CR 的 dataSources 字段中引用 subscription-manager secret。secret 已通过 nodeTemplate 字段中 ansibleVarsFrom 属性中的特定于节点的 OpenStackDataPlaneNodeSet CR 传递。

  9. 为每个单元创建 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: $compute 
    1
    
          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-$CELL 
    3
    
    spec:
      tlsEnabled: false 
    4
    
      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
        - telemetry 
    5
    
      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-ctlplane 
    6
    
            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 网络必须首先出现。命令仅保留 ctlplaneinternalapi 网络上的主机的 IP 地址。对其他隔离网络重复此步骤,或者手动更新生成的文件。
    3
    使用节点集名称,如 openstack-cell1、 openstack-cell2。仅为包含 Compute 节点的单元创建节点集。
    4
    如果启用了 TLS Everywhere,请将 tlsEnabled 更改为 true
    5
    如果没有使用 telemetry 服务,请从 services 列表中省略它。
    6
    网桥名称和其他 OVN 和网络服务特定值必须与源云配置匹配,以避免数据平面连接停机时间。
    7
    <bridge_mappings > 替换为您的配置中网桥映射的值,如 "datacentre:br-ctlplane "。
    8
    要配置巨页,将 &lt ;size > 替换为页面的大小。要配置多大小巨页,请在列表中创建更多项目。请注意,挂载点必须与源云配置匹配。
    注意

    在采用前,请确保在 Compute 服务节点中使用的 OpenStackDataPlaneNodeSet CR 中使用相同的 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"}
    ...
  10. 为每个 Compute 单元部署 OpenStackDataPlaneNodeSet CR:

    $ for CELL in $(echo $RENAMED_CELLS); do
    > test -f nodeset-${CELL}.yaml || continue
    > oc apply -f nodeset-${CELL}.yaml
    > done
  11. 如果将 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
    注意

    确保使用与原始 OpenStackDataPlaneNodeSet CR 相同的服务列表,但 ceph-clientceph-hci-pre 服务除外。

  12. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 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
  13. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 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。您可以在 NeutronAPI spec 中设置此配置:

    ..
    spec:
      serviceUser: neutron
       ...
          customServiceConfig: |
              [DEFAULT]
              dhcp_agent_notification = True
              [ovn]
              disable_ovn_dhcp_for_baremetal_ports = true
  14. 运行 pre-adoption 验证:

    1. 创建验证服务:

      $ oc apply -f - <<EOF
      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneService
      metadata:
        name: pre-adoption-validation
      spec:
        playbook: osp.edpm.pre_adoption_validation
      EOF
    2. 创建仅运行验证的 OpenStackDataPlaneDeployment CR:

      $ oc apply -f - <<EOF
      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneDeployment
      metadata:
        name: openstack-pre-adoption
      spec:
        nodeSets: $NODESETS
        servicesOverride:
        - pre-adoption-validation
      EOF
      注意

      如果您为不同的 OpenStackDataPlaneService CR 创建不同的迁移 SSH 密钥,则也应该为代表单元的每个节点设置或节点集定义一个单独的 OpenStackDataPlaneDeployment CR。

    3. 验证完成后,确认 Ansible EE pod 的状态为 Completed

      $ watch oc get pod -l app=openstackansibleee
      $ oc logs -l app=openstackansibleee -f --max-log-requests 20
    4. 等待部署变为 Ready 状态:

      $ oc wait --for condition=Ready openstackdataplanedeployment/openstack-pre-adoption --timeout=10m
      重要

      如果任何 openstack-pre-adoption 验证失败,您必须引用 Ansible 日志来确定哪些失败,然后尝试以下故障排除选项:

      • 如果主机名验证失败,请检查 data plane 节点的主机名是否在 OpenStackDataPlaneNodeSet CR 中正确列出。
      • 如果内核参数检查失败,请确保 OpenStackDataPlaneNodeSet CR 中的 edpm_kernel_argsedpm_kernel_hugepages 变量中的内核参数配置与您在 Red Hat OpenStack Platform (RHOSP) 17.1 节点中使用的内核参数配置相同。
      • 如果 tuned 配置集检查失败,请确保 OpenStackDataPlaneNodeSet CR 中的 edpm_tuned_profile 变量配置为使用与 RHOSP 17.1 节点上的设置相同的配置集。
  15. 删除剩余的 director Operator 服务:

    1. 创建 OpenStackDataPlaneService CR 来清理您正在使用的数据平面服务:

      $ oc apply -f - <<EOF
      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneService
      metadata:
        name: tripleo-cleanup
      spec:
        playbook: osp.edpm.tripleo_cleanup
      EOF
    2. 创建 OpenStackDataPlaneDeployment CR 以运行清理:

      $ oc apply -f - <<EOF
      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneDeployment
      metadata:
        name: tripleo-cleanup
      spec:
        nodeSets: $NODESETS
        servicesOverride:
        - tripleo-cleanup
      EOF
  16. 完成清理后,部署 OpenStackDataPlaneDeployment CR:

    $ oc apply -f - <<EOF
    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: openstack
    spec:
      nodeSets: $NODESETS
    EOF
    注意

    如果将其他节点设置为要部署的,如 Networker 节点,您可以在此步骤的 nodeSets 列表中添加它们,或者稍后创建单独的 OpenStackDataPlaneDeployment CR。您不能在部署后将新节点设置为 OpenStackDataPlaneDeployment CR。

验证

  1. 确认所有 Ansible EE pod 都到达 Completed 状态:

    $ watch oc get pod -l app=openstackansibleee
    $ oc logs -l app=openstackansibleee -f --max-log-requests 20
  2. 等待 data plane 节点设置为 Ready 状态:

    $ for CELL in $(echo $RENAMED_CELLS); do
    > oc wait --for condition=Ready osdpns/openstack-$CELL --timeout=30m
    > done
  3. 验证 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 数据平面 的步骤。

流程

  1. 等待 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 日志记录。

  2. OpenStackControlPlane CR 进行补丁,以删除 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&gt; 部分中追加以下 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> 源云中运行 ironic Compute 驱动程序的节点主机名
  3. 应用补丁文件:

    $ oc patch openstackcontrolplane openstack --type=merge --patch-file=oscp-patch.yaml
  4. 等待 Compute control plane 服务 CR 就绪:

    $ oc wait --for condition=Ready --timeout=300s Nova/nova
  5. 从 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
  6. 等待 Compute data plane 服务准备所有单元:

    $ oc wait --for condition=Ready openstackdataplanedeployments --all --timeout=5m
  7. 运行 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
  8. 在单元格中发现 Compute 主机:

    $ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose
  9. 验证现有测试虚拟机实例是否正在运行:

    ${BASH_ALIASES[openstack]} server --os-compute-api-version 2.48 show --diagnostics test 2>&1 || echo FAIL
  10. 验证 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
  11. 验证 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 网络器节点。

  1. 检查运行 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 是我们的目标主机。如果您有 ControllerNetworker 节点都运行 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 地址。

流程

  1. 为您的节点部署 OpenStackDataPlaneNodeSet CR:

    注意

    您可以重复使用为 Compute 节点指定的 OpenStackDataPlaneNodeSet CR 中的大多数 nodeTemplate 部分。您可以省略一些变量,因为 Networker 节点上运行的一组有限服务。

    $ oc apply -f - <<EOF
    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-networker
    spec:
      tlsEnabled: false 
    1
    
      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: true 
    3
    
    
            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
    1
    如果启用了 TLS Everywhere,请将 spec:tlsEnabled 更改为 true
    2
    设置为您在 Red Hat OpenStack Platform 17.1 部署中使用的相同值。
    3
    设置为 true 以在网关模式下运行 ovn-controller
  2. 在采用前,请确保在 Networker 节点中使用的 OpenStackDataPlaneNodeSet CR 中使用相同的 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 "。
  3. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 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
  4. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 neutron-dhcp

    $ oc patch openstackdataplanenodeset <networker_CR_name> --type='json' --patch='[
      {
        "op": "add",
        "path": "/spec/services/-",
        "value": "neutron-dhcp"
      }]'
  5. 为 Networker 节点运行 pre-adoption-validation 服务:

    1. 创建仅运行验证的 OpenStackDataPlaneDeployment CR:

      $ 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
    2. 验证完成后,确认 Ansible EE pod 的状态为 Completed

      $ watch oc get pod -l app=openstackansibleee
      $ oc logs -l app=openstackansibleee -f --max-log-requests 20
    3. 等待部署变为 Ready 状态:

      $ oc wait --for condition=Ready openstackdataplanedeployment/openstack-pre-adoption-networker --timeout=10m
  6. 为 Networker 节点部署 OpenStackDataPlaneDeployment CR:

    $ oc apply -f - <<EOF
    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: openstack-networker
    spec:
      nodeSets:
      - openstack-networker
    EOF
    注意

    另外,在部署主 OpenStackDataPlaneDeployment CR 前,您可以在 nodeSets 列表中包含 Networker 节点。您不能在部署后将新节点设置为 OpenStackDataPlaneDeployment CR。

  7. 清理不再运行的任何网络服务(neutron)代理。

    注意

    在某些情况下,来自被替换或停用的旧数据平面的代理保留在 RHOSO 中。提供的这些代理可能由 RHOSO 中运行的新代理提供,或者功能可能被其他组件替代。例如,可能不再需要 DHCP 代理,因为 RHOSO 中的 OVN DHCP 可以提供此功能。

    1. 列出代理:

      $ 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         |
      +--------------------------------------+------------------------------+--------------------------+-------------------+-------+-------+----------------------------+
    2. 如果列表中的任何代理在 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

验证

  1. 确认所有 Ansible EE pod 都到达 Completed 状态:

    $ watch oc get pod -l app=openstackansibleee
    $ oc logs -l app=openstackansibleee -f --max-log-requests 20
  2. 等待 data plane 节点设置为 Ready 状态:

    $ oc wait --for condition=Ready osdpns/<networker_CR_name> --timeout=30m
    • <networker_CR_name > 替换为您为 Networker 节点部署的 CR 名称,如 openstack-networker
  3. 验证 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 将数据从旧节点移到新节点,这可能需要很长时间,具体取决于所使用的存储量。要减少停机时间,如果节点正在运行,可以在等待迁移完成时继续使用其他服务,则可以使用它们。由于网络中的复制流量数量,性能可能会降低。

Object Storage 服务(swift)迁移涉及以下步骤:

  1. 将新节点添加到对象存储服务环中。
  2. 将现有节点的 weight 设置为 0。
  3. 通过移动一个副本来重新平衡环。
  4. 将 ring 复制到旧节点并重新启动服务。
  5. 检查复制状态并重复前面的两个步骤,直到旧节点排空为止。
  6. 从环中删除旧节点。

先决条件

  • 采用对象存储服务。如需更多信息,请参阅 使用对象存储服务
  • 对于 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

流程

  1. 通过将 SwiftStorage 资源从 0 扩展到 3 来添加新节点:

    $ oc patch openstackcontrolplane openstack --type=merge -p='{"spec":{"swift":{"template":{"swiftStorage":{"replicas": 3}}}}}'

    此命令在使用持久性卷声明的 Red Hat OpenShift Container Platform (RHOCP)集群上创建三个存储实例。

  2. 等待所有三个 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'
  3. 从当前的环中,获取节点的存储管理 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
  4. 排空旧节点。在以下示例中,旧节点 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'

    根据您的部署,您可能在命令中包含更多节点。

  5. 将更新的环复制到原始节点。为存储对象存储服务数据的现有节点运行 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_*"
  6. 使用 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
  7. 通过重新平衡并分发环,将下一个副本移到新节点:

    $ 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 输出,等待所有副本都找到,然后重复这个步骤,直到所有副本都移到新节点。

  8. 从环移除节点:

    $ 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 删除这个数据,但可能需要更长的时间。

验证

  1. 检查集群中的所有磁盘的磁盘用量:

    $ oc debug --keep-labels=true job/swift-ring-rebalance -- /bin/sh -c 'swift-ring-tool get && swift-recon -d'
  2. 确认节点上的 /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 集群一部分的目标节点上。

先决条件

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       |

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)依赖于 HAProxyPacemaker 部署到 Red Hat OpenStack Platform (RHOSP)环境中。对于外部 Red Hat Ceph Storage 集群,不支持 HA。

在此过程中,您将迁移 Ceph 监控组件并重新定位到释放 Controller 节点。

先决条件

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 个放置。

流程

  1. 将监控标签添加到集群中的所有 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
  2. 验证目标节点上的所有主机是否具有监控标签:

    [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
  3. 从 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
  4. 转储当前的监控堆栈规格:

    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
  5. 对于每个守护进程,编辑当前的 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 规格。

  6. 应用新的监控 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
  7. 验证守护进程是否已部署到预期的节点上:

    [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。节点导出器仍然在所有节点上运行。

  8. 检查 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
  9. 验证 grafanaalertmanagerprometheus 服务的 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 个副本,将请求重定向到不同的实例。

您可以在使用 cephfs-native 或 ceph-nfs 后端部署的共享文件系统服务(manila)时迁移 MDS 守护进程是 overcloud 部署的一部分。MDS 迁移由 cephadm 执行,您可以将守护进程放置从基于主机的方法移到基于标签的方法。这样可确保您可以使用 ceph orch host 命令视觉化集群的状态,以及放置守护进程的位置。您还可以对守护进程在给定主机上并置的一般视图,如红帽知识库文章 Red Hat Ceph Storage:支持的配置 中所述。

先决条件

流程

  1. 验证 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
  2. 检索有关 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
  3. 检查 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 客户端重新连接。

  4. 获取当前属于 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
  5. 将 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
  6. 验证所有主机是否具有 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
  7. 转储当前的 MDS 规格:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ mkdir -p ${SPEC_DIR}
    $ sudo cephadm shell -- ceph orch ls --export mds > ${SPEC_DIR}/mds
  8. 编辑检索到的 spec,并将 placement.hosts 部分替换为 placement.label

    service_type: mds
    service_id: mds
    service_name: mds.mds
    placement:
      label: mds
  9. 使用 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 守护进程的数量。

  10. 检查临时添加到 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]}]
  11. 要将 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 上部署的守护进程。
  12. 从 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。

  13. 检查故障转移和新部署的守护进程的结果:

    $ 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

对于超融合基础架构(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 管理。

先决条件

9.4.1. 迁移 Red Hat Ceph Storage RGW 后端

您必须将 Ceph 对象网关(RGW)后端从 Controller 节点迁移到 Red Hat Ceph Storage 节点。为确保将正确数量的服务分发到可用的节点,您可以使用 cephadm 标签来引用部署了给定守护进程类型的一组节点。有关卡图的更多信息,请参阅 Red Hat Ceph Storage 守护进程卡。以下流程假设您有三个目标节点 cephstorage-0cephstorage-1cephstorage-2

流程

  1. 将 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
  2. 在 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}/rgw
    networks:
    - 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存储网络

  3. placement 部分中,确保设置了 标签和 rgw_frontend_port 值:

    ---
    networks:
    - 172.17.3.0/24
    1
    
    placement:
      label: rgw 
    2
    
    service_id: rgw
    service_name: rgw.rgw
    service_type: rgw
    spec:
      rgw_frontend_port: 8090 
    3
    
      rgw_realm: default
      rgw_zone: default
      rgw_frontend_ssl_certificate: ... 
    4
    
      ssl: true
    1
    添加部署 RGW 后端的存储网络。
    2
    将 Controller 节点替换为 label: rgw 标签。
    3
    rgw_frontend_port 值更改为 8090,以避免与 Ceph ingress 守护进程冲突。
    4
    可选:如果启用了 TLS,请添加 SSL 证书和密钥串联,如 配置持久性存储 中的 为外部 Red Hat Ceph Storage 集群配置 RGW 所述。
  4. 使用编配器 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)
  5. 确保新的 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
  6. 如果在现有部署中使用了 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"
  7. 保存该文件。
  8. 重启 nftables 服务:

    $ sudo systemctl restart nftables
  9. 验证是否应用了规则:

    $ sudo nft list ruleset | grep ceph_rgw
  10. 从 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 守护进程的每个节点重复验证。

  11. 如果您将 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 > 替换为在 OpenStackControlPlane CR 中部署的服务的 Identity 服务(keystone)内部端点。如需更多信息,请参阅 使用 Identity 服务

9.4.2. 部署 Red Hat Ceph Storage ingress 守护进程

要部署 Ceph ingress 守护进程,您可以执行以下操作:

  1. 移除现有的 ceph_rgw 配置。
  2. 清理 director Operator 创建的配置。
  3. 重新部署 Object Storage 服务(swift)。

部署 ingress 守护进程时,会创建两个新容器:

  • HAProxy,用于访问后端。
  • keepalived,用于拥有虚拟 IP 地址。

您可以使用 rgw 标签将入口守护进程分发到托管 Ceph 对象网关(RGW)守护进程的节点数量。有关在节点上分发守护进程的更多信息,请参阅 Red Hat Ceph Storage 守护进程卡

完成此步骤后,您可以从 ingress 守护进程访问 RGW 后端,并通过对象存储服务 CLI 使用 RGW。

流程

  1. 登录到每个 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
  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
  3. 确认没有进程连接到端口 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'))
  4. 为 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
  5. controller-0 中创建一个名为 rgw_ingress 的文件:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ vim ${SPEC_DIR}/rgw_ingress
  6. 将以下内容粘贴到 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: ...
  7. 使用 Ceph 编配器 CLI 应用 rgw_ingress spec:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ cephadm shell -m ${SPEC_DIR}/rgw_ingress -- ceph orch apply -i /mnt/rgw_ingress
  8. 等待 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)。

流程

  1. 列出当前的 swift 端点和服务:

     $ oc rsh openstackclient openstack endpoint list | grep 'swift.*object'
     $ oc rsh openstackclient openstack service list | grep 'swift.*object'
  2. 如果服务和端点不存在,请创建缺少的 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& gt; 替换为 Ceph RGW 入口 VIP。
  3. 如果端点存在,请更新端点以指向正确的 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。
  4. 测试迁移的服务:

    $ 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

对于运行 Red Hat Ceph Storage 7 或更高版本的超融合基础架构(HCI)或专用存储节点,您必须将 Red Hat OpenStack Platform control plane 中包含的守护进程迁移到现有的外部 Red Hat Enterprise Linux (RHEL)节点。外部 RHEL 节点通常包括 HCI 环境或专用存储节点的 Compute 节点。

先决条件

您必须将 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。

流程

  1. 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 以查看主机列表。

      为每个目标节点重复此步骤。

  2. 检查规则是否已正确应用到目标节点并保留它们:

    $ sudo iptables-save
    $ sudo systemctl restart iptables
  3. 如果在现有部署中使用了 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"
  4. 保存该文件。
  5. 重启 nftables 服务:

    $ sudo systemctl restart nftables
  6. 验证是否应用了规则:

    $ sudo nft list ruleset | grep ceph_mgr
  7. 准备目标节点以托管新的 Ceph Manager 守护进程,并将 mgr 标签添加到目标节点:

    $ sudo cephadm shell -- ceph orch host label add <target_node> mgr
  8. 对托管 Ceph Manager 守护进程的每个目标节点重复步骤 1-7。
  9. 获取 Ceph Manager 规格:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ mkdir -p ${SPEC_DIR}
    $ sudo cephadm shell -- ceph orch ls --export mgr > ${SPEC_DIR}/mgr
  10. 编辑检索到的 spec,并将 label: mgr 部分添加到 placement 部分:

    service_type: mgr
    service_id: mgr
    placement:
      label: mgr
  11. 保存 spec。
  12. 使用 Ceph 编排器应用带有 cephadm 的 spec:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ sudo cephadm shell -m ${SPEC_DIR}/mgr -- ceph orch apply -i /mnt/mgr

验证

  1. 验证目标节点上是否创建了新的 Ceph Manager 守护进程:

    $ sudo cephadm shell -- ceph orch ps | grep -i mgr
    $ sudo cephadm shell -- ceph -s

    Ceph 管理器守护进程计数应当与添加 mgr 标签的主机数量匹配。

    注意

    迁移不会缩小 Ceph Manager 守护进程。计数由目标节点数量增加,并将 Ceph Monitor 守护进程迁移到 Red Hat Ceph Storage 节点停用 Ceph 管理器实例。有关更多信息,请参阅将 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 节点:

  1. 在目标节点中启用防火墙规则并保留它们。
  2. 创建一个基于标签的 spec,并使用 cephadm 应用它。
  3. 确保在迁移过程中维护 Ceph Monitor 仲裁。

流程

  1. 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 的节点的主机名。
  2. 检查规则是否已正确应用到目标节点并保留它们:

    $ sudo iptables-save
    $ sudo systemctl restart iptables
  3. 如果在现有部署中使用了 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"
  4. 保存该文件。
  5. 重启 nftables 服务:

    $ sudo systemctl restart nftables
  6. 验证是否应用了规则:

    $ sudo nft list ruleset | grep ceph_mon
  7. 要将现有的 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
  8. placement 部分添加 label:mon 部分:

    service_type: mon
    service_id: mon
    placement:
      label: mon
  9. 保存 spec。
  10. 使用 Ceph 编排器应用带有 cephadm 的 spec:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ sudo cephadm shell -m ${SPEC_DIR}/mon -- ceph orch apply -i /mnt/mon
  11. 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
    注意

    应用 mon spec 允许现有策略 使用标签,而不是主机 。因此,任何具有 mon 标签的节点都可以托管 Ceph Monitor 守护进程。仅执行此步骤一次,以避免在迁移多个 Ceph monitor 时进行多次迭代。

  12. 检查 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
  13. 在剩余的流程过程中使用的第一个 Controller 节点设置 Ceph 客户端,以便与 Red Hat Ceph Storage 交互。在存储网络上设置一个额外的 IP 地址,在第一个 Controller 节点停用时用于与 Red Hat Ceph Storage 交互:

    1. 备份 ceph_client_backup 目录中 /etc/ceph 的内容。

      $ mkdir -p $HOME/ceph_client_backup
      $ sudo cp -R /etc/ceph/* $HOME/ceph_client_backup
    2. 在属于存储网络的 VLAN 上的 IP 地址后,编辑 /etc/os-net-config/config.yaml 和 add - ip_netmask: 172.17.3.200。将 172.17.3.200 替换为存储网络上的任何其他可用 IP 地址,这些 IP 地址可静态分配给 controller-0
    3. 保存文件并刷新 controller-0 网络配置:

      $ sudo os-net-config -c /etc/os-net-config/config.yaml
    4. 验证 Controller 节点中是否存在 IP 地址:

      $ ip -o a | grep 172.17.3.200
    5. Ping IP 地址,并确认它可以访问:

      $ ping -c 3 172.17.3.200
    6. 验证您可以与 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 集群中删除源节点主机。

流程

  1. 在源节点上,备份 /etc/ceph/ 目录,以运行 cephadm,并从源节点获取 Red Hat Ceph Storage 集群的 shell:

    $ mkdir -p $HOME/ceph_client_backup
    $ sudo cp -R /etc/ceph $HOME/ceph_client_backup
  2. 确定活跃的 ceph-mgr 实例:

    $ sudo cephadm shell -- ceph mgr stat
  3. 如果 ceph-mgr 在源节点上活跃,则失败:

    $ sudo cephadm shell -- ceph mgr fail <mgr_instance>
    • <mgr_instance > 替换为 Ceph Manager 守护进程失败。
  4. cephadm shell 中,删除源节点上的标签:

    $ for label in mon mgr _admin; do
        sudo cephadm shell -- ceph orch host label rm <source_node> $label;
    done
    • <source_node > 替换为源节点的主机名。
  5. 可选:如果 Ceph Monitor 守护进程仍在运行,请确保从源节点中删除 Ceph Monitor 守护进程:

    $ sudo cephadm shell -- ceph orch daemon rm mon.<source_node> --force
  6. 排空源节点以删除所有剩余的守护进程:

    $ sudo cephadm shell -- ceph orch host drain <source_node>
  7. 从 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 数据,请联系红帽支持。

  8. 确认 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 管理。

流程

  1. 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]
  2. 将上一步中检索到的 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
  3. 确认位于源节点上的 /etc/ os-net-config 目录中的 os-net-config 配置中存在 Ceph Monitor IP 地址:

    [tripleo-admin@controller-0 ~]$ grep "172.17.3.60" /etc/os-net-config/config.yaml
        - ip_netmask: 172.17.3.60/24
  4. 编辑 /etc/os-net-config/config.yaml 文件并删除 ip_netmask 行。
  5. 保存文件并刷新节点网络配置:

    $ sudo os-net-config -c /etc/os-net-config/config.yaml
  6. 验证源节点中不存在 IP 地址,例如:

    [controller-0]$ ip -o a | grep 172.17.3.60
  7. SSH 到目标节点,如 cephstorage-0,再为新 Ceph 监控器添加 IP 地址。
  8. 在目标节点上,编辑 /etc/os-net-config/config.yaml,并添加您在源节点中删除的 ip_netmask: 172.17.3.60 行。
  9. 保存文件并刷新节点网络配置:

    $ sudo os-net-config -c /etc/os-net-config/config.yaml
  10. 验证目标节点中是否存在 IP 地址。

    $ ip -o a | grep 172.17.3.60
  11. 从 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。

流程

  1. 从 Ceph 客户端节点(如 controller-0 )获取 Ceph mon spec:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ sudo cephadm shell -- ceph orch ls --export mon > ${SPEC_DIR}/mon
  2. 编辑检索到的 spec,并添加 unmanaged: true 关键字:

    service_type: mon
    service_id: mon
    placement:
      label: mon
    unmanaged: true
  3. 保存 spec。
  4. 使用 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 地址。

  5. 删除目标节点上现有的 Ceph Monitor:

    $ sudo cephadm shell -- ceph orch daemon rm mon.<target_node> --force
    • <target_node > 替换为 Red Hat Ceph Storage 集群中包含的目标节点的主机名。
  6. 使用迁移的 IP 地址在目标节点上重新部署新的 Ceph Monitor:

    $ sudo cephadm shell -- ceph orch daemon add mon <target_node>:<ip_address>
    • <ip_address > 替换为迁移的 IP 地址的 IP 地址。
  7. 获取 Ceph Monitor 规格:

    $ SPEC_DIR=${SPEC_DIR:-"$PWD/ceph_specs"}
    $ sudo cephadm shell -- ceph orch ls --export mon > ${SPEC_DIR}/mon
  8. 编辑检索到的 spec,并将 unmanaged 关键字设置为 false

    service_type: mon
    service_id: mon
    placement:
      label: mon
    unmanaged: false
  9. 保存 spec。
  10. 使用 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 地址的目标节点上运行。

  11. 确定正在运行的 mgr

    $ sudo cephadm shell -- ceph mgr stat
  12. 通过强制失败来刷新 Ceph Manager 信息:

    $ sudo cephadm shell -- ceph mgr fail
  13. 刷新 OSD 信息:

    $ sudo cephadm shell -- ceph orch reconfig osd.default_drive_group

将 Ceph Monitor 守护进程迁移到目标节点后,验证 Red Hat Ceph Storage 集群是否正常运行。

流程

  1. 验证 Red Hat Ceph Storage 集群是否健康:

    $ ceph -s
      cluster:
        id:     f6ec3ebe-26f7-56c8-985d-eb974e8e08e3
        health: HEALTH_OK
    ...
    ...
  2. 验证 Red Hat Ceph Storage mons 是否使用旧 IP 地址运行。SSH 到目标节点,并验证 Ceph 监控守护进程是否已绑定到预期的 IP 和端口:

    $ netstat -tulpn | grep 3300

如果 Ceph 控制面板是启用的 Ceph Manager 模块的一部分,您需要重新配置故障转移设置。

流程

  1. 重新生成以下 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}'
  2. 对于每个检索到的 mgr 守护进程,更新 Red Hat Ceph Storage 配置中的对应条目:

    $ ceph config set mgr mgr/dashboard/<>/server_addr/<ip addr>

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部