Azure Functions部署插槽

在支持部署时段的托管计划中,你的函数应用可以运行称为 时段的独立实例。 每个槽位是一个独立的环境,拥有自己的主机名称。 对某个时隙端点的访问取决于你为该时段设置的网络和访问限制。 其中一个槽位始终是生产槽位,你可以根据需要将某个可用的预发布槽位与生产槽位进行交换。

可用槽位数取决于特定的托管选项:

托管选项 槽位数(包括生产)
消耗计划 2(一个生产槽位和一个暂存槽位)
高级计划 3
专用(应用服务)计划 1-20

请在本文顶部选择您的主机套餐,查看适用于您功能应用的指导。

在消费、高级和专用套餐中,部署时段的行为如下:

  • 在路由交换过程中,新的功能触发调用会被路由到交换的槽位,无需显式重启应用程序。
  • 槽位交换并不能保证零停机时间。 当前正在执行的函数可能会被终止,并且在槽交换操作期间,已缩放应用的可用性可能会下降。 若要了解如何编写无状态和防御性函数,请参阅 改进 Azure 函数的性能和可靠性。

为何使用插槽?

使用部署槽位有很多优点,包括:

  • 不同环境用于不同用途:通过使用不同的时段,你可以在切换到生产或预备时段前区分应用实例。
  • 预热:将应用部署到槽位,而不是直接部署到生产环境,以便在正式上线前完成预热。 此外,使用slot还能降低HTTP触发工作负载的延迟。 实例会在部署前预热,从而降低新部署函数的启动延迟。
  • 轻松回退:与生产环境进行交换后,原本放置过渡应用的槽现在包含以前的生产应用。 如果你换到生产槽的更改不符合预期,你可以立即撤销交换,拿回“最后已知正常实例”。
  • 尽量减少重启次数:更改生产槽中的应用设置需要重启正在运行的应用。 可以改为在预备环境中更改设置,然后通过已预热实例将设置更改切换到生产环境。 建议使用插槽在 Functions 运行时版本之间进行迁移,以保持最高的可用性。 有关详细信息,请参阅最少停机时更新。

交换操作

在交换过程中,一个槽位是源头,另一个是靶位。 源插槽包含要应用到目标插槽的应用程序实例。 以下步骤有助于在交换期间减少目标槽的停机时间:

  1. 应用设置: 将目标槽的设置应用到所有源槽实例。 例如,将生产设置应用到临时实例上。 应用的设置包括以下类别:

  2. 等待重启和可用性: 交换操作会等待源槽中的每个实例完成其重启并可用于请求。 如果有任何实例无法重启,交换操作将会还原对源槽所做的所有更改,并停止操作。

  3. 更新路由: 如果源槽上的所有实例都成功预热,两个槽通过交换路由规则完成交换。 完成此步骤后,目标槽(例如生产槽)将获得先前已在源槽中预热的应用程序。

  4. 重复操作:现在源槽中已经包含之前位于目标槽中的预交换应用,通过应用所有设置并重启实例,完成源槽的相同操作。

请记住以下几点:

  • 在执行交换操作期间的任何时候,已交换应用的初始化将在源槽上发生。 准备源槽时,无论交换是成功还是失败,目标槽都会保持联机。

  • 要将暂存槽位与生产槽位切换,请确保生产槽位始终是目标槽位。 这样,交换操作才不会影响生产应用。

  • 将与事件源和绑定相关的设置配置为部署槽位设置,然后再开始交换操作。 提前将它们标记为“粘性”可以确保事件和输出被定向到正确的实例。

  • 当你创建新的暂存槽时,门户网站会在新槽中创建生产槽中的所有现有设置,而不考虑该设置的 粘性。

管理设置

有些配置是针对插槽特有的。 以下列表详细说明了更换槽位时哪些设置会改变,哪些设置保持不变。

槽位专用设置:

  • 发布端点
  • 自定义域名
  • 非公共证书和 TLS/SSL 设置
  • 缩放设置
  • IP 限制
  • Always On
  • 诊断设置
  • 跨域资源共享 (CORS)
  • 专用终结点

非槽特定设置

  • 通用设置,如框架版本、32/64位和网页套接字
  • 应用设置(可以配置为与某个插槽绑定)
  • 连接字符串(可以配置为关联到某个槽)
  • 处理程序映射
  • 公共证书
  • 混合连接 *
  • 虚拟网络集成 *
  • 服务终结点 *
  • Azure 内容分发网络 *

根据设计,用星号 (*) 标记的功能不会交换。

注意

某些适用于未交换设置的应用设置未被交换。 比如,因为诊断设置没有被交换,相关的应用设置(比如 WEBSITE_HTTPLOGGING_RETENTION_DAYS 和 DIAGNOSTICS_AZUREBLOBRETENTIONDAYS )也不会被替换,即使它们没有显示在插槽设置中。

创建部署设置

可将设置标记为部署设置,使设置保持不变。 粘性设置不会随应用实例变化。

如果你在一个槽位创建了部署设置,确保在涉及交换的其他槽位上创建相同的配置并保持唯一值。 这样,设置的值不会更改,同时设置名称可在不同的槽之间保持一致。 此名称一致性可确保代码不会尝试访问已在一个槽中定义,但未在另一个槽中定义的设置。

使用以下步骤创建部署设置:

  1. 在函数应用中,转到 部署槽,然后选择槽名称。

    Screenshot 显示 Azure portal 中的部署槽位。

  2. 选择“配置”,然后选择要保留在当前插槽中的设置名称。

    屏幕截图显示如何在 Azure 门户中配置槽的应用程序设置。

  3. 选择“部署槽设置”,然后选择“确定”。

    屏幕截图显示配置部署槽设置的位置。

  4. 设置部分关闭后,选择 保存 以保留更改。

    屏幕截图显示如何保存部署槽设置。

将应用部署到槽位

创建槽时,槽是空的。 可以使用任何支持的部署技术将应用程序部署到槽中。

部署槽位如何缩放

所有槽位将缩放到与生产槽位相同的工作者数量。

  • 对于 Consumption 计划,插槽会随着函数应用的扩展而变化。
  • 对于应用服务计划,应用会扩展到固定数量的工作器。 插槽在与应用计划相同数量的工作线程上运行。

查看插槽

您可以通过Azure CLI或Azure门户查看现有时段的信息。

请使用以下步骤查看门户中现有的名额:

  1. 进入你的函数应用。

  2. 选择 部署时段 并查看现有时段。

添加槽

你可以通过使用 Azure CLI 或 Azure 门户添加一个插槽。

使用以下步骤在门户中创建槽位:

  1. 进入你的函数应用。

  2. 选择部署槽,然后选择+ 添加槽。

    Screenshot 显示添加 Azure Functions 部署插槽。

  3. 键入槽名称,然后选择添加。

你也可以使用 Azure 资源管理器(ARM)模板或 Bicep 文件创建部署槽位。 有关如何创建在消耗计划中包含部署槽的函数应用的示例,请参阅此 Azure 资源管理器 快速入门。

访问槽资源

访问过渡槽中的资源(HTTP 触发器和管理员终结点)的方式与访问生产槽相同。 但是,您需要在请求的 URL 中使用用于指定部署槽的主机名,而不是函数应用的主机名,同时还需要使用特定于该槽的密钥。 由于过渡槽是实时应用,因此必须在过渡槽中保护函数,就像在生产槽中一样。

交换槽

你可以使用 Azure CLI 或 Azure 门户,将插槽调入或调出生产环境。

使用以下步骤将过渡槽交换到生产环境中:

  1. 转到函数应用。

  2. 选择部署插槽,然后选择交换。

    显示部署槽位页面且已选中“添加槽位”操作的屏幕截图。

  3. 验证交换的配置设置,然后选择 “交换”。

    屏幕截图显示部署槽位的交换。

交换操作可能需要几秒钟时间。

回滚交换

如果交换出现错误,或者你想撤销交换,可以回滚到初始状态。 若要恢复到交换前的状态,请再次进行交换以恢复交换前的状态。

删除槽

你可以通过使用 Azure CLI 或 Azure 门户来移除一个插槽。

使用以下步骤从门户中的应用中移除槽:

  1. 在函数应用中,转到 部署槽,然后选择槽名称。

    屏幕截图显示在 Azure 门户中找到插槽的页面。

  2. 选择“删除”。

    显示“概览”页面且已选中“删除”操作的屏幕截图。

  3. 键入要删除的部署槽的名称,然后选择“删除”。

    截图显示在 Azure 门户中删除部署槽位。

  4. 关闭确认窗格。

    屏幕截图显示了部署槽位删除确认。

更改应用服务计划

对于运行在应用服务计划下的函数应用,你可以更改底层的应用服务计划以获得一个时段。

请按照以下步骤修改实例的应用服务计划:

  1. 在函数应用中,转到 部署槽,然后选择槽名称。

    截图展示了 Azure portal 中的槽位。

  2. 在“应用服务计划”下,选择“更改应用服务计划”。

  3. 选择要升级到的计划,或创建新的计划。

    截图显示如何在 Azure 门户中更改应用服务计划的位置。

  4. 选择“确定”。

注意事项

Azure Functions部署槽位具有以下注意事项:

  • 应用程序可用的插槽数量取决于计划。 消耗计划总共支持两个槽位:生产槽和一个暂存槽。 其他计划下运行的应用程序可以获得更多可用槽位。 有关详细信息,请参阅服务限制。
  • 交换某个槽位会重置那些应用设置等于 AzureWebJobsSecretStorageType 的应用的密钥。
  • 当你启用老虎机时,门户会把你的功能应用设置为只读模式。
  • 当你的函数应用使用 一个安全存储账户 作为默认存储账户(设置在 AzureWebJobsStorage中)时,插槽交换可能会失败。 有关详细信息,请查看 WEBSITE_OVERRIDE_STICKY_DIAGNOSTICS_SETTINGS 文档。
  • 使用短于 32 个字符的函数应用名称。 超过32个字符的名称可能导致 主机ID碰撞。

后续步骤