无需 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 来配置节点有很多好处

  1. 首先,摆脱可怕的“未找到有效主机”异常。调度将更加简单,错误将更加清晰。

    注意

    在 undercloud 中使用 Nova 的许多其他问题源于 Nova 是面向云的软件,而 undercloud 更像是一个传统的安装程序。在“宠物 vs 牲畜”的比喻中,Nova 处理“牲畜”情况,而 undercloud 是“宠物”情况。

  2. 对于通用配置器的情况,我们还可以摆脱 Nova 和 Glance,从而减少内存占用。

  3. 我们将摆脱当前尝试猜测 Nova 调度器期望的预部署验证。

  4. 我们将能够将由 Ironic 部署的节点与预部署服务器结合使用。

  5. 我们将负责构建 configdrive,从而可能放入更多有用的内容。

  6. 希望扩容将更不容易出错。

未来我们还可能能够

  1. 更轻松地集成按需构建 RAID 等功能。

  2. 在调度和配置决策中使用内省数据。特别是,我们可以自动处理根设备提示。

  3. 使 Neutron 可选,并使用静态 DHCP 和/或 os-net-config

提议的变更

概述

此蓝图建议移除 Heat-Nova-Glance 三元组,并用 Mistral 直接驱动的 Ironic 取代。为了避免将 Ironic 特定的代码放入 tripleo-common,已经开发了一个新的库 metalsmith 并已被 Ironic 治理接受。

作为实现的一部分,此蓝图建议完全将裸机配置过程与软件配置分离,包括 CLI 级别。这有两个好处

  1. 在两个容易出错的流程之间进行清晰的分离简化了操作员的调试。

  2. 重用现有的 deployed-server 工作流简化了实现。

在遥远的未来,metalsmith 的功能可能会移动到 Ironic API 本身。在这种情况下,它将被逐步淘汰,同时保持相同的 Mistral 工作流。

操作员工作流

概述 中所述,CLI/GUI 工作流将分为硬件配置和软件配置两部分(前者是可选的)。

  1. 除了现有的 Heat 模板外,还会填充一个新的文件 baremetal_deployment.yaml,操作员可以在其中填充裸机配置信息。

  2. 裸机配置将由一个新的 CLI 命令或 GUI 操作使用新的 deploy_roles 工作流 进行。

    openstack overcloud node provision \
       -o baremetal_environment.yaml baremetal_deployment.yaml
    

    此命令将从 baremetal_deployment.yaml 获取输入,配置请求的裸机,并输出一个 Heat 环境变量文件 baremetal_environment.yaml 以用于 deployed-server 功能。

  3. 最后,完成常规部署,包括生成的文件

    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.qcow2overcloud-full.kernelovercloud-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(computecontrol 等)。大致对应于基于 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

请求的节点功能(不包括 profileboot_option)。

conductor_group

请求的节点的 conductor group。这主要用于 Edge 情况,当由相同的 Ironic 管理的节点可以物理分离时。

nics

请求的 NIC 列表,有关详细信息,请参阅 metalsmith 文档。默认为 {"network": "ctlplane"},这将请求在 ctlplane 网络上创建一个端口。

profile

profile,例如 computecontrol 等。

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_ramdisk

ramdisk 镜像的文件或 HTTP URL(仅限分区镜像)。

image_checksum

根分区或整个磁盘镜像的 URL 的校验和。

证书颁发机构配置

如果 undercloud 中使用 TLS,我们需要使节点信任对 TLS 证书进行签名的证书颁发机构 (CA)。如果存在 /etc/pki/ca-trust/source/anchors/cm-local-ca.pem,它将包含在生成的 configdrive 中,以便该文件被复制到目标系统上的相同位置。

输出

工作流将提供以下输出

ctlplane_ips

主机名与其在 ctlplane 网络上的相应 IP 地址的映射。

instances

主机名到完整实例表示的映射,字段包括

node

Ironic 节点表示。

ip_addresses

网络名称到其上 IP 地址列表的映射。

hostname

实例主机名。

state

metalsmith 实例状态.

uuid

Ironic 节点 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 中移除两项服务将减少潜在的攻击面并简化审计。

升级影响

此功能的初始版本仅对新部署启用。

升级过程将在一个发布版本内发生,而不是在发布版本之间发生。它大致如下

  1. 升级到支持没有 Nova 和 Glance 的 undercloud 的发布版本。

  2. 对 undercloud 进行完整备份。

  3. 运行 openstack overcloud image upload 以确保 overcloud-full 镜像可以通过 HTTP(s) 访问。

接下来的步骤可能通过 Ansible playbook 或 Mistral workflow 自动化

  1. 将部署的节点标记为 Ironic 中的protected,以防止意外卸载它们。

  2. 运行 Heat stack 更新,将对 Nova 服务器的引用替换为对已部署服务器的引用。这将需要告诉 Heat 不要删除实例。

  3. 将节点标记为由metalsmith 管理(可选,但简化了故障排除)。

  4. 更新节点的 instance_info 以引用通过 HTTP(s) 访问的镜像。

    注意

    这可能需要临时将节点移动到维护状态。

  5. 运行 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,技术预览版)

  1. 更新 openstack overcloud image upload 以将镜像复制到 HTTP 位置并生成校验和。

  2. 实现 deploy_instances workflowundeploy_instances workflow

  3. 更新验证,以便在不存在 Nova 和/或 Glance 时不失败。

  4. 实现 deploy_roles workflow

  5. 为创建的 workflow 提供 CLI 命令。

  6. 提供一个实验性的 OVB CI 作业来执行新的方法。

阶段 2(T+,完全支持)

  1. 更新 openstack overcloud deploy 以支持新的 workflow。

  2. 支持缩小规模。

  3. 提供一个 Novajoin replacement

  4. 提供一个升级 workflow。

  5. 考虑弃用使用 Nova 和 Glance 进行配置。

依赖项

  • metalsmith 库将用于更轻松地访问 Ironic+Neutron API。

测试

由于测试此功能需要裸机配置,因此将为此创建一个新的 OVB 作业。最初它将是实验性的,并且在认为该功能完全支持之前,它将移动到检查队列。

文档影响

必须修改文档以解释新的部署方法。必须更新故障排除文档。

参考资料