你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Functions 的 Azure 容器应用托管

Azure Functions 提供集成的支持用于在 Azure 容器应用上开发、部署和管理容器化函数应用。 需要在与其他微服务、API、网站、工作流或任何容器托管程序相同的环境中运行 Azure 中事件驱动的函数时,可以使用 Azure 容器应用托管函数应用容器。 使用容器应用托管,可以在基于 Kubernetes 的完全托管环境中运行函数,并获得对开源监视、mTLS、Dapr 和 KEDA 的内置支持。

可以使用 Functions 支持的任何语言堆栈编写函数代码。 可以使用相同的 Functions 触发器和绑定,以及事件驱动缩放功能。 还可以使用现有的 Functions 客户端工具和 Azure 门户来创建容器、将函数应用容器部署到容器应用,以及配置持续部署。

容器应用集成还意味着在容器应用环境级别定义的网络和可观测性配置适用于函数应用,就像它们适用于容器应用环境中运行的所有微服务一样。 你还可以获得容器应用的其他云原生功能,包括 KEDA、Dapr、Envoy。 你仍然可以使用 Application Insights 监视函数执行,并且函数应用可以访问环境提供的相同虚拟网络资源。

有关 Azure Functions 容器托管选项的一般概述,请参阅 Azure Functions 中的 Linux 容器支持

托管和工作负载配置文件

容器应用有两个主要托管计划,一个无服务器 消耗计划和一个专用计划,专用计划使用工作负载配置文件更好地控制部署资源。 工作负载配置文件确定部署在环境中的容器应用可用的计算和内存资源量。 对这些配置文件进行配置以符合应用程序的不同需求。

消耗工作负载配置文件是添加到每个工作负载配置文件环境类型的默认配置文件。 可以在创建环境时或创建环境后添加专用工作负载配置文件到环境中。 若要了解有关工作负载配置文件的详细信息,请参阅 Azure 容器应用中的工作负载配置文件

容器化函数应用的容器应用托管在支持容器应用的所有区域中都受支持。

如果应用没有特定的硬件要求,则既可以在消耗计划中运行环境,也可使用默认消耗工作负载配置文件在专用计划中运行环境。 在容器应用上运行函数时,只需支付容器应用的使用费。 有关详细信息,请参阅 Azure 容器应用定价页

Azure 容器应用中的 Azure Functions 在使用工作负载配置文件的专用计划中支持启用 GPU 的托管。

若要了解如何在默认的消耗计划中创建函数应用容器并将其部署到容器应用,请参阅在 Azure 容器应用上创建第一个容器化函数

若要了解如何使用工作负载配置文件创建容器应用环境并将函数应用容器部署到特定工作负载,请参阅容器应用工作负载配置文件

容器中的 Functions

若要使用容器应用托管,必须在你创建和维护的 Linux 容器中的函数应用上运行代码。 Functions 维护一组特定语言的基础映像,你可以使用这些映像生成容器化函数应用。

当你使用 Azure Functions Core Tools 创建代码项目并提供 --docker 选项时,Core Tools 会生成带有正确基础映像的 Dockerfile,你可以使用该文件开始创建容器。

重要

创建自己的容器时,需要将容器的基础映像更新为受支持的最新基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。

Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 应定期通过最新基础映像更新容器,并重新部署容器的更新版本。

对函数代码进行更改时,必须重新生成并重新发布容器映像。 有关详细信息,请参阅更新注册表中的映像

部署选项

Azure Functions 目前支持使用以下方法将容器化函数应用部署到 Azure 容器应用:

虚拟网络集成

在容器应用程序环境中托管函数应用程序时,函数可以利用内部和外部可访问的虚拟网络。 若要了解有关环境网络的详细信息,请参阅 Azure 容器应用环境中的网络

配置缩放规则

容器应用上的 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 在专门托管的资源组中运行容器化函数应用资源。 这些受管理资源组通过防止对托管组中的资源进行意外或未经授权的修改或删除(甚至按照服务原则)来帮助保护应用程序的一致性。

首次在容器应用环境中创建函数应用资源时,系统会创建此受管理资源组。 容器化函数应用所需的容器应用资源在此受管理资源组中运行。 在同一环境中创建的任何其他函数应用都使用此现有组。

从环境中删除所有函数应用容器资源后,将自动删除受管理资源组。 当受管理资源组可见时,任何修改或删除受管理资源组的尝试都会导致错误。 若要从环境中删除受管理资源组,请删除所有函数应用容器资源,随后便会为你删除该资源组。

如果在使用这些受管理资源组时遇到任何问题,应联系支持人员。

容器应用托管的注意事项

将函数应用容器部署到容器应用时,请记住以下注意事项:

  • 虽然可以使用所有触发器,但只有以下触发器可以在容器应用环境中运行时动态缩放(从零个实例开始):
    • HTTP
    • Azure 队列存储
    • Azure 服务总线
    • Azure 事件中心
    • Kafka
    • 计时器
  • 这些限制适用于 Kafka 触发器:
    • 托管在容器应用上时,不支持 ssl 协议值。 使用其他协议值
    • 为了使 Kafka 触发器在连接到事件中心时动态缩放,username 属性必须解析为包含实际用户名值的应用程序设置。 使用默认值 $ConnectionString 时,Kafka 触发器将无法令应用动态实现缩放。
  • 对于内置容器应用策略定义,目前只有环境级策略会应用于 Azure Functions 容器。
  • 可以将托管标识用于触发器和绑定连接以及来自 Azure 容器注册表的部署
  • 在函数应用和基于 Azure 容器注册表的部署使用基于身份的托管连接时,你无法修改门户中的 CPU 和内存分配设置。 必须改用 Azure CLI
  • 当前无法在资源组或订阅之间移动容器应用托管的函数应用部署。 相反,必须在新的资源组、订阅或区域中重新创建现有的容器化应用部署。
  • 使用容器应用时,无法直接访问较低级别的 Kubernetes API。
  • containerapp 扩展与 Azure CLI 中的 appservice-kube 扩展相冲突。 如果之前已将应用发布到 Azure Arc,请运行 az extension list 并确保未安装 appservice-kube。 如果已安装,可以运行 az extension remove -n appservice-kube 将其删除。

后续步骤