Cloud Service Mesh 服务路由 API 概览
本文档适用于对 Cloud Service Mesh 和服务网格概念具有中高级熟悉程度且在 Compute Engine 上使用虚拟机实例部署 Cloud Service Mesh 的网格或平台管理员和服务开发者。本文档适用于使用 Envoy 和 gRPC 客户端的部署。如需详细了解 Cloud Service Mesh 概念,请参阅概览。
Cloud Service Mesh 为您的应用提供服务网络功能,包括高级流量管理、可观测性和安全性。但是,对网格管理员和服务开发者而言,配置和运营服务网格是一项复杂的任务。
本文档介绍了用于配置 Cloud Service Mesh 的服务路由 API。这些 API 旨在简化和改进整体网格配置体验。
服务路由模型使用名为 Mesh
、Gateway
和 Route
的 API 资源。在定义服务网络控制平面时,这些资源可提供与上下文更相关的配置体验。
本文档介绍了以下服务路由 API 模型和资源。
Mesh
资源- Envoy 边车代理和无代理 gRPC 客户端的服务到服务(东西向)流量管理和安全配置。
-
- 充当入站流量网关的 Envoy 代理的流量管理和安全配置,允许外部客户端连接到服务网格(南北向)。
以下类型的
Route
资源:
Google Cloud 控制台不提供对服务路由 API 的支持。您必须使用 Google Cloud CLI 或 REST API 实现这些 API 资源。
使用场景和优势
借助服务路由 API,您便可以为无代理 gRPC 和 Envoy 代理部署配置 Cloud Service Mesh。服务路由 API 模型具有多项关键优势。
在下图中,服务网格中的两项服务通过 Mesh
资源进行连接。两个 HTTPRoute
资源会配置路由。网格或平台管理员管理 Mesh
资源,而两个服务所有者为其服务创建路由配置。
面向角色的 API 设计可实现明确的职责分离
服务路由 API 可让您根据组织角色分离网格配置职责:
- 网格管理员可以定义逻辑网格以及入站流量网关基础架构。
- 服务所有者(应用开发者)可以独立定义其服务的访问模式。他们还可以为服务定义和应用流量管理政策。
在下图中,Cloud Load Balancing 和 Gateway
资源为从客户端(不在网格中)进入网格的流量提供了入站流量网关。网格管理员配置和管理 Gateway
资源,而服务所有者配置和管理自己的服务和流量路由。
通过自助服务模型增强可靠性
服务路由 API 使用按协议、按路由的资源,这些资源可由独立服务所有者配置和拥有。这样做具有很多优势.
- 服务所有者可以自主选择如何为其拥有的服务配置政策和流量管理。
- 更新一个
Route
资源不会影响网格中的其他Route
资源。更新过程更可靠,因为服务所有者管理的配置较小。 - 负责目标服务或主机名的服务所有者拥有每个
Route
资源。 - 服务所有者无需依赖网格管理员即可更新路由。
在共享 VPC 环境中启用跨多个项目的服务网格
借助服务路由 API 模型,服务所有者可以使用共享 VPC 和其他连接方法参与共享网格基础架构,同时保持对其服务的独立控制。例如,服务所有者可以在自己的项目中定义 Route
资源。平台管理员可以在集中管理的宿主项目中定义 Mesh
,然后向服务所有者授予 IAM 权限,使其 Route
资源关联到共享 Mesh
或 Gateway
。下图展示了使用共享 VPC 的示例。
通过服务路由 API,您还可以使用 VPC 网络对等互连将服务网格客户端连接到不同网络。
根据服务器名称指示符路由流量
借助 TLSRoute
资源,您可以根据 TLS 握手中的服务器名称指示 (SNI) 路由通过 TLS 加密的流量。您可以通过在 TLSRoute
资源中配置 SNI 匹配项,将 TLS 流量配置为路由到相应的后端服务。在这些部署中,代理仅路由流量,并且会在目标后端实例上终止 TLS 会话。
只有部署为 Sidecar 代理或网关的 Envoy 代理支持 TLSRoute
资源。
将 TLSRoute
资源挂接到 Mesh
资源
下图中显示的部署会将 SNI 扩展值为 service1
的所有服务网格流量路由到后端服务 service1
。此外,SNI 扩展值为 service2
的所有服务网格流量则会被路由到后端服务 service2
。SNI 扩展值和后端服务名称彼此独立。
将 TLSRoute
资源挂接到 Gateway
资源
下图中显示的部署会将发送到 SNI 扩展值为 serviceA
的 Gateway
资源的所有入站流量路由到后端服务 serviceA
。此外,发送到 SNI 扩展值为 serviceB
的 Gateway
的所有入站流量则会被路由到后端服务 serviceB
。SNI 扩展值和后端服务名称彼此独立。SNI 扩展值和 HTTP 请求中的标头也是彼此独立的。
Gateway
资源不会终止 Gateway
的 Envoy 代理上的 TLS 连接。相反,TLS 连接会在相应的后端服务上终止。Gateway
无法检查 TLS 层中加密的任何信息,但在查看 ClientHello
时除外,其包含一个纯文本 SNI 扩展。Gateway
在此模式下执行 TLS 直通。请注意,加密的 ClientHello
不受支持。
核心 gRPC 支持
您可以使用核心 gRPC 属性(例如按方法匹配)配置无代理 gRPC 客户端。
TCP 流量的流量拆分
您可以跨多个后端服务为 TCP 流量实现基于权重的流量拆分。您可以在更新服务时配置模式,例如 Canary 版(蓝绿色)部署。通过流量拆分,您还可以可控方式迁移流量,而无需停机。
流量拦截
使用服务路由 API Mesh
和 Gateway
资源时,所有流量都会被自动拦截。如需了解详情,请参阅为 Compute Engine 虚拟机进行自动 Envoy 部署的设置选项。
架构和资源
本部分介绍了服务路由 API 模型及其资源,并帮助您了解服务路由 API 资源如何协同工作。
Mesh
资源
Mesh
资源表示服务网格的实例。您可以用它在项目中创建逻辑服务网格。每个 Mesh
资源在项目中都必须具有唯一的名称。创建 Mesh
资源后,无法修改其名称。
Route
资源中引用了 Mesh
资源,用于为属于该网格的服务添加路由。
Envoy 代理和无代理 gRPC 客户端通过加入由 Mesh
资源的名称标识的服务网格从 Cloud Service Mesh 接收配置。Mesh
资源支持以下数据平面部署:
- Envoy 作为边车代理与应用一起运行
- 无代理 gRPC 客户端
- 将 Envoy 边车和无代理 gRPC 客户端混用
Route
资源
Route
资源用于设置通往服务的路由。Route
API 资源有四种不同的类型。它们定义用于将流量路由到后端服务的协议。
HTTPRoute
GRPCRoute
TCPRoute
TLSRoute
该 API 不包含逐字 Route
API。唯一可配置的 API 资源是 HTTPRoute
、GRPCRoute
、TCPRoute
和 TLSRoute
。
Route
资源引用一个或多个 Mesh
和 Gateway
资源来添加属于相应 Mesh
或 Gateway
配置的路由。Route
资源可以引用 Gateway
和 Mesh
资源。
Route
资源还引用一个或多个后端服务资源。这些服务使用后端服务 API 进行配置。您需要创建指向一个或多个 MIG 或 NEG 后端的后端服务资源。
下图显示了 Mesh
、Gateway
和 Route
资源与后端服务资源及其后端之间的关系。
您可以在 Route
资源中定义其他流量管理功能,例如路由、标头修改、超时和基于权重的流量拆分。例如,在下图中,HTTPRoute
资源定义了两个后端服务之间的流量拆分比例为 70%/30%。
为了简化服务网格的管理,您可以列出关联到 Mesh
或 Gateway
资源的所有 Route
资源。
TLSRoute
项资源
使用 TLSRoute
资源时,系统会根据 SNI 主机名和应用层协议协商 (ALPN) 名称将 TLS 流量路由到后端服务。TLSRoute
配置表示 TLS 直通,其中 Envoy 代理不会终止 TLS 流量。
TLSRoute
资源会引用一个或多个 Mesh
和 Gateway
资源来添加属于相应网格或网关配置的路由。
TLSRoute
资源还会引用一个或多个后端服务资源。这些服务使用后端服务 API 资源进行配置。
Gateway
项资源
Gateway
资源用于表示充当入站流量网关的 Envoy 代理,允许外部客户端连接到服务网格(南北向流量)。此资源具有侦听端口以及 scope
参数。充当入站流量网关的 Envoy 代理会绑定到指定的端口,以及绑定到 0.0.0.0
(表示本地虚拟机上的所有 IP 地址)。下图显示了部署为 Ingress 服务并由 Gateway
资源配置的 Envoy 代理。在此特定示例中,Envoy 代理配置为侦听客户端上端口 80 的传入连接。
Gateway
API 资源仅支持 Envoy 代理数据平面。它不支持无代理 gRPC。Gateway
资源支持 gRPCRoutes
,但 gRPC 流量由充当中间代理的 Envoy 代理进行路由。
什么是 Gateway
范围及合并的 Gateway
配置?
Gateway
资源实例表示端口和特定于在这些端口上接收的流量的配置。Gateway
API 资源具有参数 scope
,该参数用于对两个或更多 Gateway
资源的配置进行逻辑分组和合并。
例如,如果您希望 Gateway
代理侦听端口 80 和 443 以分别接收 HTTP 和 HTTPS 流量,则需要创建两个 Gateway
资源。使用端口 80 配置一个 Gateway
资源以用于 HTTP 流量,然后使用端口 443 配置另一个资源以用于 HTTPS 流量。为两个资源中的 scope
字段指定相同的值。Cloud Service Mesh 会动态合并具有相同范围的所有网关的各个配置。对于数据平面端,在入站流量网关模式下运行的 Envoy 代理也必须向 Cloud Service Mesh 提供相同的范围参数才能接收 Gateway
配置。请注意,您需要在创建 Gateway
资源时指定范围,并且需要为代理指定与引导参数相同的范围。
以下是 Gateway
资源的关键注意事项:
Gateway
范围参数是必需的。在Gateway
资源中和 Envoy 代理的引导配置中指定范围,即使只有一个Gateway
存在也是如此。- 创建
Gateway
资源不会使用 Envoy 代理部署服务。部署 Envoy 代理是一个单独的步骤。 Gateway
资源具有表示入站流量部署类型的type
。此字段预留以供将来使用。当前唯一支持的值是OPEN_MESH
,这是默认值,无法修改。
使用混合协议和数据平面的网格部署
您可以进行混合数据平面部署,并将 Envoy 代理和无代理 gRPC 置于同一网格中。创建此类部署时,请考虑以下事项。
- Envoy 边车部署支持所有路由(
HTTPRoute
、GRPCRoute
、TCPRoute
和TLSRoute
)。 - 无代理 gRPC 部署仅支持
GRPCRoute
。 GRPCRoute
仅限于 gRPC 无代理部署支持的功能。
多项目共享 VPC 环境中支持的拓扑
Cloud Service Mesh 支持将其他项目中定义的 Route
资源添加到集中式管理项目中定义的 Mesh
或 Gateway
资源。已获授权的服务所有者可以直接将其服务路由配置添加到 Mesh
或 Gateway
。
在典型的跨项目场景中,您选择项目(宿主项目或集中控制的管理项目)作为在其中创建 Mesh
资源的网格管理项目。网格管理项目所有者授权其他项目中的 Route
资源引用 Mesh
资源,从而允许来自其他项目的路由配置成为网格的一部分。网格数据平面(无论是 Envoy 还是 gRPC)从管理项目请求配置,并接收关联到 Mesh
的所有路由的并集。对于 Gateway
,路由也会合并到所有使用相同范围的 Gateways
中。
Mesh
管理项目可以是您选择的任何项目,只要底层项目具有共享 VPC 网络连接(通过共享 VPC 或 VPC 网络对等互连),配置就有效。
IAM 权限和角色
以下是安全获取、创建、更新、删除、列出以及使用 Mesh
和 Route
资源所需的 IAM 权限。
- Mesh 管理员需要具有
networkservices.mesh.*
权限。 - Gateway 管理员需要具有
networkservices.gateways.*
权限。 - 服务所有者需要具有
networkservices.grpcRoutes.*
、networkservices.httpRoutes.*
或networkservices.tcpRoutes.*
权限。
Mesh 管理员需要向服务所有者授予 networkservices.mesh.use
权限,以便服务所有者将其 Route
资源关联到 Mesh
资源。同一模型也适用于 Gateway
资源。
如需查看 Mesh
资源的所有 IAM 权限,请前往 IAM 权限参考页面,然后搜索 meshes
。
无需其他预定义角色。现有的预定义角色 Compute Network Admin (roles/compute.networkAdmin
) 默认具有 networkservices.*
权限。您可能需要将上述权限添加到自定义角色中。
注意事项和限制
- Google Cloud 控制台不支持服务路由 API。
- 使用 xDS API 版本 3 或更高版本。
- 最低 Envoy 版本 1.20.0(因为只有 xDS 版本 3 支持服务路由 API)
- gRPC 引导生成器最低版本 v0.14.0
- 只有部署为 Sidecar 代理或网关的 Envoy 代理支持
TLSRoute
资源。 - 仅支持具有自动 Envoy 部署的 Compute Engine 虚拟机和支持自动 Envoy 注入的 GKE Pod。您不能将手动部署与服务路由 API 一起使用。
- 服务路由 API 不向后兼容旧版 API。
- 当
TCPRoute
资源关联到Mesh
资源时,用于匹配 TCP 流量的端口不能用于处理此TCPRoute
所描述的流量以外的任何内容。- 例如,您的部署可能包含与端口“8000”匹配的
TCPRoute
资源以及 HttpRoute 资源。当两者都关联到同一Mesh
资源时,即使底层 IP 地址不同,由HTTPRoute
资源路由的流量也无法使用端口 8000。此限制来自 Envoy 代理实现,该实现会先分配与端口匹配的路由的优先级。
- 例如,您的部署可能包含与端口“8000”匹配的
Gateway
资源不会预配代管式负载均衡器,也不会动态创建 Envoy 服务。- 自动部署的 Envoy 充当入站流量网关的
serving_ports
参数不得添加到--service-proxy
标志。 - 自动部署的 Envoy 不支持提供与虚拟机项目不同的项目编号。
后续步骤
- 如需了解如何列出与
Mesh
或Gateway
资源关联的路线资源,请参阅列出Route
资源。此功能处于预览阶段。 - 如需了解服务路由 API,请参阅网络服务 API 的文档。