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

通过使用 Azure 自动重新配置基础结构

Azure 容器实例
Azure 应用程序网关
Azure Functions
Azure Monitor

容器化是应用现代化的一种常见方法。 可以考虑使用 Azure Kubernetes 服务处理高级工作负载,或使用 Azure 容器实例处理简单的容器工作负载,例如简单的 Web 应用程序。 本文重点介绍了在将应用程序网关用作防火墙时,如何为容器实例实现基础结构级无服务器自动化。

我们将从常见方案开始。 为了保护 Azure 容器实例,可以在 Azure 容器实例中使用容器组。 通过使用容器组,可以在虚拟网络中部署 Azure 容器实例,以便容器可以通过 Azure 专用终结点访问其他专用资源或其他 Azure 服务。 对于托管 Web 应用程序的客户,通常的做法是使用 Web 应用程序防火墙(如 Azure 应用程序网关)从前端传入流量,同时将 Azure 容器实例用作后端池。 可以参考这篇文章来入门:公开容器组的静态 IP 地址

这种方法的一个潜在挑战是使用非静态专用 IP 地址作为后端池。 专用 IP 可能在维护期间轮换,从而要求云管理员手动重新配置后端池。 如果添加了新容器用于缩放,管理员还需要重新配置,确保将流量路由到正确的后端池。 而且容器组中不支持运行情况探测和就绪情况探测,这就更难确定工作负载的停机时间。

本文探讨了通过采用 Application Insights 和 Azure Monitor 进行监测,以及使用 Azure Functions 自动轮换专用 IP,来解决这些常见问题的增强功能。 这种方法改进了工作负载的冗余度。

可能的用例

此体系结构最适合:

  • 无服务器部署。
  • 通过自动化实现对云原生工作负载的最少操作。
  • 不需要高级容器业务流程的简单容器工作负载。
  • 提供自动重新配置功能的高度冗余、面向外部的工作负载。
  • 需要访问专用资源的容器工作负载,例如由 Azure 专用终结点公开的专用资源。

体系结构

显示 Azure 容器实例的专用终结点正在访问 Azure Cosmos DB 的流程图。它的前面是 Azure 应用程序网关。

下载此体系结构的 Visio 文件

数据流

第 1 部分:典型的 Web 应用程序流量流

1a. 应用程序网关具有 Web 应用程序防火墙功能,非常适合在公共流量进入后端工作负载之前对其进行前端处理。 应用程序网关公开公共 IP 地址,因此 Azure DDoS 防护提供了另一层保护。

1b. 应用程序网关的后端池是使用容器组中 Azure 容器实例的专用 IP 地址配置的。 容器组中的 Azure 容器实例不附带完全限定的域名 (FQDN),因此必须使用 IP 地址。

1c. Azure 容器实例中的容器可以通过专用链接使用专用资源,例如 Azure Cosmos DB。

第 2 部分:通过自动化实现增强功能

2a. 应用程序网关包括一个“正常运行的主机计数”指标,可以用作 Azure 容器实例的运行情况探测,因为容器实例中的容器组不支持运行情况或就绪情况探测。

2b. Application Insights 在容器中用于收集其他指标(包括检测信号),这些指标可以通过自定义线程发送到 Application Insights 以进行监控。

2c. 可以基于步骤 2a 和 2b 中定义的阈值级别配置警报。 例如,假设系统有三个作为后端池运行的容器实例。 可以将警报配置为在正常运行的主机计数小于 3 时触发。 在预警规则的操作组中,可以使用 Azure 函数作为操作类型来触发自定义操作。

2d. 在 Azure 函数中,Azure SDK 用于获取现有容器实例的配置,并重新创建相同的实例。 此函数由步骤 2c 中定义的警报触发。 此函数可能需要很长时间才能运行,具体取决于设置的复杂程度。 Azure Functions 可能会超时,因此可以使用 Azure Durable Functions来处理长时间运行的进程并获取状态更新。

组件

自动化

  • Azure Durable Functions:与 Azure Functions 不同,Durable Functions 是有状态的,支持多个有状态工作流模式。 本例中使用的是监视器模式
  • Azure SDK:Azure SDK 是库的集合,可用于以你首选的编程语言与 Azure 服务进行交互。 使用 SDK 可以更灵活地集成执行自动化的逻辑。

监视

  • Azure Monitor 指标:这项 Azure Monitor 功能从 Azure 服务收集预定义的数值数据。
  • 操作组:操作组是由资源所有者定义的通知首选项的集合。 可以基于触发的警报来定义通知通道和操作。

网络

  • Azure DDoS 防护:Azure DDoS(基本)防护是免费的,已在所有公共 IP 上启用。 Azure DDoS 网络保护提供了更多功能,例如将日志引入其他位置,以及能够与 DDoS 防护的快速响应团队联系。
  • Azure 应用程序网关:Azure Web 应用程序防火墙为面向公众的应用程序提供保护,防范 SQL 注入和 XSS 攻击等漏洞的攻击。
  • Azure 专用链接:Azure 专用链接通过 Microsoft 主干上的专用终结点提供对 Azure PaaS 服务的访问,以进一步增强网络访问的安全性。

应用程序

  • Azure 容器实例:Azure 容器实例无缝运行容器映像,不需要设置其他基础结构。 应考虑将 Azure Kubernetes 服务 (AKS) 用于高级容器业务流程。
  • Azure Cosmos DB:Azure Cosmos DB 是一个完全托管的 NoSQL 数据库,支持 SQL、Cassandra 和 MongoDB 等多个平台。
  • Azure 密钥保管库:作为一种安全最佳做法,开发人员不会将连接字符串作为明文存储在应用程序源代码中。 Azure 密钥保管库作为存储机密的一个中心位置,提高了安全性。 应用程序可以检索必要的密钥,安全性得以提高。

备选方法

上述方案更新了用于应用程序网关的后端池。 作为备选方法,可以使用 Azure 专用 DNS 区域作为应用程序网关的目标后端,并使用 Azure 函数更新记录,而不是在应用程序网关上进行更改。 整个备选方法可以缩短部署的时间。 另一方面,应用程序网关指标无法识别主机计数,因为它将被 DNS 抽象化。 因此,需要通过 Application Insights 或 Azure Monitor 等应用程序监视解决方案直接触发这种自动化。

Azure 提供了多个选项来托管基于容器的工作负载,例如 Azure Kubernetes 服务Azure 应用服务

Azure Kubernetes 服务提供了高级容器业务流程和网络功能,比如服务资源,这在容器实例中是没有提供的。 此参考体系结构满足了这一要求。

应用服务还可以托管容器工作负载,应用服务环境让开发人员能够在 Azure 虚拟网络中部署应用服务。 与应用服务相比,容器实例的定价结构使其对于小型工作负载具有吸引力。

注意事项

可用性

由于容器组中不支持运行情况探测和就绪情况探测,因此我们建议使用 Azure Monitor 指标和 Azure Application Insights 进行监视。 对于要确定系统是否以端到端的方式运行,容器运行状况和运行时间并不是确定性的方法。

操作

如果容器实例出现故障,或者容器组的专用 IP 发生更改,则使用 Azure Durable Functions 重新配置基础结构。 按照此文档中所述,预配过程需要稍长一点的时间。 如果容器没有及时准备就绪,用户可能会经历最短的停机时间。

此体系结构增加了一层复原能力。 但仍建议在应用程序中配置监视,并监视 Azure 状态,了解平台是否出现故障。

可伸缩性

CPU 和内存要求是在创建容器时定义的,因此不能直接执行垂直缩放。 可以将容器添加到容器组中,以实现水平缩放。 但请注意,容器组中的每个容器都将使用一个专用 IP,所以限制将是预配的子网大小。

缩放的另一个重要注意事项是应用程序的状态。 应用程序需要在本地或通过使用外部服务(如 Azure Cache for Redis)来处理状态,以确保按需缩放不会在应用程序中造成数据丢失。

安全性

如果配置不正确,将 PaaS 部署到虚拟网络(VNet 注入)的功能就不会提高安全性。 VNet 注入为管理员提供了更多的网络控制,从而提供更严格的网络安全组和使用未公开的资源等优势。

专用链接将专用终结点投射到虚拟网络中,这使得应用程序可以通过专用 IP 地址直接访问 Azure PaaS。 同时,管理员可以进一步控制谁可以访问相关的 Azure PaaS。

如果将容器映像存储在 Azure 容器注册表中,可以启用适用于容器注册表的 Microsoft Defender 来执行容器映像漏洞扫描。

部署此方案

GitHub 上提供了示例源代码,其中使用 Azure Functions 执行自动化。

你需要一个服务主体(客户端 ID 和机密)。 Azure Functions 将用它来执行 Azure 资源管理器操作。 此服务主体至少需要拥有资源组中的所有者权限,以便它可以更新应用程序网关并创建 Azure 容器实例。 此示例创建了一个简单的 Python 应用程序,该应用程序已经过容器化并存储在容器注册表中。 请使用你自己的应用程序更新注册表。

定价

使用 Azure 定价计算器估算 Azure 资源的成本。

请参阅上述实现的此示例

作者

本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。

主要作者:

后续步骤

浏览我们的体系结构:

相关指南: