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: 将自定义库、包和 API 与用于业务线应用程序的 Azure Functions 打包。
- 迁移和现代化: 将本地旧版和/或整体式应用程序迁移到容器上的云本机微服务。
- 事件驱动的处理: 使用函数编程模型轻松处理来自事件网格、服务总线、事件中心和其他事件源的事件。
- AI 和 GPU 工作负载: 对需要 GPU 计算资源的视频、图像、脚本或任何其他处理密集型任务的无服务器工作负荷处理。 有关详细信息,请参阅 在 Azure 容器应用中使用无服务器 GPU。
- 微服务: 将 Azure Functions 与其他容器应用托管服务集成。
- 自定义容器: 使用自定义运行时或 sidecars 打包函数。
- 专用应用: 使用 VNet 和内部入口保护仅限内部的函数。
- .NET Aspire: 通过 .NET Aspire 与 Azure Functions 的集成,可以将 Azure Functions .NET 项目作为 .NET Aspire 应用主机的一部分进行开发、调试和协调。 详细了解 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/azure-functions/dotnet8-quickstart-demo:1.0 \
--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(持久任务计划程序)存储提供程序。
- 不支持自动缩放:
- 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 应用都必须链接到存储帐户。 这是管理触发器、日志和状态所必需的。 查看 存储帐户指南 ,了解最佳做法。
多修订存储:使用多个活动修订进行部署时,请为每个修订分配专用存储帐户。 使用专用存储帐户有助于防止冲突并确保适当的隔离。 或者,如果不需要并发修订,请考虑使用默认单一修订模式进行简化管理。
冷启动延迟:当容器应用在空闲期间缩小到零时,处于非活动状态后的第一个请求会经历冷启动。 详细了解 如何减少冷启动时间。
Application Insights 集成:若要进行可靠的监视和诊断,请将 Functions 应用链接到 Application Insights。 有关详细信息,请参阅 App Insights 与 Functions 的集成。
函数代理:不支持。 对于 API 网关方案,请改为与 Azure API 管理集成。
部署槽位:暂存槽和生产槽不可用。 使用 蓝绿部署策略 实现零停机发布。
函数访问密钥:不支持使用门户生成 Functions 访问密钥。 请考虑使用 Azure Key Vault 来存储密钥。 还可以使用以下选项来保护生产中的 HTTP 终结点:
配额和资源限制:容器应用环境对每个区域的内存、CPU 和实例计数有默认限制。
手动缩放规则配置:Azure 门户上的“添加缩放规则”按钮对于容器应用上托管的 Azure Functions 禁用,因为缩放规则是根据事件源自动配置的。 此设置中不需要手动 KEDA 规则定义。
提交反馈
向 Azure 容器应用 GitHub 存储库提交问题或功能请求。
后续步骤/进一步资源
若要继续在容器应用上使用 Azure Functions 进行学习和构建,请浏览以下资源:
- 入门 - 在 Azure 容器应用中部署和配置 Azure Functions 的分步指南。
- Azure 容器应用文档 - 容器应用功能的完整参考,包括缩放、网络、Dapr 和工作负荷配置文件。
- Azure 容器应用定价 - 有关基于消耗的计费和专用计划成本的详细信息。
- Azure Functions 托管选项 - 托管计划(包括容器应用、弹性消耗、高级和专用)的比较。
- Azure Functions 开发人员指南 - 深入了解触发器、绑定、运行时行为和配置。