启用多集群 Gateway


本页面介绍如何为 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(代表区域级外部多集群 Gateway)
  • gke-l7-rilb-mc(代表区域级内部多集群 Gateway)
  • gke-l7-gxlb-mc(代表全球外部传统多集群 Gateway)

详细了解各种 GKE 中的 GatewayClass 的功能。

价格

通过 Gateway 控制器部署的所有 Compute Engine 资源都会根据 GKE 集群所在的项目计费。作为 GKE Standard 和 Autopilot 价格的一部分,无需额外付费即可获得单集群 Gateway 控制器。如需了解多集群 Gateway 的价格,请参阅多集群 Ingress 和 Gateway 价格页面

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

GKE Gateway Controller 要求

  • 对于标准版,需要 GKE 1.24 或更高版本。
  • 对于 Autopilot,需要 GKE 1.26 或更高版本。
  • Google Cloud CLI 407.0.0 版或更高版本。
  • 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:

    • Traffic Director 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 搭配使用

  • 多集群 Gateway 依赖于 MCS 来处理跨集群服务发现。因此,多集群 Gateway 公开的服务受所有多集群服务要求的约束。

配额

GKE Gateway 使用 Cloud Load Balancing 配额来限制 Gateway 控制器可以创建多少资源来管理路由到 GKE 集群的入站流量。

为多集群 Gateway 设置环境

它需要多个 GKE 集群才能完成部署多集群 Gateway 中的示例。所有集群均注册到同一舰队,以便多集群 Gateway 和 Service 可以在它们之间运行。

以下步骤将跨项目中的两个不同地区部署三个 GKE 集群:

  • us-west1-a/gke-west-1
  • us-west1-a/gke-west-2
  • us-east1-b/gke-east-1

这将创建以下集群拓扑:

显示区域、舰队和项目之间关系的集群拓扑。

这些 GKE 集群用于演示使用外部和内部 Gateway 的多区域负载均衡蓝绿多集群流量分配

部署集群

在这些步骤中,您需要将三个 GKE 集群部署到 us-east1us-west1 地区。

  1. us-west1 中创建一个名为 gke-west-1 的 GKE 集群:

    gcloud container clusters create gke-west-1 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

    替换以下内容:

    • PROJECT_ID:您的 GKE 集群运行所在的项目 ID。
    • VERSION:GKE 1.24 版或更高版本。
  2. us-west1(或与上一个集群相同的区域)中创建名为 gke-west-2 的另一个 GKE 集群:

    gcloud container clusters create gke-west-2 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    
  3. us-east1(或与上一个集群不同的区域)中创建一个名为 gke-east-1 的 GKE 集群

    gcloud container clusters create gke-east-1 \
        --gateway-api=standard \
        --zone=us-east1-b \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

配置集群凭据

此步骤使用易记的名称配置集群凭据。这可让您在跨多个集群部署资源时更轻松地在集群之间切换。

  1. 提取集群 gke-west-1gke-west-2gke-east-1 的凭据:

    gcloud container clusters get-credentials gke-west-1 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-west-2 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-east-1 --zone=us-east1-b --project=PROJECT_ID
    

    此操作会将凭据存储在本地,以便您可以使用 kubectl 客户端访问集群 API 服务器。默认情况下,系统会为凭据创建自动生成的名称。

  2. 重命名集群上下文,以便日后更容易引用:

    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。

将集群注册到舰队

  1. 成功创建所有三个集群后,您需要将这些集群注册到项目的舰队。通过将 GKE 集群组合到一个舰队中,可以使多集群 Gateway 能够定位这些集群。

    gcloud container fleet memberships register gke-west-1 \
         --gke-cluster us-west1-a/gke-west-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-west-2 \
         --gke-cluster us-west1-a/gke-west-2 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-east-1 \
         --gke-cluster us-east1-b/gke-east-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
  2. 确认这些集群已成功注册到舰队:

    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
    

在舰队中启用多集群 Service

  1. 在舰队中为已注册的集群启用多集群 Service。这会为注册到舰队中的三个集群启用 MCS 控制器,以便可以监听和导出 Service。

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    
  2. 授予 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。

  3. 确认为已注册的集群启用 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 集群。它是控制集群之间路由的中心位置。请参阅配置集群设计,以帮助您决定选择哪个集群作为配置集群。

  1. 在舰队中启用多集群 Gateway 并指定配置集群。请注意,您以后可以随时更新该配置集群。此示例将 gke-west-1 指定为配置集群,该集群将托管多集群 Gateway 的资源。

    gcloud container fleet ingress enable \
        --config-membership=projects/PROJECT_ID/locations/us-west1-a/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. 授予多集群 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_IDPROJECT_NUMBER 替换为用于部署集群的项目的 ID 和编号。

  3. 确认您的舰队启用了 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'
    
  4. 确认您的配置集群中存在 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。

  5. 将 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 \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • COMPUTE_REGION:集群的 Compute Engine 区域。对于可用区级集群,请使用 --zone=COMPUTE_ZONE

已知问题

  • 多集群 Gateway 控制器存在一个已知问题,可能导致它无法启动。为避免此问题,请在配置集群上启用 Gateway API,并在启用舰队 Ingress 功能之前添加 CRD。
  • 在以下情况下,多集群 Gateway 可能会泄露负载均衡器资源:
    • 舰队 Ingress 功能会使用新的配置集群进行更新,该集群不包含当前配置集群上存在的所有 Gateway 资源。
    • 舰队 Ingress 功能已停用,而引用多集群 GatewayClassGateway 资源还在配置集群中。
  • 多集群 Gateway 作为全球服务运行。如果多集群 Gateway 控制器遇到区域性舰队 (Hub) 控制平面故障,它的响应方式是静态失败并在区域恢复正常服务之前不再更改负载均衡器。

后续步骤