重要
Azure 容器应用中直接运行 Azure Functions 的新托管方法现已推出(请参阅 公告),建议用于大多数新工作负载。 通过此集成,您可以充分利用 Azure 容器应用的全部特性和功能,同时受益于 Azure Functions 提供的函数编程模型和自动扩展的简单性。
有关详细信息,请参阅 Azure 容器应用中的本机 Azure Functions 支持
Azure Functions 提供集成的支持用于在 Azure 容器应用上开发、部署和管理容器化函数应用。 当您需要在与其他微服务、API、网站、工作流或任何容器托管程序相同的环境中运行 Azure 中事件驱动的函数时,可以使用 Azure 容器应用来托管函数应用程序容器。 使用容器应用托管,可在基于 Kubernetes 的完全托管环境中运行函数,并获得对开源监视、mTLS、Dapr 和 Kubernetes 事件驱动的自动缩放 (KEDA) 的内置支持。
可以使用 Functions 支持的任何语言堆栈编写函数代码。 可以将相同的 Functions 触发器和绑定与事件驱动的缩放配合使用。 还可以使用现有的 Functions 客户端工具和 Azure 门户来创建容器、将函数应用容器部署到容器应用,以及配置持续部署。
容器应用集成还意味着在容器应用环境级别定义的网络和可观测性配置适用于函数应用,就像它们适用于容器应用环境中运行的所有微服务一样。 你还可以获得容器应用的其他云原生功能,包括 KEDA、Dapr、Envoy。 你仍然可以使用 Application Insights 监视函数执行,并且函数应用可以访问环境提供的相同虚拟网络资源。
有关 Azure Functions 容器托管选项的一般概述,请参阅 Azure Functions 中的 Linux 容器支持。
托管和工作负载配置文件
容器应用有两个主要计划:无服务器消耗计划和专用计划。 这两种资源都可以在工作负荷配置文件环境类型中使用,工作负载配置文件用于确定应用可用的计算和内存资源。 工作负载配置文件确定部署在环境中的容器应用可用的计算和内存资源量。 对这些配置文件进行配置以符合应用程序的不同需求。
消耗工作负载配置文件是添加到每个工作负载配置文件环境类型的默认配置文件。 可以在创建环境时或创建环境后添加专用工作负载配置文件到环境中。 若要了解有关工作负载配置文件的详细信息,请参阅 Azure 容器应用中的工作负载配置文件。
容器化函数应用的容器应用托管在支持容器应用的所有区域中都受支持。
如果应用没有特定的硬件要求,则既可以在消耗计划中运行环境,也可使用默认消耗工作负载配置文件在专用计划中运行环境。 在容器应用上运行函数时,只需支付容器应用的使用费。 有关详细信息,请参阅 Azure 容器应用定价页。
Azure 容器应用中的 Azure Functions 在使用工作负载配置文件的专用计划中支持启用 GPU 的托管。
若要了解如何在默认的消耗计划中创建函数应用容器并将其部署到容器应用,请参阅在 Azure 容器应用上创建第一个容器化函数。
若要了解如何使用工作负载配置文件创建容器应用环境并将函数应用容器部署到特定工作负载,请参阅容器应用工作负载配置文件。
容器中的函数
若要使用容器应用托管,必须在你创建和维护的 Linux 容器中的函数应用上运行代码。 Functions 维护一组特定语言的基础映像,你可以使用这些映像生成容器化函数应用。
当你使用 Azure Functions Core Tools 创建代码项目并提供 --docker
选项时,Core Tools 会生成带有正确基础映像的 Dockerfile,你可以使用该文件开始创建容器。
重要
创建自己的容器时,需要将容器的基础映像更新到最新的受支持基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。
Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 应定期通过最新基础映像更新容器,并重新部署容器的更新版本。 有关详细信息,请参阅 维护自定义容器。
对函数代码进行更改时,必须重新生成并重新发布容器映像。 有关详细信息,请参阅更新注册表中的映像。
部署选项
Azure Functions 目前支持使用以下方法将容器化函数应用部署到 Azure 容器应用:
- Apache Maven
- ARM 模板
- Azure CLI
- Azure Developer CLI (azd)
- Azure Functions Core Tools
- Azure 管道任务
- Azure 门户
- Bicep 文件
- GitHub 活动
- Visual Studio Code
可以使用 Azure Pipelines 或 GitHub Actions 从源代码持续部署容器化应用。 部署到容器应用时,当前不支持 Functions 的持续部署功能。
托管标识授权
为了获得最佳安全性,应使用 Microsoft Entra 身份验证和托管标识授权连接到远程服务。 可以将托管标识用于以下连接:
在容器应用中运行时,可以对所有支持托管标识的绑定扩展结合使用 Microsoft Entra ID 和托管标识。 目前,在使用托管标识身份验证时,只有这些绑定扩展支持事件驱动的缩放:
- Azure 事件中心
- Azure 队列存储
- Azure 服务总线
对于其他绑定,使用托管标识身份验证时,请使用固定副本。 有关详细信息,请参阅 Functions 开发人员指南。
虚拟网络集成
在容器应用程序环境中托管函数应用程序时,函数可以利用内部和外部可访问的虚拟网络。 若要了解有关环境网络的详细信息,请参阅 Azure 容器应用环境中的网络。
事件驱动的扩展
所有 Functions 触发器都可以在容器化函数应用中使用。 但是,在容器应用环境中运行时,只有这些触发器可以根据收到的事件动态缩放(从零个实例开始):
- Azure Cosmos DB (KEDA 连接)
- Azure 事件网格
- Azure 事件中心
- Azure Blob 存储(基于事件网格)
- Azure 队列存储
- Azure 服务总线
- Durable Functions(MSSQL 存储提供程序)
- HTTP
- 卡 夫 卡
- 计时器
容器应用上的 Azure Functions 旨在根据事件目标配置缩放参数和规则。 你无需考虑如何配置 KEDA 缩放对象。 创建或修改函数应用时,你仍可以设置最小和最大副本计数。 在容器应用环境中从 Azure 容器注册表创建新的函数应用时,以下 Azure CLI 命令将设置最小和最大副本计数:
az functionapp create --name <APP_NAME> --resource-group <MY_RESOURCE_GROUP> --max-replicas 15 --min-replicas 1 --storage-account <STORAGE_NAME> --environment MyContainerappEnvironment --image <LOGIN_SERVER>/azurefunctionsimage:v1 --registry-username <USERNAME> --registry-password <SECURE_PASSWORD> --registry-server <LOGIN_SERVER>
以下命令在现有函数应用上设置相同的最小和最大副本计数:
az functionapp config container set --name <APP_NAME> --resource-group <MY_RESOURCE_GROUP> --max-replicas 15 --min-replicas 1
受管理资源组
容器应用中的 Azure Functions 在专门托管的资源组中运行容器化函数应用资源。 这些受管资源组通过防止包括服务主体在内的任何人对组内资源进行意外或未经授权的修改或删除,帮助保护应用程序的一致性。
首次在容器应用环境中创建函数应用资源时,系统会创建此受管理资源组。 容器化函数应用所需的容器应用资源在此受管理资源组中运行。 在同一环境中创建的任何其他函数应用都使用此现有组。
从环境中删除所有函数应用容器资源后,将自动删除受管理资源组。 当受管理资源组可见时,任何修改或删除受管理资源组的尝试都会导致错误。 若要从环境中删除受管理资源组,请删除所有函数应用容器资源,随后便会为你删除该资源组。
如果在使用这些受管理资源组时遇到任何问题,应联系支持人员。
应用程序日志记录
可以使用 Azure Monitor Application Insights 监视容器应用中托管的容器化函数应用,方法与监视 Azure Functions 托管的应用相同。 有关详细信息,请参阅监视 Azure Functions。
对于支持事件驱动的缩放的绑定,缩放事件在 Log Analytics 工作区中记录为 FunctionsScalerInfo
和 FunctionsScalerError
事件。 有关详细信息,请参阅 Azure 容器应用中的 Application Logging。
容器应用托管的注意事项
将函数应用容器部署到容器应用时,请记住以下注意事项:
- 这些限制适用于 Kafka 触发器:
- 托管在容器应用上时,不支持
ssl
协议值。 使用其他协议值。 - 为了使 Kafka 触发器在连接到事件中心时能够动态缩放,
username
属性必须被设定为包含实际用户名值的应用程序设置。 使用默认值$ConnectionString
时,Kafka 触发器无法令应用动态缩放。
- 托管在容器应用上时,不支持
- 对于内置容器应用策略定义,目前只有环境级策略会应用于 Azure Functions 容器。
- 默认情况下,容器化函数应用会监视端口 80 以接收传入请求。 如果你的应用必须使用其他端口,请使用
WEBSITES_PORT
应用设置来更改此默认端口。 - 在容器应用上托管时,当前无法使用内置持续部署功能。 必须改为使用 Azure Pipelines 或 GitHub Actions 从源代码进行部署。
- 当前无法在资源组或订阅之间移动容器应用托管的函数应用部署。 相反,必须在新的资源组、订阅或区域中重新创建现有的容器化应用部署。
- 使用容器应用时,无法直接访问较低级别的 Kubernetes API。
containerapp
扩展与 Azure CLI 中的appservice-kube
扩展相冲突。 如果之前已将应用发布到 Azure Arc,请运行az extension list
并确保未安装appservice-kube
。 如果是这样,可以运行az extension remove -n appservice-kube
将其删除。