7.4. 使用未置备的节点为动态路由创建数据平面
使用未置备的节点在 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services (RHOSO)环境中为动态路由配置数据平面,包括:
-
为每个裸机数据平面节点创建
BareMetalHost自定义资源(CR)。 -
为 Compute 节点定义
OpenStackDataPlaneNodeSetCR,为 Networker 节点定义OpenStackDataPlaneNodeSetCR。Networker 节点包含 OVN 网关机箱。
有关置备裸机节点的更多信息, 请参阅规划部署 中的规划置备裸机数据平面节点。
先决条件
- Cluster Baremetal Operator (CBO)为置备安装和配置。如需更多信息,请参阅 规划部署中的 规划 裸机数据平面节点的置备。
要使用 PXE 网络引导置备数据平面节点,Red Hat OpenShift Container Platform (RHOCP)集群中必须有一个裸机置备网络。
注意您不需要 provisioning 网络来使用虚拟介质置备节点。
-
RHOCP 中提供了一个
ProvisioningCR。有关创建ProvisioningCR 的更多信息,请参阅 Red Hat OpenShift Container Platform (RHOCP)安装中的 配置置备资源以扩展用户置备的 集群。
7.4.1. 为未置备的节点创建 BareMetalHost CR 复制链接链接已复制到粘贴板!
您必须为每个裸机数据平面节点创建一个 BareMetalHost 自定义资源(CR)。您至少需要提供在网络上添加裸机数据平面节点所需的数据,以便剩余的安装步骤可以访问该节点并执行配置。
如果您使用 ctlplane 接口进行置备,且内核上配置了 rp_filter 来启用 Reverse Path Forwarding (RPF),则反向路径过滤逻辑会丢弃流量。有关如何防止因为 RPF 过滤器丢弃流量的信息,请参阅 如何在 OpenShift 上部署 Red Hat OpenStack Services 中的如何防止非对称路由。
流程
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-compute-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_nodes.yaml的文件,该文件为每个裸机数据平面节点定义BareMetalHostCR。以下示例使用 provisioning 方法 Redfish 虚拟介质创建一个BareMetalHostCR:apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: edpm-compute-0 namespace: openstack labels:1 app: openstack workload: compute spec: bmc: address: redfish-virtualmedia+http://192.168.111.1:8000/redfish/v1/Systems/e8efd888-f844-4fe0-9e2e-498f4ab7806d2 credentialsName: edpm-compute-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_nodes.yaml验证
BareMetalHost资源是否已创建并处于Available状态:$ oc get bmh NAME STATE CONSUMER ONLINE ERROR AGE edpm-compute-0 Available openstack-edpm true 2d21h edpm-compute-1 Available openstack-edpm true 2d21h ...
为作为 Compute 节点的 data plane 中的未置备的节点的逻辑分组定义 OpenStackDataPlaneNodeSet 自定义资源(CR)。您可以根据部署需要定义多个节点设置。每个节点只能包含在一个 OpenStackDataPlaneNodeSet CR 中。每个节点集只能连接到一个 Compute 单元。默认情况下,节点集连接到 cell1。如果自定义 control plane 使其包含额外的 Compute 单元,您必须指定节点集连接的单元。有关添加计算单元的更多信息,请参阅 自定义 Red Hat OpenStack Services on OpenShift 部署指南中的将 OpenStack DataPlaneNodeSet CR 连接到计算单元。
目前,在动态路由环境中,无法分发 RHOSO control plane 的限制。因此,您必须有一个托管 OVN 网关机箱的专用 Networker 节点。在以后的 RHOSO 发行版本中将解决这个限制。如需更多信息,请参阅 OSPRH-661。
您可以使用 nodeTemplate 字段配置通用属性,以应用到 OpenStackDataPlaneNodeSet CR 中的所有节点,以及用于特定于节点属性的 nodeTemplate.nodes 字段。特定于节点的配置覆盖来自 nodeTemplate 的继承值。
有关从未置备的 Compute 节点创建节点的 OpenStackDataPlaneNodeSet CR 示例,请参阅未置备的节点的 OpenStackDataPlaneNodeSet CR 示例。
先决条件
-
为您要包含在每个节点集中的每个未置备节点创建一个
BareMetalHostCR。如需更多信息,请参阅为未置备的节点创建BareMetalHostCR。
流程
在工作站上创建一个名为
openstack_unprovisioned_compute_node_set.yaml的文件,以定义OpenStackDataPlaneNodeSetCR:apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-compute-nodes1 namespace: openstack spec: tlsEnabled: true env:2 - name: ANSIBLE_FORCE_COLOR value: "True"将 Compute 节点数据平面连接到 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 中定义的命名空间,例如openstack。 -
将
<ansible_ssh_user> 替换为 Ansible SSH 用户的用户名,如cloud-admin。 -
将
<bmh_label> 替换为节点对应的BareMetalHostCR 中定义的 metadata 标签,例如openstack。元数据标签,如app、workload和nodeName,是用于标记节点的键值对。将bmhLabelSelector字段设置为根据与对应BareMetalHostCR 中的标签匹配的一个或多个标签选择 data plane 节点。 -
将
<interface> 替换为节点连接的 control plane 接口,如enp6s0。
-
将
添加您创建的 SSH 密钥 secret,以便 Ansible 连接到 data plane 节点:
nodeTemplate: ansibleSSHPrivateKeySecret: <secret-key>-
将
<secret-key> 替换为您在 创建 data plane secret 中创建的 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,以注册节点的操作系统并启用存储库。以下示例演示了如何将节点注册到 CDN。有关如何在 Red Hat Satellite 6.13 中注册节点的详情,请参阅管理主机。nodeTemplate: ansible: ansibleUser: cloud-admin1 ansiblePort: 22 ansibleVarsFrom: - prefix: subscription_manager_ secretRef: name: subscription-manager - secretRef: name: redhat-registry ansibleVars:2 edpm_bootstrap_command: | subscription-manager register --username {{ subscription_manager_username }} --password {{ subscription_manager_password }} subscription-manager release --set=9.4 subscription-manager repos --disable=* subscription-manager repos --enable=rhel-9-for-x86_64-baseos-eus-rpms --enable=rhel-9-for-x86_64-appstream-eus-rpms --enable=rhel-9-for-x86_64-highavailability-eus-rpms --enable=fast-datapath-for-rhel-9-x86_64-rpms --enable=rhoso-18.0-for-rhel-9-x86_64-rpms --enable=rhceph-7-tools-for-rhel-9-x86_64-rpms edpm_bootstrap_release_version_package: []- 1
- 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。添加要应用到 Compute 节点的网络配置模板。以下示例将单个 NIC VLAN 网络配置应用到 data plane 节点:
nodeTemplate: ... ansible: ... ansibleVars: ... edpm_network_config_os_net_config_mappings: edpm-compute-0: nic1: 52:54:04:60:55:221 edpm-compute-1: nic1: 52:54:04:60:55:22 neutron_physical_bridge_name: br-ex neutron_public_interface_name: eth0 edpm_network_config_update: false2 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 }} use_dhcp: false use_dhcpv6: true - type: interface name: nic1 use_dhcp: true defroute: false - type: interface name: nic2 use_dhcp: false defroute: false dns_servers: {{ ctlplane_dns_nameservers }} domain: {{ dns_search_domains }} addresses: - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }} - type: interface name: nic3 use_dhcp: false addresses: - ip_netmask: {{ lookup('vars', 'bgpnet0_ip') }}/30 - type: interface name: nic4 use_dhcp: false addresses: - ip_netmask: {{ lookup('vars', 'bgpnet1_ip') }}/30 - type: interface name: lo addresses: - ip_netmask: {{ lookup('vars', 'bgpmainnet_ip') }}/32 - ip_netmask: {{ lookup('vars', 'bgpmainnetv6_ip') }}/128 - ip_netmask: {{ lookup('vars', 'internalapi_ip') }}/32 - ip_netmask: {{ lookup('vars', 'storage_ip') }}/32 - ip_netmask: {{ lookup('vars', 'tenant_ip') }}/32 - ip_netmask: {{ lookup('vars', 'octavia_ip') }}/32重要在更新或采用后,您必须将
edpm_network_config_update重置为false。否则,节点可能会丢失网络访问。每当edpm_network_config_update为true时,每次创建OpenStackDataPlaneDeploymentCR 时,都会重新应用更新的网络配置,其中包括作为servicesOverride列表成员的configure-network服务。在
nodeTemplate部分下,添加此组中一组 Compute 节点的通用配置。此OpenStackDataPlaneNodeSet中的每个节点都会继承此配置:- 示例
edpm_frr_bgp_ipv4_src_network: bgpmainnet edpm_frr_bgp_neighbor_password: f00barZ edpm_frr_bgp_uplinks: - nic3 - nic4 edpm_ovn_encap_ip: '{{ lookup(''vars'', ''bgpmainnet_ip'') }}'有关可用于配置通用节点属性的属性的信息,请参阅
OpenStackDataPlaneNodeSetCR规格属性。
在此节点集中定义每个节点:
nodes: edpm-compute-0:1 hostName: edpm-compute-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 - name: BgpNet0 subnetName: subnet0 fixedIP: 100.64.0.2 - name: BgpNet1 subnetName: subnet0 fixedIP: 100.65.0.2 - name: BgpMainNet subnetName: subnet0 fixedIP: 172.30.0.2 ansible: ansibleHost: 192.168.122.100 ansibleUser: cloud-admin ansibleVars:4 fqdn_internal_api: edpm-compute-0.example.com bmhLabelSelector:5 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 fixedIP: 172.17.0.101 - name: storage subnetName: subnet1 fixedIP: 172.18.0.101 - name: tenant subnetName: subnet1 fixedIP: 172.19.0.101 - name: BgpNet0 subnetName: subnet0 fixedIP: 100.64.1.2 - name: BgpNet1 subnetName: subnet0 fixedIP: 100.65.1.2 - name: BgpMainNet subnetName: subnet0 fixedIP: 172.30.1.2 ansible: ansibleHost: 192.168.122.101 ansibleUser: cloud-admin ansibleVars: fqdn_internal_api: edpm-compute-1.example.com bmhLabelSelector: nodeName: edpm-compute-1注意-
在
nodes部分中定义的节点可以配置nodeTemplate部分中配置的同一 Ansible 变量。其中,为特定节点和nodeTemplate部分配置了 Ansible 变量,则特定于节点的值会覆盖nodeTemplate部分中的值。 -
您不需要为节点复制所有
nodeTemplateAnsible 变量,以覆盖默认值并设置一些特定于节点的值。您只需要配置您要为节点覆盖的 Ansible 变量。 -
许多
ansibleVars在名称中包含edpm,它代表 "External Data Plane Management"。
有关可用于配置节点属性的属性的信息,请参阅
OpenStackDataPlaneNodeSetCR 属性。-
在
在
services部分中,确保包含frr和ovn-bgp-agent服务:- 示例
services: - download-cache - redhat - bootstrap - configure-network - install-os - configure-os - frr - validate-network - ssh-known-hosts - run-os - reboot-os - install-certs - ovn - neutron-metadata - ovn-bgp-agent - libvirt - nova
-
保存
openstack_unprovisioned_compute_node_set.yaml定义文件。 创建 data plane 资源:
$ oc create --save-config -f openstack_unprovisioned_compute_node_set.yaml -n openstack通过确认状态为
SetupReady来验证 data plane 资源是否已创建:$ oc wait openstackdataplanenodeset openstack-compute-nodes --for condition=SetupReady --timeout=10m当状态为
SetupReady时,命令会返回一个condition met信息,否则会返回超时错误。有关 data plane 条件和状态的详情,请参考 Data plane 条件和状态。
验证是否为节点集合创建了
Secret资源:$ oc get secret -n openstack | grep openstack-compute-nodes dataplanenodeset-openstack-compute-nodes Opaque 1 3m50s验证节点是否已转换为
置备状态:$ oc get bmh NAME STATE CONSUMER ONLINE ERROR AGE edpm-compute-0 provisioned openstack-compute-nodes true 3d21h验证是否已创建服务:
$ oc get openstackdataplaneservice -n openstack NAME AGE download-cache 8m40s bootstrap 8m40s configure-network 8m40s validate-network 8m40s frr 8m40s install-os 8m40s ...
为作为 Networker 节点的数据平面节点的逻辑分组定义 OpenStackDataPlaneNodeSet 自定义资源(CR)。您可以根据部署需要定义多个节点设置。每个节点只能包含在一个 OpenStackDataPlaneNodeSet CR 中。
目前,在动态路由环境中,无法分发 RHOSO control plane 的限制。因此,您必须有一个托管 OVN 网关机箱的专用 Networker 节点。在以后的 RHOSO 发行版本中将解决这个限制。如需更多信息,请参阅 OSPRH-661。
您可以使用 nodeTemplate 字段配置通用属性,以应用到 OpenStackDataPlaneNodeSet CR 中的所有节点,以及用于特定于节点属性的 nodeTemplate.nodes 字段。特定于节点的配置覆盖来自 nodeTemplate 的继承值。
有关从未置备的 Networker 节点创建节点的 OpenStackDataPlaneNodeSet CR 示例,请参阅未置备的节点的 OpenStackDataPlaneNodeSet CR 示例。
先决条件
-
为您要包含在每个节点集中的每个未置备节点创建一个
BareMetalHostCR。如需更多信息,请参阅为未置备的节点创建BareMetalHostCR。
流程
在工作站上创建一个名为
openstack_unprovisioned_networker_node_set.yaml的文件,以定义OpenStackDataPlaneNodeSetCR:apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-networker-nodes1 namespace: openstack spec: tlsEnabled: true env:2 - name: ANSIBLE_FORCE_COLOR value: "True"将数据平面中的 Networker 节点连接到 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 中定义的命名空间,例如openstack。 -
将
<ansible_ssh_user> 替换为 Ansible SSH 用户的用户名,如cloud-admin。 -
将
<bmh_label> 替换为节点对应的BareMetalHostCR 中定义的 metadata 标签,例如openstack。元数据标签,如app、workload和nodeName,是用于标记节点的键值对。将bmhLabelSelector字段设置为根据与对应BareMetalHostCR 中的标签匹配的一个或多个标签选择 data plane 节点。 -
将
<interface> 替换为节点连接的 control plane 接口,如enp6s0。
-
将
添加您创建的 SSH 密钥 secret,以便 Ansible 连接到 data plane 节点:
nodeTemplate: ansibleSSHPrivateKeySecret: <secret-key>-
将
<secret-key> 替换为您在 创建 data plane secret 中创建的 SSH 密钥SecretCR 名称,如dataplane-ansible-ssh-private-key-secret。
-
将
-
在 RHOCP 集群上的
openstack命名空间中创建持久性卷声明(PVC)以存储日志。将volumeMode设置为Filesystem,将accessModes设置为ReadWriteOnce。有关 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,以注册节点的操作系统并启用存储库。以下示例演示了如何将节点注册到 CDN。有关如何在 Red Hat Satellite 6.13 中注册节点的详情,请参阅管理主机。nodeTemplate: ansible: ansibleUser: cloud-admin1 ansiblePort: 22 ansibleVarsFrom: - prefix: subscription_manager_ secretRef: name: subscription-manager - secretRef: name: redhat-registry ansibleVars:2 edpm_bootstrap_command: | subscription-manager register --username {{ subscription_manager_username }} --password {{ subscription_manager_password }} subscription-manager release --set=9.4 subscription-manager repos --disable=* subscription-manager repos --enable=rhel-9-for-x86_64-baseos-eus-rpms --enable=rhel-9-for-x86_64-appstream-eus-rpms --enable=rhel-9-for-x86_64-highavailability-eus-rpms --enable=fast-datapath-for-rhel-9-x86_64-rpms --enable=rhoso-18.0-for-rhel-9-x86_64-rpms --enable=rhceph-7-tools-for-rhel-9-x86_64-rpms edpm_bootstrap_release_version_package: []- 1
- 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。添加网络配置模板以应用到您的网络节点。以下示例将单个 NIC VLAN 网络配置应用到 data plane 节点:
nodeTemplate: ... ansible: ... ansibleVars: ... edpm_network_config_os_net_config_mappings: edpm-compute-0: nic1: 52:54:04:60:55:221 edpm-compute-1: nic1: 52:54:04:60:55:22 neutron_physical_bridge_name: br-ex neutron_public_interface_name: eth0 edpm_network_config_update: false2 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 }} use_dhcp: false use_dhcpv6: true - type: interface name: nic1 use_dhcp: true defroute: false - type: interface name: nic2 use_dhcp: false defroute: false dns_servers: {{ ctlplane_dns_nameservers }} domain: {{ dns_search_domains }} addresses: - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }} - type: interface name: nic3 use_dhcp: false addresses: - ip_netmask: {{ lookup('vars', 'bgpnet0_ip') }}/30 - type: interface name: nic4 use_dhcp: false addresses: - ip_netmask: {{ lookup('vars', 'bgpnet1_ip') }}/30 - type: interface name: lo addresses: - ip_netmask: {{ lookup('vars', 'bgpmainnet_ip') }}/32 - ip_netmask: {{ lookup('vars', 'bgpmainnetv6_ip') }}/128 - ip_netmask: {{ lookup('vars', 'internalapi_ip') }}/32 - ip_netmask: {{ lookup('vars', 'storage_ip') }}/32 - ip_netmask: {{ lookup('vars', 'tenant_ip') }}/32 - ip_netmask: {{ lookup('vars', 'octavia_ip') }}/32重要在更新或采用后,您必须将
edpm_network_config_update重置为false。否则,节点可能会丢失网络访问。每当edpm_network_config_update为true时,每次创建OpenStackDataPlaneDeploymentCR 时,都会重新应用更新的网络配置,其中包括作为servicesOverride列表成员的configure-network服务。在
nodeTemplate部分下,添加此组中 Networker 节点集合的通用配置。此OpenStackDataPlaneNodeSet中的每个节点都会继承此配置:- 示例
edpm_frr_bgp_ipv4_src_network: bgpmainnet edpm_frr_bgp_neighbor_password: f00barZ edpm_frr_bgp_uplinks: - nic3 - nic4 edpm_ovn_encap_ip: '{{ lookup(''vars'', ''bgpmainnet_ip'') }}'有关 data plane 网络配置的更多信息,请参阅配置 网络服务 中的 自定义 数据平面网络。
在此节点集中定义每个节点:
nodes: edpm-networker-0:1 hostName: edpm-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 - name: BgpNet0 subnetName: subnet0 fixedIP: 100.64.0.2 - name: BgpNet1 subnetName: subnet0 fixedIP: 100.65.0.2 - name: BgpMainNet subnetName: subnet0 fixedIP: 172.30.0.2 ansible: ansibleHost: 192.168.122.100 ansibleUser: cloud-admin ansibleVars:4 fqdn_internal_api: edpm-networker-0.example.com bmhLabelSelector:5 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 - name: BgpNet0 subnetName: subnet0 fixedIP: 100.64.0.2 - name: BgpNet1 subnetName: subnet0 fixedIP: 100.65.0.2 - name: BgpMainNet subnetName: subnet0 fixedIP: 172.30.0.2 ansible: ansibleHost: 192.168.122.101 ansibleUser: cloud-admin ansibleVars: fqdn_internal_api: edpm-networker-1.example.com bmhLabelSelector: nodeName: edpm-networker-1注意-
在
nodes部分中定义的节点可以配置nodeTemplate部分中配置的同一 Ansible 变量。其中,为特定节点和nodeTemplate部分配置了 Ansible 变量,则特定于节点的值会覆盖nodeTemplate部分中的值。 -
您不需要为节点复制所有
nodeTemplateAnsible 变量,以覆盖默认值并设置一些特定于节点的值。您只需要配置您要为节点覆盖的 Ansible 变量。 -
许多
ansibleVars在名称中包含edpm,它代表 "External Data Plane Management"。
有关可用于配置节点属性的属性的信息,请参阅
OpenStackDataPlaneNodeSetCR 属性。-
在
在
services部分中,确保包含frr和ovn-bgp-agent服务。注意不要在 此节点集中包含
ssh-known-hosts服务,因为它已包含在 Compute 节点设置 CR 中。此服务 仅包含在 一个节点设置 CR 中,因为它是一个全局服务。- 示例
services: - download-cache - redhat - bootstrap - configure-network - install-os - configure-os - frr - validate-network - run-os - reboot-os - install-certs - ovn - neutron-metadata - ovn-bgp-agent
-
保存
openstack_unprovisioned_networker_node_set.yaml定义文件。 创建 data plane 资源:
$ oc create --save-config -f openstack_unprovisioned_networker_node_set.yaml -n openstack通过确认状态为
SetupReady来验证 data plane 资源是否已创建:$ oc wait openstackdataplanenodeset openstack-networker-nodes --for condition=SetupReady --timeout=10m当状态为
SetupReady时,命令会返回一个condition met信息,否则会返回超时错误。有关 data plane 条件和状态的详情,请参考 Data plane 条件和状态。
验证是否为节点集合创建了
Secret资源:$ oc get secret -n openstack | grep openstack-networker-nodes dataplanenodeset-openstack-networker-nodes Opaque 1 3m50s验证节点是否已转换为
置备状态:$ oc get bmh NAME STATE CONSUMER ONLINE ERROR AGE edpm-compute-0 provisioned openstack-networker-nodes true 3d21h验证是否已创建服务:
$ oc get openstackdataplaneservice -n openstack NAME AGE download-cache 9m17s bootstrap 9m17s configure-network 9m17s validate-network 9m17s frr 9m17s install-os 9m17s ...
7.4.4. 未置备的节点的 OpenStackDataPlaneNodeSet CR 示例,用于动态路由 复制链接链接已复制到粘贴板!
以下示例 OpenStackDataPlaneNodeSet CR 使用一些特定于节点的配置从未置备的 Compute 节点创建一个节点集。创建节点集合时,会置备未置备的 Compute 节点。将本示例中的 OpenStackDataPlaneNodeSet CR 的名称更新为反映集合中节点的名称。OpenStackDataPlaneNodeSet CR 名称必须是唯一的,必须包含小写字母数字字符、- (hyphen)或 . (period),且必须以字母数字字符开头和结尾。将本例中的名称更新为反映集合中节点的名称。
apiVersion: dataplane.openstack.org/v1beta1
kind: OpenStackDataPlaneNodeSet
metadata:
name: openstack-compute-nodes
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:
- prefix: subscription_manager_
secretRef:
name: subscription-manager
- secretRef:
name: redhat-registry
ansibleVars:
edpm_bootstrap_command: |
subscription-manager register --username {{ subscription_manager_username }} --password {{ subscription_manager_password }}
subscription-manager release --set=9.4
subscription-manager repos --disable=*
subscription-manager repos --enable=rhel-9-for-x86_64-baseos-eus-rpms --enable=rhel-9-for-x86_64-appstream-eus-rpms --enable=rhel-9-for-x86_64-highavailability-eus-rpms --enable=fast-datapath-for-rhel-9-x86_64-rpms --enable=rhoso-18.0-for-rhel-9-x86_64-rpms --enable=rhceph-7-tools-for-rhel-9-x86_64-rpms
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
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