18.2. 容器组
Ansible Automation Platform 支持容器组,它们允许您在自动化控制器中执行作业,无论自动化控制器是作为单机安装、在虚拟环境中还是在容器中安装。容器组充当虚拟环境中的资源池。您可以创建实例组以指向 OpenShift 容器。这些是按需置备为 pod 的作业环境,该 pod 仅在 playbook 运行期间存在。这称为临时执行模型,并确保每个作业运行都有一个干净的环境。
在某些情况下,您可能希望将容器组设置为"始终开启",您可以通过创建实例来配置这些容器组。
在自动化控制器 4.0 恢复到默认版本并删除旧的 pod 定义前,容器组从版本升级,清除迁移中的所有自定义 pod 定义。
容器组与执行环境的不同之处在于,执行环境是容器镜像,且不使用虚拟环境。如需更多信息,请参阅 执行环境。
18.2.1. 创建容器组
ContainerGroup
是一种 InstanceGroup
类型,它具有一个关联的凭证,供您连接到 OpenShift 集群。
先决条件
- 您可以启动的命名空间。每个集群都有一个"默认"命名空间,但您可以使用特定的命名空间。
- 具有允许在此命名空间中启动和管理 pod 的角色的服务帐户。
-
如果您在私有 registry 中使用执行环境,并在自动化控制器中有一个与其关联的容器 registry 凭证,则服务帐户还需要角色在命名空间中获取、创建和删除 secret。如果您不想为服务帐户授予这些角色,您可以预先创建
ImagePullSecrets
,并在ContainerGroup
的 pod 规格中指定它们。在这种情况下,执行环境不能关联容器 registry 凭证,或者自动化控制器会尝试为您在命名空间中创建 secret。 - 与该服务帐户关联的令牌。OpenShift 或 Kubernetes 持有者令牌。
- 与集群关联的 CA 证书。
以下流程解释了如何在 OpenShift 集群或 Kubernetes 中创建服务帐户,以便用于通过自动化控制器在容器组中运行作业。创建服务帐户后,其凭据以 OpenShift 或 Kubernetes API Bearer Token 凭据的形式提供给自动化控制器。
流程
要创建服务帐户,请下载并使用示例服务帐户
containergroup sa
,并根据需要更改它以获取凭证:--- apiVersion: v1 kind: ServiceAccount metadata: name: containergroup-service-account namespace: containergroup-namespace --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: role-containergroup-service-account namespace: containergroup-namespace rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] - apiGroups: [""] resources: ["pods/log"] verbs: ["get"] - apiGroups: [""] resources: ["pods/attach"] verbs: ["get", "list", "watch", "create"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: role-containergroup-service-account-binding namespace: containergroup-namespace subjects: - kind: ServiceAccount name: containergroup-service-account namespace: containergroup-namespace roleRef: kind: Role name: role-containergroup-service-account apiGroup: rbac.authorization.k8s.io
应用
containergroup-sa.yml
的配置:oc apply -f containergroup-sa.yml
获取与服务帐户关联的 secret 名称:
export SA_SECRET=$(oc get sa containergroup-service-account -o json | jq '.secrets[0].name' | tr -d '"')
从 secret 获取令牌:
oc get secret $(echo ${SA_SECRET}) -o json | jq '.data.token' | xargs | base64 --decode > containergroup-sa.token
获取 CA 证书:
oc get secret $SA_SECRET -o json | jq '.data["ca.crt"]' | xargs | base64 --decode > containergroup-ca.crt
-
使用
containergroup-sa.token
和containergroup-ca.crt
的内容,为容器组所需的 OpenShift 或 Kubernetes API Bearer Token 提供信息。
要创建容器组,请创建一个 OpenShift 或 Kubernetes API Bearer Token 凭据,以用于您的容器组。如需更多信息,请参阅创建新凭证。
流程
-
在导航面板中,选择
。 - 单击 Create container group。 ,再选择
- 输入新容器组的名称,并选择之前创建的凭证将其与容器组关联。
- 单击 。
18.2.2. 自定义 pod 规格
Ansible Automation Platform 提供了一个简单的默认 pod 规格,但您可以提供一个自定义 YAML 或 JSON 文档来覆盖默认的 pod 规格。此字段使用任何自定义字段,如 ImagePullSecrets
,它可以"序列化"为有效的 pod JSON 或 YAML。完整的选项列表可在 OpenShift 文档的 Pods 和 Services 部分找到。
流程
-
在导航面板中,选择
。 - 单击 Create container group。 ,再选择
- 检查 Customize pod spec 的选项。
在 Pod spec override 字段中输入自定义 Kubernetes 或 OpenShift Pod 规格。
- 单击 。
作业启动时的镜像由与作业关联的执行环境决定。如果您将容器 registry 凭证与执行环境关联,则自动化控制器会尝试生成 ImagePullSecret
来拉取镜像。如果您不希望授予服务帐户管理 secret 的权限,您必须预先创建 ImagePullSecret
并在 pod 规格中指定它,并从使用的执行环境省略任何凭证。
如需更多信息,请参阅 Red Hat Container Registry 身份验证 的 Allowing Pods to reference Images from other Secured Registries 部分。
成功创建容器组后,新创建的容器组的 Details 选项卡将保留,供您查看和编辑容器组信息。如果您点 Instance Groups 列表视图中的 图标,则打开这个菜单。
您还可以编辑 实例, 并查看与此实例组关联的 作业。
对容器组和实例组进行相应的标记。
18.2.3. 验证容器组功能
验证容器的部署和终止:
流程
通过在 Instance groups 字段中填充容器组的名称来创建 mock 清单,并将容器组与其关联。如需更多信息,请参阅 添加新清单。
使用以下变量在清单中创建
localhost
主机:{'ansible_host': '127.0.0.1', 'ansible_connection': 'local'}
使用 ping 或 setup 模块对 localhost 启动一个临时作业。即使需要 Machine Credential 字段,但为这个测试选择哪个字段无关紧要:
您可以使用其中一个临时作业在 Jobs 详情视图中看到容器已被成功访问。
如果您有 OpenShift UI,您可以在部署和结束时看到 pod 出现和消失。您还可以使用 CLI 在命名空间中执行 get pod
操作,以实时观察这些相同事件。
18.2.4. 查看容器组作业
当您运行与容器组关联的作业时,您可以在 Details 选项卡中看到该作业的详情。您还可以查看其关联的容器组以及启动的执行环境。
流程
-
在导航面板中,选择
。 - 点击您要查看容器组作业的作业。
- 点 Details 选项卡。
18.2.5. Kubernetes API 故障状况
在运行容器组和 Kubernetes API 时,Kubernetes API 会响应超过资源配额,自动化控制器会将作业保持为待处理状态。其他失败会导致 Error Details 字段的回溯显示失败原因,如下例所示:
Error creating pod: pods is forbidden: User "system: serviceaccount: aap:example" cannot create resource "pods" in API group "" in the namespace "aap"
18.2.6. 容器容量限制
容器的容量限制和配额由 Kubernetes API 中的对象定义:
-
要设置一个指定命名空间中的所有 pod 的限制,请使用
LimitRange
对象。如需更多信息,请参阅 OpenShift 文档中的 quota 和 Limit Ranges 部分。 - 要直接在由自动化控制器启动的 pod 定义上设置限制,请参阅 OpenShift 文档中的 自定义 pod 规格 和 Compute Resources 部分。
容器组不使用普通节点使用的容量算法。您需要在作业模板级别上设置 fork 数量。如果在自动化控制器中配置 fork,则该设置会随同传递给容器。