你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 容器应用上的 Azure Functions 提供了一个完全托管的无服务器托管环境,它将 Azure Functions 的事件驱动功能与容器应用的强大功能结合在一起。 此集成包括高级功能,例如基于 Kubernetes 的业务流程、由 KEDA(基于 Kubernetes 的事件驱动自动缩放)、Dapr(分布式应用程序运行时)集成、GPU 工作负载支持、sidecar 支持、虚拟网络 (VNet) 连接和修订管理提供支持的内置自动缩放。
如果希望 Functions 与其他容器化应用(如微服务、API 或网站)一起运行,此方法非常有用。 此外,当需要自定义依赖项或想要利用从零缩放来节省成本时,容器化函数应用会有所帮助。 如果正在运行计算密集型任务(例如 AI 推理),容器应用还支持通过无服务器 GPU 产品/服务和专用工作负载配置文件进行基于 GPU 的托管。
通过在调用 Microsoft.App 时设置 kind=functionapp,您可以使用 az containerapp create 资源提供程序,直接将 Azure Functions 映像部署到 Azure 容器应用中,这是 Azure 容器应用上的一个集成功能。 以这种方式创建的应用可以访问所有 Azure 容器应用功能。 如果通过 Azure 门户部署,可以在设置过程中启用“优化 Functions 应用”选项。 有关更多详细信息,请参阅部署和设置部分。
主要优势
容器应用托管模型基于容器化工作负载的灵活性和 Azure Functions 的事件驱动性质而构建。 它提供了以下主要优势:
- 以具有自定义依赖项和语言堆栈的容器身份运行 Azure Functions。
- 使用 KEDA 横向缩减到零,横向扩展到 1000 个实例。
- 使用完整的 VNet 集成保护网络。
- 高级容器应用功能,如多修订、流量拆分、Dapr 集成和可观测性组件。
- 支持计算密集型工作负荷的无服务器和专用GPU。
- 统一容器应用环境 ,用于与微服务、API 和后台作业一起运行 Functions。
下表可帮助你将容器应用中的 Functions 功能与 Flex 消耗计划进行比较。
| 功能 / 特点 | 容器应用 | 弹性消耗计划 |
|---|---|---|
| 缩放到零 | ✅ 是(通过 KEDA) | ✅ 是 |
| 最大横向扩展 | 1,000 (默认值 10,可配置) | 1,000 |
| Always on 实例 |
✅ 是(通过 minReplicas) |
✅ 是(通过始终就绪的实例) |
| VNet 集成 | ✅ 是 | ✅ 是 |
| 自定义容器支持 | ✅ 是的(自带图像) | ❌ 有限(没有自带容器) |
| GPU 支持 | ✅ 是(通过无服务器 GPU 专用工作负载配置文件) | ❌ 否 |
| 内置功能 | 容器应用功能支持。 例如,KEDA、Dapr、多修订、mTLS、sidecar、入口控制等 | 仅限函数的功能 |
| 计费模式 | 容器应用定价:消耗计划(vCPU、内存、请求)和专用计划(基于工作负载配置文件) | 执行时间 + 始终就绪实例 |
有关容器应用上的 Functions 与 Flex 消耗计划以及所有其他计划和托管类型的完整比较,请参阅 Functions 缩放和托管选项。
方案
运行在容器应用上的 Azure Functions 非常适合多种用例,在你需要事件驱动的执行、容器灵活性或与其他服务进行安全集成时,更是如此:
- 业务线 API:使用 Azure Functions 为业务线应用程序打包自定义库、包和 API。
- 迁移和现代化:将本地旧版和/或整体式应用程序迁移到容器上的云原生微服务。
- 事件驱动的处理:使用函数编程模型轻松处理来自事件网格、服务总线、事件中心和其他事件源的事件。
- AI 和 GPU 工作负载:以无服务器方式处理视频、图像、转录内容或任何其他需要 GPU 计算资源的高强度处理任务。 有关详细信息,请参阅在 Azure 容器应用中使用无服务器 GPU。
- 微服务:将 Azure Functions 与其他容器应用程序托管服务集成。
- 自定义容器:使用自定义运行时或挎斗打包函数。
- 专用应用:使用 VNet 和内部入口保护仅限内部使用的函数。
- .NET Aspire:通过 .NET Aspire 与 Azure Functions 的集成,可以在 .NET Aspire 应用托管进程中开发、调试和协调 Azure Functions .NET 项目。 详细了解集成 Azure Functions 与 .NET Aspire
- 常规函数:运行受支持的标准 Azure Functions 方案(例如计时器、文件处理、数据库触发器)。
部署和设置
若要在 Azure 容器应用上部署 Azure Functions,请将 Functions 应用打包为自定义容器映像,并像部署任何其他容器应用一样部署它,但有一个关键区别。 使用 Azure CLI 或 ARM/Bicep 模板时,需要设置 kind=functionapp 属性。 有关详细步骤和示例,请参阅官方入门文档。
az containerapp create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CONTAINER_APP_NAME \
--environment $ENVIRONMENT_NAME \
--image mcr.microsoft.com/k8se/quickstart-functions:latest \
--ingress external \
--target-port 80 \
--kind functionapp \
--query properties.outputs.fqdn
此命令会返回 Functions 应用的 URL。 复制此 URL 并将其粘贴到 Web 浏览器中。
在 Azure 门户中,在容器应用创建过程中选择“优化 Azure Functions”选项以简化设置。
支持所有标准部署方法,包括:
有关详细步骤和示例,请参阅官方入门文档。
定价和计费
Azure 容器应用上的 Azure Functions 遵循与 Azure 容器应用相同的定价模型。 计费基于您为环境选择的计划类型,可以是按需型或专属型。
你选择的计划决定了计费计算的方式。 环境中的不同应用程序可以使用不同的计划。
需要注意的要点:
- 在容器应用中使用 Azure Functions 编程模型无需额外付费。
- Durable Functions 和其他高级模式在同一容器应用定价模型中受支持和计费。 有关详细的计费机制和示例,请参阅 Azure 容器应用中的计费 文档。
事件驱动的扩展
容器应用上的 Azure Functions 支持 Azure Functions 中提供的所有主要语言运行时,包括:C#、JavaScript/TypeScript (Node.js)、Python、Java、PowerShell、自定义容器(自带映像)。
在 Azure 容器应用上运行的 Azure Functions 会根据事件源自动配置缩放规则,无需手动定义 KEDA 缩放规则。 这就是为什么在 Azure 门户中,对于运行在容器应用上的 Functions,禁用了“添加缩放规则”按钮。 但是,仍可以定义最小和最大副本计数,以建立缩放边界,并保持对资源分配的控制。
容器应用支持所有标准 Azure Functions 触发器和绑定,但以下情况除外:
- Blob 存储触发器自动缩放:仅在将事件网格用作源时才有效。 详细了解使用事件订阅在 Blob 容器上触发 Azure Functions
- Durable Functions 自动缩放:仅支持 MSSQL (Microsoft SQL Server) 和 DTS(持久任务计划程序)存储提供程序。 请参阅有关使用 MSSQL 部署 Durable Functions 的更多指南
- 以下服务不支持自动缩放:
- Azure Cache for Redis
- Azure SQL
对于允许使用托管标识的触发器和绑定,支持使用托管标识。 此外还可用于:
- 默认存储帐户 (AzureWebJobsStorage)
- Azure 容器注册表 (ACR)
- 连接到触发事件源
对于不支持的触发器,请在 Azure 容器应用上的 Azure Functions 中使用固定副本数(即,设置 minReplicas > 0)。 有关更多详细信息,请参阅 Functions 开发人员指南。
可扩展性和性能
容器应用上的 Azure Functions 会根据使用 KEDA 的事件自动缩放,无需手动配置缩放规则。 你仍然可以设置最小/最大副本数来控制扩展行为。
- 事件驱动的缩放:根据事件网格、服务总线或 HTTP 等触发器自动缩放。
- 缩放到零:空闲应用缩放到零,以节省成本。
- 冷启动控制:了解如何缩短 Azure 容器应用的冷启动时间。
- 并发:每个实例可以并行处理多个事件。
- 大规模:每个应用横向扩展到 1,000 个实例(默认值为 10)。
- GPU 支持:使用 GPU 支持的节点运行计算密集型工作负荷,例如 AI 推理。
这使得容器应用非常适合突发和稳定状态工作负荷。 若要了解详细信息,请参阅 在 Azure 容器应用中设置缩放规则
网络和安全性
容器应用上的 Azure Functions 受益于容器应用的可靠 网络 和 安全功能,以实现安全、可缩放的部署。
- VNet 集成:通过内部终结点和专用数据库安全地访问专用资源。
- 托管标识:使用系统/用户分配的标识(无需机密或连接字符串)通过 Azure 服务进行身份验证。
- Dapr 支持:通过 Dapr sidecar 启用发布/订阅、状态管理和保护服务调用。 有关详细信息,请参阅 Dapr 提供支持的微服务 API。
- 入口和 TLS:使用 TLS/mTLS、自定义域公开安全 HTTP 终结点,或将其保留在内部。
- 环境隔离:函数共享容器应用的环境限制,以进行安全的范围内通信。
这些功能使容器应用程序托管的函数成为面向企业级、安全的无服务器应用程序的理想选择。
监视和日志记录
容器应用上的 Azure Functions 与 Azure 的可观测性工具无缝集成,用于性能跟踪和问题诊断:
- Application Insights:提供请求、依赖项、异常和自定义跟踪的遥测数据。 有关详细信息,请参阅监视 Azure Functions。
- Log Analytics:捕获容器生命周期和缩放事件(例如 FunctionsScalerInfo 条目)。 有关详细信息,请参阅 Azure 容器应用中的 Application Logging。
- 自定义日志记录:支持结构化输出的标准框架(如 ILogger 和控制台日志记录)。
- 集中式监视:容器应用环境为所有应用提供统一的仪表板和警报。
注意事项
使用 Azure 容器应用中的 Azure Functions 时,请记住以下其他注意事项:
- 自动缩放的入口要求:若要基于事件启用自动缩放,必须启用入口:可以是公共入口,也可以是容器应用内部环境中的入口。
- 存储帐户要求:部署在容器应用上的每个 Functions 应用都必须关联一个存储帐户。 对于管理触发器、日志和状态,此为必要项。 查看存储帐户指南,了解最佳做法。
- 多修订存储:使用多个活动修订进行部署时,请为每个修订分配专用存储帐户。 使用专用存储帐户有助于防止冲突并确保适当的隔离。 或者,如果不需要同时进行多个版本修订,可以考虑使用默认的单版本修订模式,以简化管理。
- 多修订触发器:如果对基于拉取的触发器使用多修订模式,请为每个修订使用不同的事件源以避免与竞争使用者相关的冲突。 使用 Azure 队列存储、Azure 事件中心、Azure 服务总线或 Durable Functions 触发器的函数是基于拉取的触发器的示例。
- 冷启动延迟:当容器应用在空闲期间缩放至零实例时,空闲后收到的第一个请求会经历一次冷启动。 详细了解如何缩短冷启动时间。
- Application Insights 集成:若要进行可靠的监视和诊断,请将 Functions 应用链接到 Application Insights。 有关详细信息,请参阅 App Insights 与 Functions 的集成。
- Functions 代理:不支持。 对于 API 网关方案,请改为与 Azure API 管理集成。
- 部署槽位:暂存槽和生产槽不可用。 使用蓝绿部署策略实现零故障时间发布。
- Functions 访问密钥:不支持使用门户生成 Functions 访问密钥。 请考虑使用 Azure Key Vault 来存储密钥。 还可以使用以下选项来保护生产中的 HTTP 终结点:
- 配额和资源限制:容器应用环境对每个区域的内存、CPU 和实例数量都有默认限制。 有关详细信息,请参阅环境限制和默认配额。 如果工作负载需要更多资源,可以请求增加配额。
- 手动缩放规则配置:由于 Azure Functions 托管在容器应用上,因此 Azure 门户上的“添加缩放规则”按钮处于禁用状态,因为缩放规则是根据事件源自动配置的。 在此设置中,无需手动定义 KEDA 规则。
提交反馈
向 Azure 容器应用 GitHub 存储库提交问题或功能请求。
后续步骤/其他资源
若要继续在容器应用上使用 Azure Functions 进行学习和构建,请浏览以下资源:
- 入门指南 - 在 Azure 容器应用中部署和配置 Azure Functions 的分步指南。
- Azure 容器应用文档 – 容器应用功能的完整参考,包括缩放、网络、Dapr 和工作负载配置文件。
- Azure 容器应用定价 - 按消耗计费和专用套餐费用详情。
- Azure Functions 托管选项 – 托管计划比较,包括容器应用、Flex 消耗、高级和专用。
- Azure Functions 开发人员指南 – 深入了解触发器、绑定、运行时行为和配置。