为 Cloud Run 配置 Cloud Service Mesh

本页介绍了如何配置 Cloud Service Mesh,以便在一系列计算基础架构上运行 Cloud Run 服务。

借助 Cloud Service Mesh,您可以启用网格高级流量管理功能,例如加权流量分割和全局负载均衡,以及从一个 Cloud Run 服务到另一个 Cloud Run 服务的流量的可观察性和安全性策略。此外,这还提供了一个全托管式数据平面解决方案,可消除维护自己的服务网格 Sidecar 的运维负担。

准备工作

  1. 熟悉 Cloud Service Mesh。

  2. 设置项目:

    gcloud config set core/project PROJECT_ID
  3. 在 Google Cloud 控制台中,为您的项目启用以下 API:

  4. gcloud 组件更新到最新版本(488.0.0 或更高版本):

    gcloud components update

所需的角色

如需获得配置和部署 Cloud Run 服务所需的权限,请让您的管理员为您授予以下 IAM 角色:

Cloud Run 客户端的服务账号还必须具有以下角色:

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 服务与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限管理访问权限

使用 Cloud Service Mesh 在 Cloud Run 服务之间进行调用

Cloud Run 使用 Cloud Service Mesh 服务路由 API。借助这些 API,Cloud Run 服务可以使用自定义网址(而非提供的 run.app 网址)调用其他 Cloud Run 服务。此外,Cloud Run 会自动对目标 Cloud Run 服务进行身份验证,因此您无需配置自己的身份验证即可将请求凭据附加到其他 Cloud Run 服务。

如需使用 Cloud Service Mesh 从一个 Cloud Run 服务调用另一个 Cloud Run 服务,请按以下步骤操作:

  1. 设置 Cloud Service Mesh
  2. 设置 Cloud DNS
  3. 创建目标 Cloud Run 服务
  4. 创建无服务器 NEG
  5. 创建客户端 Cloud Run 服务
  6. 从网格客户端调用服务

设置 Cloud Service Mesh

  1. 如需使用默认网址创建服务路线,请将 Mesh 规范保存在名为 mesh.yaml 的文件中:

    name: MESH_NAME

    MESH_NAME 替换为网格资源名称。

  2. 通过运行以下命令从规范导入 Mesh 资源:

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    MESH_NAME 替换为网格资源名称。

设置 Cloud DNS

如果您使用的是 Private Service Connect 端点,且将完整的 run.app 网址作为主机名,则可以跳过 Cloud DNS 设置并前往下一部分,因为系统只会捕获专用 IP 地址。

当网格客户端调用目标服务时,请求中使用的主机名必须可通过 DNS 解析。任何有效的 RFC 1918 IP 地址均可接受,因为边车会捕获发送到这些 IP 地址范围的所有 IP 流量,并进行适当的重定向。

以下示例展示了如何在 Cloud DNS 区域中创建一个解析为单个 IP 地址的通配符 * 条目。如果您不想使用专用 Cloud DNS 区域,请为与您希望从网格中寻址的 Cloud Run 服务对应的每个主机名创建 Cloud DNS 条目

  • 如需在专用区域中创建 Cloud DNS 记录,请运行以下命令:

    1. 在 Cloud DNS 中为服务网格创建一个私有代管式 DNS 区域。

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --network=VPC_NETWORK_NAME \
      --visibility=private
    2. 在新创建的托管专用区域中创建 DNS 记录。确保 IP 地址 10.0.0.1 未使用。

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      替换以下内容:

      • DOMAIN_NAME:DNS 网域的名称。
      • MESH_NAME:网格资源名称。
      • VPC_NETWORK_NAME:您的 VPC 网络的名称;例如“default”。

使用 Cloud Service Mesh 访问内部服务

借助 Cloud Run,您可以将传入的网络流量限制为“内部”。如果您的服务启用了此入站流量限制,那么当您启用 Cloud Run 的访问路径时,从网格通过 Virtual Private Cloud 网络传输的流量可以设置为“内部”。

如需使用 Cloud Service Mesh 访问内部服务,请使用以下方法之一:

创建目标 Cloud Run 服务

请注意,Cloud Run 目标的默认网址不能处于停用状态

  1. 部署新的或现有的 Cloud Run 服务:

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    替换以下内容:

    • DESTINATION_SERVICE_NAME:目标 Cloud Run 服务的名称。
    • REGION:区域的名称。
    • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest

创建无服务器网络端点组 (NEG)

  1. 运行以下命令以创建目的地 NEG:

    gcloud compute network-endpoint-groups create destination-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    替换以下内容:

    • REGION:区域的名称。
    • DESTINATION_SERVICE_NAME:目标 Cloud Run 服务的名称。
  2. 创建一个引用无服务器 NEG 的内部自行管理式后端服务。

    1. 创建后端服务:

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      DESTINATION_SERVICE_NAME 替换为目标服务的名称,并将 REGION 替换为区域的名称。

    2. 将无服务器后端添加到后端服务:

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=destination-neg \
      --network-endpoint-group-region=REGION

      DESTINATION_SERVICE_NAME 替换为目标服务的名称,并将 REGION 替换为区域的名称。

  3. 创建引用后端服务的 HTTP 路由。

    已配置 Mesh 资源和服务。将它们与 HTTPRoute 资源相连接,而此资源将主机名与后端服务相关联。

    1. 创建 HTTPRoute 规范并将其保存到名为 http_route.yaml 的文件中:

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      将主机名设置为您要用于访问服务的名称。同一服务网格中的所有客户端都可以使用 http://<HOSTNAME> 网址调用此服务,无论调用方的区域和项目如何。如果您已将 Cloud DNS 设置为使用专用 IP 地址,路由主机名也可以是完整的 run.app 网址地址,在这种情况下,您可以跳过 Cloud DNS 设置步骤。

      替换以下内容:

      • DESTINATION_SERVICE_NAME:目标 Cloud Run 服务的名称。
      • DOMAIN_NAME:DNS 网域的名称。
      • PROJECT_ID:项目的 ID。
      • MESH_NAME:网格的名称。
      • REGION:区域的名称。
    2. 使用 http_route.yaml 文件中的规范创建 HTTPRoute 资源:

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. 运行以下命令,为 Cloud Run 目标服务授予 Cloud Run Invoker 角色 (roles/iam.invoker):

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      替换以下内容:

      • DESTINATION_SERVICE_NAME:目标 Cloud Run 服务的名称。
      • REGION:区域的名称。
      • PROJECT_NUMBER:项目编号。

创建客户端 Cloud Run 服务

创建客户端 Cloud Run 服务会创建一个 Envoy 边车,其资源与 QPS 和总配置大小相关。在大多数情况下,CPU 使用率低于 vCPU 的 1%,内存用量低于 50 MB。

您必须对 Virtual Private Cloud 网络拥有网络出站访问权限。

  • 如需创建用于测试的客户端服务,请在 Cloud Run 中部署 fortio 应用,以允许将流量转发到 HTTP 路由:

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    替换以下内容:

    • CLIENT_SERVICE_NAME:客户端 Cloud Run 服务的名称。
    • REGION:你的区域的名称。
    • VPC_NETWORK_NAME:您的 VPC 网络的名称;例如“default”。
    • SUBNET_NAME:子网的名称;例如“default”。
    • PROJECT_ID:您的项目的 ID。
    • MESH_NAME网格资源名称。

从网格客户端调用服务

如需使用上文创建客户端服务部分中的 fortio 测试应用将请求转发到目标路由,请执行以下操作:

  1. 运行以下命令,提取您创建的 Cloud Run 客户端服务的网址:

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    替换以下内容:

    • CLIENT_SERVICE_NAME:客户端 Cloud Run 服务的名称。
    • REGION:你的区域的名称。
    • PROJECT_ID:您的项目的 ID。
  2. 使用 curl 命令向上一步中 fortio 端点的目标路线发送请求:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    替换以下内容:

    • DESTINATION_SERVICE_NAME:目标 Cloud Run 服务的名称。
    • DOMAIN_NAME:DNS 网域的名称。

从 Cloud Run 调用 Compute Engine 后端

如需使用代管式实例组作为后端部署 Compute Engine 和 Cloud Service Mesh 服务路由,请在 Cloud Service Mesh 中配置基于 Compute Engine 的 HTTP 服务器。这样,Cloud Run 客户端就可以使用此后端服务路由直接将请求发送到 Compute Engine 实例。

后续步骤