设置跨项目网络端点组

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

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

  • 在多项目部署中,您可以在单个集中式 Google Cloud 项目中管理所有计算资源(Compute Engine 虚拟机、GKE NEG 等),而服务团队拥有自己的 Google Cloud 服务项目,在其中定义以 BackendServices 表示的服务政策以及各自服务项目中的服务路由。这样,服务团队便可委托其他团队管理其服务,同时对可能在不同服务团队之间共享的计算资源保持严格控制。

本页介绍了如何创建基准的 2 个项目设置,其中项目 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 下的权限。出于演示目的,您可以使用以下命令在政策项目中向工作负载项目的默认计算服务账号授予此权限:

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: gcr.io/google-samples/whereami:v1.2.20
            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"}

请注意,由于 Pod 中的所有出站流量都会被服务网格中的 Envoy 边车拦截,并且之前的 HTTPRoute 配置为仅根据 L7 属性(主机标头)将所有流量发送到“whereami”Kubernetes 服务。为方便起见,此命令中的 VIP 为 10.0.0.1,但 VIP 可以是任何 IP。

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

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

后续步骤