基于 LXC 的 Ironic 部署

本节描述了使用 Openstack-Ansible 进行 Ironic 部署的具体示例。做出了一些设计选择,说明了如何为特定需求集配置 Ironic 服务。

部署设计决策

  • 在 openstack 控制平面中使用 LXC 容器

  • 使用单个 bmaas 网络用于 Ironic 调配、清理和检查

  • bmaas 网络无法路由到任何其他网络或内部 VIP

  • 使用多租户,Ironic 服务器连接到项目网络

  • 将使用 networking-generic-switch 来控制网络设备以实现多租户

  • Cisco NXOS 交换机

  • 该部署使用 VXLAN 项目网络

这些设计决策中的许多是主观的,可以更改,例如,允许将 bmaas 网络路由到其他网络,包括内部 VIP,将导致一些简化。

此示例说明了特定部署需求集,但并非旨在严格遵循。它演示了 Ironic 和 Openstack-Ansible 的一些功能,以及如何处理 Ironic 在小型到适度规模上的实际部署的大部分内容。

警告

应考虑 IPMI 或其他带外接口的安全性,这些接口通常存在错误并且经常具有供应商特定的带内工具,这些工具允许从用户空间操作 BMC 及其固件。了解允许 IPMI/BMC 接口与板载以太网端口共享物理接口的风险,此功能将允许完全访问已部署 Ironic 节点的管理接口。对于高安全性环境或用户不可信的环境,请咨询您的硬件供应商以获取适当的加固步骤。

_images/ironic-lxc-example.drawio.png

BMAAS 网络地址计划

在本示例中,bmaas 网络的子网为 10.88.104.0/24。子网的大小决定了 Ironic 部署中节点的最大数量。

地址

目的

10.88.104.0 至 .10

为潜在的物理路由器/SVI 保留

10.88.104.11 至 .29

控制平面 Ironic 容器接口

10.88.104.64 至 .95

Neutron DHCP 在 Ironic_Network 中的分配池

10.88.104.96 至 .127

Ironic Inspector DHCP 池范围

10.88.104.128 至 .254

手动分配给 IPMI/iDRAC 的静态 IP

在本部署中,bmaas 网络为了简单起见,结合了几个功能。可以使用单独的网络进行检查、清理和调配,但这超出了本示例的范围。

该子网分为几个地址范围,为物理路由器上的未来接口或如果将来要使子网可路由则为网关地址保留。然后,一小部分地址保留给 bmaas 网络,以连接到控制平面中的 Ironic 容器,其余地址在用于调配的 neutron 网络、Ironic Inspector 分配 DHCP 的范围以及 Ironic 节点的 IPMI(或其他协议)管理端口的地址块之间共享。

注意

本示例将使用 VLAN ID 3003 作为 bmaas 网络,但可以使用任何可用的 VLAN ID。

警告

此示例将 Ironic IPMI、调配、清理和检查网络合并到同一个子网中。可以通过为每个不同功能创建网络并相应地更新容器网络和 Ironic 服务配置来使它们彼此分离。特别是,应理解节点在清理阶段是“不受信任的”,并且将处于先前用户留下的任意状态。

IPMI 接口

配置 Ironic 节点的 IPMI 接口时,建议执行以下步骤

  • 除非已经有非常可靠的手段使用 DHCP 分配地址,否则使用静态 IP 分配用于 IPMI 接口。Ironic 团队不认为 Neutron DHCP 代理适合为 IPMI 接口分配地址。

  • 如果需要多租户,请使用 Ironic 节点的专用 IPMI 端口。具有共享板载以太网/IPMI 端口的节点将在部署完成后将该端口移动到租户网络,并且 Ironic 控制平面将不再能够与节点的管理接口通信。

部署的最大规模

此 Ironic 部署的最大规模受 bmaas 网络中地址分配的限制。在本示例中,范围 10.88.104.128/25 中最多可以有 127 个服务器 BMC 接口。

可以同时调配的服务器的最大数量由分配给 Neutron DHCP 池的地址决定。

可以同时检查的服务器的最大数量由分配给 Ironic Inspector DHCP 池的地址决定。

要增加部署规模,应增加 bmaas 子网的大小,并分配地址以满足所需的节点数量以及同时调配和检查的节点的最大数量。

Openstack-Ansible 配置

确定地址计划后,可以更新 Openstack-Ansible 配置以匹配。

必须在 /etc/openstack_deploy/openstack_user_config.yml 中的现有 cidr_networksused_ips 部分中添加额外的条目,以描述 Ansible 清单可以分配给 Ironic 控制平面容器的网络范围。在本示例中,除了范围 10.88.104.11 到 10.88.104.29 之外,bmaas 网络中的所有地址都被标记为已使用。

provider_networks 列表中定义了一个额外的网络,该网络表示控制器上的桥接器 br-bmaas 与 ironic 服务容器内的 eth15 之间的连接。

必须将 bmaas 网络从控制平面主机扩展到连接到 Ironic 节点 IPMI 接口的交换机端口,以及连接到将用于 PXEboot 的 Ironic 节点接口的交换机端口。这通常是专门为 Ironic 调配分配的 VLAN。

分配了 Ironic 控制平面容器的主机。

注意

部署者有责任在控制器节点上创建 br-bmaas,并确保将其连接到 bmaas 网络的正确 VLAN ID。主机网络的配置不在 Openstack-Ansible 的范围内。

注意

提供程序网络定义中的 range 键未使用,但作为配置文件的提醒很有用,用于 VLAN ID。

cidr_networks:
  <existing entries>
  bmaas:     10.88.104.0/24        # for containers on the bmaas network

used_ips:
  <existing entries>
  # bmaas ips
  - "10.88.104.0,10.88.104.10"     # reserve for routers or other infrastructure
  - "10.88.104.30,10.88.104.255"   # reserve for ironic IPMI and provisioning

provider_networks:
  <existing entries>
  # Network definition to connect Ironic LXC containers to the bmaas network
  # on the infra hosts
  - network:
      net_name: physnet_neutron
      container_type: "veth"
      container_bridge: "br-bmaas"
      container_interface: "eth15"
      ip_from_q: bmaas
      type: "vlan"
      range: "3003:3003"
      group_binds:
        - ironic_api_container
        - ironic_compute_container
        - ironic_inspector_container


# ironic API and conductor
ironic-infra_hosts:
  infra1: *_infra1_
  infra2: *_infra2_
  infra3: *_infra3_

# nova used by ironic for machine state management
ironic-compute_hosts:
  infra1: *_infra1_
  infra2: *_infra2_
  infra3: *_infra3_

# Ironic-inspector can only support a single instance at the moment
# High availability for ironic-inspector is not yet implemented
ironic-inspector_hosts:
  infra1: *_infra1_

注意

此示例使用 YAML 锚点来简化 openstack_user_config.yml,从而仅定义一次基础设施节点的 IP 地址。请参阅 https://yaml.org/spec/1.2.2/#alias-nodes

创建 Neutron 配置

通过更新 /etc/openstack_deploy/group_vars/neutron_server.yml 启用 Neutron baremetalgenericswitch 机制驱动程序

---
neutron_plugin_types:
  - ml2.genericswitch
  - ml2.baremetal

# keep the ml2 drivers in this order
# see https://storyboard.openstack.org/#!/story/2008686
neutron_ml2_mechanism_drivers: "genericswitch,baremetal"

/etc/openstack_deploy/user_variables.yml 中配置 neutron networking-generic-switch,以了解 Ironic 节点连接到的交换机。部署完成后,Neutron 将对这些交换机进行编程,以将 Ironic 节点切换到正确的项目 VLAN,从而启用 Ironic 的多租户。

此示例适用于基于 Cisco NXOS 的交换机,该交换机使用与基于 Cisco IOS 的交换机相同的命令集,用于 networking-generic-switch 所需的功能。没有 NXOS 的特定 device_type

注意

必须在 neutron 配置中指定交换机的 MAC 地址,但 Cisco 和其他一些交换机供应商为每个端口提供唯一的 MAC 地址,因此客户端看到的 MAC 地址不能用于标识交换机。对于 IOS/NXOS networking-generic-switch,它使用来自 Ironic 节点 local_link_connection 信息的 switch_info 字段,而不是在为特定节点选择要配置的交换机时匹配 MAC 地址。

neutron_neutron_conf_overrides:
  genericswitch:my-switch-name:            # This should match the hostname configured on the switch
    device_type: netmiko_cisco_ios         # It is really NXOS but the commands are the same
    ngs_mac_address: "cc:46:d6:64:4b:41"   # Doesn't seem to matter but is required - this is taken from an SVI on the mgmt network
    ip: "10.80.240.3"                      # An IP on the switch which has ssh access from the br-mgmt network, loopback, SVI or mgmt0 as needed
    username: "neutron"                    # The user that Neutron will SSH to the switch as
    password: "supersecret"                # The password that Neutron will use to SSH to the switch
    ##  key_file: <ssh key file>           # An SSH key may be used instead of a password
    ngs_manage_vlans: "False"              # VLANs are already provisioned on the switch so tell neutron not to create/delete VLANs

注意

networking-generic-switch 的配置添加到 neturon.conf 而不是 ml2_conf_genericswitch.ini,因为需要由 neutron-rpc-server 和 neutron-server 读取配置。neutron-server 是 openstack-ansible 中的 uwsgi 服务,因此仅传递一个配置文件,请参阅 https://bugs.launchpad.net/openstack-ansible/+bug/1987405

注意

如果已经存在对此变量的覆盖,请扩展现有的覆盖,而不是创建第二个覆盖。

配置交换机以允许 Neutron 连接

为了实现多租户,Neutron 将连接到指定的交换机,并在部署完成后将 Ironic 节点被调配的端口配置为正确的项目 VLAN。在部署期间,Neutron 将确保节点处于 bmaas 调配网络中,如 Ironic 配置中所指定。

交换机上必须存在合适的用户名和凭据。SSH 连接将源自在 OpenStack 控制平面上运行的 Neutron 进程,位于 mgmt 网络上。必须从 mgmt 网络到交换机上的接口(允许 SSH 登录)存在 IP 路由。该接口可以是物理管理端口(NXOS 上的 mgmt0),环回接口、SVI 或具有 IP 地址的另一个接口。SSH 与交换机的通信可以是带内或带外,具体取决于部署的要求。

此示例配置适用于 NXOS 交换机上的使用密码身份验证的 neutron 用户,如 show run 中所示。应用于交换机的配置授予 neutron 用户访问一组最小的命令,用于为特定端口配置 VLAN 成员资格。

要控制允许 neutron 用户在 Cisco Nexus 交换机上发出的命令,请创建一个角色

role name neutron-role
  rule 3 permit command configure t
  rule 2 permit read-write feature interface
  rule 1 permit read
  vlan policy deny
    permit vlan 3003-3003
    permit vlan 3100-3200
  interface policy deny
    permit interface Ethernet1/1
    permit interface Ethernet1/2
    permit interface Ethernet1/3
    permit interface Ethernet1/4
    permit interface Ethernet1/5
    permit interface Ethernet1/6
    permit interface Ethernet1/7
    permit interface Ethernet1/8

此角色允许 neutron 用户分配到 VLAN 3003,即 bmaas 网络,并在节点调配期间使用。还应允许节点在部署完成后可以移动到的任何项目 VLAN,此处范围为 3100-3200。

列出了 neutron 用户允许修改的接口,在本例中为单个接口,但请参阅交换机文档以获取其他选项,例如正则表达式。

可以在 Arista 交换机上进行类似的配置,其中必须使用正则表达式定义更明确的允许 CLI 命令列表。

role neutron-role
   10 permit mode exec command configure
   20 permit mode exec command terminal width 511
   30 permit mode exec command terminal length 0
   40 permit mode exec command enable
   50 permit mode exec command copy running-config startup-config
   60 permit mode config command interface
   70 permit mode if-Et([1-9]|27|29)\/1 command switchport mode access
   80 permit mode if-Et([1-9]|27|29)\/1 command (no )*switchport access vlan (3003|3966)
   90 permit mode if-Et([1-9]|27|29)\/1 command no switchport mode trunk
   100 permit mode if-Et([1-9]|27|29)\/1 command switchport trunk allowed vlan none
   110 permit mode config command copy running-config startup-config

创建与 neutron.conf / genericswitch 配置文件的选项匹配的用户名和密码

username neutron password 5 <ENCRYPTED-PASSWORD-HERE> role neutron-role

允许从预期的 IP 地址(例如,一对带外管理主机 192.168.0.100/31 和 OpenStack mgmt 网络 10.80.240.0/24)SSH 到交换机。

ip access-list ACL_ALLOW_SSH_VTY
  10 permit tcp 192.168.0.100/31 any eq 22
  20 permit tcp 10.80.240.0/22 any eq 22

line vty
  session-limit 5
  exec-timeout 10
  access-class ACL_ALLOW_SSH_VTY in

创建用于 Ironic 调配、清理和检查的 Neutron 网络

openstack network create \
  --internal \
  --provider-network-type vlan \
  --provider-physical-network physnet_neutron \
  --provider-segment 3003 \
  Ironic_Network

openstack subnet create \
  --allocation-pool 10.88.104.64-10.88.104.95 \
  --dhcp \
  --subnet-range 10.88.104.0/24
  --gateway none
  Ironic_Subnet

创建 Ironic 配置

/etc/openstack_deploy/user_variables_ironic.yml

## IRONIC ##

ironic_ipxe_enabled: yes                  # use HTTP image download from the ironic conductor container
ironic_enable_web_server_for_images: yes  # use same web server to cache user images

# Ensure values used during PXEboot refer directly to the correct interface on Ironic API container
# instead of the internal VIP
ironic_http_url: "{{ ironic_ipxe_proto }}://{{ container_networks['bmaas_address']['address'] }}:{{ ironic_ipxe_port }}"
ironic_tftp_server_address: "{{ container_networks['bmaas_address']['address'] }}"

# Enable ironic drivers
ironic_drivers_enabled:     # Use PXE boot and IPMItool
  - agent_ipmitool
  - pxe_ipmitool
  - pxe_drac                # enables drivers for Dell iDrac interface

# Configure Ironic to use Neutron networking
ironic_enabled_network_interfaces_list: "noop,neutron"
ironic_default_network_interface: neutron

# Enable the default set of cleaning steps
ironic_automated_clean: yes

# Configure the neutron networks that Ironc should use
ironic_neutron_provisioning_network_name: "Ironic_Network"
ironic_neutron_cleaning_network_name:     "Ironic_Network"
ironic_neutron_inspection_network_name:   "Ironic_Network"

# Ensure ironic API (using uwsgi) listens on br-bmaas for agent callbacks
# as well as the mgmt interface for the loadbalancer
ironic_uwsgi_bind_address: 0.0.0.0

# Add ipa-insecure=1 to kernel parameters
# Needed when ironic endpoint is available over https with self-signed cert.
ironic_kernel_append_params: "ipa-debug=1 systemd.journald.forward_to_console=yes ipa-insecure=1"

# INI file overrides
ironic_ironic_conf_overrides:
  # Disable full device erasure (slow) and just metadata erasure, and replace with "Express erasure"
  # which tries to use firmware secure-erase command, but if that fails, reverts to metadata erasure.
  # See: https://docs.openstack.org/ironic/2025.2/admin/cleaning.html#storage-cleaning-options
  deploy:
    erase_devices_priority: 0
    erase_devices_metadata_priority: 0
  conductor:
    clean_step_priority_override: "deploy.erase_devices_express:5"

  # Direct IPA to callback directly to deploying ironic container (via BMAAS network)
  # instead of going via HAProxy on mgmt network. Only applies when bmaas network is isolated.
  service_catalog:
    endpoint_override: "http://{{ container_networks['bmaas_address']['address'] }}:6385"

  # Enable ipmitool's Serial-over-LAN terminal console for baremetal nodes
  DEFAULT:
    enabled_console_interfaces: "ipmitool-socat,no-console"

## IRONIC INSPECTOR ##

# Direct Inspector to callback directly to deploying ironic container (via BMAAS network)
# instead of going via HAProxy on mgmt network. Only applies when bmaas network is isolated.
ironic_inspector_callback_url: "{{ ironic_inspector_service_internaluri_proto }}://{{ container_networks['bmaas_address']['address'] }}:{{ ironic_inspector_service_port }}/v1/continue"

# Add ipa-insecure=1 to kernel parameters
# Needed when inspector is available over https with self-signed cert.
ironic_inspector_extra_callback_parameters: "ipa-collect-lldp=1 ipa-insecure=1"

# Ensure inspector API (using uwsgi) listens on br-bmaas for agent callbacks
# as well as the mgmt interface for the loadbalancer
ironic_inspector_service_address: "0.0.0.0"

# dnsmasq/dhcp information for inspector
ironic_inspector_dhcp_pool_range: 10.88.104.96 10.88.104.127
ironic_inspector_dhcp_subnet: 10.88.104.0/24
ironic_inspector_dhcp_subnet_mask: 255.255.255.0
ironic_inspector_dhcp_enable_gateway: False
ironic_inspector_dhcp_enable_nameservers: False

ironic_inspector_dhcp_interface: eth15   # connected to br-bmaas on the host

部署 Neutron 更改

openstack-ansible playbooks/os-neutron-install.yml

部署 ironic 特定的 nova 服务

这会将 nova compute 和 nova console 服务部署到 ironic compute 容器。

playbooks/os-nova-install.yml --limit ironic_all

部署对 HAProxy 的更改

这将启动所需的 Ironic、Inspector 和控制端点。

openstack-ansible playbooks/haproxy-install.yml --tags haproxy_server-config

部署 Ironic 和 Inspector 服务

openstack-ansible playbooks/os-ironic-install.yml

部署 Horizon 仪表板以用于 Ironic

openstack-ansible playbooks/os-horizon-install.yml

使用 Ironic

请参阅本文档中配置 Ironic 部分中的常规说明。

VXLAN 项目网络

在本示例中,Ironic 多租户使用 VLAN 实现。在项目网络使用叠加(如 VXLAN)实现的 OpenStack 部署中,无法将 Ironic 节点直接连接到这些网络。此外,最终用户无法在创建项目网络时请求底层实现为 VLAN。

在使用叠加网络项目的云环境中,云管理员需要为用户创建 VLAN 提供商网络,以便将 Ironic 节点连接到这些网络,并使用 Neutron RBAC 将这些网络共享到各个项目中。