本页面介绍常见的多集群服务 (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 概念。
- 确保您熟悉使用共享 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 是否已启用。
启用 Cloud DNS API:
gcloud services enable dns.googleapis.com \ --project SHARED_VPC_HOST_PROJ
在此场景中,舰队宿主项目是连接到共享 VPC 宿主项目的服务项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。
启用 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
。在舰队宿主项目中启用 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 container fleet multi-cluster-services enable \ --project FLEET_HOST_PROJ
如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:
service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com
。
创建 IAM 绑定
创建 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
创建 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 宿主项目的 IDFLEET_HOST_PROJ_NUMBER
:舰队宿主项目的编号,即此场景中的共享 VPC 服务项目FLEET_HOST_PROJ
:第一个集群项目的 ID。
将集群注册到舰队
将第一个集群注册到舰队。
--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
:第一个集群的名称。
将第二个集群注册到舰队宿主项目。
--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
:第二个集群的名称。
为集群创建通用命名空间
确保每个集群都有一个在其中共享 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 是否已启用。
启用 Cloud DNS API:
gcloud services enable dns.googleapis.com \ --project FLEET_HOST_PROJ
在此场景下,舰队宿主项目也是共享 VPC 宿主项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。
启用 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
。在舰队宿主项目和第二个集群的项目中启用 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
在舰队宿主项目中启用多集群服务
在舰队宿主项目中启用多集群服务:
gcloud container fleet multi-cluster-services enable \ --project FLEET_HOST_PROJ
如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:
service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com
。
创建 IAM 绑定
创建 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
创建 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
创建 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
:第二个集群的项目的 IDFLEET_HOST_PROJ
:第一个集群项目的 ID。FLEET_HOST_PROJ_NUMBER
:舰队宿主项目的编号,与此场景中的共享 VPC 宿主项目相同
将集群注册到舰队
将第一个集群注册到舰队。
--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
:第一个集群的名称。
将第二个集群注册到舰队。该命令必须使用
--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
:第二个集群的名称。
为集群创建通用命名空间
确保每个集群都有一个在其中共享 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 是否已启用。
启用 Cloud DNS API:
gcloud services enable dns.googleapis.com \ --project SHARED_VPC_HOST_PROJ
在此场景中,舰队宿主项目是连接到共享 VPC 宿主项目的服务项目。您必须在共享 VPC 宿主项目中启用 Cloud DNS API,因为这是共享 VPC 网络所在的位置。GKE 会在宿主项目中创建 Cloud DNS 代管式专用区域,并针对共享 VPC 网络为这些区域授权。
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
。在舰队宿主项目和第二个集群的项目中启用 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
在舰队宿主项目中启用多集群服务
在舰队宿主项目中启用多集群服务:
gcloud container fleet multi-cluster-services enable \ --project FLEET_HOST_PROJ
如果在舰队宿主项目中启用多集群服务,则系统会创建以下服务账号或者确保以下服务账号存在:
service-FLEET_HOST_PROJ_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com
。
创建 IAM 绑定
创建 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
创建 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
创建 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
创建 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
:舰队宿主项目的编号。
将集群注册到舰队
将第一个集群注册到舰队。
--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
:第一个集群的名称。
将第二个集群注册到舰队。该命令必须使用
--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
:第二个集群的名称。
为集群创建通用命名空间
确保每个集群都有一个在其中共享 Service 的命名空间。如果需要,请在每个集群中使用以下命令来创建命名空间:
kubectl create ns NAMESPACE
将
NAMESPACE
替换为命名空间的名称。
后续步骤
- 了解如何使用 MCS。