设置使用共享 VPC 的多集群 Service


本页面介绍常见的多集群服务 (MCS) 场景。本页面介绍的场景具有以下特征:

  • 两个 GKE 集群:第一个 GKE 集群已注册到自己项目的舰队。这是舰队宿主项目。第二个 GKE 集群已注册到同一舰队,但可能不在同一个项目中(具体取决于实际情况)。两个 GKE 集群都是 VPC 原生集群
  • 相同的 VPC 网络:两个 GKE 集群都使用同一共享 VPC 网络中的子网。
  • 这两个集群中均启用了适用于 GKE 的工作负载身份联合

术语

术语“共享 VPC 宿主项目”和“GKE 舰队宿主项目”的含义不同。

  • 共享 VPC 宿主项目是包含共享 VPC 网络的项目。
  • GKE 舰队宿主项目是包含要向其注册集群的舰队的项目。

情况

下表介绍了常见的 MCS 场景:

情况 舰队宿主项目(包含第一个集群的项目) 第二个集群的位置
同一共享 VPC 服务项目中的集群 共享 VPC 服务项目 与第一个集群相同的共享 VPC 服务项目
共享 VPC 宿主项目作为舰队宿主项目(共享 VPC 宿主项目中的一个集群、共享 VPC 服务项目中的第二个集群) 共享 VPC 宿主项目 共享 VPC 服务项目
不同共享 VPC 服务项目中的集群 共享 VPC 服务项目 其他共享 VPC 服务项目

前提条件

在设置 MCS 的跨项目配置之前,请完成以下步骤:

同一共享 VPC 服务项目中的集群

本部分提供了一个示例 MCS 配置,其中涉及两个现有的 GKE 集群,这两个集群都位于同一共享 VPC 服务项目中:

  • 这两个集群使用 SHARED_VPC_HOST_PROJ 中的同一共享 VPC 网络。
  • 第一个 VPC 原生 GKE 集群 FIRST_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)是在 FLEET_HOST_PROJ 中创建的。在此场景中,舰队宿主项目是连接到 SHARED_VPC_HOST_PROJ 的服务项目。
  • 第二个 VPC 原生 GKE 集群 SECOND_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)也是在 FLEET_HOST_PROJ 中创建的。

启用必需的 API

启用所需的 API。 Google Cloud CLI 的输出会显示 API 是否已启用。

  1. 启用 Cloud DNS API:

    gcloud services enable dns.googleapis.com \
        --project SHARED_VPC_HOST_PROJ
    

    在此场景中,舰队宿主项目是连接到共享 VPC 宿主项目的服务项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。

  2. 启用 GKE Hub(舰队)API。只能在舰队宿主项目中启用 GKE Hub API。

    gcloud services enable gkehub.googleapis.com \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用此 API,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com

  3. 在舰队宿主项目中启用 Traffic Director、Resource Manager 和 Multi-cluster Service Discovery API:

    gcloud services enable trafficdirector.googleapis.com \
        cloudresourcemanager.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        --project FLEET_HOST_PROJ
    

在舰队宿主项目中启用多集群服务

  1. 在舰队宿主项目中启用多集群服务:

    gcloud container fleet multi-cluster-services enable \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com

创建 IAM 绑定

  1. 创建 IAM 绑定,向舰队宿主项目 MCS 服务账号授予共享 VPC 宿主项目的 MCS Service Agent 角色:

    gcloud projects add-iam-policy-binding SHARED_VPC_HOST_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com" \
        --role roles/multiclusterservicediscovery.serviceAgent
    
  2. 创建 IAM 绑定,向舰队宿主项目 MCS 服务账号授予自己项目的 Network User 角色:

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJ \
        --member "serviceAccount:FLEET_HOST_PROJ.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role roles/compute.networkViewer
    

    由于此场景使用适用于 GKE 的工作负载身份联合,因此舰队宿主项目的 MCS 导入程序 GKE 服务账号需要自己项目的 Network User 角色。

    替换以下内容:

    • SHARED_VPC_HOST_PROJ:共享 VPC 宿主项目的 ID
    • FLEET_HOST_PROJ_NUMBER:舰队宿主项目的编号,即此场景中的共享 VPC 服务项目
    • FLEET_HOST_PROJ:第一个集群项目的 ID。

将集群注册到舰队

  1. 将第一个集群注册到舰队。--gke-cluster 标志可用于此命令,因为第一个集群与注册它的舰队位于同一项目中。

    gcloud container fleet memberships register MEMBERSHIP_NAME_1 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-cluster=LOCATION/FIRST_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_1:此集群在此舰队中的唯一标识符。例如,您可以使用第一个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:对于可用区级集群,这是包含集群的 Compute Engine 可用区;对于区域级集群,这是包含集群的 Compute Engine 区域。
    • FIRST_CLUSTER_NAME:第一个集群的名称。
  2. 将第二个集群注册到舰队宿主项目。--gke-cluster 标志可用于此命令,因为第二个集群也位于舰队宿主项目中。

    gcloud container fleet memberships register MEMBERSHIP_NAME_2 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-cluster=LOCATION/SECOND_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_2:此集群在此舰队中的唯一标识符。例如,您可以使用第二个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:对于可用区级集群,这是包含集群的 Compute Engine 可用区;对于区域级集群,这是包含集群的 Compute Engine 区域。
    • SECOND_CLUSTER_NAME:第二个集群的名称。

为集群创建通用命名空间

  1. 确保每个集群都有一个在其中共享 Service 的命名空间。如果需要,请在每个集群中使用以下命令来创建命名空间:

    kubectl create ns NAMESPACE
    

    NAMESPACE 替换为命名空间的名称。

共享 VPC 宿主项目作为舰队宿主项目

本部分提供了一个示例 MCS 配置,其中涉及两个现有的 GKE 集群:

  • 第一个 VPC 原生 GKE 集群 FIRST_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)已在 FLEET_HOST_PROJ 中创建。在此场景中,舰队宿主项目也是共享 VPC 宿主项目。
  • 第二个 VPC 原生 GKE 集群 SECOND_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)已在 SECOND_CLUSTER_PROJ 中创建。

启用必需的 API

启用所需的 API。 Google Cloud CLI 的输出会显示 API 是否已启用。

  1. 启用 Cloud DNS API:

    gcloud services enable dns.googleapis.com \
        --project FLEET_HOST_PROJ
    

    在此场景下,舰队宿主项目也是共享 VPC 宿主项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。

  2. 启用 GKE Hub(舰队)API。只能在舰队宿主项目中启用 GKE Hub API。

    gcloud services enable gkehub.googleapis.com \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用 GKE Hub API,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com

  3. 在舰队宿主项目和第二个集群的项目中启用 Traffic Director、Resource Manager 和 Multi-cluster Service Discovery API:

    gcloud services enable trafficdirector.googleapis.com \
        cloudresourcemanager.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        --project FLEET_HOST_PROJ
    
    gcloud services enable trafficdirector.googleapis.com \
        cloudresourcemanager.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        --project SECOND_CLUSTER_PROJ
    

在舰队宿主项目中启用多集群服务

  1. 在舰队宿主项目中启用多集群服务:

    gcloud container fleet multi-cluster-services enable \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com

创建 IAM 绑定

  1. 创建 IAM 绑定,向舰队宿主项目的 GKE 舰队服务账号授予第二个集群项目的 GKE Service Agent 角色:

    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com" \
        --role roles/gkehub.serviceAgent
    
  2. 创建 IAM 绑定,向舰队宿主项目的 MCS 服务账号授予第二个集群项目的 MCS Service Agent 角色:

    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com" \
        --role roles/multiclusterservicediscovery.serviceAgent
    
  3. 创建 IAM 绑定,向每个项目的 MCS 服务账号授予自己项目的 Network User 角色:

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJ \
        --member "serviceAccount:FLEET_HOST_PROJ.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role roles/compute.networkViewer
    
    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:SECOND_CLUSTER_PROJ.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role roles/compute.networkViewer
    

    由于此场景使用适用于 GKE 的工作负载身份联合,因此每个项目的 MCS 导入程序 GKE 服务账号都需要自己项目的 Network User 角色。

    替换以下内容:

    • SECOND_CLUSTER_PROJ:第二个集群的项目的 ID
    • FLEET_HOST_PROJ:第一个集群项目的 ID。
    • FLEET_HOST_PROJ_NUMBER:舰队宿主项目的编号,与此场景中的共享 VPC 宿主项目相同

将集群注册到舰队

  1. 将第一个集群注册到舰队。--gke-cluster 标志可用于此命令,因为第一个集群与注册它的舰队位于同一项目中。

    gcloud container fleet memberships register MEMBERSHIP_NAME_1 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-cluster=LOCATION/FIRST_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_1:此集群在此舰队中的唯一标识符。例如,您可以使用第一个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:对于可用区级集群,这是包含集群的 Compute Engine 可用区;对于区域级集群,这是包含集群的 Compute Engine 区域。
    • FIRST_CLUSTER_NAME:第一个集群的名称。
  2. 将第二个集群注册到舰队。该命令必须使用 --gke-uri 标志,因为第二个集群与舰队位于不同项目中。您可以通过运行 gcloud container clusters list --uri 来获取完整的集群 URI。

    gcloud container fleet memberships register MEMBERSHIP_NAME_2 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-uri https://container.googleapis.com/v1/projects/SECOND_CLUSTER_PROJ/locations/LOCATION/clusters/SECOND_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_2:此集群在此舰队中的唯一标识符。例如,您可以使用第二个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:将 LOCATION 替换为以下内容:
      • 集群的 Compute Engine 可用区(如果集群是可用区级集群)
      • 集群的 Compute Engine 区域(如果集群是区域级集群)
    • SECOND_CLUSTER_PROJECT:第二个集群所属的项目。
    • SECOND_CLUSTER_NAME:第二个集群的名称。

为集群创建通用命名空间

  1. 确保每个集群都有一个在其中共享 Service 的命名空间。如果需要,请在每个集群中使用以下命令来创建命名空间:

    kubectl create ns NAMESPACE
    

    NAMESPACE 替换为命名空间的名称。

不同共享 VPC 服务项目中的集群

本部分提供了一个示例 MCS 配置,其中涉及两个现有的 GKE 集群,每个集群位于不同的共享 VPC 服务项目中。

  • 这两个集群使用 SHARED_VPC_HOST_PROJ 中的同一共享 VPC 网络。
  • 第一个 VPC 原生 GKE 集群 FIRST_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)已在 FLEET_HOST_PROJ 中创建。在此场景中,舰队宿主项目是连接到 SHARED_VPC_HOST_PROJ 的服务项目。
  • 第二个 VPC 原生 GKE 集群 SECOND_CLUSTER_NAME(启用了适用于 GKE 的工作负载身份联合)已在 SECOND_CLUSTER_PROJ 中创建。 在此场景中,SECOND_CLUSTER_PROJ 也是连接到 SHARED_VPC_HOST_PROJ 的服务项目。

启用必需的 API

启用所需的 API。 Google Cloud CLI 的输出会显示 API 是否已启用。

  1. 启用 Cloud DNS API:

    gcloud services enable dns.googleapis.com \
        --project SHARED_VPC_HOST_PROJ
    

    在此场景中,舰队宿主项目是连接到共享 VPC 宿主项目的服务项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。

  2. GKE Hub(舰队)API。只能在舰队宿主项目 FLEET_HOST_PROJ 中启用 GKE Hub API。

    gcloud services enable gkehub.googleapis.com \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用此 API,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com

  3. 在舰队宿主项目和第二个集群的项目中启用 Traffic Director、Resource Manager 和 Multi-cluster Service Discovery API:

    gcloud services enable trafficdirector.googleapis.com \
        cloudresourcemanager.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        --project=FLEET_HOST_PROJ
    
    gcloud services enable trafficdirector.googleapis.com \
        cloudresourcemanager.googleapis.com \
        multiclusterservicediscovery.googleapis.com \
        --project SECOND_CLUSTER_PROJ
    

在舰队宿主项目中启用多集群服务

  1. 在舰队宿主项目中启用多集群服务:

    gcloud container fleet multi-cluster-services enable \
        --project FLEET_HOST_PROJ
    

    如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com

创建 IAM 绑定

  1. 创建 IAM 绑定,向舰队宿主项目的 GKE Hub 服务账号授予第二个集群项目的 GKE Service Agent 角色:

    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-gkehub.iam.gserviceaccount.com" \
        --role roles/gkehub.serviceAgent
    
  2. 创建 IAM 绑定,向舰队宿主项目的 MCS 服务账号授予第二个集群项目的 MCS Service Agent 角色:

    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com" \
        --role roles/multiclusterservicediscovery.serviceAgent
    
  3. 创建 IAM 绑定,向舰队宿主项目 MCS 服务账号授予共享 VPC 宿主项目的 MCS Service Agent 角色:

    gcloud projects add-iam-policy-binding SHARED_VPC_HOST_PROJ \
        --member "serviceAccount:service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com" \
        --role roles/multiclusterservicediscovery.serviceAgent
    
  4. 创建 IAM 绑定,向每个项目的 MCS 服务账号授予自己项目的 Network User 角色:

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJ \
        --member "serviceAccount:FLEET_HOST_PROJ.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role roles/compute.networkViewer
    
    gcloud projects add-iam-policy-binding SECOND_CLUSTER_PROJ \
        --member "serviceAccount:SECOND_CLUSTER_PROJ.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role roles/compute.networkViewer
    

    由于此场景使用适用于 GKE 的工作负载身份联合,因此每个项目的 MCS 导入程序 GKE 服务账号都需要自己项目的 Network User 角色。

    根据需要,替换上述命令中的以下内容:

    • SECOND_CLUSTER_PROJ:第二个集群项目的 ID。
    • SHARED_VPC_HOST_PROJ:共享 VPC 宿主项目的项目 ID。在此示例中,两个集群使用同一共享 VPC 网络,但两个集群均不在共享 VPC 宿主项目中。
    • FLEET_HOST_PROJ:第一个集群项目的 ID。
    • FLEET_HOST_PROJ_NUMBER:舰队宿主项目的编号。

将集群注册到舰队

  1. 将第一个集群注册到舰队。--gke-cluster 标志可用于此命令,因为第一个集群与注册它的舰队位于同一项目中。

    gcloud container fleet memberships register MEMBERSHIP_NAME_1 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-cluster=LOCATION/FIRST_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_1:此集群在此舰队中的唯一标识符。例如,您可以使用第一个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:对于可用区级集群,这是包含集群的 Compute Engine 可用区;对于区域级集群,这是包含集群的 Compute Engine 区域。
    • FIRST_CLUSTER_NAME:第一个集群的名称。
  2. 将第二个集群注册到舰队。该命令必须使用 --gke-uri 标志,因为第二个集群与舰队位于不同项目中。您可以通过运行 gcloud container clusters list --uri 来获取完整的集群 URI。

    gcloud container fleet memberships register MEMBERSHIP_NAME_2 \
        --project FLEET_HOST_PROJ \
        --enable-workload-identity \
        --gke-uri https://container.googleapis.com/v1/projects/SECOND_CLUSTER_PROJ/locations/LOCATION/clusters/SECOND_CLUSTER_NAME
    

    替换以下内容:

    • MEMBERSHIP_NAME_2:此集群在此舰队中的唯一标识符。例如,您可以使用第二个 GKE 集群的名称。
    • FLEET_HOST_PROJ:舰队宿主项目的 ID,与此场景中的共享 VPC 宿主项目相同。
    • LOCATION:将 LOCATION 替换为以下内容:
      • 集群的 Compute Engine 可用区(如果集群是可用区级集群)
      • 集群的 Compute Engine 区域(如果集群是区域级集群)
    • SECOND_CLUSTER_PROJECT:第二个集群所属的项目。
    • SECOND_CLUSTER_NAME:第二个集群的名称。

为集群创建通用命名空间

  1. 确保每个集群都有一个在其中共享 Service 的命名空间。如果需要,请在每个集群中使用以下命令来创建命名空间:

    kubectl create ns NAMESPACE
    

    NAMESPACE 替换为命名空间的名称。

后续步骤