规划并开发单个函数以在 Azure Functions 中运行时,通常侧重于代码本身。 借助 Azure Functions,只需将代码项目部署到 Azure 中的函数应用即可。 将项目部署到 Linux 函数应用时,代码将在自动创建且与 Functions 管理工具无缝集成的容器中运行。
Functions 还支持容器化函数应用部署。 在容器化部署中,从受支持的映像在本地 Docker 容器中创建自己的函数应用实例。 然后,可以将此“容器化”函数应用部署到 Azure 中的托管环境。 创建自己的函数应用容器可以自定义或控制函数代码的即时运行时环境。
重要
创建自己的容器时,需要将容器的基础映像更新到最新的受支持基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。
Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 你应该定期从最新的基础映像更新容器,并重新部署更新后的容器版本。 有关详细信息,请参阅 维护自定义容器。
容器托管选项
在 Azure 中托管容器化函数应用有多种选项:
托管选项 | 好处 |
---|---|
Azure 容器应用 | Azure Functions 提供集成的支持用于在 Azure 容器应用上开发、部署和管理容器化函数应用。 通过此集成,可以使用 Azure 门户中的相同 Functions 工具和页面来管理应用。 使用 Azure 容器应用在与其他微服务、API、网站、工作流或其他容器托管程序相同的环境中托管函数应用容器。 使用容器应用托管,可以在为开源监视、mTLS、Dapr 和 KEDA 提供内置支持的基于 Kubernetes 的受管环境中运行函数。 支持缩放到零,并提供无服务即用即付托管模型。 还可以使用工作负载配置文件请求专用硬件,甚至 GPU。 建议用于容器化函数应用的托管选项 n Azure。 |
已启用 Azure Arc 的 Kubernetes 群集(预览版) | 可以将已启用 Azure Arc 的 Kubernetes 群集上的函数应用托管为仅“代码部署”,也可以在自定义 Linux 容器中托管函数应用。 使用 Azure Arc 可以附加 Kubernetes 群集,以便在 Azure 中管理和配置它们。 在已启用 Azure Arc 的 Kubernetes 群集上托管 Azure Functions 容器目前为预览版。 有关详细信息,请参阅使用容器和 Azure Functions。 |
Azure Functions | 可以通过在 弹性高级 版或 应用服务(专用) 计划中运行容器来托管 Azure Functions 中的容器化函数应用。 使用容器应用托管以获取来自容器应用的丰富容器支持。 高级计划托管提供动态缩放的优势。 你可能想要使用专用计划托管来利用现有的未使用的应用服务计划资源。 |
Kubernetes | 由于 Azure Functions 运行时在托管位置和方式方面具有灵活性,因此可以直接在 Kubernetes 群集中托管和管理函数应用容器。 KEDA (Kubernetes-based Event Driven Autoscaling) 与 Azure Functions 运行时和工具无缝结合,以提供 Kubernetes 中的事件驱动缩放。 重要: 使用 KEDA 或直接部署时,由 Kubernetes 托管您的容器化函数应用是一项开源工作,您可以免费使用。 此托管方案的最佳做法支持仅由参与者和社区提供。 你负责在群集中维护自己的函数应用容器,即使将它们部署到 Azure Kubernetes 服务(AKS)。 |
功能支持比较
在容器中运行函数应用时,支持 Azure Functions 的各种功能和行为的程度取决于所选的容器托管选项。
功能/行为 | 容器应用(集成) | 容器应用(直接) | 高级计划 | 专用计划 | Kubernetes |
---|---|---|---|---|---|
产品支持 | 是 | 否 | 是 | 是 | 否 |
Functions 门户集成 | 是 | 无 | 是 | 是 | 无 |
事件驱动的缩放 | 是5 | 是(缩放规则) | 是 | 否 | 否 |
最大缩放(实例) | 10001 | 10001 | 1002 | 10-303 | 因群集而异 |
缩放到零实例 | 是 | 是 | 否 | 否 | KEDA |
执行时间限制 | 无限制6 | 无限制6 | 无限制7 | 无限制8 | 无 |
Core Tools 部署 | func azurecontainerapps |
否 | 否 | 否 | func kubernetes |
修订 | 无 | 是 | 无 | 无 | 无 |
部署槽位 | 无 | 无 | 是 | 是 | 无 |
流式处理日志 | 是 | 是 | 是 | 是 | 无 |
控制台访问 | 目前不可用4 | 是 | 是(使用 Kudu) | 是(使用 Kudu) | 是(在 pod 中使用 kubectl ) |
冷启动缓解 | 最小副本数 | 缩放规则 | 始终就绪/预热实例 | 不适用 | 不适用 |
应用服务身份验证 | 目前不可用4 | 是 | 是 | 是 | 无 |
自定义域名 | 目前不可用4 | 是 | 是 | 是 | 无 |
私钥证书 | 目前不可用4 | 是 | 是 | 是 | 无 |
虚拟网络 | 是 | 是 | 是 | 是 | 是 |
可用性区域 | 是 | 是 | 是 | 是 | 是 |
诊断 | 目前不可用4 | 是 | 是 | 是 | 无 |
专用硬件 | 是(工作负载配置文件) | 是(工作负载配置文件) | 无 | 是 | 是 |
专用 GPU | 是(工作负载配置文件) | 是(工作负载配置文件) | 无 | 否 | 是 |
可配置内存/CPU 计数 | 是 | 是 | 否 | 无 | 是 |
“免费授予”选项 | 是 | 是 | 否 | 否 | 否 |
定价详细信息 | 容器应用计费 | 容器应用计费 | 高级计划计费 | 专用计划计费 | AKS 定价 |
服务名称要求 | 2-32 个字符:限制为小写字母、数字和连字符。 必须以字母开头且以字母数字字符结尾。 | 2-32 个字符:限制为小写字母、数字和连字符。 必须以字母开头且以字母数字字符结尾。 | 少于 64 个字符:限制为字母数字字符和连字符。 不能以连字符开头或结尾。 | 少于 64 个字符:限制为字母数字字符和连字符。 不能以连字符开头或结尾。 | 少于 253 个字符:限制为字母数字字符和连字符。 必须以字母数字字符开头和结尾。 |
- 在容器应用上,默认设置为 10 个实例,但你可以设置最多副本数,这样,最多可以设置 1000 个实例。 只要有足够多的可用核心配额,就会遵守此设置。 从 Azure 门户创建函数应用时,实例数量限制为 300 个。
- 在某些区域中,高级计划中的 Linux 应用可以缩放到 100 个实例。 有关详细信息,请参阅高级计划文章。
- 有关各种应用服务计划选项的特定限制,请参阅应用服务计划限制。
- 功能奇偶校验是 Azure 容器应用上集成托管的目标。
- 需要 KEDA;大多数触发器都支持。 若要了解哪些触发器支持事件驱动的缩放,请参阅托管容器应用的注意事项。
- 当最小副本数设置为零时,默认超时取决于应用中使用的特定触发器。
- 不强制实施最大执行超时期限。 不过,为函数执行提供的宽限期在横向缩减期间为 60 分钟,在平台更新期间提供宽限期为 10 分钟。
- 要求将应用服务计划设置为 Always On。 在平台更新期间提供 10 分钟的宽限期。
维护自定义容器
创建自己的容器时,需要将容器的基础映像更新到最新的受支持基础映像。 Azure Functions 支持的基映像特定于语言,可在 Azure Functions 基础映像存储库中找到。
Functions 团队致力于发布这些基础映像的每月更新。 定期更新包括 Functions 运行时和语言的最新次要版本更新和安全修补程序。 你应该定期从最新的基础映像更新容器,并重新部署更新后的容器版本。
当基础映像由 Functions 管理(例如在 Linux 上的标准部署中)时,你的应用由 Functions 团队发布的常规基础映像更新自动保持最新。 对于此类非自定义的容器,你的应用将更新为在具有新次要版本或主机运行时修补版本的基础映像上运行。
使用自定义映像创建或部署自己的容器化应用时,你负责确保你的自定义映像与我们已发布的基础映像保持同步。 除了新功能和改进之外,这些基本映像更新还可以包括对应用至关重要的安全更新。 若要确保应用受到保护,请确保保持最新状态。
在某些情况下,我们需要进行平台级更改,这可能意味着使用旧基础映像的自定义容器中的应用可能会停止正常工作。 对于此类重大更改,我们会提前推出更新后的映像,以便采用常规更新的应用不会受到负面影响。 若要避免在自定义容器中运行的应用出现潜在问题,请确保不会落后于已发布的最新次要版本。 在支持案例中,如果确定你的应用遇到问题,因为它位于较旧或不支持的版本上,我们会请求你在继续支持之前将容器更新到最新的基础映像版本。
入门
使用以下链接开始使用 Linux 容器中的 Azure Functions:
我想… | 请参阅文章: |
---|---|
创建第一个容器化函数 | 在本地 Linux 容器中创建函数应用 |
创建函数并将其部署到 Azure 容器应用 | 在 Azure 容器应用上创建第一个容器化函数 |
创建容器化函数并将其部署到 Azure Functions | 创建第一个容器化 Azure Functions |