无需 Nova 和 Glance 的配置节点¶
https://blueprints.launchpad.net/tripleo/+spec/nova-less-deploy
目前 TripleO undercloud 使用 Heat、Nova、Glance、Neutron 和 Ironic 来配置裸机。此蓝图建议从此流程中排除 Heat、Nova 和 Glance,完全从 undercloud 中移除 Nova 和 Glance。
问题描述¶
让 TripleO 工作流直接使用 Ironic 来配置节点有很多好处
首先,摆脱可怕的“未找到有效主机”异常。调度将更加简单,错误将更加清晰。
注意
在 undercloud 中使用 Nova 的许多其他问题源于 Nova 是面向云的软件,而 undercloud 更像是一个传统的安装程序。在“宠物 vs 牲畜”的比喻中,Nova 处理“牲畜”情况,而 undercloud 是“宠物”情况。
对于通用配置器的情况,我们还可以摆脱 Nova 和 Glance,从而减少内存占用。
我们将摆脱当前尝试猜测 Nova 调度器期望的预部署验证。
我们将能够将由 Ironic 部署的节点与预部署服务器结合使用。
我们将负责构建 configdrive,从而可能放入更多有用的内容。
希望扩容将更不容易出错。
未来我们还可能能够
更轻松地集成按需构建 RAID 等功能。
在调度和配置决策中使用内省数据。特别是,我们可以自动处理根设备提示。
使 Neutron 可选,并使用静态 DHCP 和/或 os-net-config。
提议的变更¶
概述¶
此蓝图建议移除 Heat-Nova-Glance 三元组,并用 Mistral 直接驱动的 Ironic 取代。为了避免将 Ironic 特定的代码放入 tripleo-common,已经开发了一个新的库 metalsmith 并已被 Ironic 治理接受。
作为实现的一部分,此蓝图建议完全将裸机配置过程与软件配置分离,包括 CLI 级别。这有两个好处
在两个容易出错的流程之间进行清晰的分离简化了操作员的调试。
重用现有的 deployed-server 工作流简化了实现。
在遥远的未来,metalsmith 的功能可能会移动到 Ironic API 本身。在这种情况下,它将被逐步淘汰,同时保持相同的 Mistral 工作流。
操作员工作流¶
如 概述 中所述,CLI/GUI 工作流将分为硬件配置和软件配置两部分(前者是可选的)。
除了现有的 Heat 模板外,还会填充一个新的文件 baremetal_deployment.yaml,操作员可以在其中填充裸机配置信息。
裸机配置将由一个新的 CLI 命令或 GUI 操作使用新的 deploy_roles 工作流 进行。
openstack overcloud node provision \ -o baremetal_environment.yaml baremetal_deployment.yaml
此命令将从 baremetal_deployment.yaml 获取输入,配置请求的裸机,并输出一个 Heat 环境变量文件 baremetal_environment.yaml 以用于 deployed-server 功能。
最后,完成常规部署,包括生成的文件
openstack overcloud deploy \ <other cli arguments> \ -e baremetal_environment.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-environment.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \ -r /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-server-roles-data.yaml
为了简单起见,可以将这两个命令组合在一起
openstack overcloud deploy \
<other cli arguments> \
-b baremetal_deployment.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-environment.yaml \
-e /usr/share/openstack-tripleo-heat-templates/environments/deployed-server-bootstrap-environment-centos.yaml \
-r /usr/share/openstack-tripleo-heat-templates/deployed-server/deployed-server-roles-data.yaml
新的参数 --baremetal-deployment/-b 将接受 baremetal_deployment.yaml 并自动执行部署。
变更分解¶
本节将深入描述所需的变更。
镜像上传¶
由于 Glance 将不再使用,因此必须从其他来源提供镜像。Ironic 支持 HTTP 和文件来源的镜像。对于 undercloud 情况,文件来源似乎是最直接的,此外,Edge 情况可能需要使用 HTTP 镜像。
为了使两种情况都可行,openstack overcloud image upload 命令现在会将三个 overcloud 镜像 (overcloud-full.qcow2、overcloud-full.kernel 和 overcloud-full.ramdisk) 复制到 /var/lib/ironic/httpboot/overcloud-images。这将允许通过 file:///var/lib/ironic/httpboot/overcloud.images/... 和 http(s)://<UNDERCLOUD HOST>:<IPXE PORT>/overcloud-images/... 引用镜像。
最后,将使用以下命令从复制的镜像生成校验和文件
cd /var/lib/ironic/httpboot/overcloud-images
md5sum overcloud-full.* > MD5SUMS
这是因为校验和将不再来自 Glance。
baremetal_deployment.yaml¶
此文件将描述裸机配置参数。它将提供当前从 Heat 模板中隐式推断的信息。
注意
我们可以继续从模板中提取它。但是,单独的文件将避免对任何 Heat 特定逻辑的依赖,从而可能使独立安装程序受益。它还为操作员提供了对配置过程的更多控制。
此文件的格式类似于 roles_data 文件之一。它描述了每个角色的部署参数。该文件包含一个角色列表,每个角色都有一个 name。其他接受的参数是
count要为此角色部署的机器数量。默认为 1。
profile要为此角色使用的 profile(
compute、control等)。大致对应于基于 Nova 的部署的 flavor 名称。默认为无 profile(可以选择任何节点)。hostname_format用于生成主机名的模板。这类似于
roles_data文件中的HostnameFormatDefault,应使用%index%对节点进行编号。默认值为%stackname%-<role name in lower case>-%index%。instances实例列表,格式与 deploy_instances 工作流 接受的格式相同。这允许为每个实例调整参数。
示例¶
部署一个 compute 和一个 control,使用任意 profile
- name: Compute
- name: Controller
HA 部署,两个 compute 和匹配的 profile
- name: Compute
count: 2
profile: compute
hostname_format: compute-%index%.example.com
- name: Controller
count: 3
profile: control
hostname_format: controller-%index%.example.com
高级部署,自定义主机名和为每个实例设置参数
- name: Compute
profile: compute
instances:
- hostname: compute-05.us-west.example.com
nics:
- network: ctlplane
fixed_ip: 10.0.2.5
traits:
- HW_CPU_X86_VMX
- hostname: compute-06.us-west.example.com
nics:
- network: ctlplane
fixed_ip: 10.0.2.5
traits:
- HW_CPU_X86_VMX
- name: Controller
profile: control
instances:
- hostname: controller-1.us-west.example.com
swap_size_mb: 4096
- hostname: controller-2.us-west.example.com
swap_size_mb: 4096
- hostname: controller-3.us-west.example.com
swap_size_mb: 4096
deploy_roles 工作流¶
工作流 tripleo.baremetal_deploy.v1.deploy_roles 将接受来自 baremetal_deployment.yaml 的信息,将其转换为 deploy_instances 工作流 接受的低级格式,并使用它调用 deploy_instances 工作流。
它将接受以下强制输入
roles解析后的 baremetal_deployment.yaml 文件。
它将接受一个可选输入
plan计划/堆栈名称,用于模板化。默认为
overcloud。
它将返回与 deploy_instances 工作流 相同的输出,以及
environment生成的 baremetal_environment.yaml 文件的内容。
示例¶
来自 baremetal_deployment.yaml 的示例将被转换为
- hostname: overcloud-compute-0
- hostname: overcloud-controller-0
- hostname: compute-0.example.com
profile: compute
- hostname: compute-1.example.com
profile: compute
- hostname: controller-0.example.com
profile: control
- hostname: controller-1.example.com
profile: control
- hostname: controller-2.example.com
profile: control
- hostname: compute-05.us-west.example.com
nics:
- network: ctlplane
fixed_ip: 10.0.2.5
profile: compute
traits:
- HW_CPU_X86_VMX
- hostname: compute-06.us-west.example.com
nics:
- network: ctlplane
fixed_ip: 10.0.2.5
profile: compute
traits:
- HW_CPU_X86_VMX
- hostname: controller-1.us-west.example.com
profile: control
swap_size_mb: 4096
- hostname: controller-2.us-west.example.com
profile: control
swap_size_mb: 4096
- hostname: controller-3.us-west.example.com
profile: control
swap_size_mb: 4096
deploy_instances 工作流¶
工作流 tripleo.baremetal_deploy.v1.deploy_instances 是对相应的 metalsmith 调用的一个薄包装。
以下输入是强制的
instances实例列表,格式如 实例格式 中所述。
ssh_keys要放在机器上的 SSH 公钥内容列表。
以下输入是可选的
ssh_user_name要创建的 SSH 用户名,默认为
heat-admin以保持兼容性。timeout部署超时,默认为 3600 秒。
concurrency部署并发量 - 同时部署多少个节点。默认为 20,与内省匹配。
实例格式¶
实例记录格式与 metalsmith ansible role 的格式非常相似,只有一些 TripleO 特定的添加和默认更改。
以下字段中的一个或两个必须存在
hostname请求的主机名。它用于稍后标识部署的实例。默认为
name。name要部署的节点的名称。如果未提供
hostname,则name也将用作主机名。
将支持以下字段
capabilities请求的节点功能(不包括
profile和boot_option)。conductor_group请求的节点的 conductor group。这主要用于 Edge 情况,当由相同的 Ironic 管理的节点可以物理分离时。
nics请求的 NIC 列表,有关详细信息,请参阅 metalsmith 文档。默认为
{"network": "ctlplane"},这将请求在ctlplane网络上创建一个端口。profileprofile,例如
compute、control等。resource_class请求的节点的 resource class,默认为
baremetal。root_size_gb根分区的大小,以 GiB 为单位,默认为 49。
swap_size_mb交换分区的大小,以 MiB 为单位(如果需要)。
traits请求的节点 traits 列表。
whole_disk_image布尔值,指示是否将镜像(
overcloud-full.qcow2或通过image字段提供)视为整个磁盘镜像。默认为 false。
将支持以下字段,但默认值应该适用于除最极端情况以外的所有情况
镜像根分区或整个磁盘镜像的文件或 HTTP URL。
image_kernel内核镜像的文件或 HTTP URL(仅限分区镜像)。
image_ramdiskramdisk 镜像的文件或 HTTP URL(仅限分区镜像)。
image_checksum根分区或整个磁盘镜像的 URL 的校验和。
输出¶
工作流将提供以下输出
ctlplane_ips主机名与其在
ctlplane网络上的相应 IP 地址的映射。instances主机名到完整实例表示的映射,字段包括
nodeIronic 节点表示。
ip_addresses网络名称到其上 IP 地址列表的映射。
hostname实例主机名。
stateuuidIronic 节点 uuid。
此外,还提供了 instances 的两个子字典
existing_instances仅已存在的实例。
new_instances仅已部署的实例。
注意
实例通过其主机名区分。
baremetal_environment.yaml¶
此文件将作为裸机配置过程的输出。它将被馈送到 overcloud 部署命令。其目标是为 deployed-server 工作流提供信息。
该文件将包含从角色名称和主机名生成的 HostnameMap,例如
parameter_defaults:
HostnameMap:
overcloud-controller-0: controller-1.us-west.example.com
overcloud-controller-1: controller-2.us-west.example.com
overcloud-controller-2: controller-3.us-west.example.com
overcloud-novacompute-0: compute-05.us-west.example.com
overcloud-novacompute-1: compute-06.us-west.example.com
undeploy_instances 工作流¶
工作流 tripleo.baremetal_deploy.v1.undeploy_instances 将接受主机名列表并取消部署相应的节点。
novajoin 替换¶
novajoin 服务当前用于将节点注册到 IPA 并为其提供 TLS 证书。不幸的是,它对 Nova、Glance 和 Metadata API 具有硬依赖性,即使可以通过其他方式提供信息。实际上,metadata API 并不总是可以通过 Ironic 提供(特别是,在隔离的配置网络中使用时可能不可用)。
一种潜在的解决方案是通过 configdrive 提供所需的信息,并让节点自行注册。
替代方案¶
什么也不做,继续依赖 Nova 并解决它与我们的目标不符的情况。有关原因,请参阅 问题描述。
避免 metalsmith,使用 OpenStack Ansible 模块或 Bifrost。它们目前缺少功能(例如 VIF 附加/分离 API),并且没有任何调度概念。在纯 Ansible 中实现足够复杂的调度似乎是一项艰巨的任务。
避免使用 Mistral,通过 Ansible 驱动 metalsmith。这是这项工作的一个潜在未来方向,但目前看来,从 Mistral actions 调用 metalsmith Python API 似乎要简单得多。无论如何,我们需要 Mistral(或 Ansible Tower)来驱动 Ansible,因为我们需要一些 API 级别。
在同一变更中移除 Neutron。这将进一步减少足迹,但一些操作员可能会觉得 IPAM 的存在是可取的。另外,设置静态 DHCP 会大大增加实现范围并进一步使升级复杂化。
保留 Glance 但移除 Nova。这没有太大意义,因为 Glance 仅是 Nova 的要求。Ironic 可以从 HTTP 或本地文件位置部署,效果一样好。
安全影响¶
Overcloud 镜像将通过 HTTP 对未经验证的用户公开。我们需要清楚地说明,镜像中不应以明文形式构建密钥,而应通过configdrive 传递。如果这证明是一个问题,我们可以限制自己仅通过本地文件提供镜像。
注意
这个问题今天就存在了,因为镜像通过不安全媒介在所有支持的部署方法中传输。
从 undercloud 中移除两项服务将减少潜在的攻击面并简化审计。
升级影响¶
此功能的初始版本仅对新部署启用。
升级过程将在一个发布版本内发生,而不是在发布版本之间发生。它大致如下
升级到支持没有 Nova 和 Glance 的 undercloud 的发布版本。
对 undercloud 进行完整备份。
运行
openstack overcloud image upload以确保overcloud-full镜像可以通过 HTTP(s) 访问。
接下来的步骤可能通过 Ansible playbook 或 Mistral workflow 自动化
将部署的节点标记为 Ironic 中的protected,以防止意外卸载它们。
运行 Heat stack 更新,将对 Nova 服务器的引用替换为对已部署服务器的引用。这将需要告诉 Heat 不要删除实例。
将节点标记为由metalsmith 管理(可选,但简化了故障排除)。
更新节点的
instance_info以引用通过 HTTP(s) 访问的镜像。注意
这可能需要临时将节点移动到维护状态。
运行 undercloud 更新,移除 Nova 和 Glance。
其他最终用户影响¶
Nova CLI 将不再可用于故障排除。实际上,这不应该成为一个大问题,因为大多数它被用于解决的问题都是由使用 Nova 本身引起的。
metalsmith 提供了一个 CLI 工具,用于故障排除和高级用户。我们将记录使用它来执行诸如确定节点 IP 地址之类的任务。
将不再能够通过 Glance API 更新镜像,例如从 GUI。这不应该成为一个问题,因为大多数用户使用预构建的镜像。高级操作员可能无论如何都会使用 CLI。
操作员将不再看到未找到有效主机 错误。 metalsmith 提供更详细的错误信息,并且由于其调度方法在 undercloud 情况下工作得更好,因此不太可能失败。
性能影响¶
由于消除了多层间接关系,预计部署速度将大大加快。新的部署过程如果无法满足调度请求,也将更快地失败。
通过本地文件提供镜像将消除从 Glance 下载镜像的步骤,从而进一步加快大型镜像的速度。
操作员将能够通过 CLI 参数或 GUI 参数调整部署的并发性,而不是
nova.conf。
其他部署者影响¶
无
开发人员影响¶
必须考虑到这项工作来开发新的裸机配置功能。这可能意味着在 metalsmith 代码中实现某些内容,而不是依赖 Nova 服务器或 flavor,或 Glance 镜像。
实现¶
负责人¶
- 主要负责人
Dmitry Tantsur, IRC: dtantsur, LP: divius
工作项¶
阶段 1(Stein,技术预览版)
更新
openstack overcloud image upload以将镜像复制到 HTTP 位置并生成校验和。更新验证,以便在不存在 Nova 和/或 Glance 时不失败。
为创建的 workflow 提供 CLI 命令。
提供一个实验性的 OVB CI 作业来执行新的方法。
阶段 2(T+,完全支持)
更新
openstack overcloud deploy以支持新的 workflow。支持缩小规模。
提供一个 Novajoin replacement。
提供一个升级 workflow。
考虑弃用使用 Nova 和 Glance 进行配置。
依赖项¶
metalsmith 库将用于更轻松地访问 Ironic+Neutron API。
测试¶
由于测试此功能需要裸机配置,因此将为此创建一个新的 OVB 作业。最初它将是实验性的,并且在认为该功能完全支持之前,它将移动到检查队列。
文档影响¶
必须修改文档以解释新的部署方法。必须更新故障排除文档。