设置跨项目网络端点组

借助跨项目网络端点组 (NEG) 功能,客户可以将来自其他项目的 NEG 附加到 Traffic Director/Cloud Service Mesh BackendService,从而实现以下使用场景:

  • 在多项目部署中,BackendServices 及其关联的路由和流量政策位于集中式项目中,后端端点来自不同的项目。

  • 在多项目部署中,您可以在一个中心Google Cloud 项目中集中管理所有计算资源(如 Compute Engine 虚拟机、GKE NEG 等),而各服务团队则拥有各自的 Google Cloud 服务项目,并在其中定义以 BackendServices 和服务路由形式表达的服务政策。这样可以将服务管理委托给各团队,同时仍可对可能在团队间共享的计算资源进行严格控制。

本页介绍如何创建一个基本的双项目设置,其中项目 A(称为工作负载项目)中的 NEG 被附加到项目 B(称为政策项目)中的 BackendService。以下示例在工作负载项目的默认 VPC 网络中部署虚拟机,并演示客户端如何根据政策项目中的配置将流量路由至工作负载项目。

基准跨项目 NEG 示例

在更复杂的设置中,需要使用共享 VPC 等方案,在多个项目之间构建互通的数据平面。这也意味着每个 NEG 端点都拥有唯一的 IP 地址。此示例设置可扩展到更复杂的场景,例如工作负载部署在跨多个项目的共享 VPC 网络中。

限制

适用常规的 Traffic Director 限制BackendService/NetworkEndpointGroup 限制

以下限制同样适用,但不一定仅限于多项目设置:

  • 单个 BackendService 最多只能支持 50 个后端(包括 NEG、MIG)。
  • 仅支持类型为 GCP_VM_IP_PORT 的区域级 NEG。
  • 不支持将跨项目 BackendService 引用指向实例组(无论是托管式还是非托管式)
  • 不支持列出可附加到给定 BackendService 的跨项目 NEG。
  • 不支持列出使用特定 NEG 的跨项目 BackendService。

准备工作

在设置跨项目 NEG 之前,您必须先完成以下前提条件。

启用所需的 API

完成本指南需启用以下 API:

  • osconfig.googleapis.com
  • trafficdirector.googleapis.com
  • compute.googleapis.com
  • networkservices.googleapis.com

运行以下命令,以在工作负载项目和政策项目中启用所需的 API:

gcloud services enable --project PROJECT_ID \
    osconfig.googleapis.com \
    trafficdirector.googleapis.com \
    compute.googleapis.com \
    networkservices.googleapis.com

授予所需的 IAM 权限

如需完成本指南,您必须具备足够的 Identity and Access Management (IAM) 权限。如果您在启用 Cloud Service Mesh 的项目中拥有项目 Owner 或 Editor 角色(roles/ownerroles/editor),您将自动拥有正确的权限。

否则,您必须授予以下所有 IAM 角色。拥有这些角色即表示您也具有其对应的权限,如 Compute Engine IAM 文档中所述。

在工作负载项目和政策项目中需要以下角色:

  • roles/iam.serviceAccountAdmin
  • roles/serviceusage.serviceUsageAdmin
  • roles/compute.networkAdmin

以下角色仅在工作负载项目中需要:

  • roles/compute.securityAdmin
  • roles/container.admin
  • 包含以下权限的任何角色。将 NEG 附加到 BackendService 所需的所有权限中,最精细的预定义角色是 roles/compute.loadBalancerServiceUser
    • compute.networkEndpointGroups.get
    • compute.networkEndpointGroups.use

此外,Traffic Director 管理的 xDS 客户端(如 Envoy 代理)还必须具备 roles/trafficdirector.client 下的权限。出于演示目的,您可以使用以下命令,在政策项目中将此权限授予工作负载项目的默认 Compute Engine 服务账号:

gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
    --member "serviceAccount:WORKLOAD_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
    --role "roles/trafficdirector.client"

其中

  • POLICY_PROJECT_ID 是政策项目的 ID。
  • WORKLOAD_PROJECT_NUMBER 是工作负载项目的编号。

在工作负载项目中配置服务后端

  1. 运行以下命令,将 Google Cloud CLI 指向政策项目并设置首选 Google Cloud 计算可用区:

    gcloud config set project WORKLOAD_PROJECT_ID
    gcloud config set compute/zone ZONE
    

    其中

    • WORKLOAD_PROJECT_ID 是工作负载项目的 ID。
    • ZONE 是 GKE 集群所在的可用区,例如 us-central1
  2. 创建 GKE 集群。出于演示目的,以下命令会创建一个可用区级 GKE 集群。不过,此功能也适用于区域性 GKE 集群。

    gcloud container clusters create test-cluster \
        --scopes=https://www.googleapis.com/auth/cloud-platform
        --zone=ZONE
    
  3. 创建防火墙规则:

    gcloud compute firewall-rules create http-allow-health-checks \
        --network=default \
        --action=ALLOW \
        --direction=INGRESS \
        --source-ranges=35.191.0.0/16,130.211.0.0/22 \
        --rules=tcp:80
    

    防火墙规则允许 Google Cloud 控制平面向默认 VPC 网络中的后端发送健康检查探测。

  4. 将 kubectl 的当前上下文更改为新创建的集群:

    gcloud container clusters get-credentials test-cluster \
        --zone=ZONE
    
  5. 创建并部署 whereami 示例应用:

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: whereami
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: whereami
      template:
        metadata:
          labels:
            app: whereami
        spec:
          containers:
          - name: whereami
            image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: whereami
      annotations:
        cloud.google.com/neg: '{"exposed_ports":{"8080":{"name": "example-neg"}}}'
    spec:
      selector:
        app: whereami
      ports:
      - port: 8080
        targetPort: 8080
    EOF
    
  6. 运行以下命令,将对 NEG 的引用存储在变量中:

    NEG_LINK=$(gcloud compute network-endpoint-groups describe example-neg --format="value(selfLink)")
    

    NEG 控制器会自动为每个可用区中的服务后端创建一个可用区级 NetworkEndpointGroup。在此示例中,NEG 名称已硬编码为 example-neg。将其保存在变量中,可在下一步将该 NEG 附加到政策项目中的 BackendService 时使用。

    如果查看 $NEG_LINK 示例,其值应类似于以下内容:

    $ echo ${NEG_LINK}
    https://www.googleapis.com/compute/v1/projects/WORKLOAD_PROJECT/zones/ZONE/networkEndpointGroups/example-neg
    

    或者,您也可以通过读取服务上的 neg-status 注解来检索 NEG 网址:

    kubectl get service whereami -o jsonpath="{.metadata.annotations['cloud\.google\.com/neg-status']}"
    NEG_LINK="https://www.googleapis.com/compute/v1/projects/WORKLOAD_PROJECT_ID/zones/ZONE/networkEndpointGroups/example-neg"
    

在政策项目中配置 Google Cloud 网络资源

  1. 将 Google Cloud CLI 指向政策项目:

    gcloud config set project POLICY_PROJECT_ID
    
  2. 配置网格资源:

    gcloud network-services meshes import example-mesh --source=- --location=global << EOF
    name: example-mesh
    EOF
    

    网格资源的名称是边车代理用来请求服务网格配置的关键。

  3. 使用健康检查配置基准 BackendService

    gcloud compute health-checks create http http-example-health-check
    
    gcloud compute backend-services create example-service \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED \
      --protocol=HTTP \
      --health-checks http-example-health-check
    
  4. 将上一部分中创建的 NetworkEndpointGroup 附加到 BackendService

    gcloud compute backend-services add-backend example-service --global \
      --network-endpoint-group=${NEG_LINK} \
      --balancing-mode=RATE \
      --max-rate-per-endpoint=5
    
  5. 创建 HTTPRoute,将包含主机标头 example-service 的所有 HTTP 请求定向到工作负载项目中的服务器:

    gcloud network-services http-routes import example-route --source=- --location=global << EOF
    name: example-route
    hostnames:
    - example-service
    meshes:
    - projects/POLICY_PROJECT_NUMBER/locations/global/meshes/example-mesh
    rules:
    - action:
        destinations:
        - serviceName: "projects/POLICY_PROJECT_NUMBER/locations/global/backendServices/example-service"
    EOF
    

    其中,POLICY_PROJECT_NUMBER 是政策项目的编号。

验证设置

您可以通过向 Traffic Director 管理的边车代理后面的 VIP 发送 HOST 标头设置为 example-service 的 HTTP 请求来验证设置:

curl -H "Host: example-service" http://10.0.0.1/

输出类似于以下内容:

{"cluster_name":"test-cluster","gce_instance_id":"4879146330986909656","gce_service_account":"...","host_header":"example-service","pod_name":"whereami-7fbffd489-nhkfg","pod_name_emoji":"...","project_id":"...","timestamp":"2024-10-15T00:42:22","zone":"us-west1-a"}

请注意,由于服务网格中的 Envoy 边车会拦截来自 Pod 的所有出站流量,并且之前的 HTTPRoute 配置为仅基于 L7 属性(主机标头)将所有流量发送到“whereami”Kubernetes Service。为了示例说明,此命令中的 VIP 为 10.0.0.1,但 VIP 可以是任何 IP。

边车代理应请求与政策项目中的网格资源关联的配置。为此,请确保节点 ID 设置为以下格式:

projects/POLICY_PROJECT_NUMBER/networks/mesh:example-mesh/nodes/UUID"

后续步骤