Azure Functions 部署槽
Azure Functions 部署槽使函数应用能够运行不同的实例(称作“槽”)。 槽是通过公用终结点公开的不同环境。 一个应用实例始终映射到生产槽,你可以按需交换分配给某个槽的实例。 在消耗计划中运行的函数应用具有用于暂存的单个额外槽位。 可以通过在高级计划或专用(应用服务)计划中运行应用来获取更多过渡槽。 有关详细信息,请参阅服务限制。
下面反映了交换槽对函数的影响:
- 流量重定向是无缝的;不会因为交换而丢弃任何请求。 发生这种无缝行为是因为下一个函数触发器将路由到交换槽。
- 当前正在执行的函数在交换期间终止。 如要了解如何编写无状态函数和防御函数,请参阅提高 Azure Functions 的性能和可靠性。
为何要使用槽?
使用部署槽位有很多优点,包括:
- 满足不同用途的不同环境:使用不同的槽可以在交换到生产槽或过渡槽之前区分应用实例。
- 预热:部署到某个槽而不是直接部署到生产环境可让应用在上线之前进行预热。 此外,使用槽可以降低 HTTP 触发的工作负荷的延迟。 实例在部署之前会预热,这可以减少新部署的函数的冷启动。
- 轻松回退:与生产环境交换后,以前包含过渡应用的槽现在包含以前的生产应用。 如果交换到生产槽的更改不符合预期,你可以立即反向交换,以恢复“上次已知正常的实例”。
- 尽量减少重启次数:更改生产槽中的应用设置需要重启正在运行的应用。 可以改为更改过渡槽中的设置,然后将设置更改交换到包含已预热实例的生产槽。 建议使用槽在 Functions 运行时版本之间迁移,同时保持最高可用性。 有关详细信息,请参阅最少停机时更新。
交换操作
在交换期间,一个槽被视为源,另一个槽被视为目标。 源槽包含已应用到目标槽的应用程序实例。 以下步骤可确保在交换期间目标槽不会发生停机:
应用设置: 目标槽的设置将应用到源槽的所有实例。 例如,生产设置将应用到过渡实例。 应用的设置包括以下类别:
等待重启和可用性: 交换操作会等待源槽中的每个实例完成其重启并可用于请求。 如果有任何实例无法重启,交换操作将会还原对源槽所做的所有更改,并停止操作。
更新路由: 如果源槽上的所有实例已成功预热,则两个槽会通过切换路由规则来完成交换。 完成此步骤后,目标槽(例如生产槽)包含先前已在源槽中预热的应用。
重复操作:源槽包含先前位于目标槽中的预交换应用后,通过应用所有设置并重启源槽的实例来完成相同的操作。
请记住以下几点:
在执行交换操作期间的任何时候,已交换应用的初始化将在源槽上发生。 准备源槽时,无论交换是成功还是失败,目标槽都会保持联机。
若要将过渡槽与生产槽交换,请确保生产槽始终是目标槽。 这样,交换操作才不会影响生产应用。
在启动交换之前,必须将与事件源和绑定相关的设置配置为部署槽设置。 提前将这些设置标记为“粘性”可确保将事件和输出定向到正确的实例。
创建新的过渡槽时,无论设置的粘性如何,生产槽中的所有现有设置都会在新槽中创建。
管理设置
某些配置设置特定于槽。 以下列表详细说明了交换槽时,哪些设置会发生变化,哪些设置会保持不变。
特定于槽的设置:
- 发布终结点
- 自定义域名
- 非公共证书和 TLS/SSL 设置
- 缩放设置
- IP 限制
- Always On
- 诊断设置
- 跨域资源共享 (CORS)
- 专用终结点
非特定于槽的设置:
- 常规设置 - 例如 Framework 版本、32/64 位、Web 套接字
- 应用设置(可以配置为停在槽中)
- 连接字符串(可以配置为停在槽中)
- 处理程序映射
- 公用证书
- 混合连接 *
- 虚拟网络集成 *
- 服务终结点 *
- Azure 内容分发网络 *
根据设计,用星号 (*) 标记的功能不会交换。
注意
应用于不交换的设置的某些应用设置也不交换。 例如,由于诊断设置不会交换,因此相关的应用设置(如 WEBSITE_HTTPLOGGING_RETENTION_DAYS
和 DIAGNOSTICS_AZUREBLOBRETENTIONDAYS
)也不会交换,即使它们未显示为槽设置也是如此。
创建部署设置
可将设置标记为部署设置,使之具有“粘性”。 粘性设置不会与应用实例一起交换。
如果在一个槽中创建部署设置,请确保在交换所涉及的任何其他槽中创建具有唯一值的相同设置。 这样,设置的值不会更改,同时设置名称可在不同的槽之间保持一致。 此名称一致性可确保代码不会尝试访问已在一个槽中定义,但未在另一个槽中定义的设置。
使用以下步骤创建部署设置:
在函数应用中导航到“部署槽”,然后选择槽名称。
选择“配置”,然后选择要粘滞到当前槽的设置名称。
选择“部署槽设置”,然后选择“确定”。
设置部分消失后,选择“保存”以保留更改
部署
创建槽时,槽是空的。 可以使用任何支持的部署技术将应用程序部署到槽中。
扩展
所有槽将缩放到与生产槽中相同的辅助角色数。
- 对于消耗计划,槽将随着函数应用的缩放而缩放。
- 对于应用服务计划,应用会缩放到固定数量的辅助角色。 槽在与应用计划相同的数目的辅助角色上运行。
查看槽
可以使用 Azure CLI 或通过 Azure 门户查看有关现有槽的信息。
添加槽
可以使用 Azure CLI 或通过 Azure 门户添加槽。
访问槽资源
访问过渡槽中的资源(HTTP 触发器和管理员终结点)的方式与访问生产槽相同。 但是,不是使用函数应用主机名,而是在请求的 URL 中使用槽特定的主机名,以及任何特定于槽的密钥。 由于过渡槽是实时应用,因此必须在过渡槽中保护函数,就像在生产槽中一样。
交换槽
可以使用 Azure CLI 或通过 Azure 门户交换生产外槽。
回滚交换
如果交换导致出错,或者你想要“撤消”交换,可以回滚到初始状态。 若要恢复到交换前的状态,请再次执行交换以反向交换。
删除槽
可以使用 Azure CLI 或通过 Azure 门户移除槽。
使用以下步骤从门户中的应用中移除槽:
在函数应用中导航到“部署槽”,然后选择槽名称。
选择“删除”。
键入要删除的部署槽的名称,然后选择“删除”。
关闭确认窗格。
更改应用服务计划
对于在应用服务计划下运行的函数应用,可以更改槽的基础应用服务计划。
注意
无法在消耗计划下更改槽的应用服务计划。
使用以下步骤更改槽的应用服务计划:
在函数应用中导航到“部署槽”,然后选择槽名称。
在“应用服务计划”下,选择“更改应用服务计划”。
选择要升级到的计划,或创建新的计划。
选择“确定”。
注意事项
Azure Functions 部署槽位具有以下注意事项:
- 应用可用的槽数取决于计划。 消耗计划仅允许一个部署槽。 在其他计划中运行的应用可以使用更多的槽。 有关详细信息,请参阅服务限制。
- 交换某个槽会重置其
AzureWebJobsSecretStorageType
应用设置等于files
的应用的密钥。 - 启用槽后,函数应用在门户中设置为只读模式。
- 当函数应用使用安全存储帐户作为其默认存储帐户(在
AzureWebJobsStorage
中设置)时,槽交换可能会失败。 有关详细信息,请查看WEBSITE_OVERRIDE_STICKY_DIAGNOSTICS_SETTINGS
参考。 - 使用短于 32 个字符的函数应用名称。 名称超过 32 个字符会有导致主机 ID 冲突的风险。