设置与 Service Directory 的集成

本指南假定您正在运行一个 Traffic Director 部署,并且已向 Service Directory 注册了至少一个服务。无论您是使用 Envoy 还是无代理 gRPC,这些设置说明都适用。

我们强烈建议您使用服务路由 API(而不是负载均衡 API)来设置 Traffic Director。

如需将 Service Directory 和 Traffic Director 配合使用,首先需要将您的服务发布到 Service Directory。如需了解一些常规概览信息,请参阅将服务发布到 Service DirectoryService Directory 文档

向 Service Directory 注册服务后,您便可以使用 Traffic Director 的 API 资源创建服务绑定。您需要创建一个专用于与 Service Directory 集成的后端服务,因为引用服务绑定的后端服务不能具有后端或关联的健康检查。

使用负载均衡 API 时的 Traffic Director 转发规则和主机规则要求

如果您配置 Traffic Director 以与 Service Directory 配合使用,并且您使用旧版负载均衡 API,请遵循以下准则:

  1. 确保 Traffic Director 转发规则使用 0.0.0.0 虚拟 IP 地址 (VIP)。
  2. 如果您拥有专用可用区,请确保网址映射中的主机规则与 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/"

角色和权限要求

在创建 Traffic Director 部署之前,请确保您拥有以下权限和角色。

服务绑定权限和角色

本部分不讨论项目级层 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 服务。

权限强制执行

配置 Traffic Director 时,系统会执行 IAM 权限检查。您必须具有必要的权限才能创建服务绑定并将服务绑定与特定的 Service Directory 服务相关联。具备必要的权限之后,您便可以配置网格客户端,以了解流量情况并将其发送到 Service Directory 服务。

由于这些检查在配置时进行,因此移除现有 Service Directory 服务上的绑定权限不会中断流量。建立服务绑定后,移除权限不会影响网格客户端了解流量并将其发送到 Service Directory 服务这一过程。

如需阻止网格客户端与 Service Directory 服务之间的通信,您可以使用其他机制:

  1. 限制对 Service Directory 服务的访问权限。例如,您可以使用防火墙规则或 Traffic Director 授权政策
  2. 删除 Service Directory 服务。
  3. 更新 Traffic Director 配置,例如您可以从后端服务中移除服务绑定。

最佳实践

  • 虽然 Service Directory 允许使用 Service Directory API 注册端点,但我们建议您使用集成(如果可用)来自动注册到 Service Directory。如需详细了解这些集成,请参阅 Service Directory for GKE 概览Service Directory 和 Cloud Load Balancing 概览
  • 我们建议您为特定的逻辑服务使用相同的命名空间和服务,即使该服务部署在多个不同的区域中也是如此。

使用 Service Directory 进行服务发现

下图简要介绍了此设置过程的结束状态,包括配置、不同系统的交互方式以及请求解析为服务端点的方式。此示例假定您已向 Service Directory 注册了一个服务。

使用 Service Directory 进行服务发现的配置详情。
使用 Service Directory 进行服务发现的配置详情(点击可放大)

如需将 Service Directory 服务提供给 Traffic Director 使用,请执行以下步骤。

  1. 在 Traffic Director 中创建新的后端服务,但不为该后端服务创建后端。
  2. 为 Service Directory 服务创建全局服务绑定。
  3. 将 Service Directory 服务绑定到此后端服务。(可选)在后端服务上设置其他字段和政策。

  4. 创建新的路由配置或更新现有配置,以便将客户端请求路由到新的后端服务。

您不能对引用服务绑定的后端服务设置健康检查。此类后端服务也不能有后端。

创建集成

按照以下说明将 Traffic Director 与 Service Directory 集成。

创建后端服务

按照以下说明在 Traffic Director 部署中创建后端服务。

  1. 创建要与 Service Directory 服务一起使用的后端服务。

    gcloud compute backend-services create td-sd-demo-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. 创建引用 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
    
  3. 将服务绑定到后端服务。

    gcloud beta compute backend-services update td-sd-demo-service \
     --global \
     --service-bindings my-sd-binding
    

创建后端服务并绑定一个或多个 Service Directory 服务后,Traffic Director 便开始跟踪与 Service Directory 服务关联的端点。端点是不同的 IP:端口对。如需使此服务可路由,您将需要配置路由。

配置路由

按照以下说明更新路由配置。

服务路由 API

以下示例假定您有一个名为 sidecar- meshMesh 资源。您创建一个 HTTPRoute 资源,将其主机名设置为 myservice.example.com,将目标设置为您在上一部分中创建的后端服务 td-sd-demo-service

  1. 创建 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"
    
  2. 导入 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,该主机规则便会导致系统使用路径匹配器。
  1. 创建一个指向后端服务的简单路径匹配器。

    gcloud compute url-maps add-path-matcher my-url-map \
     --global \
     --default-service td-sd-demo-service \
     --path-matcher-name my-path-matcher
    
  2. 将后端服务映射到现有网址映射中的新主机规则。

    gcloud compute url-maps add-host-rule my-url-map \
     --global \
     --path-matcher-name=my-path-matcher \
     --hosts=myservice.example.com
    

连接多个区域中的相同服务

Traffic Director 允许您将多个 Service Directory 服务绑定到同一后端服务。例如,您可能有两个 Service Directory 服务,这两个服务相同,但它们的端点位于不同的 Google Cloud 区域或地区。换句话说,一个全局后端服务可以有两个全局服务绑定,一个指向 us-east1 中的服务,另一个指向 us-west1 中的服务。

  1. 为导入的 Service Directory 服务创建后端服务。

    gcloud compute backend-services create td-sd-demo-service \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. 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 \
    
  3. 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 \
    
  4. us-east1us-west1 服务绑定到后端服务。

    gcloud compute backend-services update td-sd-demo-service \
      --global \
      --service-bindings us-east1-binding,us-west1-binding
    

应用高级流量管理政策

在上一部分中,您使用 Traffic Director 为现有 Service Directory 服务设置了路由政策。现在您可以将此模式应用于更高级的流量管理场景。

假设以下场景。您已有一个位于 Traffic Director 网格之外的 Canary 服务。该 Canary 版服务是内部应用负载均衡器的后端。您希望将 Traffic Director 网格中生成的一些生产流量重放到此外部服务。那么 Traffic Director 可以使用 RequestMirrorPolicy 来实现这一目标,它可以在处理请求时将流量发送到其他后端服务。此过程也称为请求覆盖,可让您在不影响生产服务的情况下检查流量。

您可以启用 Envoy 客户端以通过向 Traffic Director 网格添加或移除 Canary 服务端点来覆盖流向 Canary 服务的流量。然而,使用 Service Directory 集成时,该过程会更简单。

通过 Service Directory 使用镜像进行服务发现。
通过 Service Directory 使用镜像进行服务发现(点击可放大)

在本示例中,首先将后端服务指向付款 Canary 服务的 Service Directory 注册项。然后,向 Traffic Director 中的服务添加一个请求镜像政策。

  1. 为该请求镜像政策创建后端服务。

    gcloud compute backend-services create payments-canary-bes \
     --global \
     --load-balancing-scheme=INTERNAL_SELF_MANAGED
    
  2. 创建引用 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 \
    
  3. 将 Service Directory 服务绑定到 Canary 后端服务。

    gcloud beta compute backend-services update payments-canary-bes \
     --global \
     --service-bindings my-sd-binding
    
  4. 修改网址映射以将请求镜像到 Canary 服务。

    gcloud compute url-maps edit my-url-map \
      --region=global
    
  5. 将网址映射配置加载到编辑器中后,添加请求镜像政策以将请求镜像到现有 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-canary-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-serviceunbind-service 命令都属于 gcloud 结构体。它们不是 API 级层的结构体。

后续步骤