5.4. 为一组带有未置备的节点的 Networker 节点创建 OpenStackDataPlaneNodeSet CR
要创建带有未置备的节点的 Networker 节点,您必须执行以下任务:
-
为每个裸机节点创建
BareMetalHost自定义资源(CR)。 -
为 Networker 节点定义
OpenStackDataPlaneNodeSetCR。
先决条件
- 您的 RHOCP 集群支持调配裸机节点。如需更多信息,请参阅 规划部署中的 规划 裸机数据平面节点的置备。
- Cluster Baremetal Operator (CBO)被配置为置备。如需更多信息,请参阅 RHOCP API 参考中的 Provisioning [metal3.io/v1alpha1]。
5.4.1. 为未置备的 Networker 节点创建 BareMetalHost CR 复制链接链接已复制到粘贴板!
您必须为每个裸机网络器节点创建一个 BareMetalHost 自定义资源(CR)。您至少需要提供在网络上添加裸机网络节点所需的数据,以便剩余的安装步骤可以访问该节点并执行配置。
如果您使用 ctlplane 接口进行调配,为了避免丢弃流量的内核 rp_filter 逻辑,请将 DHCP 服务配置为使用与 ctlplane 地址范围不同的地址范围。这样可确保返回的流量保留在机器网络接口中。
流程
Bare Metal Operator (BMO)默认管理
openshift-machine-api命名空间中的BareMetalHost自定义资源(CR)。更新ProvisioningCR 以监视所有命名空间:$ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"watchAllNamespaces": true }}'如果您将虚拟介质引导用于裸机节点,且节点没有连接到 provisioning 网络,您必须更新
ProvisioningCR 以启用virtualMediaViaExternalNetwork,这样可通过外部网络启用裸机连接:$ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"virtualMediaViaExternalNetwork": true }}'在工作站上创建一个文件,用用于访问节点集中每个裸机网络器节点的 Baseboard Management Controller (BMC)凭证定义
SecretCR:apiVersion: v1 kind: Secret metadata: name: edpm-networker-0-bmc-secret namespace: openstack type: Opaque data: username: <base64_username> password: <base64_password>将
<base64_username> 和 <base64_password> 替换为 base64 编码的字符串。您可以使用以下命令生成 base64 编码的字符串:$ echo -n <string> | base64提示如果您不想对用户名和密码进行 base64encode,您可以使用
stringData字段而不是data字段来设置用户名和密码。
在工作站上创建一个名为
bmh_networker_nodes.yaml的文件,该文件为每个裸机 Networker 节点定义BareMetalHostCR。以下示例使用 provisioning 方法 Redfish 虚拟介质创建一个BareMetalHostCR:apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: edpm-networker-0 namespace: openstack labels:1 app: openstack-networker workload: networker spec: ... bmc: address: redfish-virtualmedia+http://192.168.111.1:8000/redfish/v1/Systems/e8efd888-f844-4fe0-9e2e-498f4ab7806d2 credentialsName: edpm-networker-0-bmc-secret3 bootMACAddress: 00:c7:e4:a7:e7:f3 bootMode: UEFI online: false [preprovisioningNetworkDataName: <network_config_secret_name>]4 有关如何创建
BareMetalHostCR 的更多信息,请参阅 RHOCP 安装后配置指南 中的 关于 BareMetalHost 资源。创建
BareMetalHost资源:$ oc create -f bmh_networker_nodes.yaml验证
BareMetalHost资源是否已创建并处于Available状态:$ oc get bmh NAME STATE CONSUMER ONLINE ERROR AGE edpm-networker-0 Available openstack-edpm true 2d21h edpm-networker-1 Available openstack-edpm true 2d21h ...
为一组 Networker 节点定义 OpenStackDataPlaneNodeSet 自定义资源(CR)。您可以根据部署需要定义多个节点设置。每个节点只能包含在一个 OpenStackDataPlaneNodeSet CR 中。
您可以使用 nodeTemplate 字段配置通用属性,以应用到 OpenStackDataPlaneNodeSet CR 中的所有节点,以及用于特定于节点属性的 nodeTemplate.nodes 字段。特定于节点的配置覆盖来自 nodeTemplate 的继承值。
有关从未置备的 Networker 节点创建节点设置的 OpenStackDataPlaneNodeSet CR 示例,请参阅 使用 OVS-DPDK 的未置备的 Networker 节点设置 CR 示例。
先决条件
-
为您要包含在每个节点集中的每个未置备节点创建一个
BareMetalHostCR。如需更多信息,请参阅为未置备的节点创建BareMetalHostCR。
流程
在工作站上创建一个名为
openstack_unprovisioned_node_set.yaml的文件,以定义OpenStackDataPlaneNodeSetCR:apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-data-plane1 namespace: openstack spec: tlsEnabled: true env:2 - name: ANSIBLE_FORCE_COLOR value: "True"将数据平面连接到 control plane 网络:
spec: ... networkAttachments: - ctlplane指定此集合中的节点是未置备的,必须在创建资源时被置备:
preProvisioned: false定义
baremetalSetTemplate字段,以描述创建资源时必须置备的裸机节点的配置:baremetalSetTemplate: deploymentSSHSecret: dataplane-ansible-ssh-private-key-secret bmhNamespace: <bmh_namespace> cloudUserName: <ansible_ssh_user> bmhLabelSelector: app: <bmh_label> ctlplaneInterface: <interface>-
将
<bmh_namespace> 替换为节点对应的BareMetalHostCR 中定义的命名空间,如openshift-machine-api。 -
将
<ansible_ssh_user> 替换为 Ansible SSH 用户的用户名,如cloud-admin。 -
将
<bmh_label> 替换为节点对应的BareMetalHostCR 中定义的标签,如openstack-networker。元数据标签(如app、workload和nodeName)是键值对,它为标记节点提供不同的粒度级别。将bmhLabelSelector字段设置为根据与对应BareMetalHostCR 中的标签匹配的标签选择 data plane 节点。 -
将
<interface> 替换为节点连接的 control plane 接口,如enp6s0。
-
将
如果创建了自定义
OpenStackProvisionServerCR,请将其添加到baremetalSetTemplate定义中:baremetalSetTemplate: ... provisionServerName: my-os-provision-server添加您创建的 SSH 密钥 secret,以便 Ansible 连接到 data plane 节点:
nodeTemplate: ansibleSSHPrivateKeySecret: <secret-key>-
将
<secret-key> 替换为您在 <link> 中创建的 SSH 密钥SecretCR 的名称,如dataplane-ansible-ssh-private-key-secret。
-
将
-
在 Red Hat OpenShift Container Platform (RHOCP)集群上的
openstack命名空间中创建持久性卷声明(PVC)以存储日志。将volumeMode设置为Filesystem,将accessModes设置为ReadWriteOnce。不要为使用 NFS 卷插件的 PersistentVolume (PV)的日志请求存储。NFS 与 FIFO 不兼容,ansible-runner创建一个 FIFO 文件来存储日志。有关 PVC 的详情,请参考 RHOCP Storage 指南中的 了解持久性存储 和 规划部署 中的 Red Hat OpenShift Container Platform 集群要求。 为 data plane 节点启用持久性日志记录:
nodeTemplate: ... extraMounts: - extraVolType: Logs volumes: - name: ansible-logs persistentVolumeClaim: claimName: <pvc_name> mounts: - name: ansible-logs mountPath: "/runner/artifacts"-
将
<pvc_name> 替换为 RHOCP 集群中的 PVC 存储名称。
-
将
指定管理网络:
nodeTemplate: ... managementNetwork: ctlplane指定用于提供用户名和密码的
SecretCR,以注册没有注册到红帽客户门户网站的节点的操作系统,并为节点启用软件仓库。以下示例演示了如何将节点注册到 Red Hat Content Delivery Network (CDN)。有关如何在 Red Hat Satellite 6.13 中注册节点的详情,请参阅管理主机。nodeTemplate: ansible: ansibleUser: cloud-admin1 ansiblePort: 22 ansibleVarsFrom: - secretRef: name: subscription-manager - secretRef: name: redhat-registry ansibleVars:2 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: []- 1
- 与您在 <link> 中创建的 secret 关联的用户[创建数据平面 secret]。
- 2
- 自定义一组节点的 Ansible 变量。有关可以使用的 Ansible 变量的列表,请参阅 https://openstack-k8s-operators.github.io/edpm-ansible/。
有关红帽客户门户网站注册命令的完整列表,请参阅 https://access.redhat.com/solutions/253273。有关如何登录到
registry.redhat.io的详情,请参考 https://access.redhat.com/RegistryAuthentication#creating-registry-service-accounts-6。添加网络配置模板以应用到您的数据平面节点。
nodeTemplate: ... ansible: ... ansiblePort: 22 ansibleUser: cloud-admin ansibleVars: ... edpm_enable_chassis_gw: true edpm_network_config_nmstate: true ... neutron_physical_bridge_name: br-ex neutron_public_interface_name: eth0 edpm_network_config_update: false1 - 1
- 首次部署设置的节点时,将
edpm_network_config_update变量设置为false。更新或使用节点集时,将edpm_network_config_update变量设置为true,以便在更新时应用网络配置更改。然后,在更新或采用后将变量重置为false。如果没有将更新的网络配置重置为false,则每次创建包含configure-network服务的OpenStackDataPlaneDeploymentCR 时,都会重新应用更新的网络配置。
以下示例使用 DPDK 将 VLAN 网络配置应用到一组 data plane Networker 节点:
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_user_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: ovs_dpdk_port driver: mlx5_core name: dpdk0 mtu: {{ min_viable_mtu }} members: - type: sriov_vf device: nic6 vfid: 0 - 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 %}以下示例将 VLAN 网络配置应用到没有 DPDK 的 data plane Networker 节点:
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 %}有关 data plane 网络配置的更多信息,请参阅配置 网络服务 中的 自定义 数据平面网络。
-
在
nodeTemplate部分下,添加此组中节点集合的通用配置。此OpenStackDataPlaneNodeSet中的每个节点都会继承此配置。有关可用于配置通用节点属性的属性的信息,请参阅 Deploying Red Hat OpenStack Services on OpenShift 指南中的OpenStackDataPlaneNodeSetCR spec 属性。 在此节点集中定义每个节点:
nodes: edpm-networker-0:1 hostName: networker-0 networks:2 - name: ctlplane subnetName: subnet1 defaultRoute: true fixedIP: 192.168.122.1003 - name: internalapi subnetName: subnet1 fixedIP: 172.17.0.100 - name: storage subnetName: subnet1 fixedIP: 172.18.0.100 - name: tenant subnetName: subnet1 fixedIP: 172.19.0.100 ansible: ansibleHost: 192.168.122.100 ansibleUser: cloud-admin ansibleVars: fqdn_internal_api: edpm-networker-0.example.com bmhLabelSelector:4 nodeName: edpm-networker-0 edpm-networker-1: hostName: edpm-networker-1 networks: - name: ctlplane subnetName: subnet1 defaultRoute: true fixedIP: 192.168.122.101 - name: internalapi subnetName: subnet1 fixedIP: 172.17.0.101 - name: storage subnetName: subnet1 fixedIP: 172.18.0.101 - name: tenant subnetName: subnet1 fixedIP: 172.19.0.101 ansible: ansibleHost: 192.168.122.101 ansibleUser: cloud-admin ansibleVars: fqdn_internal_api: edpm-networker-1.example.com bmhLabelSelector: nodeName: edpm-networker-1- 1
- 节点定义引用,如
edpm-networker-0。节点集中的每个节点都必须有一个节点定义。 - 2
- 定义节点的 IPAM 和 DNS 记录。
- 3
- 为网络指定一个可预测的 IP 地址,该地址必须在
NetConfigCR 中为网络定义的分配范围内。 - 4
- 可选:为 data plane 节点选择
BareMetalHostCR 的BareMetalHostCR 元数据标签。标签可以是BareMetalHostCR 定义的任何标签。该标签与baremetalSetTemplate定义中配置的bmhLabelSelector标签一起使用,以选择节点的BareMetalHost。
注意-
在
nodes部分中定义的节点可以配置nodeTemplate部分中配置的同一 Ansible 变量。其中,为特定节点和nodeTemplate部分配置了 Ansible 变量,则特定于节点的值会覆盖nodeTemplate部分中的值。 -
您不需要为节点复制所有
nodeTemplateAnsible 变量,以覆盖默认值并设置一些特定于节点的值。您只需要配置您要为节点覆盖的 Ansible 变量。 -
许多
ansibleVars在名称中包含edpm,它代表 "External Data Plane Management"。
有关可用于配置通用节点属性的属性的信息,请参阅 Deploying Red Hat OpenStack Services on OpenShift 指南中的
OpenStackDataPlaneNodeSetCR spec 属性。-
保存
openstack_unprovisioned_node_set.yaml定义文件。 创建 data plane 资源:
$ oc create --save-config -f openstack_unprovisioned_node_set.yaml -n openstack通过确认状态为
SetupReady来验证 data plane 资源是否已创建:$ oc wait openstackdataplanenodeset openstack-data-plane --for condition=SetupReady --timeout=10m当状态为
SetupReady时,命令会返回一个condition met信息,否则会返回超时错误。如需有关 data plane 条件和状态的信息,请参阅 在 OpenShift 上部署 Red Hat OpenStack Services 中的 Data plane 条件 和状态。
验证是否为节点集合创建了
Secret资源:$ oc get secret -n openstack | grep openstack-data-plane dataplanenodeset-openstack-data-plane Opaque 1 3m50s验证节点是否已转换为
置备状态:$ oc get bmh NAME STATE CONSUMER ONLINE ERROR AGE edpm-networker-0 provisioned openstack-data-plane true 3d21h验证是否已创建服务:
$ oc get openstackdataplaneservice -n openstack NAME AGE bootstrap 8m40s ceph-client 8m40s ceph-hci-pre 8m40s configure-network 8m40s configure-os 8m40s ...
5.4.3. 使用 OVS-DPDK 的未置备的 Networker 节点设置 CR 示例 复制链接链接已复制到粘贴板!
以下示例 OpenStackDataPlaneNodeSet CR 从带有 OVS-DPDK 和一些节点特定配置的未置备的 Networker 节点创建一个节点集。创建节点集时,会置备未置备的网络节点。将本示例中的 OpenStackDataPlaneNodeSet CR 的名称更新为反映集合中节点的名称。OpenStackDataPlaneNodeSet CR 名称必须是唯一的,仅包含小写字母数字字符和 - (hyphens)或 . (periods),以字母数字字符开头和结尾,且最大长度为 53 个字符。
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
name: networker-nodes
namespace: openstack
services:
- redhat
- 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-metadata
nodeTemplate:
ansible:
ansibleVars:
edpm_enable_chassis_gw: true
edpm_kernel_args: default_hugepagesz=1GB hugepagesz=1G hugepages=64 iommu=pt
intel_iommu=on tsx=off isolcpus=2-47,50-95
edpm_network_config_nmstate: true
...
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: interface
name: nic1
use_dhcp: false
- type: sriov_pf
name: nic6
mtu: 9000
numvfs: 2
use_dhcp: false
defroute: false
nm_controlled: true
hotplug: true
promisc: false
- type: ovs_user_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: ovs_dpdk_port
driver: mlx5_core
name: dpdk0
mtu: {{ min_viable_mtu }}
members:
- type: sriov_vf
device: nic6
vfid: 0
- type: linux_bond
name: bond_api
use_dhcp: false
bonding_options: "mode=active-backup"
dns_servers: {{ ctlplane_dns_nameservers }}
members:
- type: sriov_vf
device: nic6
driver: mlx5_core
mtu: {{ min_viable_mtu }}
spoofcheck: false
promisc: false
vfid: 1
primary: true
- type: vlan
vlan_id: {{ lookup('vars', networks_lower['internalapi'] ~ '_vlan_id') }}
device: bond_api
addresses:
- ip_netmask: {{ lookup('vars', networks_lower['internalapi'] ~ '_ip') }}/{{ lookup('vars', networks_lower['internalapi'] ~ '_cidr') }}
- type: ovs_user_bridge
name: br-link0
use_dhcp: false
ovs_extra: "set port br-link0 tag={{ lookup('vars', networks_lower['tenant'] ~ '_vlan_id') }}"
addresses:
- ip_netmask: {{ lookup('vars', networks_lower['tenant'] ~ '_ip') }}/{{ lookup('vars', networks_lower['tenant'] ~ '_cidr')}}
members:
- type: ovs_dpdk_bond
name: dpdkbond0
mtu: 9000
rx_queue: 1
ovs_extra: "set port dpdkbond0 bond_mode=balance-slb"
members:
- type: ovs_dpdk_port
name: dpdk1
members:
- type: interface
name: nic4
- type: ovs_dpdk_port
name: dpdk2
members:
- type: interface
name: nic5
- type: ovs_user_bridge
name: br-link1
use_dhcp: false
members:
- type: ovs_dpdk_bond
name: dpdkbond1
mtu: 9000
rx_queue: 1
ovs_extra: "set port dpdkbond1 bond_mode=balance-slb"
members:
- type: ovs_dpdk_port
name: dpdk3
members:
- type: interface
name: nic2
- type: ovs_dpdk_port
name: dpdk4
members:
- type: interface
name: nic3
edpm_ovn_bridge_mappings:
- access:br-ex
- dpdkmgmt:br-link0
- dpdkdata0:br-link1
edpm_ovs_dpdk_memory_channels: 4
edpm_ovs_dpdk_pmd_core_list: 2,3,50,51
edpm_ovs_dpdk_socket_memory: 4096,4096
edpm_tuned_isolated_cores: 2-47,50-95
edpm_tuned_profile: cpu-partitioning
neutron_physical_bridge_name: br-ex
neutron_public_interface_name: eth0