安装并配置 Bare Metal 服务

本节描述了如何从软件包手动安装和配置 Bare Metal 服务,代码名为 ironic,在三个流行的 Linux 发行版系列之一上进行操作。

或者,您可以使用安装 ironic 的众多项目之一。其中一个是由 bare metal 团队提供的

  • Bifrost 以独立模式安装 ironic(没有 OpenStack 的其余部分)。

更多安装项目由其他 OpenStack 团队开发

  • Kolla 可以将 ironic 安装在容器中作为 OpenStack 的一部分。

  • OpenStack-Ansible 具有一个 role 来安装 ironic

  • TripleO 使用 ironic 来配置裸机节点,也可以用于 安装 ironic

安装和配置先决条件

Bare Metal 服务是一组组件的集合,它提供支持来管理和配置物理机器。您可以将这些组件配置为在单独的节点或同一节点上运行。在本指南中,这些组件在一个节点上运行,通常是 Compute 服务的计算节点。

它假定 Identity、Image、Compute 和 Networking 服务已经设置完毕。

为 Bare Metal 设置数据库

Bare Metal 服务将信息存储在数据库中。本指南使用其他 OpenStack 服务使用的 MySQL 数据库。

在 MySQL 中,创建一个 ironic 数据库,该数据库可被 ironic 用户访问。将 IRONIC_DBPASSWORD 替换为合适的密码

# mysql -u root -p
mysql> CREATE DATABASE ironic CHARACTER SET utf8mb3;
mysql> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'localhost' \
       IDENTIFIED BY 'IRONIC_DBPASSWORD';
mysql> GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'%' \
       IDENTIFIED BY 'IRONIC_DBPASSWORD';

注意

在 MySQL/MariaDB 上创建用于存放 Ironic 的数据库时,字符集不能是 4 字节 Unicode 字符。这是由于内部结构限制所致。 在这些数据库平台上,UTF8 传统上意味着 utf8mb3,简称“UTF-8,3 字节编码”,但是预计这些平台将迁移到 utf8mb4,这与 Ironic 不兼容。

在 SQLite 上运行

可以将 Bare Metal 服务与 SQLite 作为数据库后端运行。但是,请注意以下限制

  • 您必须以一体化模式运行 Ironic(请参阅 配置单进程 ironic)。这样您就不能拥有多个 conductor。

  • 您应该使用 WAL 模式 作为数据库。Ironic 会尝试为您启用它,但只能对新的数据库执行此操作。

  • 即使在 WAL 模式下,SQLite 也具有有限的写入并发性。如果您遇到“数据库已锁定”错误,请尝试减少定期任务的频率。如果仍然无法解决,您可能需要使用基于服务器的数据库。

  • 并非所有数据库迁移都受 SQLite 支持。您可能需要在升级时重新创建数据库。

要使用 SQLite,请像这样配置您的连接

[database]
connection = sqlite:////full/path/to/ironic.sqlite

注意

这不是笔误!完整路径需要 4 个斜杠。

如有疑问,请使用 MySQL/MariaDB。

安装和配置组件

使用 DNF 在 RHEL/CentOS Stream 和 RDO 包上

# dnf install openstack-ironic-api openstack-ironic-conductor openstack-ironic-novncproxy python3-ironicclient

Ubuntu/Debian 上

# apt-get install ironic-api ironic-conductor ironic-novncproxy python3-ironicclient

Bare Metal 服务通过其配置文件进行配置。该文件通常位于 /etc/ironic/ironic.conf

虽然此处提到了一些配置选项,但建议您查看所有 示例配置文件,以便根据您的需要配置 Bare Metal 服务。

可以将 ironic-api 和 ironic-conductor 服务配置在同一主机或不同主机上。用户还可以添加新的 ironic-conductor 主机来处理越来越多的裸机节点。但是,额外的 ironic-conductor 服务应与现有的 ironic-conductor 服务具有相同的版本。

配置 ironic-api 服务

  1. Bare Metal 服务将信息存储在数据库中。本指南使用其他 OpenStack 服务使用的 MySQL 数据库。

    通过 connection 选项配置数据库的位置。在以下示例中,将 IRONIC_DBPASSWORD 替换为您的 ironic 用户的密码,并将 DB_IP 替换为 DB 服务器的 IP 地址

    [database]
    
    # The SQLAlchemy connection string used to connect to the
    # database (string value)
    connection=mysql+pymysql://ironic:IRONIC_DBPASSWORD@DB_IP/ironic?charset=utf8
    
  2. 通过设置以下选项配置 ironic-api 服务以使用 RabbitMQ 消息代理。将 RPC_* 替换为 RabbitMQ 服务器的适当地址详细信息和凭据

    [DEFAULT]
    
    # A URL representing the messaging driver to use and its full
    # configuration. (string value)
    transport_url = rabbit://RPC_USER:RPC_PASSWORD@RPC_HOST:RPC_PORT/
    

    或者,您可以使用 JSON RPC 进行 ironic-conductor 和 ironic-api 之间的交互。在配置中启用它,并提供用于身份验证的 keystone 凭据

    [DEFAULT]
    
    rpc_transport = json-rpc
    
    [json_rpc]
    
    # Authentication type to load (string value)
    auth_type = password
    
    # Authentication URL (string value)
    auth_url=https://IDENTITY_IP:5000/
    
    # Username (string value)
    username=ironic
    
    # User's password (string value)
    password=IRONIC_PASSWORD
    
    # Project name to scope to (string value)
    project_name=service
    
    # Domain ID containing project (string value)
    project_domain_id=default
    
    # User's domain id (string value)
    user_domain_id=default
    

    如果您使用 JSON RPC 的端口不是默认端口 8089,则必须进行配置,例如

    [json_rpc]
    port = 9999
    
  3. 配置 ironic-api 服务以使用 Identity 服务的这些凭据。将 PUBLIC_IDENTITY_IP 替换为 Identity 服务器的公共 IP,将 PRIVATE_IDENTITY_IP 替换为 Identity 服务器的私有 IP,将 IRONIC_PASSWORD 替换为您在 Identity 服务中为 ironic 用户选择的密码,并将 MEMCACHED_SERVER 替换为 memcached 服务器的主机名

    [DEFAULT]
    
    # Authentication strategy used by ironic-api: one of
    # "keystone" or "noauth". "noauth" should not be used in a
    # production environment because all authentication will be
    # disabled. (string value)
    auth_strategy=keystone
    
    [keystone_authtoken]
    
    # Authentication type to load (string value)
    auth_type=password
    
    # Complete public Identity API endpoint (string value)
    www_authenticate_uri=http://PUBLIC_IDENTITY_IP:5000
    
    # Complete admin Identity API endpoint. (string value)
    auth_url=http://PRIVATE_IDENTITY_IP:5000
    
    # Service username. (string value)
    username=ironic
    
    # Service account password. (string value)
    password=IRONIC_PASSWORD
    
    # Service tenant name. (string value)
    project_name=service
    
    # Domain name containing project (string value)
    project_domain_name=Default
    
    # User's domain name (string value)
    user_domain_name=Default
    
    # memcached setting (string value)
    memcached_servers=MEMCACHED_SERVER:11211
    
  4. 创建 Bare Metal 服务数据库表

    $ ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
    
  5. 重新启动 ironic-api 服务

    RHEL/CentOS

    sudo systemctl restart openstack-ironic-api
    

    Ubuntu/Debian

    sudo service ironic-api restart
    

将 ironic-api 配置在 WSGI 服务器之后

Bare Metal 服务可以配置为在任何 WSGI 兼容的 Web 服务器(如 uWSGI 或 Gunicorn)之后运行,以提高性能和可扩展性。

注意

这是可选的,ironic APIs 可以使用独立的 ironic-api 命令运行。但是,对于生产部署,建议使用适当的 WSGI 服务器以获得更好的性能、多个工作进程以及与现有基础设施的集成。

WSGI 应用程序

Ironic 在 ironic.wsgi:application 提供了一个 WSGI 应用程序,可与任何 WSGI 服务器一起使用。下面的示例使用 uWSGI,该服务器用于 Ironic CI 作业。

使用 uWSGI

  1. 安装 uWSGI

    pip install uwsgi
    
  2. 创建一个 uWSGI 配置文件(例如 /etc/uwsgi/ironic.ini

    [uwsgi]
    module = ironic.wsgi:application
    http-socket = 127.0.0.1:6385
    processes = 2
    ; allow 60 seconds for graceful shutdown on SIGTERM
    die-on-term = true
    exit-on-reload = false
    hook-master-start = unix_signal:15 gracefully_kill_them_all
    worker-reload-mercy = 60
    ; disallow connection reuse
    add-header = Connection: close
    ; Prevent thundering herd on accept()
    thunder-lock = true
    ; ensure file descriptors aren't shared between processes
    lazy-apps = true
    enable-threads = true
    master = true
    

注意

此 uWSGI 配置和注释基于 devstack 配置。您可能需要根据您的部署方法和规模修改设置。

  1. 启动 uWSGI

    uwsgi --ini /etc/uwsgi/ironic.ini
    

反向代理配置

WSGI 服务器通常部署在反向代理(如 nginx 或 Apache)之后,用于 SSL 终止、负载平衡和提供静态文件。

示例 nginx 配置

upstream ironic-api {
    server 127.0.0.1:6385;
}

server {
    listen 443 ssl;
    server_name ironic.example.com;

    ssl_certificate /etc/ssl/certs/ironic.crt;
    ssl_certificate_key /etc/ssl/private/ironic.key;

    location / {
        proxy_pass http://ironic-api;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

有关详细的反向代理配置,请参阅

传递配置选项

默认情况下,Ironic 将使用其标准的配置文件搜索路径。如果您需要指定自定义配置文件

对于带有参数的初始化方法

# uWSGI with custom config (in ini file)
[uwsgi]
module = ironic.api.wsgi:initialize_wsgi_app(argv=["--config-file=/etc/ironic/ironic.conf"])

或者,您可以在启动 WSGI 服务器之前设置环境变量

export OS_CLOUD=mycloud
# or
export IRONIC_CONF=/etc/ironic/ironic.conf

重要注意事项

  1. 在启动 WSGI 服务器之前,停止并禁用独立的 ironic-api 服务,以避免端口冲突。

  2. 在反向代理之后,请确保在 ironic.conf 中将 [oslo_middleware]/enable_proxy_headers_parsing 设置为 True,以正确处理 X-Forwarded 标头。

配置 ironic-conductor 服务

  1. HOST_IP 替换为 conductor 主机的 IP。

    [DEFAULT]
    
    # IP address of this host. If unset, will determine the IP
    # programmatically. If unable to do so, will use "127.0.0.1".
    # (string value)
    my_ip=HOST_IP
    

    注意

    如果 conductor 主机有多个 IP,my_ip 应设置为与裸机节点位于同一网络的 IP。

  2. 配置数据库的位置。Ironic-conductor 应使用与 ironic-api 相同的配置。将 IRONIC_DBPASSWORD 替换为您的 ironic 用户的密码,并将 DB_IP 替换为 DB 服务器的 IP 地址

    [database]
    
    # The SQLAlchemy connection string to use to connect to the
    # database. (string value)
    connection=mysql+pymysql://ironic:IRONIC_DBPASSWORD@DB_IP/ironic?charset=utf8
    
  3. 通过设置以下选项配置 ironic-conductor 服务以使用 RabbitMQ 消息代理。Ironic-conductor 应使用与 ironic-api 相同的配置。将 RPC_* 替换为 RabbitMQ 服务器的适当地址详细信息和凭据

    [DEFAULT]
    
    # A URL representing the messaging driver to use and its full
    # configuration. (string value)
    transport_url = rabbit://RPC_USER:RPC_PASSWORD@RPC_HOST:RPC_PORT/
    

    或者,您可以使用 JSON RPC 进行 ironic-conductor 和 ironic-api 之间的交互。在配置中启用它,并提供用于身份验证传入请求的 keystone 凭据(可以与 API 相同)。

    [DEFAULT]
    
    rpc_transport = json-rpc
    
    [keystone_authtoken]
    
    # Authentication type to load (string value)
    auth_type=password
    
    # Complete public Identity API endpoint (string value)
    www_authenticate_uri=http://PUBLIC_IDENTITY_IP:5000
    
    # Complete admin Identity API endpoint. (string value)
    auth_url=http://PRIVATE_IDENTITY_IP:5000
    
    # Service username. (string value)
    username=ironic
    
    # Service account password. (string value)
    password=IRONIC_PASSWORD
    
    # Service tenant name. (string value)
    project_name=service
    
    # Domain name containing project (string value)
    project_domain_name=Default
    
    # User's domain name (string value)
    user_domain_name=Default
    

    您可以选择更改 JSON RPC 服务绑定到的主机和端口,例如

    [json_rpc]
    host_ip = 192.168.0.10
    port = 9999
    

    警告

    当使用 JSON RPC 时,ironic-api 服务必须能够解析 ironic-conductor 机器的主机名。

  4. 配置访问其他 OpenStack 服务的凭据。

    为了与另一个 OpenStack 服务通信,Bare Metal 服务需要使用服务用户向 OpenStack Identity 服务进行身份验证,以便向其他服务发出请求。这些用户的凭据必须配置在与相应服务相关的每个配置文件部分中

    • [neutron] - 访问 OpenStack Networking 服务

    • [glance] - 访问 OpenStack Image 服务

    • [swift] - 访问 OpenStack 对象存储服务

    • [cinder] - 访问 OpenStack 块存储服务

    • [inspector] - 访问 OpenStack 裸机内省服务

    • [service_catalog] - 一个特殊的部分,保存 Bare Metal 服务将用于在 OpenStack Identity 服务目录中注册其自己的 API URL 端点的凭据。

    为了简单起见,您可以为所有服务使用相同的服务用户。为了向后兼容,这应与在 [keystone_authtoken] 部分中为 ironic-api 服务配置的服务用户相同(请参阅“配置 ironic-api 服务”)。但是,这并非必需,您可以创建和配置为每个服务单独的服务用户。

    在底层,Bare Metal 服务使用 keystoneauth 库以及它提供的 Authentication pluginSessionAdapter 概念来实例化服务客户端。请参阅 Keystoneauth 文档,了解支持的插件、可用选项以及身份验证、连接和端点发现相关的会话和适配器选项。

    在下面的示例中,配置用于访问 OpenStack Networking 服务的身份验证信息使用

    • Networking 服务部署在 Identity 服务区域 RegionTwo 中,并且其 public 端点接口已在服务目录中注册。

    • 使用 HTTPS 连接和特定的 CA SSL 证书进行请求

    • 与 ironic-api 服务配置的相同服务用户

    • 动态 password 身份验证插件,它将根据提供的其他选项发现 Identity 服务 API 的适当版本

      • IDENTITY_IP 替换为 Identity 服务器的 IP,并将 IRONIC_PASSWORD 替换为您在 Identity 服务中为 ironic 用户选择的密码

    [neutron]
    
    # Authentication type to load (string value)
    auth_type = password
    
    # Authentication URL (string value)
    auth_url=https://IDENTITY_IP:5000/
    
    # Username (string value)
    username=ironic
    
    # User's password (string value)
    password=IRONIC_PASSWORD
    
    # Project name to scope to (string value)
    project_name=service
    
    # Domain ID containing project (string value)
    project_domain_id=default
    
    # User's domain id (string value)
    user_domain_id=default
    
    # PEM encoded Certificate Authority to use when verifying
    # HTTPs connections. (string value)
    cafile=/opt/stack/data/ca-bundle.pem
    
    # The default region_name for endpoint URL discovery. (string
    # value)
    region_name = RegionTwo
    
    # List of interfaces, in order of preference, for endpoint
    # URL. (list value)
    valid_interfaces=public
    

    默认情况下,为了与另一个服务通信,Bare Metal 服务将尝试通过 Identity 服务的服务目录发现该服务的适当端点。Bare Metal 服务配置文件的该服务的相关配置选项用于此目的。如果您想为特定服务使用不同的端点,请通过 Bare Metal 服务配置文件的该服务的 endpoint_override 配置选项指定此端点。以之前的 Networking 服务为例,这将是

    [neutron]
    ...
    endpoint_override = <NEUTRON_API_ADDRESS>
    

    (将 <NEUTRON_API_ADDRESS> 替换为特定 Networking 服务端点的实际地址。)

  5. 配置启用驱动程序和硬件类型,如 启用驱动程序和硬件类型 中所述。

    1. 如果您启用了使用 直接部署 的驱动程序,则必须安装和配置 Image 服务的 Swift 后端,请参阅 配置 Image 服务以获取临时 URL。Ceph 对象网关 (RADOS Gateway) 也受支持作为 Image 服务的后端,请参阅 Ceph 对象网关支持

  6. 配置 ironic-conductor 服务以执行节点清理,请参阅管理指南中的 节点清理

  7. 如果启用了 ironic-novncproxy,则必须配置 ironic-conductor 以构建有效的控制台 URL,并且还需要配置控制台容器提供程序。每个启用的控制台都有一个正在运行的容器,该容器运行无头 X11 会话,连接到 BMC 的图形控制台,并公开一个 VNC 服务器供 ironic-novncproxy 连接。

    PUBLIC_IPPUBLIC_PORT 替换为适当的值

    [vnc]
    
    # Base url used to build browser links to graphical consoles. If a
    # reverse proxy is used the protocol, IP, and port needs to match how
    # users will access the service. When there is no reverse proxy
    # ``PUBLIC_IP`` should match ``[vnc]host_ip`` and ``PUBLIC_PORT`` should
    # match ``[vnc]port``
    public_url=http://PUBLIC_IP:PUBLIC_PORT/vnc_lite.html
    
    # The only functional container provider included is the systemd
    # provider which manages containers as Systemd Quadlet containers. This
    # provider is appropriate to use when the Ironic services themselves are
    # not containerised, otherwise a custom external provider may be
    # required
    container_provider=systemd
    
    # For the ``container_provider=systemd``, set a valid container image
    # reference available to the podman image storage of the user running
    # ironic-conductor. See /usr/share/ironic/vnc-container for instructions
    # to build a compatible image.
    console_image=localhost/vnc-container
    

    [vnc]container_provider=systemd 时,openstack-ironic-conductor 服务需要能够对 ironic-conductor 和 ironic-novncproxy 运行的用户进行 systemctl --user 调用。

    假设服务以用户 ironic 身份运行,请通过运行 id -u ironic 来发现该用户的 <UID>。编辑 openstack-ironic-conductor.service 以添加环境变量 DBUS_SESSION_BUS_ADDRESS,并用 <UID> 进行替换

    [Service]
    ...
    Environment = DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<UID>/bus
    
  8. 重启 ironic-conductor 服务

    RHEL/CentOS

    sudo systemctl restart openstack-ironic-conductor
    

    Ubuntu/Debian

    sudo service ironic-conductor restart
    

配置 ironic-novncproxy 服务

  1. NoVNC 代理服务需要查找数据库中的节点,因此 ironic-novncproxy 需要与 ironic-apiironic-conductor 相同的数据库配置。

    通过 connection 选项配置数据库的位置。在以下示例中,将 IRONIC_DBPASSWORD 替换为您的 ironic 用户的密码,并将 DB_IP 替换为 DB 服务器的 IP 地址

    [database]
    
    # The SQLAlchemy connection string used to connect to the
    # database (string value)
    connection=mysql+pymysql://ironic:IRONIC_DBPASSWORD@DB_IP/ironic?charset=utf8
    
  2. 配置 NoVNC 和主机图形化控制台选项。将 PUBLIC_IPPUBLIC_URL 替换为适当的值

    [vnc]
    
    # Enable VNC related features, required to allow the ironic-novncproxy service to start
    enabled=True
    
    # Port to bind to for serving NoVNC web assets and websockets
    port=6090
    
    # IP address to bind to for serving NoVNC web assets and websockets
    host_ip=PUBLIC_IP
    
  3. 重启 ironic-novncproxy 服务

    RHEL/CentOS

    sudo systemctl restart openstack-ironic-novncproxy
    

    Ubuntu/Debian

    sudo service ironic-novncproxy restart
    

配置单进程 ironic

作为启动单独的 API 和 conductor 实例的替代方案,您可以启动将 API 和 conductor 结合在同一进程中的 ironic 服务。这在资源有限且需要处理的节点数量较少的环境中可能特别有益。

注意

此功能从 Yoga 版本系列开始可用。

  1. 首先按照 配置 ironic-api 服务配置 ironic-conductor 服务配置 ironic-novncproxy 服务 中的描述设置环境,但不要启动任何服务。将配置选项合并到一个配置文件中。

    注意

    任何 RPC 设置只有在启动了多个组合服务或有额外的 conductor 时才会生效。

    如果您不计划拥有多个 conductor,可以完全禁用 RPC

    [DEFAULT]
    rpc_transport = none
    
  2. 停止已启动的服务(如果已启动)

    RHEL/CentOS

    sudo systemctl stop openstack-ironic-api
    sudo systemctl stop openstack-ironic-conductor
    sudo systemctl stop openstack-ironic-novncproxy
    

    Ubuntu/Debian

    sudo service ironic-api stop
    sudo service ironic-conductor stop
    sudo service ironic-novncproxy stop
    
  3. 启动或重启 ironic 服务

    RHEL/CentOS

    sudo systemctl restart openstack-ironic
    

    Ubuntu/Debian

    sudo service ironic restart