自托管网关概述

自承载网关是每个 API 管理服务中包含的默认托管网关的可选容器化版本。 对于将网关置于托管 API 的同一环境中等场景,它非常有用。 使用自承载网关可改善 API 流量流,并满足 API 安全性与合规性要求。

本文介绍 Azure API 管理的自托管网关功能如何实现混合和多云 API 管理,从较高层面演示其体系结构,并重点介绍其功能。

有关各种网关产品/服务的功能的概述,请参阅 API 管理中的 API 网关

混合和多云 API 管理

自承载网关功能扩展了混合和多云环境的 API 管理支持,使组织能够安全有效地从 Azure 中的单个 API 管理服务来管理本地和跨云承载的 API。

借助自承载网关,客户可以灵活地将 API 管理网关组件的容器化版本部署到用于承载其 API 的相同环境。 所有自承载网关都是通过与它们联合的 API 管理服务进行管理的,因此,在所有内部和外部 API 中可为客户提供直观统一的管理体验。

每个 API 管理服务由以下关键组件构成:

  • 作为 API 公开的管理平面,用于通过 Azure 门户、PowerShell 和其他支持的机制配置服务。
  • 网关(或数据平面),负责代理 API 请求、应用策略以及收集遥测数据
  • 开发人员门户,供开发人员用来发现、学习 API 以及在登记后使用 API

默认情况下,所有这些组件都部署在 Azure 中,因此,无论实现 API 的后端承载在何处,所有 API 流量(在下图中以黑色实线箭头指示)都会流经 Azure。 此模型虽然在操作上比较简单,但代价是增大延迟,造成合规性问题,而且在某些情况下还会产生额外的数据传输费。

不使用自承载网关的 API 流量流

如果将自托管网关部署到后端 API 实现所在的相同环境,则可以使 API 流量直接流向后端 API,从而减少延迟,减少数据传输成本,并且在实现合规性的同时,可以继续享有单一管理点、以及发现并观察组织中所有 API 的优势,而不管这些 API 的实现托管在何处。

使用自承载网关的 API 流量流

打包

自托管网关在 Microsoft Artifact Registry 中以基于 Linux 的 Docker 容器映像的形式提供。 它可以部署到 Docker、Kubernetes,或任何其他在本地服务器节点上、云基础结构上或出于评估和开发目的在个人计算机上运行的容器业务流程解决方案。

容器映像

为了满足你的需求,我们提供了用于自承载网关的各种容器映像:

标记约定 建议 示例 滚动标记 推荐用于生产
{major}.{minor}.{patch} 使用此标记就可以始终运行同一版本的网关 2.0.0 ✔️
v{major} 使用此标记就可以始终使用每个新功能和补丁运行一个主版本的网关。 v2 ✔️
v{major}-preview 如果你始终需要运行最新的预览版容器映像,请使用此标记。 v2-preview ✔️
latest 如果要评估自承载网关,请使用此标记。 latest ✔️

可以在此处找到可用标记的完整列表。

在我们的官方部署选项中使用标记

Azure 门户中的部署选项使用 v2 标记,使客户可以使用最新版自承载网关 v2 容器映像和所有功能更新及补丁。

注意

我们提供了命令和 YAML 代码片段作为参考,你可以随意使用更具体的标记。

使用 Helm chart 进行安装时,将会为你优化图像标记。 Helm 图表的应用程序版本会将网关固定到给定版本,而不依赖于 latest

详细了解如何使用 Helm 在 Kubernetes 上安装 API 管理自托管网关

使用滚动标记的风险

滚动标记是发布新版容器映像时可能会更新的标记。 因此,容器用户可接收容器映像的更新,而无需更新其部署。

这意味着你可能会在不知道的情况下并行运行不同版本,例如,在更新 v2 标记后执行缩放操作时就是如此。

示例 - v2 标记已通过 2.0.0 容器映像发布,但当发布 2.1.0 时,v2 标记将链接到 2.1.0 映像。

重要

请考虑在生产环境中使用特定版本的标记,以避免无意中升级到较新版本。

连接到 Azure

自托管网关需要通过端口 443 来与 Azure 建立出站 TCP/IP 连接。 每个自托管网关必须与单个 API 管理服务相关联,并通过其管理平面进行配置。 自托管网关使用与 Azure 的连接来执行以下操作:

  • 通过每隔一分钟发送检测信号消息来报告自身的状态
  • 定期(每隔 10 秒)检查配置更新,每当有可用更新时应用这些更新
  • 将指标发送到 Azure Monitor(如果采用此配置)
  • 将事件发送到 Application Insights(如果采用此设置)

FQDN 依赖项

若要正常运行,每个自托管网关需要在端口 443 上与以下终结点建立出站连接,这些终结点与其基于云的 API 管理示例关联:

重要

  • DNS 主机名必须可解析为 IP 地址,并且相应的 IP 地址必须可访问。
  • 关联的存储帐户名称列在 Azure 门户的服务的“网络连接状态”页。
  • 关联存储帐户下的公共 IP 地址是动态的,可能在不另行通知的情况下更改。

如果与 API 管理实例集成,则还启用以下项的到关联公共 IP 地址、端口和主机名的出站连接:

网关 v2 要求

自承载网关 v2 需要以下各项:

  • API 管理实例的主位置中的公共 IP 地址
  • 实例的配置终结点的主机名:<apim-service-name>.configuration.azure-api.cn

此外,在其策略中使用 API 检查器或配额的客户必须确保可访问以下依赖项:

  • 实例的关联 Blob 存储帐户的主机名:<blob-storage-account-name>.blob.core.chinacloudapi.cn
  • 实例的关联表存储帐户的主机名:<table-storage-account-name>.table.core.chinacloudapi.cn
  • 与 API 管理实例的主位置对应的存储服务标记中的公共 IP 地址。

网关 v1 要求

自承载网关 v1 需要以下各项:

  • API 管理实例的主位置中的公共 IP 地址
  • 实例的管理终结点的主机名:<apim-service-name>.management.azure-api.cn
  • 实例的关联 Blob 存储帐户的主机名:<blob-storage-account-name>.blob.core.chinacloudapi.cn
  • 实例的关联表存储帐户的主机名:<table-storage-account-name>.table.core.chinacloudapi.cn
  • 与 API 管理实例的主位置对应的存储服务标记中的公共 IP 地址。

连接失败

与 Azure 断开连接时,自托管网关无法接收配置更新、报告自身的状态或上传遥测数据。

自托管网关采用“静态失败”设计,在暂时与 Azure 断开连接时可以留存。 可以在启用或不启用本地配置备份的情况下部署自托管网关。 通过配置备份,自托管网关会定期将下载配置的备份副本保存在已附加到其容器或 pod 的持久性卷上。

已禁用配置备份且与 Azure 中断连接时:

  • 正在运行的自托管网关将使用配置的内存中副本继续正常工作
  • 已停止的自承载网关将无法启动

已启用配置备份且与 Azure 中断连接时:

  • 正在运行的自托管网关将使用配置的内存中副本继续正常工作
  • 已停止的自托管网关将可以使用配置的备份副本启动

连接恢复后,受中断影响的每个自承载网关将自动重新连接到其关联的 API 管理服务,并下载它处于“脱机”状态时发生的所有配置更新。

安全性

限制

托管网关中的以下功能在自托管网关中不可用:

  • TLS 会话恢复。
  • 客户端证书重新协商。 若要使用客户端证书身份验证,API 使用者必须出示其证书作为初始 TLS 握手的一部分。 为确保此行为,请在配置自承载网关自定义主机名(域名)时启用协商客户端证书设置。

传输层安全 (TLS) (Transport Layer Security) (TLS)

重要

此概述仅适用于自承载网关 v1 和 v2。

支持的协议

默认情况下,自承载网关支持 TLS v1.2。

使用自定义域的客户可以在控制平面启用 TLS v1.0 和/或 v1.1。

可用密码套件

重要

此概述仅适用于自承载网关 v2。

自承载网关对客户端和服务器连接使用以下密码套件:

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_DHE_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA

管理密码套件

从 v2.1.1 及更高版本起,可以通过配置管理正在使用的密码:

  • 使用 net.server.tls.ciphers.allowed-suites 可以定义以逗号分隔的密码列表,以用于 API 客户端和自承载网关之间的 TLS 连接。
  • 使用 net.client.tls.ciphers.allowed-suites 可以定义以逗号分隔的密码列表,以用于自承载网关和后端之间的 TLS 连接。

后续步骤