Azure 容器应用 中的作业

Azure 容器应用作业使你能够运行有限持续时间的容器化任务,然后停止。 可以使用作业来执行数据处理、机器学习以及任何需要按需处理的任务。

容器应用和作业在同一环境中运行,二者就可以共享网络和日志记录等功能。

比较容器应用和作业

Azure 容器应用中有两种类型的计算资源:应用和作业。

应用是持续运行的服务。 如果应用中的容器失败,它将自动重启。 应用示例包括持续处理输入的 HTTP API、web apps和后台服务。

作业是启动、运行有限持续时间并在完成后停止的任务。 任务的每次执行通常会完成一个工作单元。 作业执行可以手动启动,根据计划启动或在响应事件后启动。 作业示例包括按需运行的批处理进程和计划任务。

示例方案

下表比较了应用和作业的常见方案:

容器 计算资源 说明
为 Web 内容和 API 请求提供服务的 HTTP 服务器 应用 配置 HTTP 缩放规则。
每晚生成财务报告的过程 任务 使用“计划”作业类型并配置 cron 表达式。
一个持续运行的服务,用于处理来自Azure 服务总线队列的消息 应用 配置自定义缩放规则。
处理来自Azure队列的单个消息或少量消息的作业,然后停止 任务 使用事件作业类型并配置自定义缩放规则以在队列中有消息时触发作业执行。
按需触发的后台任务,完成后停止 任务 使用 手动 作业类型,并使用 API 手动或以编程方式 启动执行 。
自托管 GitHub Actions 运行程序或 Azure Pipelines 代理 任务 使用 Event 作业类型并配置 GitHub Actions 或 Azure Pipelines 缩放规则。
Azure Functions 应用 应用 将 Azure Functions 部署到容器应用。
使用 Azure WebJobs SDK 的事件驱动应用 应用 为每个事件源配置缩放规则。

概念

容器应用环境是围绕一个或多个容器应用和作业的安全边界。 以下是一些关键概念:

  • 工作: 作业定义用于每个作业执行的默认配置。 配置包括要使用的容器映像、要分配的资源以及要运行的命令。
  • 作业执行: 作业执行是手动、按计划或响应事件触发的作业的单个运行。
  • 作业副本:典型的作业执行运行作业配置定义的一个副本。 在高级方案中,作业执行可以运行多个副本。

提供容器应用作业概览的图示。

权限

要启动容器应用作业,你的用户账户或服务主体需要相应的权限。 请考虑以下角色:

  • 容器应用职位贡献者: 允许创建和管理作业的权限。
  • 容器应用作业操作员: 允许读取、启动和停止作业的权限。
  • 监控阅读器(可选): 启用查看作业的监控数据。

容器应用作业参与者和容器应用作业操作员角色均包含Microsoft.App/jobs/*/action通配符权限。 该通配符匹配 Microsoft.App/jobs/listSecrets/action,因此这两个角色都被授予了以明文形式读取该作业机密值的权限。

如果两个角色都不符合你想要授予的权限,创建一个只列出你需要操作的 自定义角色 。 例如,以下操作允许用户在不使用 Microsoft.App/jobs/*/action 通配符的情况下查看、启动和停止作业。 由于此规则集包括 Microsoft.App/jobs/start/action,因此,请将其仅授予你信任的标识,以使用作业的机密以及配置为可供其容器使用的托管标识:

  • Microsoft.App/jobs/read
  • Microsoft.App/jobs/start/action
  • Microsoft.App/jobs/stop/action
  • Microsoft.App/jobs/stop/execution/action
  • Microsoft.App/jobs/executions/read
  • Microsoft.App/jobs/execution/read
  • Microsoft.App/managedEnvironments/read

避免在自定义角色定义中使用诸如 Microsoft.App/jobs/*/action 之类的通配符模式。 该通配符允许所有当前和未来的操作与该模式相匹配,包括 listSecrets。

Warning

启动作业的权限可能会提供对该作业机密信息的访问权限,即使该角色不包含 listSecrets 操作。 Jobs - Start REST API 接受一个可选的执行模板,可以覆盖主容器和初始化容器的镜像、命令和环境变量。 持有 Microsoft.App/jobs/start/action 并知道某个秘密名称的用户可以从自己选择的容器中引用该秘密,并在容器中读取其值。 此容器还可以使用配置为可供其使用的任何托管标识 。 仅向你信任且可使用该作业的机密信息和可用托管标识的身份授予启动作业的权限。

更多信息请参见“管理秘密的权限”和“Azure 基于角色的访问控制”。

作业触发器类型

作业的触发器类型确定作业的启动方式。 提供以下触发器类型:

  • 手动:按需触发手动作业。
  • 计划:在特定时间触发计划作业,并且可以重复运行。
  • 事件:事件驱动的作业是由事件触发的,例如消息到达队列时触发。

手动作业

手动作业通过Azure CLI、Azure portal或对 Azure 资源管理器 API 的请求按需触发。

手动作业的示例包括:

  • 一次性处理任务,例如将数据从一个系统迁移到另一个系统。
  • 以容器应用形式运行的电子商务站点在接到订单时启动作业任务,以处理库存。

若要创建手动作业,请使用作业类型 Manual。

若要使用Azure CLI创建手动作业,请使用 az containerapp job create 命令。 以下示例在名为 my-job 的资源组和名为 my-resource-group 的容器应用环境中创建了名为 my-environment 的手动作业:

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Manual" \
    --replica-timeout 1800 \
    --replica-retry-limit 0 \
    --replica-completion-count 1 \ 
    --parallelism 1 \ 
    --image "mcr.microsoft.com/k8se/quickstart-jobs:latest" \
    --cpu "0.25" --memory "0.5Gi"

该 mcr.microsoft.com/k8se/quickstart-jobs:latest 映像是一个公共示例容器映像,该映像运行等待几秒钟的作业,将消息输出到控制台,然后停止。 有关对专用容器映像进行身份验证和使用的信息,请参阅 容器。

前面的命令仅创建作业。 若要启动作业执行,请参阅按需启动作业执行。

计划的作业

若要创建计划作业,请使用作业类型 Schedule。

容器应用作业使用 cron 表达式来定义计划。 它支持标准 cron 表达式格式,其中包含分钟、小时、日、月和星期这五个字段。 下面展示了 cron 表达式示例:

表达式 说明
*/5 * * * * 每隔 5 分钟运行一次。
0 */2 * * * 每隔两小时运行一次。
0 0 * * * 每天午夜运行一次。
0 0 * * 0 每周日午夜运行一次。
0 0 1 * * 每月第一天的午夜运行一次。

计划作业中的 cron 表达式以协调世界时 (UTC) 计算。

若要使用Azure CLI创建计划作业,请使用 az containerapp job create 命令。 以下示例在名为 my-job 的资源组和名为 my-resource-group 的容器应用环境中创建名为 my-environment 的计划作业:

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Schedule" \
    --replica-timeout 1800 \
    --replica-retry-limit 0 \ 
    --parallelism 1 \
    --replica-completion-count 1 \
    --image "mcr.microsoft.com/k8se/quickstart-jobs:latest" \
    --cpu "0.25" --memory "0.5Gi" \
    --cron-expression "*/1 * * * *"

该 mcr.microsoft.com/k8se/quickstart-jobs:latest 映像是一个公共示例容器映像,该映像运行等待几秒钟的作业,将消息输出到控制台,然后停止。 有关对专用容器映像进行身份验证和使用的信息,请参阅 容器。

cron 表达式 */1 * * * * 每分钟运行一次作业。

事件驱动作业

支持的自定义缩放器中的事件会触发事件驱动型作业。 事件驱动作业的示例包括:

容器应用和事件驱动作业使用 KEDA 缩放器。 它们都会评估轮询间隔上的缩放规则,以度量事件源的事件量,但它们使用结果的方式不同。

在应用中,每个副本都会持续处理事件,缩放规则确定要运行以满足需求的副本数。 在事件驱动的作业中,每个作业执行通常处理单个事件,缩放规则确定要运行的作业执行数。

当每个事件都需要具有专用资源的新容器实例或需要长时间运行时,请使用作业。 事件驱动作业在概念上类似于 KEDA 缩放作业。

若要创建事件驱动作业,请使用作业类型 Event。

若要使用Azure CLI创建事件驱动作业,请使用 az containerapp job create 命令。 以下示例在名为 my-job 的资源组和名为 my-resource-group 的容器应用环境中创建名为 my-environment 的事件驱动作业:

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Event" \
    --replica-timeout 1800 \
    --image "docker.io/myuser/my-event-driven-job:latest" \
    --cpu "0.25" --memory "0.5Gi" \
    --min-executions "0" \
    --max-executions "10" \
    --scale-rule-name "queue" \
    --scale-rule-type "azure-queue" \
    --scale-rule-metadata "accountName=mystorage" "queueName=myqueue" "queueLength=1" \
    --scale-rule-auth "connection=connection-string-secret" \
    --secrets "connection-string-secret=<QUEUE_CONNECTION_STRING>"

该示例配置Azure 存储队列缩放规则。

如需完整教程,请参阅部署事件驱动作业。

按需启动作业

对于任何作业类型,都可以按需启动作业执行。

若要使用 Azure CLI 启动作业执行,请使用 az containerapp job start 命令。 以下示例在名为 my-job 的资源组中启动名为 my-resource-group 的作业执行:

az containerapp job start --name "my-job" --resource-group "my-resource-group"

在启动作业执行时,可以选择覆盖作业的配置。 例如,可以重写环境变量或启动命令,以使用不同的输入运行相同作业。 被重写的配置仅用于当前执行,不会更改作业的配置。

重写配置时,作业的整个模板配置将替换为新配置。 确保新配置包含所有必需设置。

Warning

能够启动作业的标识可以使用执行模板来引用该标识知晓其名称的作业机密,并使用配置为可供容器使用的托管标识。 有关详细信息,请参阅权限。

要在启动执行时覆盖作业的配置,请使用 az containerapp job start 命令,并传递一个包含用于执行模板的 YAML 文件。 以下示例在名为 my-job 的资源组中启动名为 my-resource-group 的作业执行。

通过 az containerapp job show 命令检索作业的当前配置,并将配置保存为一个名为 my-job-template.yaml 的文件。

az containerapp job show --name "my-job" --resource-group "my-resource-group" --query "properties.template" --output yaml > my-job-template.yaml

--query "properties.template"选项仅返回作业的模板配置。

编辑该 my-job-template.yaml 文件以覆盖作业的配置。 例如,若要覆盖环境变量,请修改 env 部分:

containers:
- name: print-hello
  image: ubuntu
  resources:
    cpu: 1
    memory: 2Gi
  env:
  - name: MY_NAME
    value: Azure Container Apps jobs
  args:
  - /bin/bash
  - -c
  - echo "Hello, $MY_NAME!"

使用模板启动作业:

az containerapp job start --name "my-job" --resource-group "my-resource-group" \
    --yaml my-job-template.yaml

获取作业执行历史记录

每个容器应用程序作业都会维护近期作业执行的历史记录。

若要使用Azure CLI获取作业执行的状态,请使用 az containerapp job execution list 命令。 以下示例在名为 my-job 的资源组中返回名为 my-resource-group的作业的最近执行状态:

az containerapp job execution list --name "my-job" --resource-group "my-resource-group"

计划作业和基于事件的作业的执行历史记录仅限最近 100 次成功和失败的作业执行。

若要列出作业的所有执行或者获取作业的详细输出信息,请查询针对容器应用环境所配置的日志提供程序。

高级作业配置

容器应用作业支持高级配置选项,例如容器设置、重试、超时和并行性。

容器设置

容器设置定义了要在作业执行的每个副本中运行的容器。 它们包括环境变量、密钥和资源限制。 有关详细信息,请参阅容器。 在单个作业中运行多个容器是高级方案。 大多数工作负载运行单个容器。

作业设置

下表包含可配置的作业设置:

设置 Azure 资源管理器 属性 CLI 参数 说明
作业类型 triggerType --trigger-type 作业的类型(Manual或ScheduleEvent)。
副本超时 replicaTimeout --replica-timeout 等待副本完成的最长时间(以秒为单位)。
轮询间隔 pollingInterval --polling-interval 轮询事件之间的等待时间(以秒为单位)。 默认为 30 秒。
副本重试限制 replicaRetryLimit --replica-retry-limit 重试失败副本的最大次数。 若要使副本失败而无需重试,请将此值设置为 0。 如果设置在所有重试发生之前过期,则 replicaTimeout 设置优先。
并行度 parallelism --parallelism 每个执行要运行的副本数。 对于大多数作业,请将值设置为 1。
副本完成计数 replicaCompletionCount --replica-completion-count 要执行操作获得成功,需要完成的副本数量。 大多数都等于或小于并行度。 对于大多数作业,请将值设置为 1。

示例

以下示例使用高级配置选项创建一个作业:

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Schedule" \
    --replica-timeout 1800 --replica-retry-limit 3 --replica-completion-count 5 --parallelism 5 \
    --image "myregistry.azurecr.cn/quickstart-jobs:latest" \
    --cpu "0.25" --memory "0.5Gi" \
    --command "/startup.sh" \
    --env-vars "MY_ENV_VAR=my-value" \
    --cron-expression "0 0 * * *"  \
    --registry-server "myregistry.azurecr.cn" \
    --registry-username "myregistry" \
    --registry-password "myregistrypassword"

职场网络和应用间通信

在作业容器启动时,确保 sidecar 容器(如 Envoy 代理)在主作业容器执行之前已准备就绪。 这可以确保作业在启动时发出的应用间调用能够成功,而不会出现连接失败。

注释

如果作业在启动时调用其他容器应用,则无需为初始挎斗就绪情况添加重试逻辑。 平台会自动处理此问题。

作业限制

不支持以下功能:

  • Dapr
  • 入口流量和相关功能,如自定义域和 SSL 证书

后续步骤