第 18 章 实例和容器组


自动化控制器允许您通过 Ansible playbook 直接在集群成员或置备了所需服务帐户的 OpenShift 集群的命名空间中执行作业。这称为容器组。您可以在每个 playbook 中根据需要在容器组中执行作业。如需更多信息,请参阅 容器组

有关执行环境,请参阅 执行环境

18.1. 实例组

实例可以分组到一个或多个实例组中。实例组可以分配给以下一个或多个列出的资源:

  • 机构
  • 清单
  • 作业模板

当与其中一个资源关联的作业执行时,它将分配给与该资源关联的实例组。在执行过程中,与作业模板关联的实例组会在与清单关联的实例组之前被检查。与清单关联的实例组在与机构关联的实例组之前被检查。因此,这三个资源的实例组分配形成层次结构:

Job Template > Inventory > Organization

在使用实例组时请考虑以下几点:

  • 您可以在这些组中定义其他组和组实例。这些组必须带有 instance_group_ 前缀。实例需要位于 automationcontrollerexecution_nodes 组中,与其他 instance_group_ 组一起。在集群设置中,至少有一个实例必须存在于 automationcontroller 组中,该组在 API 实例组中显示为 controlplane。如需更多信息和示例场景,请参阅 Automationcontroller的组策略
  • 您无法修改 controlplane 实例组,并尝试这样做会导致任何用户的权限被拒绝。

    因此,controlplaneInstances 选项卡中不提供 Disassociate 选项。

  • 自动创建 默认 API 实例组,其中包含能够运行作业的所有节点。这与任何其他实例组一样,但如果一个特定的实例组没有与特定资源关联,则作业执行始终回退到默认实例组。默认实例组始终存在,您无法删除或重命名它。
  • 不要创建名为 instance_group_default 的组。
  • 请勿将任何实例命名为与组名相同。

18.1.1. Automationcontroller的组策略

在定义节点时使用以下条件:

  • automationcontroller 组中的节点可以将 node_type hostvar 定义 为混合 (默认) 或控制
  • execution _nodes 组中的节点 可以定义要执行(默认)或 hopnode_type hostvar。

您可以在清单文件中定义自定义组,将组命名为 instance_group solutions,其中 * 成为 API 中的组名称。您还可以在安装完成后在 API 中创建自定义实例组。

当前的行为需要 instance_groupEscalation 的一个成员是 automationcontrollerexecution_nodes 组的成员。

Example

[automationcontroller]
126-addr.tatu.home ansible_host=192.168.111.126  node_type=control

[automationcontroller:vars]
peers=execution_nodes

[execution_nodes]

[instance_group_test]
110-addr.tatu.home ansible_host=192.168.111.110 receptor_listener_port=8928

运行安装程序后,会出现以下错误:

TASK [ansible.automation_platform_installer.check_config_static : Validate mesh topology] ***
fatal: [126-addr.tatu.home -> localhost]: FAILED! => {"msg": "The host '110-addr.tatu.home' is not present in either [automationcontroller] or [execution_nodes]"}

要解决这个问题,请将 110-addr.tatu.home 框移到 execution_node 组:

[automationcontroller]
126-addr.tatu.home ansible_host=192.168.111.126  node_type=control

[automationcontroller:vars]
peers=execution_nodes

[execution_nodes]
110-addr.tatu.home ansible_host=192.168.111.110 receptor_listener_port=8928

[instance_group_test]
110-addr.tatu.home

结果:

TASK [ansible.automation_platform_installer.check_config_static : Validate mesh topology] ***
ok: [126-addr.tatu.home -> localhost] => {"changed": false, "mesh": {"110-addr.tatu.home": {"node_type": "execution", "peers": [], "receptor_control_filename": "receptor.sock", "receptor_control_service_name": "control", "receptor_listener": true, "receptor_listener_port": 8928, "receptor_listener_protocol": "tcp", "receptor_log_level": "info"}, "126-addr.tatu.home": {"node_type": "control", "peers": ["110-addr.tatu.home"], "receptor_control_filename": "receptor.sock", "receptor_control_service_name": "control", "receptor_listener": false, "receptor_listener_port": 27199, "receptor_listener_protocol": "tcp", "receptor_log_level": "info"}}}

从自动化控制器 4.0 或更早版本升级后,旧的 instance_group_ 成员可能会安装 awx 代码。这会将该节点放置在 automationcontroller 组中。

18.1.2. 从 API 配置实例组

您可以作为系统管理员 POST 到 /api/v2/instance_groups 来创建实例组。

创建后,您可以使用以下命令将实例与实例组关联:

HTTP POST /api/v2/instance_groups/x/instances/ {'id': y}`

添加到实例组中的实例会自动重新配置自身,以侦听组的工作队列。如需更多信息,请参阅以下 实例组策略 部分。

18.1.3. 实例组策略

您可以通过定义策略,将自动化控制器实例配置为在其上线时自动加入实例组。这些策略会针对上线的每个新实例进行评估。

实例组策略由一个实例组中的以下三个可选字段控制:

  • policy_instance_percentage :这是 0 到 100 之间的数字。它保证了这个百分比的活动自动化控制器实例添加到此实例组中。随着新实例上线,如果这个组中的实例数量相对于实例的总数量小于给定的百分比,则会添加新实例,直到满足百分比条件为止。
  • policy_instance_minimum: 此策略尝试在实例组中保留至少此数量的实例。如果可用实例的数量低于这个最小值,则所有实例都放置在此实例组中。
  • policy_instance_list :这是此实例组中始终包含的实例名称列表。

自动化控制器用户界面(UI)中的 实例组 列表视图根据实例组策略为每个实例组提供容量级别的概述:

实例组列表视图

其他资源

如需更多信息,请参阅 管理实例组部分

18.1.4. 重要策略注意事项

请考虑以下策略注意事项:

  • policy_instance_percentagepolicy_instance_minimum 设置最小分配。导致分配给组更多实例的规则生效。例如,如果您的 policy_instance_percentage 为 50%,policy_instance_minimum 为 2,并且您启动 6 个实例,则它们的 3 个会被分配给实例组。如果您将集群中的实例总数减少到 2,则这两个实例都会被分配给实例组以满足 policy_instance_minimum。这可让您对可用资源量设置较低限制。
  • 策略不会主动阻止实例与多个实例组关联,但可以通过使最多 100 的百分比来实现。如果您有 4 个实例组,为每个实例组分配一个百分比值 25,实例会在它们之间分布,且没有重叠。

18.1.5. 手动将实例固定到特定的组中

如果您有一个特殊的实例,它只需要分配给特定的实例组,但不想根据"百分比"或"最小"策略自动加入其他组:

流程

  1. 将实例添加到一个或多个实例组的 policy_instance_list 中。
  2. 将实例的 managed_by_policy 属性更新为 False

这可防止实例根据百分比和最小策略自动添加到其他组中。它仅属于您手动为其分配的组:

HTTP PATCH /api/v2/instance_groups/N/
{
"policy_instance_list": ["special-instance"]
}
HTTP PATCH /api/v2/instances/X/
{
"managed_by_policy": False
}

18.1.6. 作业运行时行为

当您运行与实例组关联的作业时,请注意以下行为:

  • 如果您将集群划分为不同的实例组,则行为与整个集群类似。如果您将两个实例分配给组,则任一实例都可能作为同一组中的任何其他实例接收作业。
  • 随着自动化控制器实例上线,它可以有效地扩展系统的工作容量。如果将这些实例放入实例组中,则它们也会扩展该组的容量。如果一个实例正在执行工作,并且它是多个组的成员,则会从它所属的所有组中减少容量。取消置备实例会从分配该实例的集群中删除容量。如需更多信息,请参阅取消置备实例组 部分。
注意

不是所有实例都需要置备相同的容量。

18.1.7. 控制作业运行的位置

如果您将实例组与作业模板、清单或机构关联,则从该作业模板运行的作业不符合默认行为。这意味着,如果与这三个资源关联的实例组中的所有实例都没有容量,则作业会一直处于 pending 状态,直到容量可用为止。

决定哪个实例组提交该作业的优先顺序如下:

  1. 作业模板
  2. 清单(Inventory)
  3. 机构(通过项目)

如果您将实例组与作业模板关联,并且所有这些实例组都满负荷,则该作业将提交到清单上指定的实例组,然后提交到机构。在资源可用时,作业必须在这些组中以优先顺序执行。

您仍然可以将全局 默认组 与一个资源关联,如 playbook 中定义的任何自定义实例组。您可以使用它来指定作业模板或清单上的首选实例组,但仍然启用将作业提交到任何实例(如果它们没有容量)。

例子

  • 如果您将 group_a 与一个作业模板关联,并将 default 组与其清单关联,您可以在 group_a 超出容量时启用 default 组用作回退。
  • 另外,也可以不将实例组与一个资源关联,而是选择另一个资源作为回退。例如,不将实例组与作业模板关联,并使它回退到清单或机构的实例组。

这提供了以下两个示例:

  1. 将实例组与清单关联(忽略将作业模板分配给实例组)可确保针对特定清单运行的任何 playbook 都仅在与其关联的组上运行。当只有这些实例有到受管节点的直接链接时,这很有用。
  2. 管理员可以将实例组分配给机构。这可让管理员对整个基础架构进行分段,并确保每个机构都有能力运行作业,而不会影响到其它机构运行作业的能力。

    管理员可以为每个机构分配多个组,类似于以下情况:

    • 有三个实例组: BC。有两个机构: Org1Org2
    • 管理员将组 A 分配给 Org1,将 B 组分配给 Org2,然后将组 C 分配给 Org1Org2,作为可能需要的额外容量的溢出。
    • 然后,机构管理员可以自由地为他们想要的组分配清单或作业模板,或者让他们从机构中继承默认顺序。
实例组场景

以这种方式安排资源为您提供了灵活性。您还可以只使用一个实例创建实例组,允许您将工作直接指向自动化控制器集群中的特定主机。

18.1.8. 实例组容量限制

有外部业务逻辑可以驱动发送到实例组的作业并发性,或者要消耗的 fork 数量上限。

对于传统实例和实例组,您可能希望使两个机构能够在同一底层实例上运行作业,但限制每个机构的并发作业总数。这可以通过为每个机构创建一个实例组并为 max_concurrent_jobs 分配值来实现。

对于自动化控制器组,自动化控制器通常不知道 OpenShift 集群的资源限值。您可以设置命名空间中 pod 数量的限制,或者如果没有自动扩展,则一次只能调度特定 pod 数量的资源。在这种情况下,您可以调整 max_concurrent_jobs 的值。

另一个可用的参数是 max_forks。这为限制实例组或容器组消耗的容量提供了额外的灵活性。如果作业具有各种清单大小,并且正在运行"forks"值,则可以使用它。您可以把机构限制为同时运行最多 10 个作业,但一次不消耗超过 50 个 fork:

max_concurrent_jobs: 10
max_forks: 50

如果运行了 10 个作业,每个作业都使用 5 个 fork,则作业会等待到其中一个完成以在该组上运行(或调度到具有容量的其他组中)。

如果 2 个作业使用 20 个 fork 运行,则每个作业有 20 个 fork,然后有一个 task_impact 为 11 个作业,直到其中一个完成以在该组上运行(或调度到具有容量的其他组中)。

对于容器组,使用 max_forks 值时,如果所有作业都使用相同的资源请求的 pod_spec 提交,无论作业的"forks"值如何。默认 pod_spec 设置请求而不是限制,因此 pod 可以在请求的值上"burst",而无需节流或恢复。通过设置 max_forks 值,您可以帮助防止同时调度具有大量 fork 值的作业的情况,并导致 OpenShift 节点使用比请求的值更多的资源超额订阅。

要在实例组中为并发作业和分叉设置最大值,请参阅创建实例组

18.1.9. 取消置备实例组

重新运行设置 playbook 不会取消置备实例,因为集群目前不会区分您有意关闭的实例与因故障而关闭的实例。相反,请关闭自动化控制器实例上的所有服务,然后从任何其他实例运行取消置备工具。

流程

  1. 使用以下命令关闭实例或停止服务:

    automation-controller-service stop
  2. 从另一个实例运行以下取消置备命令将其从控制器集群 registry 中删除:

    awx-manage deprovision_instance --hostname=<name used in inventory file>

    Example

    awx-manage deprovision_instance --hostname=hostB

在自动化控制器中取消置备实例组不会自动取消置备或删除实例组,即使重新置备通常会导致这些实例组没有被使用。它们仍然可以显示在 API 端点和统计监控中。您可以使用以下命令删除这些组:

awx-manage unregister_queue --queuename=<name>

从清单文件中的实例组中删除实例成员资格,并重新运行 setup playbook 并不确保实例没有重新添加到组中。为确保实例没有添加回组中,请通过 API 将其移除,并在清单文件中删除。您还可以停止在清单文件中定义实例组。您可以通过自动化控制器 UI 管理实例组拓扑。有关在 UI 中管理实例组的更多信息,请参阅管理实例组

注意

如果您在旧版本的自动化控制器(3.8.x 及更早版本)中创建隔离实例组,并希望将它们迁移到执行节点,使其与自动化网格架构兼容,请参阅 Ansible Automation Platform 升级和迁移指南 中的迁移 隔离实例到执行节点

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.