安装并配置 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 服务¶
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
通过设置以下选项配置 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
配置 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
创建 Bare Metal 服务数据库表
$ ironic-dbsync --config-file /etc/ironic/ironic.conf create_schema
重新启动 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¶
安装 uWSGI
pip install uwsgi
创建一个 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 配置。您可能需要根据您的部署方法和规模修改设置。
启动 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
重要注意事项¶
在启动 WSGI 服务器之前,停止并禁用独立的 ironic-api 服务,以避免端口冲突。
在反向代理之后,请确保在 ironic.conf 中将
[oslo_middleware]/enable_proxy_headers_parsing设置为True,以正确处理 X-Forwarded 标头。
配置 ironic-conductor 服务¶
将
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。配置数据库的位置。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
通过设置以下选项配置 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 机器的主机名。
配置访问其他 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 plugin、Session和Adapter概念来实例化服务客户端。请参阅 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 服务端点的实际地址。)
配置启用驱动程序和硬件类型,如 启用驱动程序和硬件类型 中所述。
如果您启用了使用 直接部署 的驱动程序,则必须安装和配置 Image 服务的 Swift 后端,请参阅 配置 Image 服务以获取临时 URL。Ceph 对象网关 (RADOS Gateway) 也受支持作为 Image 服务的后端,请参阅 Ceph 对象网关支持。
配置 ironic-conductor 服务以执行节点清理,请参阅管理指南中的 节点清理。
如果启用了 ironic-novncproxy,则必须配置 ironic-conductor 以构建有效的控制台 URL,并且还需要配置控制台容器提供程序。每个启用的控制台都有一个正在运行的容器,该容器运行无头 X11 会话,连接到 BMC 的图形控制台,并公开一个 VNC 服务器供 ironic-novncproxy 连接。
将
PUBLIC_IP和PUBLIC_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
重启 ironic-conductor 服务
RHEL/CentOS
sudo systemctl restart openstack-ironic-conductor
Ubuntu/Debian
sudo service ironic-conductor restart
配置 ironic-novncproxy 服务¶
NoVNC 代理服务需要查找数据库中的节点,因此
ironic-novncproxy需要与ironic-api和ironic-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
配置 NoVNC 和主机图形化控制台选项。将
PUBLIC_IP和PUBLIC_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
重启 ironic-novncproxy 服务
RHEL/CentOS
sudo systemctl restart openstack-ironic-novncproxy
Ubuntu/Debian
sudo service ironic-novncproxy restart
配置单进程 ironic¶
作为启动单独的 API 和 conductor 实例的替代方案,您可以启动将 API 和 conductor 结合在同一进程中的 ironic 服务。这在资源有限且需要处理的节点数量较少的环境中可能特别有益。
注意
此功能从 Yoga 版本系列开始可用。
首先按照 配置 ironic-api 服务、配置 ironic-conductor 服务 和 配置 ironic-novncproxy 服务 中的描述设置环境,但不要启动任何服务。将配置选项合并到一个配置文件中。
注意
任何 RPC 设置只有在启动了多个组合服务或有额外的 conductor 时才会生效。
如果您不计划拥有多个 conductor,可以完全禁用 RPC
[DEFAULT] rpc_transport = none
停止已启动的服务(如果已启动)
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
启动或重启 ironic 服务
RHEL/CentOS
sudo systemctl restart openstack-ironic
Ubuntu/Debian
sudo service ironic restart