本页面介绍如何为 GKE 集群启用多集群 GKE Gateway Controller 控制器,这是 Google 托管的控制器,可用于预配外部和内部负载均衡器。如需了解如何使用 Gateway 资源进行容器负载均衡,请参阅部署 Gateway 或部署多集群 Gateway。
多集群 GKE Gateway Controller 控制器会在集群中安装以下多集群 GatewayClass:
gke-l7-global-external-managed-mc(代表全球外部多集群 Gateway)gke-l7-regional-external-managed-mc(代表区域级外部多集群)gke-l7-cross-regional-internal-managed-mc(代表跨区域内部多集群 Gateway)gke-l7-rilb-mc(代表区域级内部多集群 Gateway)gke-l7-gxlb-mc(代表全球外部传统多集群 Gateway)
详细了解各种 GKE 中的 GatewayClass 的功能。
价格
通过 Gateway 控制器部署的所有 Compute Engine 资源都会根据 GKE 集群所在的项目计费。作为 GKE Standard 和 Autopilot 价格的一部分,无需额外付费即可获得单集群 Gateway 控制器。如需了解多集群网关的价格,请参阅多集群网关和多集群 Ingress 价格页面。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update命令以获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
GKE Gateway Controller 要求
- 仅 VPC 原生集群支持 Gateway API。
- 如果您使用的是区域级或跨区域 GatewayClass,则必须启用代理专用子网。
- 集群必须启用
HttpLoadBalancing插件。 - 如果您使用的是 Istio,则必须将 Istio 升级到以下版本之一:
- 1.15.2 或更高版本
- 1.14.5 或更高版本
- 1.13.9 或更高版本。
- 如果您使用的是共享 VPC,则需要在宿主项目中将
Compute Network User角色分配给服务项目的 GKE 服务账号。
多集群 Gateway 要求
除了 GKE Gateway Controller 要求之外,对于多集群 Gateway 部署,请确保您已执行以下任务:
- 在配置集群上启用 Gateway API。
- 在集群上启用适用于 GKE 的工作负载身份联合。
- 完成关于注册集群的舰队常规前提条件。
在项目中启用以下多集群 Gateway 所需的 API:
- Cloud Service Mesh API
- Multi-cluster Services API
- Multi Cluster Ingress API
运行以下命令可启用所需的 API(如果尚未启用):
gcloud services enable \ trafficdirector.googleapis.com \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ --project=PROJECT_ID将
PROJECT_ID替换为在其中运行 GKE 集群的项目的 ID。
限制和局限
单集群 Gateway 的限制和已知问题同样也适用于多集群 Gateway。
除了单集群 Gateway 的限制之外,以下限制也适用于多集群 Gateway:
区域级内部 GatewayClass
gke-l7-rilb-mc不支持负载均衡到不同区域中的后端。如需详细了解每个 GatewayClass 支持的不同功能,请参阅 GatewayClass 功能。在多集群 Gateway 中,不支持将
Service用作backendRefs。多集群 Gateway 仅支持将ServiceImport用作有效的backendRefs。舰队中的所有集群都必须位于舰队宿主项目中。
不支持跨项目负载均衡。连接到同一多集群 Gateway 的所有集群(配置集群和目标集群)必须部署在同一共享 VPC 宿主项目或服务项目中。如需详细了解多集群 Gateway 支持的共享 VPC 拓扑,请参阅将多集群 Gateway 与共享 VPC 搭配使用。
不支持跨 VPC 负载均衡。连接到同一多集群 Gateway 的所有集群(配置集群和目标集群)必须部署在同一 VPC 中。
多集群 Gateway 依赖于 MCS 来处理跨集群服务发现。因此,多集群 Gateway 公开的服务受所有多集群服务要求的约束。
在以下情况下,多集群 Gateway 可能会泄露负载均衡器资源:
- 舰队 Ingress 功能会使用新的配置集群进行更新,该集群不包含当前配置集群上存在的所有
Gateway资源。 - 舰队 Ingress 功能已停用,而引用多集群
GatewayClass的Gateway资源还在配置集群中。
- 舰队 Ingress 功能会使用新的配置集群进行更新,该集群不包含当前配置集群上存在的所有
多集群 Gateway 作为全球服务运行。如果多集群 Gateway 控制器遇到区域性舰队 (Hub) 控制平面故障,它的响应方式是静态失败并在区域恢复正常服务之前不再更改负载平衡器。
配额
GKE Gateway 使用 Cloud Load Balancing 配额来限制 Gateway 控制器可以创建多少资源来管理路由到 GKE 集群的入站流量。
为多集群 Gateway 设置环境
它需要多个 GKE 集群才能完成部署多集群 Gateway 中的示例。所有集群均注册到同一舰队,以便多集群 Gateway 和 Service 可以在它们之间运行。
以下步骤将跨项目中的两个不同地区部署三个 GKE 集群:
us-west1-a/gke-west-1us-west1-a/gke-west-2us-east1-b/gke-east-1
这将创建以下集群拓扑:
这些 GKE 集群用于演示使用外部和内部 Gateway 的多区域负载均衡和蓝绿多集群流量分配。
部署集群
在这些步骤中,您需要将三个 GKE 集群部署到 us-east1 和 us-west1 地区。
集群将注册到项目的舰队。通过将 GKE 集群组合到一个舰队中,可以使多集群 Gateway 能够定位这些集群。
在
us-west1中创建一个名为gke-west-1的 GKE 集群:gcloud container clusters create gke-west-1 \ --gateway-api=standard \ --location=us-west1-a \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_ID替换以下内容:
PROJECT_ID:您的 GKE 集群运行所在的项目 ID。VERSION:GKE 1.24 版或更高版本。
在
us-west1(或与上一个集群相同的区域)中创建名为gke-west-2的另一个 GKE 集群:gcloud container clusters create gke-west-2 \ --gateway-api=standard \ --location=us-west1-a \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_ID在
us-east1(或与上一个集群不同的区域)中创建一个名为gke-east-1的 GKE 集群gcloud container clusters create gke-east-1 \ --gateway-api=standard \ --location=us-east1-b \ --workload-pool=PROJECT_ID.svc.id.goog \ --cluster-version=VERSION \ --enable-fleet \ --project=PROJECT_ID确认这些集群已成功注册到舰队:
gcloud container fleet memberships list --project=PROJECT_ID输出将如下所示:
NAME EXTERNAL_ID LOCATION gke-east-1 45a80b37-4b00-49aa-a68b-b430fce1e3f0 us-east1 gke-west-2 ac7087a5-f5ee-401e-b430-57f3af141239 us-west1 gke-west-1 549efe3a-b18e-4eb9-8796-e50b7967cde2 us-west1
配置集群凭据
此步骤使用易记的名称配置集群凭据。这可让您在跨多个集群部署资源时更轻松地在集群之间切换。
提取集群
gke-west-1、gke-west-2和gke-east-1的凭据:gcloud container clusters get-credentials gke-west-1 --location=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-west-2 --location=us-west1-a --project=PROJECT_ID gcloud container clusters get-credentials gke-east-1 --location=us-east1-b --project=PROJECT_ID此操作会将凭据存储在本地,以便您可以使用 kubectl 客户端访问集群 API 服务器。默认情况下,系统会为凭据创建自动生成的名称。
重命名集群上下文,以便日后更容易引用:
kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-1 gke-west-1 kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-2 gke-west-2 kubectl config rename-context gke_PROJECT_ID_us-east1-b_gke-east-1 gke-east-1将
PROJECT_ID替换为在其中部署集群的项目的 ID。
在舰队中启用多集群 Service
在舰队中为已注册的集群启用多集群 Service。这会为注册到舰队中的三个集群启用 MCS 控制器,以便可以监听和导出 Service。
gcloud container fleet multi-cluster-services enable \ --project PROJECT_ID授予 MCS 控制器所需的 Identity and Access Management (IAM) 权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \ --role "roles/compute.networkViewer" \ --project=PROJECT_ID将
PROJECT_ID替换为在其中部署集群的项目的 ID。确认为已注册的集群启用 MCS。您将看到三个已注册集群的成员。所有集群可能需要几分钟才能显示出来。
gcloud container fleet multi-cluster-services describe --project=PROJECT_ID输出内容类似如下:
createTime: '2023-10-12T06:14:33.466903587Z' membershipStates: projects/441323991697/locations/us-east1/memberships/gke-east-1: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:28.395318091Z' projects/441323991697/locations/us-west1/memberships/gke-west-1: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:30.534594027Z' projects/441323991697/locations/us-west1/memberships/gke-west-2: state: code: OK description: Firewall successfully updated updateTime: '2023-10-12T06:15:29.110582109Z' name: projects/pierre-louis-playground/locations/global/features/multiclusterservicediscovery resourceState: state: ACTIVE spec: {} updateTime: '2023-10-12T06:15:31.027276757Z'
在舰队中启用多集群 Gateway
多集群 GKE Gateway Controller 控制器用于管理多集群 Gateway 的部署。
启用多集群 Gateway 控制器时,您必须选择配置集群。配置集群是用于部署 Gateway 资源(Gateway、路由、政策)的 GKE 集群。它是控制集群之间路由的中心位置。请参阅配置集群设计,以帮助您决定选择哪个集群作为配置集群。
在舰队中启用多集群 Gateway 并指定配置集群。请注意,您以后可以随时更新该配置集群。此示例将
gke-west-1指定为配置集群,该集群将托管多集群 Gateway 的资源。gcloud container fleet ingress enable \ --config-membership=projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1 \ --project=PROJECT_ID授予多集群 Gateway 控制器所需的 Identity and Access Management (IAM) 权限:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \ --role "roles/container.admin" \ --project=PROJECT_ID将
PROJECT_ID和PROJECT_NUMBER替换为用于部署集群的项目的 ID 和编号。确认您的舰队启用了 GKE Gateway Controller 控制器:
gcloud container fleet ingress describe --project=PROJECT_ID输出内容类似如下:
createTime: '2023-10-12T06:23:06.732858524Z' membershipStates: projects/441323991697/locations/us-east1/memberships/gke-east-1: state: code: OK updateTime: '2023-10-12T06:30:08.815839024Z' projects/441323991697/locations/us-west1/memberships/gke-west-1: state: code: OK updateTime: '2023-10-12T06:30:08.815837031Z' projects/441323991697/locations/us-west1/memberships/gke-west-2: state: code: OK updateTime: '2023-10-12T06:30:08.815840985Z' name: projects/pierre-louis-playground/locations/global/features/multiclusteringress resourceState: state: ACTIVE spec: multiclusteringress: configMembership: projects/pierre-louis-playground/locations/us-west1/memberships/gke-west-1 state: state: code: OK description: Ready to use updateTime: '2023-10-12T06:23:51.317464415Z' updateTime: '2023-10-12T06:30:09.439319551Z'确认您的配置集群中存在 GatewayClass:
kubectl get gatewayclasses --context=gke-west-1输出内容类似如下:
NAME CONTROLLER ACCEPTED AGE gke-l7-global-external-managed networking.gke.io/gateway True 78m gke-l7-global-external-managed-mc networking.gke.io/gateway True 4m22s gke-l7-gxlb networking.gke.io/gateway True 78m gke-l7-gxlb-mc networking.gke.io/gateway True 4m23s gke-l7-regional-external-managed networking.gke.io/gateway True 78m gke-l7-regional-external-managed-mc networking.gke.io/gateway True 4m22s gke-l7-rilb networking.gke.io/gateway True 78m gke-l7-rilb-mc networking.gke.io/gateway True 4m22s此输出包括针对外部多集群 Gateway 的 GatewayClass gke-l7-global-external-managed-mc、gke-l7-regional-external-managed-mc、gke-l7-gxlb-mc 和针对内部多集群 Gateway 的 GatewayClass gke-l7-rilb-mc。
将 kubectl 上下文切换到配置集群:
kubectl config use-context gke-west-1
您现在可以开始在配置集群中部署多集群 Gateway 了。
问题排查
本部分介绍如何解决与多集群 Gateway 启用相关的问题。
配置集群中不提供 GatewayClass
运行 kubectl get gatewayclasses 命令时可能会出现以下错误:
error: the server doesn't have a resource type "gatewayclasses"
如需解决此问题,请在集群上安装 Gateway API:
gcloud container clusters update CLUSTER_NAME \
--gateway-api=standard \
--location=CONTROL_PLANE_LOCATION
替换以下内容:
CLUSTER_NAME:您的集群的名称。CONTROL_PLANE_LOCATION:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。
多集群 Gateway 控制器无法启动
如果您在配置集群上启用 Gateway API,并在启用舰队 Ingress 功能之后添加 CRD,则多集群 Gateway 控制器可能会无法启动。
您可以通过在启用舰队 Ingress 之前先启用 Gateway API 来避免此问题。不过,如果您已启用舰队 Ingress,请先停用舰队 Ingress,然后再重新启用,以解决此问题:
停用舰队 Ingress:
gcloud container fleet ingress disable启用舰队 Ingress:
gcloud container fleet ingress enable \ --config-membership=CONFIG_MEMBERSHIP \ --project=PROJECT_ID
替换以下内容:
- CONFIG_MEMBERSHIP:成员资格的 ID 或成员资格的完全限定标识符。例如
projects/PROJECT_ID/locations/us-west1/memberships/gke-west-1。 - PROJECT_ID:您的 GKE 集群运行所在的项目 ID。
后续步骤
- 如需部署多集群负载均衡,请参阅部署多集群 Gateway。
- 如需详细了解 Gateway 控制器,请参阅 Gateway。