设置与 Service Directory 的集成
本指南假定您正在运行一个 Cloud Service Mesh 部署,并且已向 Service Directory 注册了至少一个服务。无论您是使用 Envoy 还是无代理 gRPC,这些设置说明都适用。
如需将 Service Directory 和 Cloud Service Mesh 配合使用,首先需要将您的服务发布到 Service Directory。如需了解一些常规概览信息,请参阅将服务发布到 Service Directory 或 Service Directory 文档。
向 Service Directory 注册服务后,您便可以使用 Cloud Service Mesh 的 API 资源创建服务绑定。您需要创建一个专用于与 Service Directory 集成的后端服务,因为引用服务绑定的后端服务不能具有后端或关联的健康检查。
使用负载均衡 API 时的 Cloud Service Mesh 转发规则和主机规则要求
如果您配置 Cloud Service Mesh 以与 Service Directory 配合使用,并且您使用旧版负载均衡 API,请遵循以下准则:
- 确保 Cloud Service Mesh 转发规则使用
0.0.0.0
虚拟 IP 地址 (VIP)。 - 如果您拥有专用可用区,请确保网址映射中的主机规则与 Service Directory 在您的 Cloud DNS 专用可用区中配置的 DNS 名称匹配。
如果不遵循这些准则,来自您的应用的出站请求可能会失败。
设置 network-services
API 端点
在创建和使用后端服务之前,请确保设置了 network-services
API 端点,以便正确引用 network-services
资源下的服务绑定资源。使用以下命令设置 network-services
API 端点。
export CLOUDSDK_API_ENDPOINT_OVERRIDES_NETWORKSERVICES="https://networkservices.googleapis.com/"
角色和权限要求
在创建 Cloud Service Mesh 部署之前,请确保您拥有以下权限和角色。
服务绑定权限和角色
本部分不讨论项目级层 Owner、Editor 和 Viewer 权限;仅涵盖创建、读取、更新和删除资源所需的权限和角色。
操作 | 权限 | 角色 |
---|---|---|
创建服务绑定。 | networkservices.serviceBindings.create |
网络管理员 |
获取服务绑定。 | networkservices.serviceBindings.get |
Network Admin、Network Viewer |
列出 Google Cloud 项目中的服务绑定。 | networkservices.serviceBindings.list |
Network Admin、Network Viewer |
更新服务绑定。 | networkservices.serviceBindings.update |
网络管理员 |
删除服务绑定。 | networkservices.serviceBindings.delete |
网络管理员 |
Service Directory 服务权限
Service Directory 管理员必须将 servicedirectory.services.bind
权限授予给尝试将服务绑定附加到 Service Directory 服务的服务账号。这样,该服务账号便可以使用 Service Directory 服务,这意味着该账号可以在服务绑定中引用 Service Directory 服务。
权限强制执行
配置 Cloud Service Mesh 时,系统会执行 IAM 权限检查。您必须具有必要的权限才能创建服务绑定并将服务绑定与特定的 Service Directory 服务相关联。具备必要的权限之后,您便可以配置网格客户端,以了解流量情况并将其发送到 Service Directory 服务。
由于这些检查在配置时进行,因此移除现有 Service Directory 服务上的绑定权限不会中断流量。建立服务绑定后,移除权限不会影响网格客户端了解流量并将其发送到 Service Directory 服务这一过程。
如需阻止网格客户端与 Service Directory 服务之间的通信,您可以使用其他机制:
- 限制对 Service Directory 服务的访问权限。例如,您可以使用防火墙规则。
- 删除 Service Directory 服务。
- 更新 Cloud Service Mesh 配置,例如您可以从后端服务中移除服务绑定。
最佳做法
- 虽然 Service Directory 允许使用 Service Directory API 注册端点,但我们建议您使用集成(如果可用)来自动注册到 Service Directory。如需详细了解这些集成,请参阅 Service Directory for GKE 概览和 Service Directory 和 Cloud Load Balancing 概览。
- 我们建议您为特定的逻辑服务使用相同的命名空间和服务,即使该服务部署在多个不同的区域中也是如此。
使用 Service Directory 进行服务发现
下图简要介绍了此设置过程的结束状态,包括配置、不同系统的交互方式以及请求解析为服务端点的方式。此示例假定您已向 Service Directory 注册了一个服务。
如需将 Service Directory 服务提供给 Cloud Service Mesh 使用,请执行以下步骤。
- 在 Cloud Service Mesh 中创建新的后端服务,但不为该后端服务创建后端。
- 为 Service Directory 服务创建全局服务绑定。
将 Service Directory 服务绑定到此后端服务。(可选)在后端服务上设置其他字段和政策。
创建新的路由配置或更新现有配置,以便将客户端请求路由到新的后端服务。
您不能对引用服务绑定的后端服务设置健康检查。此类后端服务也不能有后端。
创建集成
按照以下说明将 Cloud Service Mesh 与 Service Directory 集成。
创建后端服务
按照以下说明在 Cloud Service Mesh 部署中创建后端服务。
创建要与 Service Directory 服务一起使用的后端服务。
gcloud compute backend-services create td-sd-demo-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED
创建引用 Service Directory 服务的服务绑定。
gcloud beta network-services service-bindings create my-sd-binding \ --location global \ --service-directory-region us-east1 \ --service-directory-namespace my-namespace \ --service-directory-service my-service
将服务绑定到后端服务。
gcloud beta compute backend-services update td-sd-demo-service \ --global \ --service-bindings my-sd-binding
创建后端服务并绑定一个或多个 Service Directory 服务后,Cloud Service Mesh 便开始跟踪与 Service Directory 服务关联的端点。端点是不同的 IP:端口对。如需使此服务可路由,您将需要配置路由。
配置路由
按照以下说明更新路由配置。
服务路由 API
以下示例假定您有一个名为 sidecar-
mesh
的 Mesh
资源。您创建一个 HTTPRoute
资源,将其主机名设置为 myservice.example.com
,将目标设置为您在上一部分中创建的后端服务 td-sd-demo-service
。
创建
HTTPRoute
规范并将其保存到名为httproute.yaml
的文件中。name: td-sd-demo-route hostnames: ‐ myservice.example.com meshes: ‐ projects/PROJECT_NUMBER/locations/global/meshes/sidecar-mesh rules: ‐ action: destinations: ‐ serviceName: "projects/PROJECT_NUMBER/locations/global/backendServices/td-sd-demo-service"
导入
HTTPRoute
规范。gcloud network-services httproutes import td-sd-demo-route \ --source=httproute.yaml \ --location=global
负载均衡 API
以下示例假定您已拥有基本的路由配置,包括名为 my-url-map
的网址映射。
- 首先,为该网址映射创建一个路径匹配器。该路径匹配器不会复杂化。使用时,它会解析为您在上一步中创建的
td-sd-demo-service
。 - 接下来,向网址映射添加主机规则。如果请求指定主机名
myservice.example.com
,该主机规则便会导致系统使用路径匹配器。
创建一个指向后端服务的简单路径匹配器。
gcloud compute url-maps add-path-matcher my-url-map \ --global \ --default-service td-sd-demo-service \ --path-matcher-name my-path-matcher
将后端服务映射到现有网址映射中的新主机规则。
gcloud compute url-maps add-host-rule my-url-map \ --global \ --path-matcher-name=my-path-matcher \ --hosts=myservice.example.com
连接多个区域中的相同服务
借助 Cloud Service Mesh,您可以将多个 Service Directory 服务绑定到同一后端服务。例如,您可能有两个 Service Directory 服务,这两个服务相同,但它们的端点位于不同的 Google Cloud 区域或地区。换句话说,一个全局后端服务可以有两个全局服务绑定,一个指向 us-east1
中的服务,另一个指向 us-west1
中的服务。
为导入的 Service Directory 服务创建后端服务。
gcloud compute backend-services create td-sd-demo-service \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED
在
us-east1
中创建与 Service Directory 服务的服务绑定。gcloud beta network-services service-bindings create us-east1-binding \ --location global \ --service-directory-region us-east1 \ --service-directory-namespace my-namespace \ --service-directory-service my-service \
在
us-west1
中创建与 Service Directory 服务的服务绑定。gcloud beta network-services service-bindings create us-west1-binding \ --location global --service-directory-region us-west1 \ --service-directory-namespace my-namespace \ --service-directory-service my-service \
将
us-east1
和us-west1
服务绑定到后端服务。gcloud compute backend-services update td-sd-demo-service \ --global \ --service-bindings us-east1-binding,us-west1-binding
应用高级流量管理政策
在上一部分中,您使用 Cloud Service Mesh 为现有 Service Directory 服务设置了路由政策。现在您可以将此模式应用于更高级的流量管理场景。
假设以下场景。您已有一个位于 Cloud Service Mesh 网格之外的测试服务。测试服务是内部应用负载平衡器的后端。您希望将 Cloud Service Mesh 网格中生成的一些生产流量重放到此外部服务。Cloud Service Mesh 可以使用 RequestMirrorPolicy
来实现这一目标,它可以在处理请求时将流量发送到其他后端服务。此过程也称为请求覆盖,可让您在不影响生产服务的情况下检查流量。
您可以启用 Envoy 客户端以通过向 Cloud Service Mesh 网格添加或移除测试服务端点来覆盖流向测试服务的流量。然而,使用 Service Directory 集成时,该过程会更简单。
在本示例中,首先将后端服务指向付款测试服务的 Service Directory 注册项。然后,向 Cloud Service Mesh 中的服务添加一个请求镜像政策。
为该请求镜像政策创建后端服务。
gcloud compute backend-services create payments-test-bes \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED
创建引用 Service Directory 服务的服务绑定。
gcloud beta network-services service-bindings create my-sd-binding \ --location global \ --service-directory-region us-east1 \ --service-directory-namespace my-namespace \ --service-directory-service my-service \
将 Service Directory 服务绑定到测试后端服务。
gcloud beta compute backend-services update payments-test-bes \ --global \ --service-bindings my-sd-binding
修改网址映射以将请求镜像到测试服务。
gcloud compute url-maps edit my-url-map \ --region=global
将网址映射配置加载到编辑器中后,添加请求镜像政策以将请求镜像到现有 Service Directory 服务。
defaultService: my-project/global/default-service hostRules: - hosts: - '*' pathMatcher: path-matcher-one pathMatchers: - defaultService: my-project/global/default-service name: path-matcher-one pathRules: - paths: - /payments/ service: my-project/global/default-service requestMirrorPolicy: backendService: myproject/global/payments-test-bes
从后端服务中移除服务绑定
如需从后端服务中移除服务绑定,请将新的服务绑定列表传递给 gcloud compute backend-services update
命令。新列表不得包含您要删除的服务绑定:
- 如需移除所有服务绑定,请设置
--no-service-bindings
标志。 - 如需移除一个或多个服务绑定,请将排除了要移除的服务绑定的新服务绑定列表传递给
--service-bindings
标志。
添加或移除服务绑定
bind-service
命令会将服务绑定添加到后端服务上的现有服务绑定集中。
gcloud compute backend-services bind-service BACKEND_SERVICE_NAME \ --service-binding-name SERVICE_BINDING_URL \ --global
unbind-service
命令会从后端服务上的现有服务绑定集中移除服务绑定。
gcloud compute backend-services unbind-service BACKEND_SERVICE_NAME \ --service-binding-name SERVICE_BINDING_URL \ --global
bind-service
和 unbind-service
命令都属于 Google Cloud CLI 结构体。它们不是 API 级层的结构体。
后续步骤
- 如需了解此集成的可观测性,请参阅 Service Directory 的可观测性和调试。