7.2. 将计算服务到 RHOSO 数据平面


将您的 Compute (nova)服务纳入 OpenShift (RHOSO)数据平面上的 Red Hat OpenStack 服务。

先决条件

  • 您已在 Compute 服务(nova)主机上停止剩余的 control plane 节点、存储库和软件包。如需更多信息,请参阅 停止基础架构管理和计算服务
  • 您已为 NovaLibvirt 服务配置了 Ceph 后端。有关更多信息 ,请参阅配置 Ceph 后端
  • 您已配置了 IP 地址管理(IPAM):

    $ oc apply -f - <<EOF
    apiVersion: network.openstack.org/v1beta1
    kind: NetConfig
    metadata:
      name: netconfig
    spec:
      networks:
      - name: ctlplane
        dnsDomain: ctlplane.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 192.168.122.120
            start: 192.168.122.100
          - end: 192.168.122.200
            start: 192.168.122.150
          cidr: 192.168.122.0/24
          gateway: 192.168.122.1
      - name: internalapi
        dnsDomain: internalapi.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.17.0.250
            start: 172.17.0.100
          cidr: 172.17.0.0/24
          vlan: 20
      - name: External
        dnsDomain: external.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 10.0.0.250
            start: 10.0.0.100
          cidr: 10.0.0.0/24
          gateway: 10.0.0.1
      - name: storage
        dnsDomain: storage.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.18.0.250
            start: 172.18.0.100
          cidr: 172.18.0.0/24
          vlan: 21
      - name: storagemgmt
        dnsDomain: storagemgmt.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.20.0.250
            start: 172.20.0.100
          cidr: 172.20.0.0/24
          vlan: 23
      - name: tenant
        dnsDomain: tenant.example.com
        subnets:
        - name: subnet1
          allocationRanges:
          - end: 172.19.0.250
            start: 172.19.0.100
          cidr: 172.19.0.0/24
          vlan: 22
    EOF
    Copy to Clipboard Toggle word wrap
  • 如果在 Compute 服务节点上运行 neutron-sriov-nic-agent,请确保物理设备映射与 OpenStackDataPlaneNodeSet 自定义资源(CR)中定义的值匹配。如需更多信息,请参阅从 director Operator 部署中提取配置
  • 您已定义 shell 变量来运行运行升级的脚本:

    $ CEPH_FSID=$(oc get secret ceph-conf-files -o json | jq -r '.data."ceph.conf"' | base64 -d | grep fsid | sed -e 's/fsid = //')
    
    $ alias openstack="oc exec -t openstackclient -- openstack"
    
    $ DEFAULT_CELL_NAME="cell3" 
    1
    
    $ RENAMED_CELLS="cell1 cell2 $DEFAULT_CELL_NAME"
    
    $ declare -A COMPUTES_CELL1
    $ export COMPUTES_CELL1=( 
    2
    
      ["standalone.localdomain"]="192.168.122.100" 
    3
    
      # <compute1> 
    4
    
      # <compute2>
      # <compute3>
    )
    $ declare -A COMPUTES_CELL2
    $ export COMPUTES_CELL2=(
      # ...
    )
    $ declare -A COMPUTES_CELL3
    $ export COMPUTES_CELL3=(
      # ... 
    5
    
    )
    # ...
    
    $ declare -A COMPUTES_API_CELL1
    $ export COMPUTES_API_CELL1=( 
    6
    
      ["standalone.localdomain"]="172.17.0.100"
      # ...
    )
    # ...
    
    $ NODESETS=""
    $ for CELL in $(echo $RENAMED_CELLS); do
      ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
      eval names=\${!${ref}[@]}
      [ -z "$names" ] && continue
      NODESETS="'openstack-${CELL}', $NODESETS" 
    7
    
    done
    $ NODESETS="[${NODESETS%,*}]"
    Copy to Clipboard Toggle word wrap
    1
    源云 默认单元 在采用后获取目标云上的新的 DEFAULT_CELL_NAME。在多单元采用场景中,您可以通过提供源云中最后单元的索引来保留原始名称、默认 或 创建新单元默认名称。例如,如果最后一个单元的递增索引是 cell5,新的单元默认名称是 cell6
    2
    对于每个单元,使用连接到 ctlplaneinternalapi 网络的 Compute 服务节点的名称和 IP 地址更新 <["standalone.localdomain"]="x.x.x">值以及 COMPUTES_CELL<X > 值。不要为每个网络指定一个真实的 FQDN。始终对 Compute 节点的每个连接的网络使用相同的主机名。根据需要,提供源云其余网络上的 IP 地址和主机名称。或者,您可以手动调整在此流程的第 9 步中生成的文件。
    3
    如果您的部署有自定义 DNS 域,请在节点的 FQDN 值中指定它。此值用于 data plane 节点设置 spec.nodes.<NODE NAME>.hostName
    4
    将源云 单元1单元 中的所有 Compute 服务节点分配给 COMPUTES_CELL1,以此类推。将 <compute1& gt; , & lt;compute 2&gt ; , 和 <compute3 > 替换为 Compute 服务节点的名称。
    5
    将源云 默认单元 中的所有 Compute 服务节点分配给 COMPUTES_CELL<X>COMPUTES_API_CELL<X>',其中 <X > 是 DEFAULT_CELL_NAME 环境变量值。在本例中,DEFAULT_CELL_NAME 环境变量值等于 cell3
    6
    对于每个单元,使用连接到 ctlplaneinternalapi 网络的 Compute 服务节点的 name 和 COMPUTES_API_CELL 值更新 <[ "standalone.localdomain"]="192.168.122.100 ">值以及 COMPUTES_API_CELL 值。不要为每个网络指定一个真实的 FQDN。为每个连接的网络使用相同的主机名。根据需要,提供源云其余网络上的 IP 地址和主机名称。或者,您可以手动调整在此流程的第 9 步中生成的文件。
    7
    此模板中省略了不包含 Compute 节点的单元,因为没有为单元创建节点集。
    注意

    如果您使用 默认单元 部署源云,并希望在采用过程中重命名它,请定义您要使用的新名称,如下例所示:

    $ DEFAULT_CELL_NAME="cell1"
    $ RENAMED_CELLS="cell1"
    Copy to Clipboard Toggle word wrap
注意

如果本地存储后端由 libvirt 的 Compute 服务配置,则不要为 CEPH_FSID 参数设置值。存储后端必须与源云存储后端匹配。您不能在采用过程中更改存储后端。

流程

  1. 为 data plane 节点创建 SSH 身份验证 secret:

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: Secret
    metadata:
        name: dataplane-adoption-secret
    data:
        ssh-privatekey: |
    $(cat <path_to_SSH_key> | base64 | sed 's/^/        /')
    EOF
    Copy to Clipboard Toggle word wrap
    • <path_to_SSH_key > 替换为 SSH 密钥的路径。
  2. 生成 ssh 密钥对 nova-migration-ssh-key secret:

    $ cd "$(mktemp -d)"
    ssh-keygen -f ./id -t ecdsa-sha2-nistp521 -N ''
    oc get secret nova-migration-ssh-key || oc create secret generic nova-migration-ssh-key \
      --from-file=ssh-privatekey=id \
      --from-file=ssh-publickey=id.pub \
      --type kubernetes.io/ssh-auth
    rm -f id*
    cd -
    Copy to Clipboard Toggle word wrap
  3. 如果启用了 TLS Everywhere,将 LIBVIRT_PASSWORD 设置为与现有的 RHOSP 部署密码匹配:

    declare -A TRIPLEO_PASSWORDS
    TRIPLEO_PASSWORDS[default]="$HOME/overcloud-passwords.yaml"
    LIBVIRT_PASSWORD=$(cat ${TRIPLEO_PASSWORDS[default]} | grep ' LibvirtTLSPassword:' | awk -F ': ' '{ print $2; }')
    LIBVIRT_PASSWORD_BASE64=$(echo -n "$LIBVIRT_PASSWORD" | base64)
    Copy to Clipboard Toggle word wrap
    1. 启用 TLS-e 时创建 libvirt-secret:

      $ oc apply -f - <<EOF
      apiVersion: v1
      kind: Secret
      metadata:
        name: libvirt-secret
      type: Opaque
      data:
        LibvirtPassword: ${LIBVIRT_PASSWORD_BASE64}
      EOF
      Copy to Clipboard Toggle word wrap
  4. 创建一个配置映射,用于所有单元来为 libvirt 配置本地存储后端:

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nova-cells-global-config
    data: 
    1
    
      99-nova-compute-cells-workarounds.conf: | 
    2
    
        [workarounds]
        disable_compute_service_check_for_ffu=true
    EOF
    Copy to Clipboard Toggle word wrap
    1
    ConfigMap 中的 data 资源为所有单元提供配置文件。
    2
    根据优先级将 &lt ;*.conf& gt; 文件从 03 索引为 99。& lt;99636.conf > 文件具有最高的优先级,而以下 03 的索引则保留给内部使用。
    注意

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

  5. 为 libvirt 配置 Red Hat Ceph Storage 后端:

    $ oc apply -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nova-cells-global-config
    data:
      99-nova-compute-cells-workarounds.conf: |
        [workarounds]
        disable_compute_service_check_for_ffu=true
      03-ceph-nova.conf: |
        [libvirt]
        images_type=rbd
        images_rbd_pool=vms
        images_rbd_ceph_conf=/etc/ceph/ceph.conf
        images_rbd_glance_store_name=default_backend
        images_rbd_glance_copy_poll_interval=15
        images_rbd_glance_copy_timeout=600
        rbd_user=openstack
        rbd_secret_uuid=$CEPH_FSID
    EOF
    Copy to Clipboard Toggle word wrap
    注意

    对于带有多单元配置的 Red Hat Ceph Storage 环境,您必须命名配置映射和 Red Hat OpenStack Platform 数据平面服务,如下例所示: nova-custom-ceph-cellXnova-compute-extraconfig-cellX

  6. 为 Compute 服务单元创建 data plane 服务以启用预升级临时解决方案,并为您选择的存储后端配置 Compute 服务:

    for CELL in $(echo $RENAMED_CELLS); do
     $ oc apply -f - <<EOF
    ---
    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneService
    metadata:
      name: nova-$CELL
    spec:
      dataSources: 
    1
    
        - secretRef:
            name: nova-$CELL-compute-config 
    2
    
        - secretRef:
            name: nova-migration-ssh-key 
    3
    
        - configMapRef:
            name: nova-cells-global-config
      playbook: osp.edpm.nova
      caCerts: combined-ca-bundle
      edpmServiceType: nova
      containerImageFields:
      - NovaComputeImage
      - EdpmIscsidImage
    EOF
      done
    Copy to Clipboard Toggle word wrap
    • 如果启用了 TLS Everywhere,请将以下内容附加到 OpenStackDataPlaneService CR 中:

        tlsCerts:
          contents:
            - dnsnames
            - ips
          networks:
            - ctlplane
          issuer: osp-rootca-issuer-internal
          edpmRoleServiceName: nova
        caCerts: combined-ca-bundle
        edpmServiceType: nova
      Copy to Clipboard Toggle word wrap
      1
      要为 cell<X> 启用本地元数据服务,请附加 spec.dataSources.secretRef 来引用额外的自动生成的 nova-cell<X>-metadata-neutron-config secret。您还应该在 OpenStackControlPlane/openstack CR 中设置 spec.nova.template.cellTemplates.cell<X>.metadataServiceTemplate.enable,如 Adopt ing the Compute 服务 中所述。您可以配置单个顶级元数据,或者定义每个单元的元数据。
      2
      每个单元格的 secret nova-cell<X>-compute-config auto-generates。
      3
      您必须为每个与 Compute 服务相关的自定义 OpenStackDataPlaneService CR 附加 nova-cell<X>-compute-confignova-migration-ssh-key 引用。
      注意

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

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

    $ oc create secret generic subscription-manager \
    --from-literal rhc_auth='{"login": {"username": "<subscription_manager_username>", "password": "<subscription_manager_password>"}}'
    Copy to Clipboard Toggle word wrap
    • <subscription_manager_username& gt; 替换为适用的用户名。
    • <subscription_manager_password& gt; 替换为适用的密码。
  8. 为 Red Hat registry 创建 secret:

    $ oc create secret generic redhat-registry \
    --from-literal edpm_container_registry_logins='{"registry.redhat.io": {"<registry_username>": "<registry_password>"}}'
    Copy to Clipboard Toggle word wrap
    • <registry_username& gt; 替换为适用的用户名。
    • <registry_password& gt; 替换为适用的密码。

      注意

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

  9. 为每个单元创建 data plane 节点设置定义:

    $ declare -A names
    $ for CELL in $(echo $RENAMED_CELLS); do
      ref="COMPUTES_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
      eval names=\${!${ref}[@]}
      ref_api="COMPUTES_API_$(echo ${CELL}|tr '[:lower:]' '[:upper:]')"
      [ -z "$names" ] && continue
      ind=0
      rm -f computes-$CELL
      for compute in $names; do
        ip="${ref}['$compute']"
        ip_api="${ref_api}['$compute']"
        cat >> computes-$CELL << EOF
        ${compute}:
          hostName: $compute 
    1
    
          ansible:
            ansibleHost: $compute
          networks: 
    2
    
          - defaultRoute: true
            fixedIP: ${!ip}
            name: ctlplane
            subnetName: subnet1
          - name: internalapi
            subnetName: subnet1
            fixedIP: ${!ip_api}
          - name: storage
            subnetName: subnet1
          - name: tenant
            subnetName: subnet1
    EOF
        ind=$(( ind + 1 ))
      done
    
      test -f computes-$CELL || continue
      cat > nodeset-${CELL}.yaml <<EOF
    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-$CELL 
    3
    
    spec:
      tlsEnabled: false 
    4
    
      networkAttachments:
          - ctlplane
      preProvisioned: true
      services:
        - redhat
        - bootstrap
        - download-cache
        - configure-network
        - validate-network
        - install-os
        - configure-os
        - ssh-known-hosts
        - run-os
        - reboot-os
        - install-certs
        - ovn
        - neutron-metadata
        - libvirt
        - nova-$CELL
        - telemetry 
    5
    
      env:
        - name: ANSIBLE_CALLBACKS_ENABLED
          value: "profile_tasks"
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
        - name: ANSIBLE_VERBOSITY
          value: '3'
      nodeTemplate:
        ansibleSSHPrivateKeySecret: dataplane-adoption-secret
        ansible:
          ansibleUser: root
          ansibleVarsFrom:
          - secretRef:
              name: subscription-manager
          - secretRef:
              name: redhat-registry
          ansibleVars:
            rhc_release: 9.2
            rhc_repositories:
                - {name: "*", state: disabled}
                - {name: "rhel-9-for-x86_64-baseos-eus-rpms", state: enabled}
                - {name: "rhel-9-for-x86_64-appstream-eus-rpms", state: enabled}
                - {name: "rhel-9-for-x86_64-highavailability-eus-rpms", state: enabled}
                - {name: "rhoso-18.0-for-rhel-9-x86_64-rpms", state: enabled}
                - {name: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
                - {name: "rhceph-7-tools-for-rhel-9-x86_64-rpms", state: enabled}
            edpm_bootstrap_release_version_package: []
            # edpm_network_config
            # Default nic config template for a EDPM node
            # These vars are edpm_network_config role vars
            edpm_network_config_template: |
               ---
               {% set mtu_list = [ctlplane_mtu] %}
               {% for network in nodeset_networks %}
               {% set _ = mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) %}
               {%- endfor %}
               {% set min_viable_mtu = mtu_list | max %}
               network_config:
               - type: ovs_bridge
                 name: {{ neutron_physical_bridge_name }}
                 mtu: {{ min_viable_mtu }}
                 use_dhcp: false
                 dns_servers: {{ ctlplane_dns_nameservers }}
                 domain: {{ dns_search_domains }}
                 addresses:
                 - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
                 routes: {{ ctlplane_host_routes }}
                 members:
                 - type: interface
                   name: nic1
                   mtu: {{ min_viable_mtu }}
                   # force the MAC address of the bridge to this interface
                   primary: true
               {% for network in nodeset_networks %}
                 - type: vlan
                   mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }}
                   vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }}
                   addresses:
                   - ip_netmask:
                       {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }}
                   routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }}
               {% endfor %}
    
            edpm_network_config_nmstate: false
            # Control resolv.conf management by NetworkManager
            # false = disable NetworkManager resolv.conf update (default)
            # true = enable NetworkManager resolv.conf update
            edpm_bootstrap_network_resolvconf_update: false
            edpm_network_config_hide_sensitive_logs: false
            #
            # These vars are for the network config templates themselves and are
            # considered EDPM network defaults.
            neutron_physical_bridge_name: br-ctlplane 
    6
    
            neutron_public_interface_name: eth0
    
            # edpm_nodes_validation
            edpm_nodes_validation_validate_controllers_icmp: false
            edpm_nodes_validation_validate_gateway_icmp: false
    
            # edpm ovn-controller configuration
            edpm_ovn_bridge_mappings: <bridge_mappings> 
    7
    
            edpm_ovn_bridge: br-int
            edpm_ovn_encap_type: geneve
            ovn_monitor_all: true
            edpm_ovn_remote_probe_interval: 60000
            edpm_ovn_ofctrl_wait_before_clear: 8000
    
            timesync_ntp_servers:
            - hostname: clock.redhat.com
            - hostname: clock2.redhat.com
    
            edpm_bootstrap_command: |
              # FIXME: perform dnf upgrade for other packages in EDPM ansible
              # here we only ensuring that decontainerized libvirt can start
              dnf -y upgrade openstack-selinux
              rm -f /run/virtlogd.pid
    
            gather_facts: false
            # edpm firewall, change the allowed CIDR if needed
            edpm_sshd_configure_firewall: true
            edpm_sshd_allowed_ranges: ['192.168.122.0/24']
    
            # Do not attempt OVS major upgrades here
            edpm_ovs_packages:
            - openvswitch3.3
            edpm_default_mounts: 
    8
    
              - path: /dev/hugepages<size>
                opts: pagesize=<size>
                fstype: hugetlbfs
                group: hugetlbfs
      nodes:
    EOF
      cat computes-$CELL >> nodeset-${CELL}.yaml
    done
    Copy to Clipboard Toggle word wrap
    1
    如果您的部署有一个自定义 DNS 域,请指定节点的 FQDN。
    2
    网络组成必须与源云配置匹配,以避免数据平面连接停机时间。ctlplane 网络必须首先出现。命令仅保留 ctlplaneinternalapi 网络上的主机的 IP 地址。对其他隔离网络重复此步骤,或者手动更新生成的文件。
    3
    使用节点集名称,如 openstack-cell1、 openstack-cell2。仅为包含 Compute 节点的单元创建节点集。
    4
    如果启用了 TLS Everywhere,请将 tlsEnabled 更改为 true
    5
    如果没有使用 telemetry 服务,请从 services 列表中省略它。
    6
    网桥名称和其他 OVN 和网络服务特定值必须与源云配置匹配,以避免数据平面连接停机时间。
    7
    <bridge_mappings > 替换为您的配置中网桥映射的值,如 "datacentre:br-ctlplane "。
    8
    要配置巨页,将 &lt ;size > 替换为页面的大小。要配置多大小巨页,请在列表中创建更多项目。请注意,挂载点必须与源云配置匹配。
    注意

    在采用前,请确保在 Compute 服务节点中使用的 OpenStackDataPlaneNodeSet CR 中使用相同的 ovn-controller 设置。此配置存储在 Open vSwitch 数据库的 Open_vSwitch 表中的 external_ids 列中:

    $ ovs-vsctl list Open .
    ...
    external_ids        : {hostname=standalone.localdomain, ovn-bridge=br-int, ovn-bridge-mappings=<bridge_mappings>, ovn-chassis-mac-mappings="datacentre:1e:0a:bb:e6:7c:ad", ovn-encap-ip="172.19.0.100", ovn-encap-tos="0", ovn-encap-type=geneve, ovn-match-northd-version=False, ovn-monitor-all=True, ovn-ofctrl-wait-before-clear="8000", ovn-openflow-probe-interval="60", ovn-remote="tcp:ovsdbserver-sb.openstack.svc:6642", ovn-remote-probe-interval="60000", rundir="/var/run/openvswitch", system-id="2eec68e6-aa21-4c95-a868-31aeafc11736"}
    ...
    Copy to Clipboard Toggle word wrap
  10. 为每个 Compute 单元部署 OpenStackDataPlaneNodeSet CR:

    $ for CELL in $(echo $RENAMED_CELLS); do
      test -f nodeset-${CELL}.yaml || continue
    $ oc apply -f nodeset-${CELL}.yaml
    done
    Copy to Clipboard Toggle word wrap
  11. 如果将 Red Hat Ceph Storage 后端用于块存储服务(cinder),请准备采用的 data plane 工作负载:

    $ for CELL in $(echo $RENAMED_CELLS); do
      test -f nodeset-${CELL}.yaml || continue
    $ oc patch osdpns/openstack-$CELL --type=merge --patch "
      spec:
        services:
          - redhat
          - bootstrap
          - download-cache
          - configure-network
          - validate-network
          - install-os
          - configure-os
          - ssh-known-hosts
          - run-os
          - reboot-os
          - ceph-client
          - install-certs
          - ovn
          - neutron-metadata
          - libvirt
          - nova-$CELL
          - telemetry
        nodeTemplate:
          extraMounts:
          - extraVolType: Ceph
            volumes:
            - name: ceph
              secret:
                secretName: ceph-conf-files
            mounts:
            - name: ceph
              mountPath: "/etc/ceph"
              readOnly: true
      "
    done
    Copy to Clipboard Toggle word wrap
    注意

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

  12. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 neutron-sriov-nic-agent

    $ for CELL in $(echo $RENAMED_CELLS); do
      test -f nodeset-${CELL}.yaml || continue
    $ oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[
      {
        "op": "add",
        "path": "/spec/services/-",
        "value": "neutron-sriov"
      }, {
        "op": "add",
        "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_physical_device_mappings",
        "value": "dummy_sriov_net:dummy-dev"
      }, {
        "op": "add",
        "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_bandwidths",
        "value": "dummy-dev:40000000:40000000"
      }, {
        "op": "add",
        "path": "/spec/nodeTemplate/ansible/ansibleVars/edpm_neutron_sriov_agent_SRIOV_NIC_resource_provider_hypervisors",
        "value": "dummy-dev:standalone.localdomain"
      }]'
      done
    Copy to Clipboard Toggle word wrap
  13. 可选:在 OpenStackDataPlaneNodeSet CR 中启用 neutron-dhcp

    $ for CELL in $(echo $RENAMED_CELLS); do
      test -f nodeset-${CELL}.yaml || continue
    $ oc patch openstackdataplanenodeset openstack-$CELL --type='json' --patch='[
      {
        "op": "add",
        "path": "/spec/services/-",
        "value": "neutron-dhcp"
      }]'
    done
    Copy to Clipboard Toggle word wrap
    注意

    要将 neutron-dhcp 与 OVN 用于裸机置备服务(ironic),您必须将 Networking 服务(neutron)的 disable_ovn_dhcp_for_baremetal_ports 配置选项设为 true。您可以在 NeutronAPI spec 中设置此配置:

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

    1. 创建验证服务:

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

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

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

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

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

      $ oc wait --for condition=Ready openstackdataplanedeployment/openstack-pre-adoption --timeout=10m
      Copy to Clipboard Toggle word wrap
      重要

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

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

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

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

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

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

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

验证

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

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

    $ for CELL in $(echo $RENAMED_CELLS); do
    $ oc wait --for condition=Ready osdpns/openstack-$CELL --timeout=30m
    done
    Copy to Clipboard Toggle word wrap
  3. 验证 Networking 服务(neutron)代理是否正在运行:

    $ oc exec openstackclient -- openstack network agent list
    +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+
    | ID                                   | Agent Type                   | Host                   | Availability Zone | Alive | State | Binary                     |
    +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+
    | 174fc099-5cc9-4348-b8fc-59ed44fcfb0e | DHCP agent                   | standalone.localdomain | nova              | :-)   | UP    | neutron-dhcp-agent         |
    | 10482583-2130-5b0d-958f-3430da21b929 | OVN Metadata agent           | standalone.localdomain |                   | :-)   | UP    | neutron-ovn-metadata-agent |
    | a4f1b584-16f1-4937-b2b0-28102a3f6eaa | OVN Controller agent         | standalone.localdomain |                   | :-)   | UP    | ovn-controller             |
    +--------------------------------------+------------------------------+------------------------+-------------------+-------+-------+----------------------------+
    Copy to Clipboard Toggle word wrap
注意

从 director Operator 单元控制器中删除所有服务后,您可以取消单元控制器。要创建新的单元 Compute 节点,您可以将分离的控制器重新置备为新的数据平面主机,并将它们添加到对应或新单元的节点集合中。

后续步骤

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat