Azure 容器应用中的作业

使用 Azure 容器应用作业,可以运行在有限的持续时间内执行并退出的容器化任务。 可以使用作业来执行数据处理、机器学习等任务,或任何需要按需处理的方案。

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

比较容器应用和作业

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

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

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

示例方案

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

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

概念

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

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

Azure 容器应用作业概述。

作业触发器类型

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

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

手动作业

手动作业是使用 Azure CLI、Azure 门户或对 Azure 资源管理器 API 的请求按需触发的。

手动作业的示例包括:

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

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

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

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Manual" \
    --replica-timeout 1800 \
    --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-resource-group 的资源组和名为 my-environment 的容器应用环境中创建名为 my-job 的计划作业:

az containerapp job create \
    --name "my-job" --resource-group "my-resource-group"  --environment "my-environment" \
    --trigger-type "Schedule" \
    --replica-timeout 1800 \
    --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 * * * * 为每分钟运行一次作业。

事件驱动作业

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

  • 将新消息被添加到 Azure 服务总线、Kafka 或 RabbitMQ 等队列时运行的作业。
  • 一个自托管的 GitHub Actions 运行器Azure DevOps 代理,当新作业在工作流或管道中排队时运行此代理。

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

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

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

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

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

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-resource-group 的资源组中启动名为 my-job 的作业执行:

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

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

重要

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

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

使用 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-resource-group 的资源组中返回名为 my-job的作业的最近执行状态:

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

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

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

高级作业配置

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

容器设置

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

作业设置

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

设置 Azure 资源管理器属性 CLI 参数 说明
作业类型 triggerType --trigger-type 作业类型。 (ManualScheduleEvent
副本超时 replicaTimeout --replica-timeout 等待副本完成的最长时间(以秒为单位)。
轮询间隔 pollingInterval --polling-interval 轮询事件之间的等待时间(以秒为单位)。 默认值为 30 秒。
副本重试限制 replicaRetryLimit --replica-retry-limit 重试失败副本的最大次数。 若要使副本失败而无需重试,请将此值设置为 0
并行度 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"

作业限制

不支持以下功能:

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

后续步骤