使用 Azure 容器应用作业,可以运行在有限持续时间内运行的容器化任务,然后停止。 可以使用作业来执行数据处理、机器学习等任务,或任何需要按需处理的方案。
容器应用和作业在同一环境中运行,二者就可以共享网络和日志记录等功能。
比较容器应用和作业
Azure 容器应用中有两种类型的计算资源:应用和作业。
应用是持续运行的服务。 如果应用中的容器失败,它将自动重启。 应用示例包括 HTTP API、Web 应用和持续处理输入的后台服务。
作业是启动、运行有限持续时间并在完成后停止的任务。 任务的每次执行通常会完成一个工作单元。 作业执行可以手动启动,根据计划启动或在响应事件后启动。 作业示例包括按需运行的批处理进程和计划任务。
示例方案
下表比较了应用和作业的常见方案:
| 容器 | 计算资源 | 说明 |
|---|---|---|
| 为 Web 内容和 API 请求提供服务的 HTTP 服务器 | 应用 | 配置 HTTP 缩放规则。 |
| 每晚生成财务报告的过程 | 任务 | 使用“计划”作业类型并配置 cron 表达式。 |
| 持续运行的服务,用于处理来自 Azure 服务总线队列的消息 | 应用 | 配置自定义缩放规则。 |
| 处理来自 Azure 队列的单个消息或少量消息的作业,然后停止 | 任务 | 使用事件作业类型并配置自定义缩放规则以在队列中有消息时触发作业执行。 |
| 按需触发的后台任务,完成后停止 | 任务 | 使用 手动 作业类型,并使用 API 手动或以编程方式 启动执行 。 |
| 自托管 GitHub Actions 运行器或 Azure Pipelines 代理 | 任务 | 使用“事件”作业类型并配置 GitHub Actions 或 Azure Pipelines 缩放规则。 |
| 使用 Azure WebJobs SDK 的事件驱动应用 | 应用 | 为每个事件源配置缩放规则。 |
概念
容器应用环境是围绕一个或多个容器应用和作业的安全边界。 以下是一些关键概念:
- 工作: 作业定义用于每个作业执行的默认配置。 配置包括要使用的容器映像、要分配的资源以及要运行的命令。
- 作业执行: 作业执行是手动、按计划或响应事件触发的作业的单个运行。
- 作业副本:典型的作业执行运行作业配置定义的一个副本。 在高级方案中,作业执行可以运行多个副本。
权限
若要启动容器应用作业,需要具有适当的权限。 请确保用户帐户或服务主体账户被分配有以下角色:
- 容器应用参与者: 允许创建和管理容器应用和作业的权限。
- 监控阅读器(可选): 启用查看作业的监控数据。
- 自定义角色:要获取更精细的权限,可以使用以下操作创建自定义角色:
- microsoft.app/jobs/start/action
- microsoft.app/jobs/read
- microsoft.app/jobs/execution/read
有关分配角色和权限的详细信息,请参阅 Azure 基于角色的访问控制。
作业触发器类型
作业的触发器类型确定作业的启动方式。 提供以下触发器类型:
- 手动:按需触发手动作业。
- 计划:在特定时间触发计划作业,并且可以重复运行。
- 事件:事件驱动的作业是由事件触发的,例如消息到达队列时触发。
手动作业
手动作业通过 Azure CLI、Azure 门户或对 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 * * * * 每分钟运行一次作业。
事件驱动作业
支持的自定义缩放器中的事件会触发事件驱动型作业。 事件驱动作业的示例包括:
- 当新消息被添加到 Azure 服务总线、Kafka 或 RabbitMQ 等队列时运行的作业。
- 一个自托管的 GitHub Actions 运行器 或 Azure DevOps 代理,该运行器或代理在工作流或管道中有新作业排队时运行。
容器应用和事件驱动作业使用 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"
在启动作业执行时,可以选择覆盖作业的配置。 例如,可以重写环境变量或启动命令,以使用不同的输入运行相同作业。 被重写的配置仅用于当前执行,不会更改作业的配置。
重要
重写配置时,作业的整个模板配置将替换为新配置。 确保新配置包含所有必需设置。
要在启动执行时覆盖作业的配置,请使用 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"
作业限制
不支持以下功能:
- Dapr
- 入口流量和相关功能,如自定义域和 SSL 证书