部署分布式 Compute 节点(DCN)架构


Red Hat OpenStack Services on OpenShift 18.0

Openshift 上 Red Hat OpenStack Services 的边缘和存储配置

OpenStack Documentation Team

摘要

您可以使用位于远程位置的边缘站点的分布式计算节点(DCN)架构在 OpenShift (RHOSO)上部署 Red Hat OpenStack Services。每个站点都可以具有自己的用于镜像服务的 Red Hat Ceph Storage 后端(glance)。

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。

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

第 1 章 了解 DCN

注意

目前,分布式 Compute 节点(DCN)部署不支持从 Red Hat OpenStack Platform (RHOSP) 17.1 升级到 OpenShift (RHOSO) 18.0.3 上的 Red Hat OpenStack Services。

分布式计算节点(DCN)架构适用于需要远程部署计算和存储节点的边缘用例,同时共享集中式 control plane。使用 DCN 架构,您可以战略性地将工作负载定位到操作需求,以获得更高的性能。

中央位置至少由 Red Hat OpenShift Container Platform (RHOCP)集群上安装的 RHOSO control plane 组成。Compute 节点也可以部署到中央位置。边缘位置由 Compute 和可选的存储节点组成。

DCN 架构由多个可用区(AZ)组成,以确保 OpenStack 资源的每站点调度进行隔离。

您使用唯一的 AZ 配置每个站点。在本指南中,中央站点使用 az0,第一个边缘位置使用 az1 等等。您可以使用任何命名约定来确保 AZ 名称在每个站点都是唯一的。

DCN 架构是一个 hub 和spoke 的路由网络部署。DCN 与用于路由置备和使用 RHOSO 的控制平面网络的 spine-leaf 部署相当。

  • hub 是带有核心路由器和数据中心网关(DC-GW)的中央站点。hub 托管管理地理位置分散的站点的 control plane。
  • spoke 是远程边缘站点。每个站点通过使用 OpenStackDataPlaneNodeSet 自定义资源定义。Red Hat Ceph Storage (RHCS)用作存储后端。您可以在超融合配置中或独立存储后端部署 RHCS。
489 OpenStack edge 0825

当您在边缘站点启动实例时,所需的镜像会自动复制到本地镜像服务(glance)存储中。您可以使用 glance 多存储在实例启动期间节省时间,从而将镜像从中央镜像存储复制到边缘站点。

1.1. DCN 架构所需的软件

下表显示了在分布式计算节点(DCN)架构中部署 Red Hat OpenStack Services (RHOSO)所需的软件和最低版本:

Expand
平台版本选填

Red Hat OpenShift Container Platform

4.16

Red Hat Enterprise Linux

9.2

Red Hat OpenStack Platform

18.0.3

Red Hat Ceph Storage

7 或 8

1.2. DCN 存储

您可以在三个配置之一中部署中央位置或任何边缘站点:

  • 没有存储。
  • 使用超融合 Ceph 存储.
  • 使用 Red Hat Ceph Storage (RHCS)作为独立存储后端。

您部署的存储专用于部署它的站点。DCN 架构使用镜像服务(glance) pod 和每个站点(部署在 Red Hat OpenShift Container Platform (RHOCP)集群上的中央位置部署的块存储服务(cinder) pod。

对于在没有存储的情况下部署的边缘站点,您可以使用 aggregate cache 命令将镜像存储在计算服务(nova)缓存中。通过避免通过 WAN 链接下载镜像的过程,计算服务中的缓存镜像为实例提供更快的引导时间。

示例:

$ openstack aggregate cache image <dcn0> <myimage>
  • <dcn0 > 替换为您的可用区的名称。
  • <myimage > 替换为您的镜像的名称。
注意

Red Hat OpenStack Services on OpenShift (RHOSO)支持外部部署 Red Hat Ceph Storage 7 和 8。引用 Red Hat Ceph Storage 的配置示例使用版本 7 信息。如果您使用 Red Hat Ceph Storage 8,请相应地调整配置示例。

第 2 章 规划分布式 Compute 节点(DCN)部署

在规划 DCN 架构时,请检查您需要的技术是否可用并提供支持。

2.1. DCN 架构上的存储注意事项

与更常见的架构相比,附加到带有分布式计算节点(DCN)架构的 Red Hat OpenStack Services (RHOSO)部署的存储具有特定的功能和支持差异。

DCN 架构目前不支持以下功能:

  • 在边缘站点间复制卷。您可以通过从卷创建镜像并使用镜像服务(glance)来复制镜像来解决此问题。复制镜像后,您可以从其中创建卷。
  • 边缘站点上的 Ceph Rados 网关(RGW)。
  • 边缘站点上的 CephFS。
  • 边缘站点的实例高可用性(HA)。
  • 边缘站点之间的 RBD 镜像功能。
  • 实例迁移、实时或冷迁移,可以在边缘站点之间,或者从中央位置到边缘站点。您只能迁移站点边界中的实例。要在站点之间移动镜像,必须对镜像进行快照,并使用 glance image-import

另外,您必须考虑以下几点:

  • 在将镜像复制到边缘站点之前,您必须将镜像上传到中央位置。每个镜像的副本必须存在于中央位置的镜像服务中。
  • 您必须将 RBD 存储驱动程序用于镜像、计算和块存储服务。
  • 对于每个站点,包括中央位置,分配一个唯一的可用区。
  • 您可以将离线卷从边缘站点迁移到中央位置,反之亦然。您无法直接在边缘站点之间迁移卷。

2.2. DCN 架构上的网络的注意事项

与更常见的架构相比,带有分布式计算节点(DCN)架构的 RHOSO 部署具有特定的特性和支持差异。

DCN 架构目前不支持以下功能:

  • DPDK 节点上的 DHCP
  • TC Flower Hardware Offload

以下 ML2/OVN 网络技术被完全支持:

  • 路由提供商网络
  • 支持 Neutron AZ 的 OVN GW (网络节点)

另外,您必须考虑以下几点:

  • 网络延迟:平衡往返时间(RTT)的延迟,以及预期的并发 API 操作数,以保持可接受的性能。最大 TCP/IP 吞吐量与 RTT 相反。您可以通过调整内核 TCP 参数来缓解高带宽的高延迟连接的问题。如果跨站点通信超过 100 毫秒,请联系红帽支持团队。
  • Network outs: 如果边缘站点临时丢失与中央站点的连接,则在中断期间,不会在受影响的边缘站点执行 control plane API 或 CLI 操作。例如,边缘站点中的 Compute 节点无法创建实例的快照、签发身份验证令牌或删除镜像。常规 control plane API 和 CLI 操作在此中断期间仍然可以正常工作,并可继续提供具有工作连接的其他边缘站点。
  • Image type:在部署带有 Ceph 存储的 DCN 架构时,您必须使用 raw 镜像。
  • 镜像大小:

    • 计算镜像:计算镜像从中央位置下载。在置备过程中,这些镜像可能是在所有必要的网络中传输的大型文件,从中央站点传输到边缘站点。
    • 实例镜像:如果边缘没有块存储,则镜像服务镜像会先遍历 WAN。镜像在本地复制或缓存到目标边缘节点,供以后使用。镜像没有大小限制。传输时间因可用带宽和网络延迟而异。
  • 提供商网络是 DCN 部署的最常见方法。请注意,网络服务(neutron)不会验证您可以在何处附加可用网络。例如,如果您在边缘站点 A 中使用名为"site-a"的提供商网络,网络服务不会验证并防止您将 "site-a" 附加到站点 B 中的实例,这不起作用。
  • 特定于站点的网络:如果您使用特定于某个站点的网络,则 DCN 网络中的一个限制:当您使用 Compute 节点部署集中式 neutron 控制器时,网络服务中没有触发器将特定的 Compute 节点识别为远程节点。因此,Compute 节点接收其他 Compute 节点列表,并互相自动形成隧道。隧道通过中央站点从边缘到边缘。如果您使用 VXLAN 或 GENEVE,则每个站点中的每个 Compute 节点都会形成一个隧道,无论是本地的还是远程的。如果您在任何地方使用相同的网络,则这不是问题。使用 VLAN 时,网络服务要求所有 Compute 节点都有相同的网桥映射,并且所有 VLAN 都位于每个站点。
  • 如果没有预置备边缘服务器,您必须配置 DHCP 转发,以便在路由片段上内省和调配。
  • 路由必须在云或将每个边缘站点连接到 hub 的网络基础架构中配置。您应该实施一个网络设计,用于为每个 RHOSO 集群网络(外部、内部 API 等)分配 L3 子网,每个站点都是唯一的。如果使用 BGP,您必须在这些位置的路由器上配置 BGP,以了解 RHOSO control plane 和数据平面节点公告的路由。

2.3. internalapi 网络的 IP Address 池大小

Image service operator 为每个镜像服务 pod 创建一个端点,并带有自己的 DNS 名称,如 glance-az0-internal.openstack.svc:9292。每个可用区中的每个 Compute 服务和块存储服务都使用同一可用区中的镜像服务(glance) API 服务器。例如,当您更新 OpenStackControlPlane 自定义资源(CR)中的 cinderVolumes 字段时,在 customServiceConfig 下添加名为 glance_api_servers 的字段:

      cinderVolumes:
        az0:
          customServiceConfig: |
            [DEFAULT]
            enabled_backends = az0
            glance_api_servers = https://glance-az0-internal.openstack.svc:9292

镜像服务端点 DNS 名称映射到 internalapi 地址池中的负载均衡器 IP 地址,如内部元数据注解所示:

            [glance_store]
            default_backend = ceph
            [ceph]
            rbd_store_ceph_conf = /etc/ceph/ceph.conf
            store_description = "ceph RBD backend"
            rbd_store_pool = images
            rbd_store_user = openstack
            rbd_thin_provisioning = True
          networkAttachments:
          - storage
          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

此地址池中的地址范围应该根据 DCN 站点的数量进行大小。例如,下面显示了 internalapi 网络中有 10 个可用地址。

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

在更新 OpenStackControlPlane CR 的 glance 部分后,使用以下命令确认 Glance Operator 已创建了服务端点和路由。

$ oc get svc | grep glance
glance-az0-internal             LoadBalancer   172.30.217.178   172.17.0.80      9292:32134/TCP                                   24h
glance-az0-public               ClusterIP      172.30.78.47     <none>           9292/TCP                                         24h
glance-az1-internal             LoadBalancer   172.30.52.123    172.17.0.81      9292:31679/TCP                                   23h
glance-c1ca8-az0-external-api   ClusterIP      None             <none>           9292/TCP                                         24h
glance-c1ca8-az0-internal-api   ClusterIP      None             <none>           9292/TCP                                         24h
glance-c1ca8-az1-edge-api       ClusterIP      None             <none>           9292/TCP                                         23h

$ oc get route | grep glance
glance-az0-public              glance-az0-public-openstack.apps.ocp.openstack.lab                     glance-az0-public              glance-az0-public              reencrypt/Redirect   None
glance-default-public          glance-default-public-openstack.apps.ocp.openstack.lab                 glance-default-public          glance-default-public          reencrypt/Redirect   None

第 3 章 安装和准备 Operator

您可以在 OpenShift (RHOSO) OpenStack Operator (openstack-operator)上安装 Red Hat OpenStack Services,并在可正常工作的 Red Hat OpenShift Container Platform (RHOCP)集群上创建 RHOSO 控制平面。您可以使用 RHOCP Web 控制台安装 OpenStack Operator。您可以在可访问 RHOCP 集群的工作站上执行 control plane 安装任务和所有数据平面创建任务。

有关将 RHOSO 版本映射到 OpenStack Operator 和 OpenStackVersion 自定义资源(CR)的信息,请参阅红帽知识库文章 https://access.redhat.com/articles/7125383

3.1. 先决条件

  • 一个可正常工作的 RHOCP 集群,版本 4.18。有关 RHOCP 系统要求,请参阅规划部署 中的 Red Hat OpenShift Container Platform 集群要求

  • oc 命令行工具已安装在您的工作站上。
  • 以具有 cluster-admin 权限的用户身份登录 RHOCP 集群。

3.2. 安装 OpenStack Operator

您可以在 Red Hat OpenShift Container Platform (RHOCP) Web 控制台上使用 OperatorHub 在 RHOCP 集群上安装 OpenStack Operator (openstack-operator)。安装 Operator 后,您可以配置 OpenStack Operator 初始化资源的单一实例来在集群中启动 OpenStack Operator。

流程

  1. 以具有 cluster-admin 权限的用户身份登录 RHOCP Web 控制台。
  2. 选择 Operators → OperatorHub
  3. Filter by keyword 字段中,键入 OpenStack
  4. 点带有 Red Hat source 标签的 OpenStack Operator 标题。
  5. 阅读 Operator 信息并单击 Install
  6. Install Operator 页面中,从 Installed Namespace 列表中选择 "Operator recommended Namespace: openstack-operators"。
  7. Install Operator 页面中,从 Update approval 列表中选择 "Manual"。有关如何手动批准待处理的 Operator 更新的详情,请参考 RHOCP Operator 指南中的手动批准待处理的 Operator 更新
  8. Install 使 Operator 可供 openstack-operators 命名空间使用。当 StatusSucceeded 时,会安装 OpenStack Operator。
  9. 单击 Create OpenStack 以打开 Create OpenStack 页面。
  10. Create OpenStack 页面中,点 Create 来创建 OpenStack Operator 初始化资源的实例。当 openstack 实例的 StatusConditions: Ready 时,OpenStack Operator 已就绪。

第 4 章 部署 DCN control plane

要使用分布式计算节点(DCN)架构在 OpenShift (RHOSO)上部署 Red Hat OpenStack Services,您需要从安装 Red Hat OpenShift Container Platform (RHOCP)开始并安装 RHOSO control plane。有关准备 RHOSO control plane 的详细信息,请参阅在 OpenShift 上为 Red Hat OpenStack Services 准备 Red Hat OpenShift Container Platform

在部署 control plane 之前,还必须配置 RHOCP 网络。RHOSO 的 DCN 部署需要管理大量子网。您使用的子网特定于您的环境。本文档在每个示例中都使用以下配置。

Expand
 中央位置(AZ-0)AZ-1AZ-2

Control plane(控制平面)

192.168.122.0/24

192.168.133.0/24

192.168.144.0/24

外部

10.0.0.0/24

10.0.10.0/24

10.0.20.0/24

内部

172.17.0.0/24

172.17.10.0/24

172.17.20.0/24

Storage

172.18.0.0/24

172.18.10.0/24

172.18.20.0/24

租户

172.19.0.0/24

172.19.10.0/24

172.19.20.0/24

存储管理

172.20.0.0/24

172.20.10.0/24

172.20.20.0/24

4.1. 为 DCN 创建 spine-leaf 网络拓扑

分布式计算节点(DCN)架构中的地理分布式节点通过路由 spine-leaf 网络拓扑进行互连。

您必须配置以下 CR:

NodeNetworkConfigurationPolicy
使用 NodeNetworkConfigurationPolicy CR 在 RHOCP 集群中每个 worker 节点上为每个隔离网络配置接口。
NetworkAttachmentDefinition
根据需要,使用 NetworkAttachmentDefinition CR 将服务 pod 附加到隔离的网络中。
L2Advertisement
使用 L2Advertisement 资源来定义如何宣布虚拟 IP (VIP)。
IPAddressPool
使用 IPAddressPool 资源来配置哪些 IP 可用作 VIP。
NetConfig
使用 NetConfig CR 指定 data plane 网络的子网。
OpenStackControlPlane
使用 OpenStackControlPlane 在 OpenShift 中定义和配置 OpenStack 服务。

4.2. 准备 DCN 网络

当您部署分布式计算节点架构时,您首先部署中央位置 control plane。Red Hat OpenStack Services on OpenShift (RHOSO)服务作为 Red Hat OpenShift Container Platform (RHOCP)工作负载运行。

先决条件

  • 已安装 OpenStack Operator

流程

  1. 在工作站上为托管 OpenStack 服务的每个 worker 节点创建一个 NodeNetworkConfigurationPolicy (nncp) CR 定义文件。
  2. 在每个 nncp CR 文件中,为每个隔离网络配置接口。每个服务接口必须具有自己的唯一地址:

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      labels:
        osp/nncm-config-type: standard
      name: worker-0
      namespace: openstack
    spec:
      desiredState:
        dns-resolver:
          config:
            search: []
            server:
            - 192.168.122.1
        interfaces:
        - description: internalapi vlan interface
          ipv4:
            address:
            - ip: 172.17.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: internalapi
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "20"
        - description: storage vlan interface
          ipv4:
            address:
            - ip: 172.18.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: storage
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "21"
        - description: tenant vlan interface
          ipv4:
            address:
            - ip: 172.19.0.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1496
          name: tenant
          state: up
          type: vlan
          vlan:
            base-iface: enp7s0
            id: "22"
        - description: ctlplane interface
          mtu: 1500
          name: enp7s0
          state: up
          type: ethernet
        - bridge:
            options:
              stp:
                enabled: false
            port:
            - name: enp7s0
              vlan: {}
          description: linux-bridge over ctlplane interface
          ipv4:
            address:
            - ip: 192.168.122.10
              prefix-length: "24"
            dhcp: false
            enabled: true
          ipv6:
            enabled: false
          mtu: 1500
          name: ospbr
          state: up
          type: linux-bridge
  3. route-rules 属性和路由配置添加到每个远程位置中的网络到每个 nncp CR 文件:

        route-rules:
          config: []
        routes:
          config:
          - destination: 192.168.133.0/24
            next-hop-address: 192.168.122.1
            next-hop-interface: ospbr
            table-id: 254
          - destination: 192.168.144.0/24
            next-hop-address: 192.168.122.1
            next-hop-interface: ospbr
            table-id: 254
          - destination: 172.17.10.0/24
            next-hop-address: 172.17.0.1
            next-hop-interface: internalapi
            table-id: 254
          - destination: 172.18.10.0/24
            next-hop-address: 172.18.0.1
            next-hop-interface: storage
            table-id: 254
          - destination: 172.19.10.0/24
            next-hop-address: 172.19.0.1
            next-hop-interface: tenant
            table-id: 254
          - destination: 172.17.20.0/24
            next-hop-address: 172.17.0.1
            next-hop-interface: internalapi
            table-id: 254
          - destination: 172.18.20.0/24
            next-hop-address: 172.18.0.1
            next-hop-interface: storage
            table-id: 254
          - destination: 172.19.20.0/24
            next-hop-address: 172.19.0.1
            next-hop-interface: tenant
            table-id: 254
      nodeSelector:
        kubernetes.io/hostname: worker-0
        node-role.kubernetes.io/worker: ""
    注意

    每个服务网络会路由到每个远程位置的同一网络。例如,internapi 网络(172.17.0.0/24)通过 172.17.0.1 的本地路由器在每个远程位置(172.17.10.0/24 和 172.17.20.0/24)上到 internalapi 网络的路由。

  4. 在集群中创建 nncp CR:

    $ oc create -f worker0-nncp.yaml
    $ oc create -f worker1-nncp.yaml
    $ oc create -f worker2-nncp.yaml
  5. 为每个网络创建一个 NetworkAttachmentDefinition CR 定义文件。包括到同一功能网络的每个远程位置的路由。例如,internalapi NetworkAttachmentDefinition 指定自己的子网范围,以及远程站点上的 internalapi 网络的路由。

    1. internalapi 网络创建 NetworkAttachmentDefinition CR 定义文件:

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: internalapi
          osp/net-attach-def-type: standard
        name: internalapi
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "internalapi",
            "type": "macvlan",
            "master": "internalapi",
            "ipam": {
              "type": "whereabouts",
              "range": "172.17.0.0/24",
              "range_start": "172.17.0.30",
              "range_end": "172.17.0.70",
              "routes": [
                  { "dst": "172.17.10.0/24", "gw": "172.17.0.1" },
                  { "dst": "172.17.20.0/24", "gw": "172.17.0.1" }
                ]
            }
          }
    2. 为控制网络创建 NetworkAttachmentDefinition CR 定义文件:

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: ctlplane
          osp/net-attach-def-type: standard
        name: ctlplane
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "ctlplane",
            "type": "macvlan",
            "master": "ospbr",
            "ipam": {
              "type": "whereabouts",
              "range": "192.168.122.0/24",
              "range_start": "192.168.122.30",
              "range_end": "192.168.122.70",
              "routes": [
                  { "dst": "192.168.133.0/24", "gw": "192.168.122.1" },
                  { "dst": "192.168.144.0/24", "gw": "192.168.122.1" }
                ]
            }
          }
    3. 为存储网络创建 NetworkAttachmentDefinition CR 定义文件:

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: storage
          osp/net-attach-def-type: standard
        name: storage
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "storage",
            "type": "macvlan",
            "master": "storage",
            "ipam": {
              "type": "whereabouts",
              "range": "172.18.0.0/24",
              "range_start": "172.18.0.30",
              "range_end": "172.18.0.70",
              "routes": [
                  { "dst": "172.18.10.0/24", "gw": "172.18.0.1" },
                  { "dst": "172.18.20.0/24", "gw": "172.18.0.1" }
                ]
            }
          }
    4. 租户网络 创建 NetworkAttachmentDefinition CR 定义文件:

      apiVersion: k8s.cni.cncf.io/v1
      kind: NetworkAttachmentDefinition
      metadata:
        labels:
          osp/net: tenant
          osp/net-attach-def-type: standard
        name: tenant
        namespace: openstack
      spec:
        config: |
          {
            "cniVersion": "0.3.1",
            "name": "tenant",
            "type": "macvlan",
            "master": "tenant",
            "ipam": {
              "type": "whereabouts",
              "range": "172.19.0.0/24",
              "range_start": "172.19.0.30",
              "range_end": "172.19.0.70",
              "routes": [
                  { "dst": "172.19.10.0/24", "gw": "172.19.0.1" },
                  { "dst": "172.19.20.0/24", "gw": "172.19.0.1" }
                ]
            }
          }
  6. 创建 NetworkAttachmentDefinition CR:

    $ oc create -f internalapi-net-attach-def.yaml
    $ oc create -f control-net-attach-def.yaml
    $ oc create -f storage-net-attach-def.yaml
    $ oc create -f tenant-net-attach-def.yaml
  7. 创建 NetConfig CR 定义文件,以定义哪些 IP 可用作虚拟 IP (VIP)。在 dnsDomain 字段下定义的每个网络,每个地理位置的 allocationRanges 都有 allocationRanges。这些范围不能与abouts IPAM 范围 的位置重叠。

    1. 使用为 control plane 网络添加的分配范围创建该文件,如下所示:

      apiVersion: network.openstack.org/v1beta1
      kind: NetConfig
      metadata:
        name: netconfig
        namespace: openstack
      spec:
        networks:
        - dnsDomain: ctlplane.example.com
          mtu: 1500
          name: ctlplane
          subnets:
          - allocationRanges:
            - end: 192.168.122.120
              start: 192.168.122.100
            - end: 192.168.122.170
              start: 192.168.122.150
            cidr: 192.168.122.0/24
            gateway: 192.168.122.1
            name: subnet1
            routes:
            - destination: 192.168.133.0/24
              nexthop: 192.168.122.1
            - destination: 192.168.144.0/24
              nexthop: 192.168.122.1
          - allocationRanges:
            - end: 192.168.133.120
              start: 192.168.133.100
            - end: 192.168.133.170
              start: 192.168.133.150
            cidr: 192.168.133.0/24
            gateway: 192.168.133.1
            name: subnet2
            routes:
            - destination: 192.168.122.0/24
              nexthop: 192.168.133.1
            - destination: 192.168.144.0/24
              nexthop: 192.168.133.1
          - allocationRanges:
            - end: 192.168.144.120
              start: 192.168.144.100
            - end: 192.168.144.170
              start: 192.168.144.150
            cidr: 192.168.144.0/24
            gateway: 192.168.144.1
            name: subnet3
            routes:
            - destination: 192.168.122.0/24
              nexthop: 192.168.144.1
            - destination: 192.168.133.0/24
              nexthop: 192.168.144.1
    2. internalapi 网络添加分配范围:

        - dnsDomain: internalapi.example.com
          mtu: 1496
          name: internalapi
          subnets:
          - allocationRanges:
            - end: 172.17.0.250
              start: 172.17.0.100
            cidr: 172.17.0.0/24
            name: subnet1
            routes:
            - destination: 172.17.10.0/24
              nexthop: 172.17.0.1
            - destination: 172.17.20.0/24
              nexthop: 172.17.0.1
            vlan: 20
          - allocationRanges:
            - end: 172.17.10.250
              start: 172.17.10.100
            cidr: 172.17.0.0/24
            name: subnet2
            routes:
            - destination: 172.17.0.0/24
              nexthop: 172.17.10.1
            - destination: 172.17.20.0/24
              nexthop: 172.17.10.1
            vlan: 30
          - allocationRanges:
            - end: 172.17.20.250
              start: 172.17.20.100
            cidr: 172.17.20.0/24
            name: subnet3
            routes:
            - destination: 172.17.0.0/24
              nexthop: 172.17.20.1
            - destination: 172.17.10.0/24
              nexthop: 172.17.20.1
            vlan: 40
    3. 为外部网络添加分配范围:

        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.0.250
              start: 10.0.0.100
            cidr: 10.0.0.0/24
            name: subnet1
            vlan: 22
        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.10.250
              start: 10.0.10.100
            cidr: 10.0.10.0/24
            name: subnet2
            vlan: 22
        - dnsDomain: external.example.com
          mtu: 1500
          name: external
          subnets:
          - allocationRanges:
            - end: 10.0.20.250
              start: 10.0.20.100
            cidr: 10.0.20.0/24
            name: subnet3
            vlan: 22
        - dnsDomain: storage.example.com
          mtu: 1496
          name: storage
          subnets:
          - allocationRanges:
            - end: 172.18.0.250
              start: 172.18.0.100
            cidr: 172.18.0.0/24
            name: subnet1
            routes:
            - destination: 172.18.10.0/24
              nexthop: 172.18.0.1
            - destination: 172.18.20.0/24
              nexthop: 172.18.0.1
            vlan: 21
          - allocationRanges:
            - end: 172.18.10.250
              start: 172.18.10.100
            cidr: 172.18.10.0/24
            name: subnet2
            routes:
            - destination: 172.18.0.0/24
              nexthop: 172.18.10.1
            - destination: 172.18.20.0/24
              nexthop: 172.18.10.1
            vlan: 31
          - allocationRanges:
            - end: 172.18.20.250
              start: 172.18.20.100
            cidr: 172.18.20.0/24
            name: subnet3
            routes:
            - destination: 172.18.0.0/24
              nexthop: 172.18.20.1
            - destination: 172.18.10.0/24
              nexthop: 172.18.20.1
            vlan: 41
    4. 租户网络 添加分配范围:

        - dnsDomain: tenant.example.com
          mtu: 1496
          name: tenant
          subnets:
          - allocationRanges:
            - end: 172.19.0.250
              start: 172.19.0.100
            cidr: 172.19.0.0/24
            name: subnet1
            routes:
            - destination: 172.19.10.0/24
              nexthop: 172.19.0.1
            - destination: 172.19.20.0/24
              nexthop: 172.19.0.1
            vlan: 22
          - allocationRanges:
            - end: 172.19.10.250
              start: 172.19.10.100
            cidr: 172.19.10.0/24
            name: subnet2
            routes:
            - destination: 172.19.0.0/24
              nexthop: 172.19.10.1
            - destination: 172.19.20.0/24
              nexthop: 172.19.10.1
            vlan: 32
          - allocationRanges:
            - end: 172.19.20.250
              start: 172.19.20.100
            cidr: 172.19.20.0/24
            name: subnet3
            routes:
            - destination: 172.19.0.0/24
              nexthop: 172.19.20.1
            - destination: 172.19.10.0/24
              nexthop: 172.19.20.1
            vlan: 42
    5. storagemgmt 网络添加分配范围:

        - dnsDomain: storagemgmt.example.com
          mtu: 1500
          name: storagemgmt
          subnets:
          - allocationRanges:
            - end: 172.20.0.250
              start: 172.20.0.100
            cidr: 172.20.0.0/24
            name: subnet1
            routes:
            - destination: 172.20.10.0/24
              nexthop: 172.20.0.1
            - destination: 172.20.20.0/24
              nexthop: 172.20.0.1
            vlan: 23
          - allocationRanges:
            - end: 172.20.10.250
              start: 172.20.10.100
            cidr: 172.20.10.0/24
            name: subnet2
            routes:
            - destination: 172.20.0.0/24
              nexthop: 172.20.10.1
            - destination: 172.20.20.0/24
              nexthop: 172.20.10.1
            vlan: 33
          - allocationRanges:
            - end: 172.20.20.250
              start: 172.20.20.100
            cidr: 172.20.20.0/24
            name: subnet3
            routes:
            - destination: 172.20.0.0/24
              nexthop: 172.20.20.1
            - destination: 172.20.10.0/24
              nexthop: 172.20.20.1
            vlan: 43
  8. 创建 NetConfig CR:

    oc create -f netconfig

4.3. 创建 DCN control plane

OpenShift (RHOSO)控制平面上的 Red Hat OpenStack Services 包含用于管理云的 RHOSO 服务。RHOSO 服务作为 Red Hat OpenShift Container Platform (RHOCP)工作负载运行。

先决条件

  • 已安装 OpenStack Operator (openstack-operator)。
  • RHOCP 集群为 RHOSO 网络做好准备。
  • RHOCP 集群没有配置任何防止 openstack-operators 命名空间和 control plane 命名空间(默认 openstack)之间的通信的网络策略。使用以下命令检查集群中的现有网络策略:

    $ oc get networkpolicy -n openstack
  • 以具有 cluster-admin 权限的用户身份登录到可访问 RHOCP 集群的工作站。

流程

  1. 在工作站上创建一个名为 openstack_control_plane.yaml 的文件,以定义 OpenStackControlPlane CR:

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
      namespace: openstack
  2. 使用 spec 字段指定您创建的 Secret CR 来提供对 pod 的安全访问,以及您为 Red Hat OpenShift Container Platform (RHOCP)集群存储后端创建的 storageClass

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    metadata:
      name: openstack-control-plane
      namespace: openstack
    spec:
      secret: osp-secret
      storageClass: <RHOCP_storage_class>
    • 将 <RHOCP_storage_class> 替换为您为 RHOCP 集群存储后端创建的存储类。
  3. 添加服务配置。包括所有所需服务的服务配置:

    • 块存储服务(cinder):

        cinder:
          uniquePodNames: false
          apiOverride:
            route: {}
          template:
            customServiceConfig: |
              [DEFAULT]
              storage_availability_zone = az0
            databaseInstance: openstack
            secret: osp-secret
            cinderAPI:
              replicas: 3
              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
            cinderScheduler:
              replicas: 1
            cinderVolumes:
              az0:
                networkAttachments:
                - storage
                replicas: 0
      注意

      在 RHOSO 18.0.3 中,您必须将 uniquePodNames 字段设置为 false,以允许传播 Secret。如需更多信息,请参阅 OSPRH-11240

      注意
      • replicas 字段设置为 0 的值。副本数已更改,并在配置存储后添加额外的 cinderVolume 服务。
      • 将 template 部分中的 storage_availability_zone 字段设置为 az0。所有块存储服务(cinder) pod 都会继承这个值,如 cinderBackupcinderVolume 等。您可以通过指定 backend_availability_zone 来为 cinderVolume 服务覆盖此 AZ。
    • 计算服务(nova):

        nova:
          apiOverride:
            route: {}
          template:
            apiServiceTemplate:
              replicas: 3
              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
            metadataServiceTemplate:
              replicas: 3
              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
            schedulerServiceTemplate:
              replicas: 3
              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
            cellTemplates:
              cell0:
                cellDatabaseAccount: nova-cell0
                cellDatabaseInstance: openstack
                cellMessageBusInstance: rabbitmq
                hasAPIAccess: true
              cell1:
                cellDatabaseAccount: nova-cell1
                cellDatabaseInstance: openstack-cell1
                cellMessageBusInstance: rabbitmq-cell1
                noVNCProxyServiceTemplate:
                  enabled: true
                  networkAttachments:
                  - ctlplane
                hasAPIAccess: true
            secret: osp-secret
    • data plane 的 DNS 服务:

        dns:
          template:
            options:
            - key: server
              values:
              - 192.168.122.1
            - key: server
              values:
              - 192.168.122.2
            override:
              service:
                metadata:
                  annotations:
                    metallb.universe.tf/address-pool: ctlplane
                    metallb.universe.tf/allow-shared-ip: ctlplane
                    metallb.universe.tf/loadBalancerIPs: 192.168.122.80
                spec:
                  type: LoadBalancer
            replicas: 2
    • galera

        galera:
          templates:
            openstack:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
            openstack-cell1:
              storageRequest: 5000M
              secret: osp-secret
              replicas: 3
    • Identity 服务 (keystone)

        keystone:
          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
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            secret: osp-secret
            replicas: 3
    • 镜像服务(glance):

        glance:
          apiOverrides:
            default:
              route: {}
          template:
            databaseInstance: openstack
            storage:
              storageRequest: 10G
            secret: osp-secret
            keystoneEndpoint: default
            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
                      spec:
                        type: LoadBalancer
                networkAttachments:
                - storage
      注意

      您最初必须将 replicas 字段设置为 0。副本数已更改,并在配置存储后添加额外的 glanceAPI 服务。

    • 密钥管理服务(barbican):

        barbican:
          apiOverride:
            route: {}
          template:
            databaseInstance: openstack
            secret: osp-secret
            barbicanAPI:
              replicas: 3
              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
            barbicanWorker:
              replicas: 3
            barbicanKeystoneListener:
              replicas: 1
    • Memcached

        memcached:
          templates:
            memcached:
               replicas: 3
    • Networking 服务(neutron):

        neutron:
          apiOverride:
            route: {}
          template:
            customServiceConfig: |
            [DEFAULT]
            network_scheduler_driver = neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
            default_availability_zones = az0
            [ml2_type_vlan]
            network_vlan_ranges = datacentre:1:1000
            [neutron]
            physnets = datacentre
            replicas: 3
            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
            databaseInstance: openstack
            secret: osp-secret
            networkAttachments:
            - internalapi
    • 如果部署了 DHCP 代理,则将 network_scheduler_driver 设置为 neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
    • OVN

        ovn:
          template:
            ovnController:
              external-ids:
                availability-zones:
                - az0
                enable-chassis-as-gateway: true
                ovn-bridge: br-int
                ovn-encap-type: geneve
                system-id: random
              networkAttachment: tenant
              nicMappings:
                datacentre: ospbr
            ovnDBCluster:
              ovndbcluster-nb:
                replicas: 3
                dbType: NB
                storageRequest: 10G
                networkAttachment: internalapi
              ovndbcluster-sb:
                replicas: 3
                dbType: SB
                storageRequest: 10G
                networkAttachment: internalapi
            ovnNorthd:
              networkAttachment: internalapi
    • 放置服务(placement)

        placement:
          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
                  spec:
                    type: LoadBalancer
            databaseInstance: openstack
            replicas: 3
            secret: osp-secret
    • RabbitMQ

        rabbitmq:
          templates:
            rabbitmq:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.85
                  spec:
                    type: LoadBalancer
            rabbitmq-cell1:
              replicas: 3
              override:
                service:
                  metadata:
                    annotations:
                      metallb.universe.tf/address-pool: internalapi
                      metallb.universe.tf/loadBalancerIPs: 172.17.0.86
                  spec:
                    type: LoadBalancer
  4. 创建 control plane:

    oc create -f openstack_control_plane.yaml -n openstack

4.4. Ceph secret 密钥站点分发

当您使用多个 Ceph 后端部署分布式计算节点(DCN)环境时,您可以为每个后端创建一个 Ceph 密钥。为了安全起见,请将最少的 Ceph 密钥数量分发到每个站点。为每个位置创建一个 secret。

  • 将每个 Ceph 后端的密钥添加到默认位置的 secret 中。
  • 为默认 Ceph 后端添加密钥,以及每个额外位置的本地 ceph 后端。

对于三个位置: az0、 az1az2,您必须有三个 secret。位置 az1az2 各自都有本地后端的密钥以及 az0 的密钥。位置 az0 包含所有 Ceph 后端密钥。

您可以在 Ceph 部署到每个边缘位置后创建所需的 secret,并收集每个 secret 的密钥环和配置文件。或者,您可以根据需要部署每个 Ceph 后端,并使用每个边缘部署更新 secret。

流程

  1. 为位置 az0 创建 secret。

    1. 如果您在所有需要存储的边缘站点部署了 Red Hat Ceph Storage (RHCS),请为 az0 创建一个 secret,其中包含所有密钥环和 conf 文件:

      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az0.conf \
      --from-file=az1.client.openstack.keyring \
      --from-file=az1.conf \
      --from-file=az2.client.openstack.keyring \
      --from-file=az2.conf -n openstack
    2. 如果您还没有在所有边缘站点上部署 RHCS,请为 az0 创建一个 secret,其中包含 az0 的密钥环和 conf 文件:

      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az0.conf -n openstack
  2. 当您在可用区 1 (z1)的边缘位置部署 RHCS 时,为位置 az1 创建一个 secret,其中包含本地后端的密钥环和 conf 文件,以及默认后端:

    oc create secret generic ceph-conf-az-1 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf -n openstack
  3. 如果需要,为中央位置更新 secret:

    oc delete secret ceph-conf-az-0 -n openstack
    
    oc create secret generic ceph-conf-az-0 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf -n openstack
  4. 当您在可用区 2 (z2)的边缘位置部署 RHCS 时,为位置 az2 创建一个 secret,其中包含本地后端的密钥环和 conf 文件,以及默认后端:

    oc create secret generic ceph-conf-az-2 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az2.client.openstack.keyring \
    --from-file=az2.conf -n openstack
  5. 如果需要,为中央位置更新 secret:

    oc delete secret ceph-conf-az-0 -n openstack
    
    oc create secret generic ceph-conf-az-0 \
    --from-file=az0.client.openstack.keyring \
    --from-file=az0.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf \
    --from-file=az1.client.openstack.keyring \
    --from-file=az1.conf \
    --from-file=az2.client.openstack.keyring \
    --from-file=az2.conf
  6. [可选] 完成创建所需密钥后,您可以验证它们是否出现在 openstack 命名空间中:

    oc get secret -n openstack -o name | grep ceph-conf

    输出示例:

    secret/ceph-conf-az-0
    secret/ceph-conf-az-1
    secret/ceph-conf-az-2
  7. 创建 OpenStackDataPlaneNodeSet 时,请使用 extraMounts 字段下的适当的键:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm-dcn-0
      namespace: openstack
    spec:
      ...
      nodeTemplate:
        extraMounts:
        - extraVolType: Ceph
          volumes:
          - name: ceph
            secret:
              secretName: ceph-conf-az-0
          mounts:
          - name: ceph
            mountPath: "/etc/ceph"
            readOnly: true
  8. 在创建 data plane NodeSet 时,还必须使用 secret 名称更新 OpenStackControlPlane 自定义资源(CR):

    apiVersion: core.openstack.org/v1beta1
    kind: OpenStackControlPlane
    spec:
      extraMounts:
        - name: v1
          region: r1
          extraVol:
            - propagation:
              - az0
              - CinderBackup
              extraVolType: Ceph
              volumes:
              - name: ceph
                secret:
                  name: ceph-conf-az-0
              mounts:
              - name: ceph
                mountPath: "/etc/ceph"
                readOnly: true
            - propagation:
              - az1
              extraVolType: Ceph
              volumes:
              - name: ceph
                secret:
                  name: ceph-conf-az-1
              mounts:
              - name: ceph
                mountPath: "/etc/ceph"
                readOnly: true
            ...
    注意

    如果 CinderBackup 服务是部署的一部分,则必须将其包含在传播列表中,因为它在其 pod 名称中没有可用区。

  9. 当您更新 OpenStackControlPlane CR 中的 glanceAPIs 字段时,Image 服务(glance) pod 名称与 extraMounts 传播 实例匹配:

         glanceAPIs:
           az0:
             customServiceConfig: |
             ...
           az1:
             customServiceConfig: |
             ...
  10. 当您更新 OpenStackControlPlane CR 中的 cinderVolumes 字段时,块存储服务(cinder) pod 名称也必须与 extraMounts 传播 实例匹配:

    kind: OpenStackControlPlane
    spec:
      <...>
      cinder
        <...>
        cinderVolumes:
          az0:
            <...>
          az1:
            <...>

第 5 章 部署 DCN 节点集

节点集使用相同的流程部署,无论是否将其部署在中央位置,还是在远程位置进行部署。在单独的可用区部署每个边缘位置。例如,在 az0 上部署中央位置节点集,在 az1 上部署第一个边缘站点,等等。

5.1. 配置数据平面节点网络

您必须配置 data plane 节点网络,以适应 Red Hat Ceph Storage 网络要求。

先决条件

  • control plane 部署已完成,但尚未修改以使用 Ceph Storage。
  • data plane 节点已预置备操作系统。
  • data plane 节点可以通过 Ansible 可以使用的 SSH 密钥访问。
  • 如果您使用 HCI,则 data plane 节点具有可供用作 Ceph OSD 的磁盘。
  • 至少三个可用的数据平面节点。Ceph Storage 集群必须至少有三个节点以确保冗余。

流程

  1. 在工作站上创建一个名为 dcn-data-plane-networks.yaml 的文件,以防御 OpenStackDataPlaneNodeSet CR,以配置 dataplane 节点网络:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: dcn-data-plane-networks
      namespace: openstack
    spec:
      env:
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
  2. 指定要应用到节点的服务:

    spec:
      ...
      services:
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - ceph-hci-pre
        - configure-os
        - ssh-known-hosts
        - run-os
        - reboot-os
  3. 在 data plane 中设置 edpm_enable_chassis_gw 和 edpm_ovn_availability_zones 字段:

    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
        value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
        ansible:
          ansiblePort: 22
          ansibleUser: cloud-admin
          ansibleVars:
            edpm_enable_chassis_gw: true
            edpm_ovn_availability_zones:
              - az0
  4. 可选: ceph-hci-pre 服务准备 data plane 节点,以便在网络配置使用 edpm_ceph_hci_pre edpm-ansible 角色后托管 Red Hat Ceph Storage 服务。默认情况下,此角色的 edpm_ceph_hci_pre_enabled_services 参数仅包含 RBDRGWNFS 服务。DCN 只在 DCN 站点支持 RBD 服务。如果您要部署 HCI,请通过添加 edpm_ceph_hci_pre_enabled_services 参数来禁用 RGW 和 NFS 服务,并仅添加 ceph RBD 服务。

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm
      namespace: openstack
    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
    	value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
    	ansible:
      	ansiblePort: 22
      	ansibleUser: cloud-admin
      	ansibleVars:
        	edpm_ceph_hci_pre_enabled_services:
        	- ceph_mon
        	- ceph_mgr
        	- ceph_osd
    ...
    注意

    如果其他服务(如 Dashboard)部署有 HCI 节点,则必须将它们添加到 edpm_ceph_hci_pre_enabled_services 参数列表中。有关此角色的更多信息,请参阅 edpm_ceph_hci_pre 角色。

  5. 配置 Red Hat Ceph Storage 集群网络以进行存储管理。

    以下示例有 3 个节点。它假定存储管理位于 VLAN23 上:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-edpm
      namespace: openstack
    spec:
      env:
      - name: ANSIBLE_FORCE_COLOR
        value: "True"
      networkAttachments:
      - ctlplane
      nodeTemplate:
        ansible:
          ansiblePort: 22
          ansibleUser: cloud-admin
          ansibleVars:
            edpm_ceph_hci_pre_enabled_services:
            - ceph_mon
            - ceph_mgr
            - ceph_osd
            edpm_fips_mode: check
            edpm_iscsid_image: {{ registry_url }}/openstack-iscsid:{{ image_tag }}
            edpm_logrotate_crond_image: {{ registry_url }}/openstack-cron:{{ image_tag }}
            edpm_network_config_hide_sensitive_logs: false
            edpm_network_config_os_net_config_mappings:
              edpm-compute-0:
                nic1: 52:54:00:1e:af:6b
                nic2: 52:54:00:d9:cb:f4
              edpm-compute-1:
                nic1: 52:54:00:f2:bc:af
                nic2: 52:54:00:f1:c7:dd
              edpm-compute-2:
                nic1: 52:54:00:dd:33:14
                nic2: 52:54:00:50:fb:c3
            edpm_network_config_template: |
              ---
              {% set mtu_list = [ctlplane_mtu] %}
              {% for network in nodeset_networks %}
              {{ 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: nic2
                  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_neutron_metadata_agent_image: {{ registry_url }}/openstack-neutron-metadata-agent-ovn:{{ image_tag }}
            edpm_nodes_validation_validate_controllers_icmp: false
            edpm_nodes_validation_validate_gateway_icmp: false
            edpm_selinux_mode: enforcing
            edpm_sshd_allowed_ranges:
            - 192.168.111.0/24
            - 192.168.122.0/24
            - 192.168.133.0/24
            - 192.168.144.0/24
            edpm_sshd_configure_firewall: true
            enable_debug: false
            gather_facts: false
            image_tag: current-podified
            neutron_physical_bridge_name: br-ex
            neutron_public_interface_name: eth0
            service_net_map:
              nova_api_network: internalapi
              nova_libvirt_network: internalapi
            storage_mgmt_cidr: "24"
            storage_mgmt_host_routes: []
            storage_mgmt_mtu: 9000
            storage_mgmt_vlan_id: 23
            storage_mtu: 9000
            timesync_ntp_servers:
            - hostname: pool.ntp.org
        ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
        managementNetwork: ctlplane
        networks:
        - defaultRoute: true
          name: ctlplane
          subnetName: subnet1
        - name: internalapi
          subnetName: subnet1
        - name: storage
          subnetName: subnet1
        - name: tenant
          subnetName: subnet1
      nodes:
        edpm-compute-0:
          ansible:
            host: 192.168.122.100
          hostName: compute-0
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.100
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
        edpm-compute-1:
          ansible:
            host: 192.168.122.101
          hostName: compute-1
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.101
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
        edpm-compute-2:
          ansible:
            host: 192.168.122.102
          hostName: compute-2
          networks:
          - defaultRoute: true
            fixedIP: 192.168.122.102
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
          - name: storage
            subnetName: subnet1
          - name: storagemgmt
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
      preProvisioned: true
      services:
      - bootstrap
      - configure-network
      - validate-network
      - install-os
      - ceph-hci-pre
      - configure-os
      - ssh-known-hosts
      - run-os
      - reboot-os
  6. 应用 CR:

    $ oc apply -f <dataplane_cr_file>
    • <dataplane_cr_file > 替换为您的文件的名称。

      注意

      Ansible 在创建 OpenStackDataPlaneDeployment CRD 之前,不会配置或验证网络。

  7. 创建 OpenStackDataPlaneDeployment CRD,如在 OpenShift 上部署 Red Hat OpenStack Services on OpenShift 指南中的创建 data plane 所述,它定义了 OpenStackDataPlaneNodeSet CRD 文件,以便 Ansible 配置 data plane 节点上的服务。
  8. 要确认网络配置,请完成以下步骤:

    1. SSH 到数据平面节点。
    2. 使用 ip a 命令显示配置网络。
    3. 确认存储网络位于配置网络列表中。

5.2. 配置和部署超融合 Red Hat Ceph Storage

注意

以下步骤专门用于 Red Hat Ceph Storage (RHCS)的超融合配置,如果您部署了外部 RHCS 集群,则不需要以下步骤。

通过编辑配置文件和使用 cephadm 实用程序来配置和部署 Red Hat Ceph Storage。

流程

  1. 编辑 Red Hat Ceph Storage 配置文件。
  2. 添加 StorageStorage Management 网络范围。Red Hat Ceph Storage 使用 Storage 网络作为 Red Hat Ceph Storage public_networkStorage Management 网络作为 cluster_network

    以下示例是 Storage 网络范围为 172.18.0.0/24 的配置文件条目,Storage Management 网络范围为 172.20.0.0/24

    [global]
    public_network = 172.18.0.0/24
    cluster_network = 172.20.0.0/24
  3. 在 Compute 服务和 Ceph OSD 服务之间添加并置界限。应在并置计算服务和 Ceph OSD 服务之间设置界限,以减少 CPU 和内存争用。

    以下是设置了这些边界的 Ceph 配置文件条目的示例:

    [osd]
    osd_memory_target_autotune = true
    osd_numa_auto_affinity = true
    [mgr]
    mgr/cephadm/autotune_memory_target_ratio = 0.2

    在本例中,osd_memory_target_autotune 参数设置为 true,以便 OSD 守护进程根据 osd_memory_target 选项调整内存消耗。autotune_memory_target_ratio 默认为 0.7。这意味着系统总 RAM 的 70% 是非自动调优 Ceph 守护进程所消耗的内存的起点。剩余的内存在 OSD 之间划分;假设所有 OSD 的 osd_memory_target_autotune 设置为 true。对于 HCI 部署,您可以将 mgr/cephadm/autotune_memory_target_ratio 设置为 0.2,以便计算服务有更多内存可用。

    有关服务并置的更多信息,请参阅 在 NUMA 节点的 HCI 环境中并置服务

    注意

    如果需要在部署后调整这些值,请使用 ceph config set osd <key> <value> 命令。

  4. 使用 data plane 节点上编辑的配置文件部署 Ceph Storage:

    $ cephadm bootstrap --config <config_file> --mon-ip <data_plane_node_ip> --skip-monitoring-stack

    • <config_file > 替换为 Ceph 配置文件的名称。
    • <data_plane_node_ip & gt; 替换为安装 Red Hat Ceph Storage 的 data plane 节点的 Storage 网络 IP 地址。

      注意

      cephadm bootstrap 命令中使用 --skip-monitoring-stack 选项,以跳过监控服务的部署。如果之前已作为上述其他流程的一部分部署了监控服务,则确保 Red Hat Ceph Storage 部署成功完成。

      如果还没有部署监控服务,请参阅 Red Hat Ceph Storage 文档来了解启用监控服务的信息和流程。

  5. 在第一个 EDPM 节点上启动 Red Hat Ceph Storage 集群后,请参阅 Red Hat Ceph Storage 安装指南中的 Red Hat Ceph Storage 安装,将其他 EDPM 节点添加到 Ceph 集群。

5.3. 配置 DCN 数据平面

在 data plane 节点可以使用前,必须将 Red Hat Ceph Storage 配置为存储解决方案。

先决条件

流程

  1. 编辑 OpenStackDataPlaneNodeSet CR。
  2. 要使 cephx 密钥和配置文件可用于计算服务(nova),请使用 extraMounts 参数。

    以下是为此目的使用 extraMounts 参数的示例:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    spec:
      ...
      nodeTemplate:
        extraMounts:
        - extraVolType: Ceph
          volumes:
          - name: ceph
            secret:
              secretName: ceph-conf-files
          mounts:
          - name: ceph
            mountPath: "/etc/ceph"
            readOnly: true
  3. 创建 ConfigMap,将所需的配置详情添加到计算服务(nova)。创建名为 ceph-nova-az0.yaml 的文件,并添加类似以下内容的内容:您必须为本地可用区添加 Image 服务(glance)端点,并将 cross_az_attach 参数设置为 false :

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ceph-nova-az0
      namespace: openstack
    data:
      03-ceph-nova.conf:
        [libvirt]
        images_type = rbd
        images_rbd_pool = vms
        images_rbd_ceph_conf = /etc/ceph/az0.conf
        images_rbd_glance_store_name = az0
        images_rbd_glance_copy_poll_interval = 15
        images_rbd_glance_copy_timeout = 600
        rbd_user = openstack
        rbd_secret_uuid = 9cfb3a03-3f91-516a-881e-a675f67c30ea
        hw_disk_discard = unmap
        volume_use_multipath = False
        [glance]
        endpoint_override = http://glance-az0-internal.openstack.svc:9292
        valid_interfaces = internal
        [cinder]
        cross_az_attach = False
        catalog_info = volumev3:cinderv3:internalURL
  4. 创建 ConfigMap

    oc create -f ceph-nova-az0.yaml
  5. 创建自定义 Compute (nova)服务以使用 ConfigMap。创建名为 nova-custom-az0.yaml 的文件,并添加类似以下内容的内容:您必须在 dataSources 字段中添加您刚才创建的 ConfigMap 的名称:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-custom-ceph-az0
    spec:
      addCertMounts: false
      caCerts: combined-ca-bundle
      dataSources:
      - configMapRef:
          name: ceph-nova-az0
      - secretRef:
          name: nova-cell1-compute-config
      - secretRef:
          name: nova-migration-ssh-key
      edpmServiceType: nova
      playbook: osp.edpm.nova
      tlsCerts:
        default:
          contents:
          - dnsnames
          - ips
          edpmRoleServiceName: nova
          issuer: osp-rootca-issuer-internal
          networks:
          - ctlplane
  6. 创建自定义服务:

    oc create -f nova-custom-ceph-az0.yaml
    注意

    您必须为每个可用区创建一个唯一的 ConfigMap 和自定义 Compute 服务。如前面的步骤所示,将可用区附加到这些文件名的末尾。

  7. 在 CR 中找到 服务列表
  8. 编辑 服务列表,以恢复 配置 data plane 节点网络 中描述的所有服务。恢复完整 服务列表 可让剩余的作业完成 HCI 环境的配置。

    以下是一个完整 服务列表 的示例,其额外服务以粗体显示:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    spec:
      ...
      services:
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - ceph-hci-pre
        - configure-os
        - ssh-known-hosts
        - run-os
        - reboot-os
        - install-certs
        - ceph-client
        - ovn
        - neutron-metadata
        - libvirt
        - nova-custom-ceph-az0
    注意

    除了恢复默认服务列表外,ceph-client 服务也会在 run-os 服务后添加。ceph-client 服务将 EDPM 节点配置为 Red Hat Ceph Storage 服务器的客户端。此服务分发客户端连接到 Red Hat Ceph Storage 服务器所需的文件。只有在部署 HCI 时,才需要 ceph-hci-pre 服务。

  9. 可选: 您可以将计算节点分配给 Compute 服务(nova)单元,与在任何其他环境中相同的单元。将 OpenStackDataPlaneNodeSet CR 中的 nova 服务替换为您的自定义 nova 服务:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-cell2
    spec:
      services:
        - download-cache
        - bootstrap
        - configure-network
        - validate-network
        - install-os
        - configure-os
        - ssh-known-hosts
        - run-os
        - ovn
        - libvirt
        - *nova-cell-custom*

    如需更多信息,请参阅 将 OpenStackDataPlaneNodeSetSR 连接到计算单元

    注意

    如果您使用单元,则 neutron-metadata 服务为每个单元是唯一的,并单独定义。例如,neutron-metadata-cell1

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
     labels:
        app.kubernetes.io/instance: neutron-metadata-cell1
        app.kubernetes.io/name: openstackdataplaneservice
        app.kubernetes.io/part-of: openstack-operator
      name: neutron-metadata-cell1
      ...

    nova-custom-ceph 服务对于每个可用区是唯一的,并单独定义。例如,nova-custom-ceph-az0

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      labels:
        app.kubernetes.io/instance: nova-custom-ceph-az0
        app.kubernetes.io/name: openstackdataplaneservice
        app.kubernetes.io/part-of: openstack-operator
      name: nova-custom-ceph-az0
      namespace: openstack
  10. 可选: 如果您要将 Red Hat Ceph Storage (RHCS)部署为超融合解决方案,请完成以下步骤:

    1. 创建一个 ConfigMap,将 reserved_host_memory_mb 参数设置为适合您配置的值:

      以下是用于此目的的 ConfigMap 示例:

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: reserved-memory-nova
      data:
        04-reserved-memory-nova.conf: |
          [DEFAULT]
          reserved_host_memory_mb=75000
      注意

      可以设置 reserved_host_memory_mb 参数的值,以便计算服务调度程序不会将内存提供给同一服务器上的 Ceph OSD 所需的虚拟机。除了虚拟机监控程序的默认保留内存外,示例还为每个主机保留 5 GB 的 OSD 为 10 个 OSD。在 IOPS 优化的集群中,您可以通过为每个 OSD 保留更多内存来提高性能。5 GB 数字作为起点提供,必要时可以进一步调整。

    2. 编辑 OpenStackDataPlaneService/nova-custom-ceph-az 文件。将 reserved-memory-nova 添加到之前创建的 OpenStackDataPlaneService CR 中的 configMaps 列表中,名为 ceph-nova-az0

      kind: OpenStackDataPlaneService
      <...>
      spec:
        configMaps:
        - ceph-nova
        - reserved-memory-nova
  11. 应用 CR 更改。

    $ oc apply -f <dataplane_cr_file>
    • <dataplane_cr_file > 替换为您的文件的名称。

      注意

      Ansible 在创建 OpenStackDataPlaneDeployment CRD 之前,不会配置或验证网络。

  12. 创建 OpenStackDataPlaneDeployment CRD,如在 OpenShift 上部署 Red Hat OpenStack Services on OpenShift 指南中的创建 data plane 所述,它定义了 OpenStackDataPlaneNodeSet CRD 文件,以便 Ansible 配置 data plane 节点上的服务。

example-node-set-resource

5.4. 节点设置资源示例

以下示例有三个节点。它假定存储管理网络范围为 172.20.0.0/24,并且它位于 vlan23 上。

apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
  name: openstack-edpm
  namespace: openstack
spec:
  env:
  - name: ANSIBLE_FORCE_COLOR
    value: "True"
  networkAttachments:
  - ctlplane
  nodeTemplate:
    ansible:
      ansiblePort: 22
      ansibleUser: cloud-admin
      ansibleVars:
        edpm_ceph_hci_pre_enabled_services:
        - ceph_mon
        - ceph_mgr
        - ceph_osd
        edpm_fips_mode: check
        edpm_iscsid_image: {{ registry_url }}/openstack-iscsid:{{ image_tag }}
        edpm_logrotate_crond_image: {{ registry_url }}/openstack-cron:{{ image_tag }}
        edpm_network_config_hide_sensitive_logs: false
        edpm_network_config_os_net_config_mappings:
          edpm-compute-0:
            nic1: 52:54:00:1e:af:6b
            nic2: 52:54:00:d9:cb:f4
          edpm-compute-1:
            nic1: 52:54:00:f2:bc:af
            nic2: 52:54:00:f1:c7:dd
          edpm-compute-2:
            nic1: 52:54:00:dd:33:14
            nic2: 52:54:00:50:fb:c3
        edpm_network_config_template: |
          ---
          {% set mtu_list = [ctlplane_mtu] %}
          {% for network in nodeset_networks %}
          {{ 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: nic2
              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_neutron_metadata_agent_image: {{ registry_url }}/openstack-neutron-metadata-agent-ovn:{{ image_tag }}
        edpm_nodes_validation_validate_controllers_icmp: false
        edpm_nodes_validation_validate_gateway_icmp: false
        edpm_selinux_mode: enforcing
        edpm_sshd_allowed_ranges:
        - 192.168.111.0/24
        - 192.168.122.0/24
        - 192.168.133.0/24
        - 192.168.144.0/24
        edpm_sshd_configure_firewall: true
        enable_debug: false
        gather_facts: false
        image_tag: current-podified
        neutron_physical_bridge_name: br-ex
        neutron_public_interface_name: eth0
        service_net_map:
          nova_api_network: internalapi
          nova_libvirt_network: internalapi
        storage_mgmt_cidr: "24"
        storage_mgmt_host_routes: []
        storage_mgmt_mtu: 9000
        storage_mgmt_vlan_id: 23
        storage_mtu: 9000
        timesync_ntp_servers:
        - hostname: pool.ntp.org
    ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    managementNetwork: ctlplane
    networks:
    - defaultRoute: true
      name: ctlplane
      subnetName: subnet1
    - name: internalapi
      subnetName: subnet1
    - name: storage
      subnetName: subnet1
    - name: tenant
      subnetName: subnet1
    - name: external
      subnetName: external1
  nodes:
    edpm-compute-0:
      ansible:
        host: 192.168.122.100
      hostName: compute-0
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.100
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
    edpm-compute-1:
      ansible:
        host: 192.168.122.101
      hostName: compute-1
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.101
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
    edpm-compute-2:
      ansible:
        host: 192.168.122.102
      hostName: compute-2
      networks:
      - defaultRoute: true
        fixedIP: 192.168.122.102
        name: ctlplane
        subnetName: subnet1
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: storagemgmt
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      - name: external
        subnetName: external1
  preProvisioned: true
  services:
  - bootstrap
  - configure-network
  - validate-network
  - install-os
  - ceph-hci-pre
  - configure-os
  - ssh-known-hosts
  - run-os
  - reboot-os
注意

不需要将存储管理网络添加到 networkAttachments 键。

5.5. 更新 control plane

在中央位置部署了数据平面后,您必须更新 control plane。

先决条件

  • 您已在 OpenShift 中使用 Red Hat OpenStack 服务在中央位置部署了节点集。
  • 您已部署了 Red Hat Ceph Storage (RHCS)。

流程

  1. 可选:在 openstack_control_plane.yaml 文件中配置块存储备份服务:

          cinderBackup:
            customServiceConfig: |
              [DEFAULT]
              backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
              backup_ceph_pool = backups
              backup_ceph_user = openstack

    有关配置块存储备份服务的更多信息 ,请参阅配置块存储备份服务

  2. 更新 openstack_control_plane.yaml 文件中的 Block Storage cinder 卷服务:

          cinderVolumes:
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_backends = ceph
                glance_api_servers = https://glance-az0-internal.openstack.svc:9292
                [ceph]
                volume_backend_name = ceph
                volume_driver = cinder.volume.drivers.rbd.RBDDriver
                rbd_ceph_conf = /etc/ceph/az0.conf
                rbd_user = openstack
                rbd_pool = volumes
                rbd_flatten_volume_from_snapshot = False
                rbd_secret_uuid = 795dcbca-e715-5ac3-9b7e-a3f5c64eb89f
                rbd_cluster_name = az0
                backend_availability_zone = az0

    有关配置块存储卷服务的更多信息 ,请参阅配置卷服务

  3. openstack_control_plane.yaml 文件中添加 extraMounts 字段,以定义需要访问 Red Hat Ceph Storage secret 的服务:

      extraMounts:
      - extraVol:
        - extraVolType: Ceph
          mounts:
          - mountPath: /etc/ceph
            name: ceph
            readOnly: true
          propagation:
          - az0
          - CinderBackup
          volumes:
          - name: ceph
            projected:
              sources:
              - secret:
                  name: ceph-conf-az-0
  4. 更新 openstack_control_plane.yaml 文件中的 Image 服务(glance),将块存储服务配置为后端:

          glanceAPIs:
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd
                [glance_store]
                default_backend = az0
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
  5. 应用对 OpenStackControlPlane CR 所做的更改:

    oc apply -f openstack_control_plane.yaml
  6. 将 AZ 添加到主机聚合中。这使得 OpenStack 管理员能够根据镜像元数据将工作负载调度到地理位置。

    1. 打开终端到 openstackclient pod:

      # oc rsh openstackclient
    2. 创建新的 OpenStack 聚合:

      $ openstack aggregate create <aggregate_name>
    3. 使用 AZ 名称标记 OpenStack 聚合:

      $ openstack aggregate set --zone <availability_zone> <aggregate_name>
    4. 将 AZ 中的每个主机添加到聚合中:

      $ openstack aggregate add host <aggregate_name> <compute_node_1>
      $ openstack aggregate add host <aggregate_name> <compute_node_2>
      ...

5.6. 在部署 DCN 边缘位置后更新 control plane

您可以使用 OpenStackDataPlaneNodeSet 自定义资源(CR)创建额外的节点集。使用唯一的可用区,以及特定于您要部署的站点的 VLAN、NIC 映射和 IP 地址。如需有关部署 OpenStackDataPlaneNodeSet 的更多信息,请参阅创建数据平面

当使用存储部署 DCN 节点集时,您必须在中央位置更新 OpenStackControlPlane CR 的两个字段:

  • cinderVolumes
  • glanceapis
  • Neutron
  • OVN
注意

如果使用单元,还必须为新的 DCN 站点配置单元。

先决条件

  • 您已部署了中央位置。
  • 您已部署了额外的 OpenStackDataPlane 节点集。

流程

  1. 在 neutron 服务配置中,更新 customServiceConfig 字段,以添加新的可用区和网络叶:

            customServiceConfig: |
        	[DEFAULT]
        	router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler
        	network_scheduler_driver =  neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
        	default_availability_zones = az0,az1
        	[ml2_type_vlan]
        	network_vlan_ranges = datacentre:1:1000,leaf1:1:1000
        	[neutron]
        	physnets = datacentre,leaf
  2. 在 OVN 服务配置中,更新可用区:

          ovnController:
            external-ids:
              availability-zones:
              - az0
              - az1
              enable-chassis-as-gateway
              ovn-bridge: br-int
              onv-enap-type: geneve
              system-id: random
            networkAttachment: tenant
            nicMappings:
              datacentre: ospbr
  3. 更新 OpenStackControlPlane CR 中的 cinderVolumes 字段,以添加远程位置的可用区定义。每个可用区中的每个 Cinder 卷服务使用 Glance API 服务器作为其可用区。例如,glance_api_servers = https://glance-az1-internal.openstack.svc:9292

          cinderVolumes:
            az0:
              customServiceConfig: |
                [DEFAULT]
                ....
            az1:
              customServiceConfig: |
                [DEFAULT]
                enabled_backends = ceph
                glance_api_servers = https://glance-az1-internal.openstack.svc:9292
                [ceph]
                volume_backend_name = az1
                volume_driver = cinder.volume.drivers.rbd.RBDDriver
                rbd_ceph_conf = /etc/ceph/az1.conf
                rbd_user = openstack
                rbd_pool = volumes
                rbd_flatten_volume_from_snapshot = False
                rbd_secret_uuid = 19ccdd60-79a0-5f0f-aece-ece700e514f8
                rbd_cluster_name = az1
                backend_availability_zone = az1
  4. 将镜像服务(glance) pod 注册到 Identity Service (keystone)目录:

    在 DCN 中,为每个节点部署了一个镜像服务 pod。单个镜像服务 pod 注册到 Identity service (keystone)目录。因此,在顶级 Glance CR 中,定义并公开 keystoneEndpoint 参数。除非部署了单个实例,否则可以在应用主 OpenStackControlPlane CR 之前选择 human 操作符,哪些实例应在 keystone 中注册。因为我们的默认端点是 az0 glance API,所以 keystoneEndpoint 被设置为 az0 :

    spec:
       <...>
       glance:
          enabled: true
          keystoneEndpoint: az0
            glanceAPIs:
              az0:
                apiTimeout: 60
  5. 更新 glanceAPIs 字段:

    对于位于 az0 的节点集,glanceAPIs 字段为中央位置配置镜像服务 pod。当您添加 AZ1 中设置的额外节点时,OpenStackControlPlane CR 会被更新,以便 glanceAPIs 字段包含 AZ0 和 AZ1 的镜像服务(glance) pod 定义。另外,AZ1 的镜像服务 pod 定义了 ceph 作为中央位置的后端,以及中央位置的 AZ0 镜像服务 pod 已更新,使其具有 AZ1 的 ceph 后端定义。

          glanceAPIs:
            az1:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd,az1:rbd
                [glance_store]
                default_backend = az1
                [az1]
                rbd_store_ceph_conf = /etc/ceph/az1.conf
                store_description = "az1 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
              networkAttachments:
              - storage
              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.81
                    spec:
                      type: LoadBalancer
              replicas: 2
              type: edge
            az0:
              customServiceConfig: |
                [DEFAULT]
                enabled_import_methods = [web-download,copy-image,glance-direct]
                enabled_backends = az0:rbd,az1:rbd
                [glance_store]
                default_backend = az0
                [az0]
                rbd_store_ceph_conf = /etc/ceph/az0.conf
                store_description = "az0 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
                [az1]
                rbd_store_ceph_conf = /etc/ceph/az1.conf
                store_description = "az1 RBD backend"
                rbd_store_pool = images
                rbd_store_user = openstack
                rbd_thin_provisioning = True
              networkAttachments:
              - storage
              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
              replicas: 3
              type: split
    注意

    可用域 az0 类型为 split,所有其他可用区都类型为 edge

    分割类型是云用户在上传镜像时使用。创建边缘类型,以便在 Cinder 或 Nova 与 Glance 交互时,可以将它们配置为 glance 是本地的。对默认分割 glance pod 使用至少 3 个副本,为 edge glance pod 使用 2 个副本,并将副本按比例增加到工作负载。

  6. 可选:更新 Cell 配置。

    默认情况下,所有可用区(AZ)之间的计算节点放置在一个名为 cell1 的通用单元中。您可以通过将计算节点分区到单独的单元来提高大型部署的性能。对于 DCN 部署,将每个可用区放在自己的单元中。如需更多信息,请参阅在 control plane 中添加计算单元

  7. 应用对 OpenStackControlPlane CR 所做的更改:

    oc apply -f openstack_control_plane.yaml
  8. 继续为添加的每个额外边缘站点更新 control plane。根据需要,将 Red Hat Storage Service (RHCS)添加到 OpenShift secret 中。

    1. 在 neutron 服务配置中,更新 customServiceConfig 字段,以添加新的可用区和网络叶:

              customServiceConfig: |
          	[DEFAULT]
          	router_scheduler_driver = neutron.scheduler.l3_agent_scheduler.AZLeastRoutersScheduler
          	network_scheduler_driver =  neutron.scheduler.dhcp_agent_scheduler.AZAwareWeightScheduler
          	default_availability_zones = az0,az1,az2
          	[ml2_type_vlan]
          	network_vlan_ranges = datacentre:1:1000,leaf1:1:1000,leaf2:1:1000
          	[neutron]
          	physnets = datacentre,leaf1,leaf2
    2. 在 OVN 服务配置中,更新可用区

            ovnController:
              external-ids:
                availability-zones:
                - az0
                - az1
                - az2
                enable-chassis-as-gateway
                ovn-bridge: br-int
                onv-enap-type: geneve
                system-id: random
              networkAttachment: tenant
              nicMappings:
                datacentre: ospbr
    3. cinderVolumes service 字段添加一个额外的可用区:

           cinderVolumes:
              az0:
                customServiceConfig: |
                  [DEFAULT]
                  ...
              az1:
                customServiceConfig: |
                  [DEFAULT]
                  ...
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_backends = ceph
                  glance_api_servers = https://glance-az2-internal.openstack.svc:9292
                  [ceph]
                  volume_backend_name = ceph
                  volume_driver = cinder.volume.drivers.rbd.RBDDriver
                  rbd_ceph_conf = /etc/ceph/az2.conf
                  rbd_user = openstack
                  rbd_pool = volumes
                  rbd_flatten_volume_from_snapshot = False
                  rbd_secret_uuid = 5c0c7a8e-55b1-5fa8-bc5c-9756b7862d2f
                  rbd_cluster_name = az2
                  backend_availability_zone = az2
    4. glanceAPIs 字段中添加额外的可用区:

      在添加额外的 AZ 时,您必须确保每个镜像服务 pod 定义都包含中央位置(AZ0)的存储配置,以及自己的本地 ceph 配置。您还必须确保中央位置具有所有其他站点的存储定义。这会在中央位置镜像服务 pod 和分布的节点集合的镜像服务 pod 之间创建一个 hub 和 spoke 关系:

            glanceAPIs:
              az0:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az1:rbd,az2:rbd
                  [glance_store]
                  default_backend = az0
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az1]
                  rbd_store_ceph_conf = /etc/ceph/az1.conf
                  store_description = "az1 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                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
                replicas: 3
                type: split
              az1:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az1:rbd
                  [glance_store]
                  default_backend = az1
                  [az1]
                  rbd_store_ceph_conf = /etc/ceph/az1.conf
                  store_description = "az1 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                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.81
                      spec:
                        type: LoadBalancer
                replicas: 2
                type: edge
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az2:rbd
                  [glance_store]
                  default_backend = az2
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                networkAttachments:
                - storage
                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.82
                      spec:
                        type: LoadBalancer
                replicas: 2
                type: edge
  9. 应用对 OpenStackControlPlane CR 所做的更改:

    oc apply -f openstack_control_plane.yaml
  10. 将 AZ 添加到主机聚合中。这允许 OpenStack 管理员通过传递- availabliity-zone 参数将工作负载调度到地理位置:

    1. 打开终端到 openstackclient pod:

      # oc rsh openstackclient
    2. 创建新的 OpenStack 聚合:

      $ openstack aggregate create <aggregate_name>
    3. 使用 AZ 名称标记 OpenStack 聚合:

      $ openstack aggregate set --zone <availability_zone> <aggregate_name>
    4. 将 AZ 中的每个主机添加到聚合中:

      $ openstack aggregate add host <aggregate_name> <compute_node_1>
      $ openstack aggregate add host <aggregate_name> <compute_node_2>
      ...

5.7. 在 DCN 站点中添加节点到节点集

您可以通过将新节点添加到现有 OpenStackDataPlaneNodeSet 自定义资源(CR)的 nodes 部分,在站点扩展数据平面。

先决条件

流程

  1. 为您要更新的节点集打开 OpenStackDataPlaneNodeSet 清单文件,如 openstack_data_plane.yaml
  2. 将新节点添加到节点集中:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-node-set
    spec:
      preProvisioned: True
      nodes:
      ...
        edpm-compute-3:
          hostName: edpm-compute-3
          ansible:
            ansibleHost: 192.168.122.103
          networks:
          - name: CtlPlane
            subnetName: subnet1
            defaultRoute: true
            fixedIP: 192.168.122.103
          - name: InternalApi
            subnetName: subnet1
          - name: Storage
            subnetName: subnet1
          - name: Tenant
            subnetName: subnet1
      ...
  3. OpenStackDataPlaneNodeSet 清单文件中,编辑 edpm_network_config_os_net_config_mappings,以添加新主机的 mac 地址:

           ...
           edpm_network_config_os_net_config_mappings:
              edpm-compute-0:
                nic1: 52:54:00:1e:af:6b
                nic2: 52:54:00:d9:cb:f4
              edpm-compute-1:
                nic1: 52:54:00:f2:bc:af
                nic2: 52:54:00:f1:c7:dd
              edpm-compute-2:
                nic1: 52:54:00:dd:33:14
                nic2: 52:54:00:50:fb:c3
              edpm-compute-3:
                nic1: 52:54:12:8b:be:9a
                nic2: 52:54:12:8b:be:9b
  4. (可选)如果要使用 HCI 将节点添加到数据平面部署中,您必须完成以下内容:

    1. 必须存在 extraMounts 参数,以定义 Compute 服务(nova)的 cephx 密钥和配置文件。确保 OpenStackDataPlaneNodeSet 清单文件中存在 extraMounts 配置:

      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneNodeSet
      spec:
        ...
        nodeTemplate:
          extraMounts:
          - extraVolType: Ceph
            volumes:
            - name: ceph
              secret:
                secretName: ceph-conf-files
            mounts:
            - name: ceph
              mountPath: "/etc/ceph"
              readOnly: true
    2. 指定要应用到节点的其他服务:

      apiVersion: dataplane.openstack.org/v1beta1
      kind: OpenStackDataPlaneNodeSet
      spec:
        ...
        services:
          - bootstrap
          - configure-network
          - validate-network
          - install-os
          - ceph-hci-pre
          - configure-os
          - ssh-known-hosts
          - run-os
          - reboot-os
          - install-certs
          - ceph-client
          - ovn
          - neutron-metadata
          - libvirt
          - nova-custom-ceph-az0
      注意

      在配置 DCN 数据平面时,nova-custom-ceph-az0 服务会被创建,应在这一步中出现。如需更多信息 ,请参阅配置 DCN 数据平面

  5. 保存 OpenStackDataPlaneNodeSet 清单文件。
  6. 应用更新的 OpenStackDataPlaneNodeSet CR 配置:

    $ oc apply -f <data-plane-custom-resource-file>
    • <data-plane-custom-resource-file > 替换为您编辑的清单文件的名称。
  7. 通过确认状态为 SetupReady 来验证 data plane 资源是否已更新:

    $ oc wait openstackdataplanenodeset <node-set-name> --for condition=SetupReady --timeout=10m
    • <node-set-name > 替换为您要将节点添加到的 OpenStackDataPlaneNodeSet CR 的名称。

    当状态是 SetupReady 时,命令会返回一个 condition met 消息,否则会返回超时错误。如需有关 data plane 条件和状态的信息,请参阅 在 OpenShift 上部署 Red Hat OpenStack Services 中的 Data plane 条件 和状态

  8. 在工作站上创建一个文件来定义 OpenStackDataPlaneDeployment CR:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: <node_set_scaling_deployment_name>
    • <node_set_scaling_deployment_name > 替换为 OpenStackDataPlaneDeployment CR 的名称。名称必须是唯一的,且无法与之前创建的 OpenStackDataPlaneDeployment 匹配。您选择的名称必须包含小写字母数字字符(hyphen)或 . (句点),且必须以字母数字字符开头和结尾。
    提示

    为定义文件和 OpenStackDataPlaneDeployment CR 提供唯一和描述性名称,以指示修改的节点集的用途。

  9. 添加您修改的 OpenStackDataPlaneNodeSet CR:

    spec:
      nodeSets:
        - <nodeSet_name>
  10. 保存 OpenStackDataPlaneDeployment CR 部署文件。
  11. 部署修改后的 OpenStackDataPlaneNodeSet CR:

    $ oc create -f openstack_data_plane_deploy.yaml -n openstack

    您可以在部署执行时查看 Ansible 日志:

    $ oc get pod -l app=openstackansibleee -w
    $ oc logs -l app=openstackansibleee -f --max-log-requests 10

    如果 oc logs 命令返回类似以下错误的错误,请提高 --max-log-requests 值:

    error: you are attempting to follow 19 log streams, but maximum allowed concurrency is 10, use --max-log-requests to increase the limit
  12. 验证修改后的 OpenStackDataPlaneNodeSet CR 是否已部署:

    $ oc get openstackdataplanedeployment -n openstack
    NAME                  NODESETS                  STATUS  MESSAGE
    openstack-data-plane  ["openstack-data-plane"]  True    Setup Complete
    
    $ oc get openstackdataplanenodeset -n openstack
    NAME                  STATUS  MESSAGE
    openstack-data-plane  True    NodeSet Ready

    有关返回状态的含义的信息,请参阅 在 OpenShift 上部署 Red Hat OpenStack Services 中的 Data plane 条件和状态

    如果状态表示 data plane 尚未部署,则对部署进行故障排除。有关故障排除的更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的 对 data plane 创建和部署进行故障排除

  13. (可选):如果要使用 HCI 将节点添加到数据平面部署中,则必须将节点配置为 Ceph OSD 节点,并将其配置为使用并置 Red Hat Ceph Storage 集群。如需更多信息,请参阅以下资源:

  14. 如果新节点是 Compute 节点,则必须在线它们:

    1. 将 Compute 节点映射到它们连接的 Compute 单元:

      $ oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose

      如果您没有创建额外的单元,这个命令会将 Compute 节点映射到 cell1

    2. 访问 openstackclient pod 的远程 shell,并验证部署的 Compute 节点是否在 control plane 上可见:

      $ oc rsh -n openstack openstackclient
      $ openstack hypervisor list
      注意

      在后端中将 Ceph 编排器与 Cephadm 搭配使用,将主机添加到现有的 Red Hat Ceph Storage 集群中。有关更多信息,请参阅 [使用 Ceph 编排器] 添加主机。

  15. 将新主机添加到与节点集或其所在地理位置对应的可用区(AZ):

    1. 打开终端到 openstackclient pod:

      $ oc rsh openstackclient
    2. 将主机添加到 AZ 聚合中:

      $ openstack aggregate add host <availability_zone> <compute_node_3>
      • <availability_zone > 替换为新主机所在 AZ 的名称。
      • 将 < compute_node_3 > 替换为您要添加到节点集合中的主机的名称。

第 6 章 从 RHOSO DCN 部署中删除 DCN 站点

您可以从 DCN 配置中删除未使用的边缘位置和可用区。

6.1. 从 RHOSO DCM 部署中停用边缘站点

从部署的节点集合回收硬件不再需要的边缘站点。

先决条件

  • DCN 站点上的所有数据和工作负载都已迁移。

    重要

    在完成此步骤后,未保存的数据和未迁移的工作负载将会丢失。

流程

  1. 删除您要删除的 DCN 站点的主机聚合,例如 "az2":

    1. 从您的工作站访问 OpenStackClient pod 的远程 shell:

      $ oc rsh -n openstack openstackclient
    2. 可选:查看分配给主机聚合的 Compute 节点:

      # openstack aggregate show <aggregate_name>
    3. 要从主机聚合中删除分配的 Compute 节点,为每个 Compute 节点输入以下命令:

      # openstack aggregate remove host <aggregate_name> \
      <host_name>
      • <aggregate_name > 替换为与要删除的 DCN 站点对应的聚合,如 "az2"。
      • <host_name > 替换为要删除的聚合中的每个主机。
    4. 删除聚合:

      openstack aggregate delete <aggregate_name>
      • <aggregate_name > 替换为与要删除的 DCN 站点对应的聚合,如 "az2"。
    5. 退出 openstackclient pod:

      $ exit
  2. 可选:删除单元:

    1. 在工作站上打开 OpenStackControlPlane CR 文件 openstack_control_plane.yaml。
    2. cellTemplates 中删除单元定义:

            cellTemplates:
              cell0:
                hasAPIAccess: true..
                cellDatabaseAccount: nova-cell0
                cellDatabaseInstance: openstack
                cellMessageBusInstance: rabbitmq
              cell1:
                hasAPIAccess: true
                cellDatabaseAccount: nova-cell1
                cellDatabaseInstance: openstack-cell1
                cellMessageBusInstance: rabbitmq-cell1
              cell2:
                hasAPIAccess: true
                cellDatabaseAccount: nova-cell2
                cellDatabaseInstance: openstack-cell2
                cellMessageBusInstance: rabbitmq-cell2
      -       cell3:
      -         hasAPIAccess: true
      -         cellDatabaseAccount: nova-cell3
      -         cellDatabaseInstance: openstack-cell3
      -         cellMessageBusInstance: rabbitmq-cell3
    3. 从 OpenStackControlPlane CR 中删除特定于单元的 RabbitMQ 定义:

      spec:
      ...
        rabbitmq:
          templates:
            ...
            rabbitmq-<cellname>:
              ...
    4. 从 'OpenStackControlPlane CR 文件中删除特定于单元的 Galera 定义:

      spec:
      ...
        galera:
          templates:
            ...
            openstack-<cellname>:
              ...
    5. 更新 control plane:

      $ oc apply -f openstack_control_plane.yaml -n openstack
  3. 删除 DCN 站点的 Block storage (cinder) pod:

    1. 获取卷列表:

      $ openstack volume service list

      Example

      +------------------+--------------------------+------+---------+-------+----------------------------+
      | Binary           | Host                     | Zone | Status  | State | Updated At                 |
      +------------------+--------------------------+------+---------+-------+----------------------------+
      | cinder-scheduler | cinder-e479e-scheduler-0 | nova | enabled | down  | 2024-11-10T16:29:40.000000 |
      | cinder-scheduler | cinder-scheduler-0       | nova | enabled | up    | 2024-11-12T19:11:08.000000 |
      | cinder-volume    | cinder-volume-az0-0@ceph | az0  | enabled | up    | 2024-11-12T19:11:09.000000 |
      | cinder-backup    | cinder-backup-0          | nova | enabled | up    | 2024-11-12T19:11:08.000000 |
      | cinder-backup    | cinder-backup-1          | nova | enabled | up    | 2024-11-12T19:11:13.000000 |
      | cinder-backup    | cinder-backup-2          | nova | enabled | up    | 2024-11-12T19:11:16.000000 |
      | cinder-volume    | cinder-volume-az1-0@ceph | az1  | enabled | up    | 2024-11-12T19:11:15.000000 |
      | cinder-volume    | cinder-volume-az2-0@ceph | az2  | enabled | up    | 2024-11-12T17:28:28.000000 |
      +------------------+--------------------------+------+---------+-------+----------------------------+
    2. 禁用要删除的可用区(AZ)的块存储卷服务:

      $ openstack volume service set \
      --disable cinder-volume-az2-0@ceph cinder-volume
    3. 验证块存储卷是否已禁用:

      openstack volume service list

      Example

      +------------------+--------------------------+------+----------+-------+----------------------------+
      | Binary           | Host                     | Zone | Status   | State | Updated At                 |
      +------------------+--------------------------+------+----------+-------+----------------------------+
      | cinder-scheduler | cinder-e479e-scheduler-0 | nova | enabled  | down  | 2024-11-10T16:29:40.000000 |
      | cinder-scheduler | cinder-scheduler-0       | nova | enabled  | up    | 2024-11-12T19:23:38.000000 |
      | cinder-volume    | cinder-volume-az0-0@ceph | az0  | enabled  | up    | 2024-11-12T19:23:29.000000 |
      | cinder-backup    | cinder-backup-0          | nova | enabled  | up    | 2024-11-12T19:23:38.000000 |
      | cinder-backup    | cinder-backup-1          | nova | enabled  | up    | 2024-11-12T19:23:33.000000 |
      | cinder-backup    | cinder-backup-2          | nova | enabled  | up    | 2024-11-12T19:23:36.000000 |
      | cinder-volume    | cinder-volume-az1-0@ceph | az1  | enabled  | up    | 2024-11-12T19:23:35.000000 |
      | cinder-volume    | cinder-volume-az2-0@ceph | az2  | disabled | up    | 2024-11-12T19:23:24.000000 |
      +------------------+--------------------------+------+----------+-------+----------------------------+
    4. 打开 OpenStackControlPlane 清单文件 openstack_control_plane.yaml。删除要删除的站点的 CinderVolume pod,如下例所示:

           cinderVolumes:
              az2:
                customServiceConfig: |
                  [DEFAULT]
                  enabled_backends = ceph
                  glance_api_servers = https://glance-az2-internal.openstack.svc:9292
                  [ceph]
                  volume_backend_name = ceph
                  volume_driver = cinder.volume.drivers.rbd.RBDDriver
                  rbd_ceph_conf = /etc/ceph/az2.conf
                  rbd_user = openstack
                  rbd_pool = volumes
                  rbd_flatten_volume_from_snapshot = False
                  rbd_secret_uuid = 795dcbca-e715-5ac3-9b7e-a3f5c64eb89f
                  rbd_cluster_name = az2
                  backend_availability_zone = az2
  4. 为您要删除的 DCN 站点删除 cinder 卷服务:

    1. 打开 Cinder 调度程序 pod 的 shell:

      oc rsh cinder-scheduler-0
    2. 删除 cinder 卷服务:

      cinder-manage service remove cinder-volume cinder-volume-az2-0@ceph
    3. 退出 shell

      $ exit
  5. 移除正在移除的站点的 GlanceAPI pod:

    1. 在 openstack-control-plane.yaml 自定义资源(CR)文件中,删除 az2 字段及其下的所有字段:

           glanceAPIs:
              az0:
                <...>
              az1:
                <...>
             az2:
                apiTimeout: 60
                customServiceConfig: |
                  [DEFAULT]
                  enabled_import_methods = [web-download,copy-image,glance-direct]
                  enabled_backends = az0:rbd,az2:rbd
                  [glance_store]
                  default_backend = az2
                  [az0]
                  rbd_store_ceph_conf = /etc/ceph/az0.conf
                  store_description = "az0 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                  [az2]
                  rbd_store_ceph_conf = /etc/ceph/az2.conf
                  store_description = "az2 RBD backend"
                  rbd_store_pool = images
                  rbd_store_user = openstack
                  rbd_thin_provisioning = True
                imageCache:
                  cleanerScheduler: '*/30 * * * *'
                  prunerScheduler: 1 0 * * *
                  size: ""
                networkAttachments:
                - storage
                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.82
                      spec:
                        type: LoadBalancer
                replicas: 1
                resources: {}
                storage: {}
                tls:
                  api:
                    internal: {}
                    public: {}
                type: edge
    2. 重新应用 control plane:

      oc apply -f openstack-control-plane.yaml
    3. 确保 Image 服务(glance) pod 已被删除:

      $ oc get pods | grep glance | grep -v purge

      Example

      glance-e479e-az0-external-api-0           3/3     Running     0             2d
      glance-e479e-az0-external-api-1           3/3     Running     0             2d
      glance-e479e-az0-external-api-2           3/3     Running     0             2d
      glance-e479e-az0-internal-api-0           3/3     Running     0             2d
      glance-e479e-az0-internal-api-1           3/3     Running     0             2d
      glance-e479e-az0-internal-api-2           3/3     Running     0             2d
      glance-e479e-az1-edge-api-0
      注意

      glance-e4793-az2-edge-api-0 不会出现在此列表中。

    4. 确保 az2 pod 已被删除:

      $ oc get pods | grep cinder-volume

      Example

      cinder-volume-az0-0       2/2     Running     0   2d
      cinder-volume-az1-0       2/2     Running     0   2d
  6. 从 DCN 站点中删除 Ceph 集群:

    1. 关闭 Ceph 集群,但不要关闭主机。有关更多信息,请参阅" 使用 Ceph 编排器关闭并重启集群 "。

      注意

      主机必须保持开机,才能完成以下步骤。

    2. 删除用于访问已删除 Ceph 集群的 secret:

      $ oc delete secret ceph-conf-az-2 -n openstack
    3. 为中央站点重新创建 secret,使其不包含 az2 上 ceph 集群的 secret。例如,如果您有三个可用区 az0az1az2,并且您要删除与 az2 对应的边缘位置,请运行以下命令:

      oc delete secret cent-conf-az-0 -n openstack
      oc create secret generic ceph-conf-az-0 \
      --from-file=az0.client.openstack.keyring \
      --from-file=az-.conf \
      --from-file=az1.client.openstack.keyring \
      --from-file=az1.conf -n openstack
    4. 编辑 OpenStackControlPlane 中的 extraMounts,以删除对正在移除的 AZ 的引用,以及移除的 secret。例如,对于 AZ2,删除 follosing list 元素:

              - propagation:
                - az2
                extraVolType: Ceph
                volumes:
                - name: ceph
                  secret:
                    name: ceph-conf-az-2
  7. 删除节点集。要删除与 az2 可用区对应的节点集,请完成 删除 OpenStackDataPlaneNodeSet 资源 中的步骤。

第 7 章 删除 DCN 节点

如果不再需要,您可以从 DCN 站点中删除节点,允许您重新使用硬件。

7.1. 冷迁移实例

冷迁移实例涉及停止实例并将其移动到另一个 Compute 节点。冷迁移有助于实时迁移无法促进的迁移方案,如迁移使用 PCI 直通的实例。调度程序自动选择目标 Compute 节点。如需更多信息,请参阅 迁移限制

流程

  1. 从您的工作站访问 OpenStackClient pod 的远程 shell:

    $ oc rsh -n openstack openstackclient
  2. 要冷迁移实例,请输入以下命令关闭并移动实例:

     $ openstack server migrate <instance> --wait
    • <instance > 替换为要迁移的实例的名称或 ID。
    • 如果迁移本地存储的卷,则指定 --block-migration 标记。
    • 指定 --wait 标志,以指示您必须等待迁移完成。
  3. 等待实例迁移完成后,您可以打开另一个终端窗口并检查迁移状态。如需更多信息,请参阅 检查迁移状态
  4. 检查实例的状态:

     $ openstack server list --all-projects

    "VERIFY_RESIZE"状态表示您需要确认或恢复迁移:

    • 如果迁移按预期工作,请确认它:

       $ openstack server resize --confirm <instance>

      <instance > 替换为要迁移的实例的名称或 ID。"ACTIVE"状态表示实例已就绪。

    • 如果迁移无法正常工作,请恢复它:

       $ openstack server resize --revert <instance>

      <instance > 替换为实例的名称或 ID。

  5. 重启实例:

     $ openstack server start <instance>

    <instance > 替换为实例的名称或 ID。

  6. 可选:如果您为维护禁用了源 Compute 节点,您必须重新启用该节点,以便可以把新实例分配给该节点:

     $ openstack compute service set <source> nova-compute --enable

    <source > 替换为源 Compute 节点的主机名。

  7. 退出 OpenStackClient pod:

    $ exit

7.2. 从主机聚合中删除计算节点

您可以使用 OpenStackClient pod 从主机聚合中删除计算节点。

流程

  1. 从您的工作站访问 OpenStackClient pod 的远程 shell:

    $ oc rsh -n openstack openstackclient
  2. 查看分配给主机聚合的所有 Compute 节点列表:

    # openstack aggregate show <aggregate_name>
  3. 要从主机聚合中删除分配的 Compute 节点,请输入以下命令:

    # openstack aggregate remove host <aggregate_name> <host_name>
    • <aggregate_name > 替换为主机聚合的名称,以便从中删除 Compute 节点。
    • <host_name > 替换为要从主机聚合中删除的 Compute 节点的名称。

7.3. 使用 Ceph Orchestrator 删除主机

在运行超融合基础架构(HCI)时,您可以从 DCN 集群中删除节点。

先决条件

  • 您在 DCN 集群上运行 HCI
  • 您有对所有节点的 Root 级别访问权限。
  • 要删除的主机被添加到存储集群中。
  • Cephadm 部署在要移除该服务的节点上。

流程

  1. 登录到 Cephadm shell:

    [root@host01 ~]# cephadm shell
  2. 获取主机详情:

    [ceph: root@host01 /]# ceph orch host ls
  3. 排空主机中的所有守护进程:

    [ceph: root@host01 /]# ceph orch host drain <hostname>
    • 将 <hostname > 替换为您要删除的主机的名称。

      有关管理 Red Hat Ceph Storage 服务的更多信息,请参阅 Red Hat Ceph Storage 7 的 管理指南

  4. 检查移除 OSD 的状态:

    [ceph: root@host01 /]# ceph orch osd rm status

    当 OSD 上没有剩余的放置组(PG)时,该 OSD 会停用并从存储集群中移除。

  5. 检查所有守护进程是否已从存储集群中移除:

    [ceph: root@host01 /]# ceph orch ps <hostname>
    • 将 <hostname > 替换为您要删除的主机的名称。
  6. 删除主机:

    [ceph: root@host01 /]# ceph orch host rm <hostname>
    • 将 <hostname > 替换为您要删除的主机的名称。

7.4. 从数据平面中删除 Compute 节点

您可以从数据平面上的节点集合中删除 Compute 节点。如果从节点集合中删除所有节点,则还必须从 data plane 中删除节点集。

先决条件

  • 以具有 cluster-admin 权限的用户身份登录 RHOCP 集群。
  • Compute 节点上的工作负载已迁移到其他 Compute 节点。

流程

  1. 访问 openstackclient pod 的远程 shell:

    $ oc rsh -n openstack openstackclient
  2. 检索您要删除的 Compute 节点的 IP 地址:

    $ openstack hypervisor list
  3. 检索 Compute 节点列表,以识别您要删除的节点的名称和 UUID:

    $ openstack compute service list
  4. 禁用要删除的 Compute 节点上的 nova-compute 服务:

    $ openstack compute service set <hostname> nova-compute --disable
    提示

    使用 --disable-reason 选项添加有关为何要禁用该服务的简短说明。如果您打算重新部署 Compute 服务,这很有用。

  5. 退出 OpenStackClient pod:

    $ exit
  6. SSH 到要删除的 Compute 节点,并停止 ovnnova-compute 容器:

    $ ssh -i <key_file_name> cloud-admin@<node_IP_address>
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_ovn_controller
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_ovn_metadata_agent
    [cloud-admin@<hostname> ~]$ sudo systemctl stop edpm_nova_compute
    • 将 < key_file_name > 替换为您创建的 SSH 密钥对文件的名称和位置,以便 Ansible 管理 RHEL 节点。
    • <node_IP_address > 替换为在第 2 步中获取的 Compute 节点的 IP 地址。
  7. 删除管理 ovnnova-compute 容器的 systemd 单元文件,以防止在删除的节点重启时自动启动和注册代理:

    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_ovn_controller
    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_ovn_metadata_agent
    [cloud-admin@<hostname> ~]$ sudo rm -f /etc/systemd/system/edpm_nova_compute
  8. 断开与 Compute 节点的连接:

    $ exit
  9. 访问 openstackclient 的远程 shell:

    $ oc rsh -n openstack openstackclient
  10. 删除要删除的 Compute 节点的网络代理:

    $ openstack network agent list [--host <hostname>]
    $ openstack network agent delete <agent_id>
  11. 删除要删除的 Compute 节点的 nova-compute 服务:

    $ openstack compute service delete <node_uuid>
    • <node_uuid > 替换为您要删除在第 3 步中检索的节点 UUID。
  12. 退出 OpenStackClient pod:

    $ exit
  13. OpenStackDataPlaneNodeSet CR 中删除节点:

    $ oc patch openstackdataplanenodeset/<node_set_name> --type json --patch '[{ "op": "remove", "path": "/spec/nodes/<node_name>" }]'
    • <node_set_name > 替换为节点所属的 OpenStackDataPlaneNodeSet CR 的名称。
    • <node_name > 替换为 OpenStackDataPlaneNodeSet CR 的 nodes 部分中定义的节点名称。
  14. 在工作站上创建一个文件,以定义 OpenStackDataPlaneDeployment CR,以便在移除 Compute 节点的情况下更新节点集:

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneDeployment
    metadata:
      name: <node_set_deployment_name>
    • <node_set_deployment_name > 替换为 OpenStackDataPlaneDeployment CR 的名称。名称必须是唯一的,必须包含小写字母数字字符(hyphen)或 . (句点),且必须以字母数字字符开头和结尾。
    提示

    为定义文件和 OpenStackDataPlaneDeployment CR 提供唯一和描述性名称,以指示修改的节点集的用途。

  15. 添加从中删除节点的 OpenStackDataPlaneNodeSet CR:

    spec:
      nodeSets:
        - <nodeSet_name>
  16. 指定 OpenStackDataPlaneDeployment CR 应该仅在部署列出的节点集合时运行 ssh-known-hosts 服务:

    spec:
      servicesOverride:
        - ssh-known-hosts
  17. 保存 OpenStackDataPlaneDeployment CR 部署文件。
  18. 部署 ssh-known-hosts 服务,以从剩余的节点上的已知主机列表中删除删除的节点:

    $ oc create -f openstack_data_plane_deploy.yaml -n openstack

    您可以在部署执行时查看 Ansible 日志:

    $ oc get pod -l app=openstackansibleee -w
    $ oc logs -l app=openstackansibleee -f --max-log-requests 10

    如果 oc logs 命令返回类似以下错误的错误,请提高 --max-log-requests 值:

    error: you are attempting to follow 19 log streams, but maximum allowed concurrency is 10, use --max-log-requests to increase the limit
  19. 验证修改后的 OpenStackDataPlaneNodeSet CR 是否已部署:

    $ oc get openstackdataplanedeployment -n openstack
    NAME                  NODESETS                  STATUS  MESSAGE
    openstack-data-plane  ["openstack-data-plane"]  True    Setup Complete
    
    $ oc get openstackdataplanenodeset -n openstack
    NAME                  STATUS  MESSAGE
    openstack-data-plane  True    NodeSet Ready

    有关返回状态的含义的信息,请参阅 在 OpenShift 上部署 Red Hat OpenStack Services 中的 Data plane 条件和状态

    如果状态表示 data plane 尚未部署,则对部署进行故障排除。如需更多信息,请参阅在 OpenShift 上部署 Red Hat OpenStack Services 中的对 data plane 创建和部署进行故障排除

第 8 章 验证边缘存储

为确保部署中央和边缘站点正常工作,可测试 glance 多存储和实例创建。您可以使用 openstackclient pod 以 OpenStack 管理员身份测试命令。

您可以将镜像导入到可在本地文件系统中可用的 glance 中,或者在 web 服务器上可用。

注意

始终将镜像副本存储在中央站点,即使没有在中央位置使用该镜像的实例。

8.1. 查看 DCN 环境中的镜像服务存储

在测试 glance multi-store 前,请确保镜像服务存储可用。

流程

  • 使用 glance stores-info 命令,检查可通过镜像服务提供的存储。在以下示例中,有三个存储可用: central、dcn1 和 dcn2。它们分别对应于中央位置和边缘站点中的 glance 存储:

      $ glance stores-info
      +----------+----------------------------------------------------------------------------------+
      | Property | Value                                                                            |
      +----------+----------------------------------------------------------------------------------+
      | stores   | [{"default": "true", "id": "az0", "description": "central rbd glance             |
      |          | store"}, {"id": "az1", "description": "z1 rbd glance store"},                    |
      |          | {"id": "az2", "description": "az2 rbd glance store"}]                            |
      +----------+----------------------------------------------------------------------------------+

8.2. 从本地文件导入

您必须首先将镜像上传到中央位置的存储,然后将镜像复制到远程站点。

  1. 确保您的镜像文件采用 RAW 格式。如果镜像不是 raw 格式,则必须在将镜像导入到镜像服务前转换它:

    $ file cirros-0.5.1-x86_64-disk.img
    cirros-0.5.1-x86_64-disk.img: QEMU QCOW2 Image (v3), 117440512 bytes
    
    $ qemu-img convert -f qcow2 -O raw cirros-0.5.1-x86_64-disk.img cirros-0.5.1-x86_64-disk.raw

    将镜像导入到中央站点的默认后端:

    openstack image create \
    --disk-format raw --container-format bare \
    --name cirros --file cirros-0.5.1-x86_64-disk.raw \
    --store central

8.3. 从 Web 服务器导入镜像

如果镜像托管在 web 服务器上,您可以使用 GlanceImageImportPlugins 参数将镜像上传到多个存储中。

此流程假设默认 Image Conversion 插件已在镜像服务(glance)中启用。此功能自动将 QCOW2 文件格式转换为 RAW 镜像,它们是 Ceph RBD 的最佳选择。您可以通过运行 glance image-show ID | grep disk_format 来确认 glance 镜像采用 RAW 格式。

流程

  1. 使用 glance 命令的 image-create-via-import 参数从 Web 服务器导入镜像。使用- -stores 参数。

    # glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name cirros \
    --uri http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img \
    --import-method web-download \
    --stores az0,az1

    在本例中,qcow2 cirros 镜像从官方 Cirros 站点下载,由 glance 转换为 RAW,并导入到中央站点和边缘站点 1 (由- stores 参数指定)。

    注意

    或者,您可以将 --- stores 替换为--all-stores True,将镜像上传到所有存储。

8.4. 将镜像复制到新站点

您可以将现有镜像从中央位置复制到边缘站点,这可让您在新创建的位置访问之前创建的镜像。

  1. 将 glance 镜像的 UUID 用于复制操作:

    ID=$(openstack image show cirros -c id -f value)
    
    glance image-import $ID --stores az1,az2 --import-method copy-image
    注意

    在本例中,-- stores 选项指定将 cirros 镜像从中央站点( z0) 复制到边缘站点 az1az2。或者,您可以使用 --all-stores True 选项,将镜像上传到目前没有该镜像的所有存储中。

  2. 确认镜像的副本位于每个存储中。请注意,store 键是属性映射中的最后一个项,设置为 az0,az1,az2

    $ openstack image show $ID | grep properties
    
    | properties | os_glance_failed_import=', os_glance_importing_to_stores=', os_hash_algo=sha512, os_hash_value=6b813aa46bb90b4da216a4d19376593fa3f4fc7e617f03a92b7fe11e9a3981cbe8f0959dbebe36225e5f53dc4492341a4863cac4ed1ee0909f3fc78ef9c3e869, os_hidden=False, stores=az0,az1 |
注意

始终将镜像副本存储在中央站点中,即使该站点中没有使用它的虚拟机。

您可以使用边缘站点的镜像来创建持久的根卷。

流程

  1. 识别要作为卷创建的镜像的 ID,并将该 ID 传递给 openstack volume create 命令:

    IMG_ID=$(openstack image show cirros -c id -f value)
    openstack volume create --size 8 --availability-zone az1 pet-volume-az1 --image $IMG_ID
  2. 确定新创建的卷的卷 ID,并将其传递给 openstack server create 命令:

    VOL_ID=$(openstack volume show -f value -c id pet-volume-az1)
    openstack server create --flavor tiny --key-name az1-key --network az1-network --security-group basic --availability-zone az1 --volume $VOL_ID pet-server-az1
  3. 您可以通过在 az1 边缘站点的 ceph-mon 容器中运行 rbd 命令,以验证卷是否基于镜像,以列出 volumes 池。

    $ sudo cephadm shell -- rbd -p volumes ls -l
    NAME                                      SIZE  PARENT                                           FMT PROT LOCK
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2      excl
    $
  4. 确认您可以创建实例的 root 卷的 cinder 快照。确保服务器停止停止以静止数据以创建干净的快照。使用-- force 选项,因为实例关闭时卷状态为 in-use

    openstack server stop pet-server-az1
    openstack volume snapshot create pet-volume-az1-snap --volume $VOL_ID --force
    openstack server start pet-server-az1
  5. 列出 az1 Ceph 集群上 volumes 池的内容,以显示新创建的快照。

    $ sudo cephadm shell -- rbd -p volumes ls -l
    NAME                                                                                      SIZE  PARENT                                           FMT PROT LOCK
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7                                               8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2      excl
    volume-28c6fc32-047b-4306-ad2d-de2be02716b7@snapshot-a1ca8602-6819-45b4-a228-b4cd3e5adf60 8 GiB images/8083c7e7-32d8-4f7a-b1da-0ed7884f1076@snap   2 yes

8.6. 确认可以在站点之间创建和复制镜像快照

重新快照,并确认您可以使用 glance image-import 将其复制到中央位置。

  1. 验证您可以在 az1 位置创建新镜像。确保服务器停止静止数据以创建清理快照:

    NOVA_ID=$(openstack server show pet-server-az1 -f value -c id)
    openstack server stop $NOVA_ID
    openstack server image create --name cirros-snapshot $NOVA_ID
    openstack server start $NOVA_ID
  2. 将镜像从 az1 边缘站点复制回中央位置,这是 glance 的默认后端:

    IMAGE_ID=$(openstack image show cirros-snapshot -f value -c id)
    glance image-import $IMAGE_ID --stores az0 --import-method copy-image

8.7. 在边缘站点测试备份和恢复

您可以在边缘站点可用区(AZ)和中央 AZ 中备份和恢复块存储服务(cinder)卷。cinder-backup 服务在中央 AZ 中运行,备份存储在中央 AZ 中。块存储服务不会在边缘站点存储备份,且不支持在边缘站点间直接备份和恢复操作。

先决条件

  • 块存储备份服务部署在中央 AZ 中。如需更多信息 ,请参阅更新 control plane
  • Block Storage (cinder) REST API 微版本 3.51 或更高版本。
  • 所有站点都使用常见的 openstack cephx 客户端名称。

流程

  1. 在第一个 DCN 站点中创建卷的备份:

    $ openstack --os-volume-api-version 3.51 volume backup create \
    --name <volume_backup> --availability-zone <az0> <edge_volume>
    • <volume_backup > 替换为卷备份的名称。
    • <az0 > 替换为托管 cinder-backup 服务的中央可用区的名称。
    • 将 < edge_volume > 替换为您要备份的卷的名称。

      注意

      如果您在 Ceph 密钥环时遇到问题,您可能需要重启 cinder-backup 容器,以便主机中的密钥环从主机复制到容器。

  2. 将备份恢复到第二个 DCN 站点中的新卷:

    $ openstack --os-volume-api-version 3.47 volume create \
    --backup <volume_backup> --availability-zone <az_2> <new_volume>
    • 将 &lt ;az_ 2> 替换为您要恢复备份的可用区的名称。
    • <new_volume > 替换为新卷的名称。
    • 将 &lt ;volume_backup > 替换为您在上一步中创建的卷备份的名称。

法律通告

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 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部