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 节点注册并检查
BareMetalHostCR。检查后,每个裸机节点都必须处于Available状态。有关配置裸机节点的更多信息,请参阅 Red Hat OpenShift Container Platform (RHOCP) 安装后配置 指南中的 裸机配置。
流程
在工作站上创建一个名为
openstack_unprovisioned_node_set.yaml的文件,以定义OpenStackDataPlaneNodeSetCR:apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneNodeSet metadata: name: openstack-data-plane1 namespace: openstack spec: tlsEnabled: true env: - name: ANSIBLE_FORCE_COLOR value: "True"- 1
OpenStackDataPlaneNodeSetCR 名称必须是唯一的,仅包含小写字母数字字符和-(hyphens)或.(periods),以字母数字字符开头和结尾,且最大长度为 53 个字符。将本例中的名称更新为反映集合中节点的名称。
定义
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> 替换为节点对应的BareMetalHostCR 中定义的命名空间。 -
将
<ansible_ssh_user> 替换为 Ansible SSH 用户的用户名。 -
将
<bmh_label> 替换为节点对应的BareMetalHostCR 中定义的 metadata 标签,例如openstack。元数据标签,如app、workload和nodeName,是用于标记节点的键值对。将bmhLabelSelector字段设置为根据与对应BareMetalHostCR 中的标签匹配的一个或多个标签选择 data plane 节点。 -
将
<interface> 替换为节点连接的 control plane 接口,如enp6s0。
-
将
BMO 默认管理
openshift-machine-api命名空间中的BareMetalHostCR。您必须更新ProvisioningCR 以监视所有命名空间:$ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"watchAllNamespaces": true }}'添加您创建的 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。不要为使用 NFS 卷插件的 PersistentVolume (PV)的日志请求存储。NFS 与 FIFO 不兼容,ansible-runner创建一个 FIFO 文件来存储日志。有关 PVC 的详情,请参考 RHOCP Storage 指南中的 了解持久性存储 和 规划部署 中的 Red Hat OpenShift Container Platform 集群要求。 为 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 存储名称。
-
将
在
nodeTemplate部分下,添加此组中节点集合的通用配置。此OpenStackDataPlaneNodeSet中的每个节点都会继承此配置。如需更多信息,请参阅:
在此节点集中定义每个节点:
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 - 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: true5 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注意-
在
nodes部分中定义的节点可以配置nodeTemplate部分中配置的同一 Ansible 变量。其中,为特定节点和nodeTemplate部分配置了 Ansible 变量,则特定于节点的值会覆盖nodeTemplate部分中的值。 -
您不需要为节点复制所有
nodeTemplateAnsible 变量,以覆盖默认值并设置一些特定于节点的值。您只需要配置您要为节点覆盖的 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。
有关可用于配置节点属性的属性的信息,请参阅
OpenStackDataPlaneNodeSetCR 属性。-
在
在
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 ...-
保存
openstack_unprovisioned_node_set.yaml定义文件。 创建 data plane 资源:
$ oc create -f openstack_unprovisioned_node_set.yaml -n openstack验证 data plane 资源是否已创建:
$ oc get openstackdataplanenodeset -n openstack NAME STATUS MESSAGE openstack-data-plane False Deployment not started有关返回状态的含义的信息,请参阅 Data plane 条件和状态。
验证是否为节点集合创建了
Secret资源:$ oc get secret -n openstack | grep openstack-data-plane dataplanenodeset-openstack-data-plane Opaque 1 3m50s验证是否已创建服务:
$ 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
10.6.1. 未置备的节点的 OpenStackDataPlaneNodeSet CR 示例 复制链接链接已复制到粘贴板!
以下示例 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