第 18 章 实例和容器组
自动化控制器允许您通过 Ansible playbook 直接在集群成员或置备了所需服务帐户的 OpenShift 集群的命名空间中执行作业。这称为容器组。您可以在每个 playbook 中根据需要在容器组中执行作业。如需更多信息,请参阅 容器组。
有关执行环境,请参阅 执行环境。
18.1. 实例组
实例可以分组到一个或多个实例组中。实例组可以分配给以下一个或多个列出的资源:
- 机构
- 清单
- 作业模板
当与其中一个资源关联的作业执行时,它将分配给与该资源关联的实例组。在执行过程中,与作业模板关联的实例组会在与清单关联的实例组之前被检查。与清单关联的实例组在与机构关联的实例组之前被检查。因此,这三个资源的实例组分配形成层次结构:
Job Template > Inventory > Organization
在使用实例组时请考虑以下几点:
-
您可以在这些组中定义其他组和组实例。这些组必须带有
instance_group_
前缀。实例需要位于automationcontroller
或execution_nodes
组中,与其他instance_group_
组一起。在集群设置中,至少有一个实例必须存在于automationcontroller
组中,该组在 API 实例组中显示为controlplane
。如需更多信息和示例场景,请参阅Automationcontroller
的组策略。 您无法修改
controlplane
实例组,并尝试这样做会导致任何用户的权限被拒绝。因此,
controlplane
的 Instances 选项卡中不提供 Disassociate 选项。-
自动创建
默认
API 实例组,其中包含能够运行作业的所有节点。这与任何其他实例组一样,但如果一个特定的实例组没有与特定资源关联,则作业执行始终回退到默认实例组。默认实例组始终存在,您无法删除或重命名它。 -
不要创建名为
instance_group_default
的组。 - 请勿将任何实例命名为与组名相同。
18.1.1. Automationcontroller
的组策略
在定义节点时使用以下条件:
-
automationcontroller
组中的节点可以将node_type
hostvar 定义为混合
(默认)或控制
。 -
execution
_nodes 组中的节点hop
的node_type
hostvar。
您可以在清单文件中定义自定义组,将组命名为 instance_group solutions
,其中 *
成为 API 中的组名称。您还可以在安装完成后在 API 中创建自定义实例组。
当前的行为需要 instance_groupEscalation
的一个成员是 automationcontroller
或 execution_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_percentage
和policy_instance_minimum
设置最小分配。导致分配给组更多实例的规则生效。例如,如果您的policy_instance_percentage
为 50%,policy_instance_minimum
为 2,并且您启动 6 个实例,则它们的 3 个会被分配给实例组。如果您将集群中的实例总数减少到 2,则这两个实例都会被分配给实例组以满足policy_instance_minimum
。这可让您对可用资源量设置较低限制。 - 策略不会主动阻止实例与多个实例组关联,但可以通过使最多 100 的百分比来实现。如果您有 4 个实例组,为每个实例组分配一个百分比值 25,实例会在它们之间分布,且没有重叠。
18.1.5. 手动将实例固定到特定的组中
如果您有一个特殊的实例,它只需要分配给特定的实例组,但不想根据"百分比"或"最小"策略自动加入其他组:
流程
-
将实例添加到一个或多个实例组的
policy_instance_list
中。 -
将实例的
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 状态,直到容量可用为止。
决定哪个实例组提交该作业的优先顺序如下:
- 作业模板
- 清单(Inventory)
- 机构(通过项目)
如果您将实例组与作业模板关联,并且所有这些实例组都满负荷,则该作业将提交到清单上指定的实例组,然后提交到机构。在资源可用时,作业必须在这些组中以优先顺序执行。
您仍然可以将全局 默认组
与一个资源关联,如 playbook 中定义的任何自定义实例组。您可以使用它来指定作业模板或清单上的首选实例组,但仍然启用将作业提交到任何实例(如果它们没有容量)。
例子
-
如果您将
group_a
与一个作业模板关联,并将default
组与其清单关联,您可以在group_a
超出容量时启用default
组用作回退。 - 另外,也可以不将实例组与一个资源关联,而是选择另一个资源作为回退。例如,不将实例组与作业模板关联,并使它回退到清单或机构的实例组。
这提供了以下两个示例:
- 将实例组与清单关联(忽略将作业模板分配给实例组)可确保针对特定清单运行的任何 playbook 都仅在与其关联的组上运行。当只有这些实例有到受管节点的直接链接时,这很有用。
管理员可以将实例组分配给机构。这可让管理员对整个基础架构进行分段,并确保每个机构都有能力运行作业,而不会影响到其它机构运行作业的能力。
管理员可以为每个机构分配多个组,类似于以下情况:
- 有三个实例组: 、 B 和 C。有两个机构: Org1 和 Org2。
- 管理员将组 A 分配给 Org1,将 B 组分配给 Org2,然后将组 C 分配给 Org1 和 Org2,作为可能需要的额外容量的溢出。
- 然后,机构管理员可以自由地为他们想要的组分配清单或作业模板,或者让他们从机构中继承默认顺序。
以这种方式安排资源为您提供了灵活性。您还可以只使用一个实例创建实例组,允许您将工作直接指向自动化控制器集群中的特定主机。
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 不会取消置备实例,因为集群目前不会区分您有意关闭的实例与因故障而关闭的实例。相反,请关闭自动化控制器实例上的所有服务,然后从任何其他实例运行取消置备工具。
流程
使用以下命令关闭实例或停止服务:
automation-controller-service stop
从另一个实例运行以下取消置备命令将其从控制器集群 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 升级和迁移指南 中的迁移 隔离实例到执行节点。