10.6. 使用未置备节点创建一组数据平面节点


为数据平面中的每个未置备的节点的逻辑分组定义 OpenStackDataPlaneNodeSet 自定义资源(CR),例如,按硬件、位置或网络分组的节点。您可以根据部署需要定义多个节点设置。每个节点只能包含在一个 OpenStackDataPlaneNodeSet CR 中。每个节点集只能连接到一个 Compute 单元。默认情况下,节点集连接到 cell1。如果自定义 control plane 使其包含额外的 Compute 单元,您必须指定节点集连接的单元。有关添加计算单元的更多信息,请参阅 自定义 Red Hat OpenStack Services on OpenShift 部署指南中的将 OpenStack DataPlaneNodeSet CR 连接到计算单元

您可以使用 nodeTemplate 字段配置 OpenStackDataPlaneNodeSet 共享中的所有节点的属性,并为特定于节点的属性配置 nodeTemplate.nodes 字段。特定于节点的配置覆盖来自 nodeTemplate 的继承值。

有关置备裸机节点的更多信息, 请参阅规划部署 中的规划置备裸机数据平面节点

先决条件

  • Cluster Baremetal Operator (CBO)为置备安装和配置。如需更多信息,请参阅 规划部署中的 规划 裸机数据平面节点的置备
  • 为每个裸机 data plane 节点注册并检查 BareMetalHost CR。检查后,每个裸机节点都必须处于 Available 状态。有关配置裸机节点的更多信息,请参阅 Red Hat OpenShift Container Platform (RHOCP) 安装后配置 指南中的 裸机配置

流程

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

    apiVersion: dataplane.openstack.org/v1beta1
    kind: OpenStackDataPlaneNodeSet
    metadata:
      name: openstack-data-plane 
    1
    
      namespace: openstack
    spec:
      tlsEnabled: true
      env:
        - name: ANSIBLE_FORCE_COLOR
          value: "True"
    1
    OpenStackDataPlaneNodeSet CR 名称必须是唯一的,仅包含小写字母数字字符和 - (hyphens)或 . (periods),以字母数字字符开头和结尾,且最大长度为 53 个字符。将本例中的名称更新为反映集合中节点的名称。
  2. 定义 baremetalSetTemplate 字段来描述裸机节点的配置:

      preProvisioned: false
      baremetalSetTemplate:
        deploymentSSHSecret: dataplane-ansible-ssh-private-key-secret
        bmhNamespace: <bmh_namespace>
        cloudUserName: <ansible_ssh_user>
        bmhLabelSelector:
          app: <bmh_label>
        ctlplaneInterface: <interface>
    • <bmh_namespace > 替换为节点对应的 BareMetalHost CR 中定义的命名空间。
    • <ansible_ssh_user > 替换为 Ansible SSH 用户的用户名。
    • <bmh_label > 替换为节点对应的 BareMetalHost CR 中定义的 metadata 标签,例如 openstack。元数据标签,如 appworkloadnodeName,是用于标记节点的键值对。将 bmhLabelSelector 字段设置为根据与对应 BareMetalHost CR 中的标签匹配的一个或多个标签选择 data plane 节点。
    • <interface > 替换为节点连接的 control plane 接口,如 enp6s0
  3. BMO 默认管理 openshift-machine-api 命名空间中的 BareMetalHost CR。您必须更新 Provisioning CR 以监视所有命名空间:

    $ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"watchAllNamespaces": true }}'
  4. 添加您创建的 SSH 密钥 secret,以便 Ansible 连接到 data plane 节点:

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
    • <secret-key > 替换为您在 创建 data plane secret 中创建的 SSH 密钥 Secret CR 名称,如 dataplane-ansible-ssh-private-key-secret
  5. 在 RHOCP 集群上的 openstack 命名空间中创建持久性卷声明(PVC)以存储日志。将 volumeMode 设置为 Filesystem,将 accessModes 设置为 ReadWriteOnce。不要为使用 NFS 卷插件的 PersistentVolume (PV)的日志请求存储。NFS 与 FIFO 不兼容,ansible-runner 创建一个 FIFO 文件来存储日志。有关 PVC 的详情,请参考 RHOCP Storage 指南中的 了解持久性存储规划部署 中的 Red Hat OpenShift Container Platform 集群要求
  6. 为 data plane 节点启用持久性日志记录:

      nodeTemplate:
        ansibleSSHPrivateKeySecret: <secret-key>
        extraMounts:
          - extraVolType: Logs
            volumes:
            - name: ansible-logs
              persistentVolumeClaim:
                claimName: <pvc_name>
            mounts:
            - name: ansible-logs
              mountPath: "/runner/artifacts"
    • <pvc_name > 替换为 RHOCP 集群中的 PVC 存储名称。
  7. nodeTemplate 部分下,添加此组中节点集合的通用配置。此 OpenStackDataPlaneNodeSet 中的每个节点都会继承此配置。

    如需更多信息,请参阅:

  8. 在此节点集中定义每个节点:

      nodes:
        edpm-compute-0: 
    1
    
          hostName: edpm-compute-0
          networks: 
    2
    
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.100 
    3
    
            - name: internalapi
              subnetName: subnet1
            - name: storage
              subnetName: subnet1
            - name: tenant
              subnetName: subnet1
          ansible:
            ansibleHost: 192.168.122.100
            ansibleUser: cloud-admin
            ansibleVars: 
    4
    
              fqdn_internal_api: edpm-compute-0.example.com
              edpm_network_config_nmstate: true 
    5
    
        edpm-compute-1:
          hostName: edpm-compute-1
          networks:
            - name: ctlplane
              subnetName: subnet1
              defaultRoute: true
              fixedIP: 192.168.122.101
            - name: internalapi
              subnetName: subnet1
            - name: storage
              subnetName: subnet1
            - name: tenant
              subnetName: subnet1
          ansible:
            ansibleHost: 192.168.122.101
            ansibleUser: cloud-admin
            ansibleVars:
              fqdn_internal_api: edpm-compute-1.example.com
    1
    节点定义引用,如 edpm-compute-0。节点集中的每个节点都必须有一个节点定义。
    2
    定义节点的 IPAM 和 DNS 记录。
    3
    为网络指定一个可预测的 IP 地址,该地址必须在 NetConfig CR 中为网络定义的分配范围内。
    4
    自定义节点的特定于节点的 Ansible 变量。
    注意
    • nodes 部分中定义的节点可以配置 nodeTemplate 部分中配置的同一 Ansible 变量。其中,为特定节点和 nodeTemplate 部分配置了 Ansible 变量,则特定于节点的值会覆盖 nodeTemplate 部分中的值。
    • 您不需要为节点复制所有 nodeTemplate Ansible 变量,以覆盖默认值并设置一些特定于节点的值。您只需要配置您要为节点覆盖的 Ansible 变量。
    • 许多 ansibleVars 在名称中包含 edpm,它代表 "External Data Plane Management"。
    os-net-config 供应商设置为 nmstate。默认值为 true。只有在 nmstate 供应商的特定限制需要您使用 ifcfg 供应商时,才会将其更改为 false。有关 nmstate 供应商的优点和限制的更多信息,请参阅规划部署中的 https://docs.redhat.com/en/documentation/red_hat_openstack_services_on_openshift/18.0/html/planning_your_deployment/plan-networks_planning#plan-os-net-config_plan-network

    有关可用于配置节点属性的属性的信息,请参阅 OpenStackDataPlaneNodeSet CR 属性

  9. services 部分,添加要在 data plane 节点上运行的服务列表。确保将 nova 替换为 nova-custom-sriov,或 nova-custom-ovsdpdk,或两者:

    ...
      services:
      - bootstrap
      - download-cache
      - reboot-os
      - configure-ovs-dpdk
      - configure-network
      - validate-network
      - install-os
      - configure-os
      - ssh-known-hosts
      - run-os
      - install-certs
      - ovn
      - neutron-ovn
      - neutron-ovn-igmp
      - neutron-metadata
      - libvirt
      - nova-custom-sriov
      - nova-custom-ovsdpdk
      - telemetry
    ...
  10. 保存 openstack_unprovisioned_node_set.yaml 定义文件。
  11. 创建 data plane 资源:

    $ oc create -f openstack_unprovisioned_node_set.yaml -n openstack
  12. 验证 data plane 资源是否已创建:

    $ oc get openstackdataplanenodeset -n openstack
    NAME           		STATUS MESSAGE
    openstack-data-plane 	False  Deployment not started

    有关返回状态的含义的信息,请参阅 Data plane 条件和状态。

  13. 验证是否为节点集合创建了 Secret 资源:

    $ oc get secret -n openstack | grep openstack-data-plane
    dataplanenodeset-openstack-data-plane Opaque 1 3m50s
  14. 验证是否已创建服务:

    $ oc get openstackdataplaneservice -n openstack
    NAME                AGE
    configure-network   6d7h
    configure-os        6d6h
    install-os          6d6h
    run-os              6d6h
    validate-network    6d6h
    ovn                 6d6h
    libvirt             6d6h
    nova                6d6h
    telemetry           6d6h

以下示例 OpenStackDataPlaneNodeSet CR 使用一些特定于节点的配置从未置备的 Compute 节点创建一个节点集。创建节点集合时,会置备未置备的 Compute 节点。这个示例包括可选字段。查看示例,并将可选字段更新为您的环境的正确值,或者在使用 OpenShift (RHOSO)部署中的 Red Hat OpenStack Services (RHOSO)部署中的示例之前删除它们。

将本示例中的 OpenStackDataPlaneNodeSet CR 的名称更新为反映集合中节点的名称。OpenStackDataPlaneNodeSet CR 名称必须是唯一的,仅包含小写字母数字字符和 - (hyphens)或 . (periods),以字母数字字符开头和结尾,且最大长度为 53 个字符。

注意

以下变量从 IPAM 和 DNS 自动生成,不是由用户提供的:

  • ctlplane_dns_nameservers
  • dns_search_domains
  • ctlplane_host_routes
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
  name: openstack-data-plane
  namespace: openstack
spec:
  env:
    - name: ANSIBLE_FORCE_COLOR
      value: "True"
  networkAttachments:
    - ctlplane
  preProvisioned: false
  baremetalSetTemplate:
    deploymentSSHSecret: dataplane-ansible-ssh-private-key-secret
    bmhNamespace: openstack
    cloudUserName: cloud-admin
    bmhLabelSelector:
      app: openstack
    ctlplaneInterface: enp1s0
  nodeTemplate:
    ansibleSSHPrivateKeySecret: dataplane-ansible-ssh-private-key-secret
    extraMounts:
      - extraVolType: Logs
        volumes:
        - name: ansible-logs
          persistentVolumeClaim:
            claimName: <pvc_name>
        mounts:
        - name: ansible-logs
          mountPath: "/runner/artifacts"
    managementNetwork: ctlplane
    ansible:
      ansibleUser: cloud-admin
      ansiblePort: 22
      ansibleVarsFrom:
        - secretRef:
            name: subscription-manager
        - secretRef:
            name: redhat-registry
      ansibleVars:
        timesync_ntp_servers:
          - hostname: ntp.example.com
            iburst: true
          - hostname: ntp2.example.com
            iburst: false
        rhc_release: 9.4
        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: "fast-datapath-for-rhel-9-x86_64-rpms", state: enabled}
            - {name: "rhoso-18.0-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_os_net_config_mappings:
          edpm-compute-0:
            nic1: 52:54:04:60:55:22
          edpm-compute-1:
            nic1: 52:54:04:60:55:22
        neutron_physical_bridge_name: br-ex
        neutron_public_interface_name: eth0
        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: 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 %}
  nodes:
    edpm-compute-0:
      hostName: edpm-compute-0
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.100
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      ansible:
        ansibleHost: 192.168.122.100
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-0.example.com
      bmhLabelSelector:
        nodeName: edpm-compute-0
    edpm-compute-1:
      hostName: edpm-compute-1
      networks:
      - name: ctlplane
        subnetName: subnet1
        defaultRoute: true
        fixedIP: 192.168.122.101
      - name: internalapi
        subnetName: subnet1
      - name: storage
        subnetName: subnet1
      - name: tenant
        subnetName: subnet1
      ansible:
        ansibleHost: 192.168.122.101
        ansibleUser: cloud-admin
        ansibleVars:
          fqdn_internal_api: edpm-compute-1.example.com
      bmhLabelSelector:
        nodeName: edpm-compute-1
  services:
  - bootstrap
  - download-cache
  - reboot-os
  - configure-ovs-dpdk
  - configure-network
  - validate-network
  - install-os
  - configure-os
  - ssh-known-hosts
  - run-os
  - install-certs
  - ovn
  - neutron-ovn
  - neutron-ovn-igmp
  - neutron-metadata
  - libvirt
  - nova-custom-sriov
  - nova-custom-ovsdpdk
  - telemetry
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部