设置多集群 Ingress

本页面介绍如何配置多集群 Ingress,以跨不同区域中的多个 Google Kubernetes Engine (GKE) 集群路由流量。

多集群 Ingress 是 GKE 集群的云托管多集群 Ingress 控制器,支持跨集群和区域部署共享的负载平衡资源。

如需详细了解多集群 Ingress,请参阅多集群 Ingress。您还可以了解如何跨集群部署 Ingress

要求

以下集群支持多集群 Ingress:

  • 仅限 GKE 集群。
  • VPC 原生(别名 IP 地址)模式下的集群。如需了解详情,请参阅创建 VPC 原生集群
  • 已启用 HTTP 负载平衡(默认启用)的集群。请注意,多集群 Ingress 仅支持外部 HTTP(S) 负载均衡器。
  • 使用 Workload Identity 启用的 GKE 集群。
  • Cloud SDK 290 版或更高版本 (gcloud --version)。如需更新到最新版本,请使用命令 gcloud components update

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 为可用区级集群选择默认 Compute Engine 可用区,或为区域级集群或 Autopilot 集群选择区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是 Autopilot 集群或区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

Deployment 练习

在本练习中,您将部署组件并准备使用多集群 Ingress 时所需的基础架构。如需在您的环境中使用多集群 Ingress,必须执行以下步骤。这些步骤需要具备更高的权限,并且应由 GKE 管理员执行。

本练习中的步骤摘要包括:

  1. 启用所需的 API。
  2. 部署 GKE 集群以托管工作负载。
  3. 将集群分组到机群中
  4. 配置多集群 Ingress 管理设置。

下图展示了您完成练习后得到的环境的情形:

展示了区域、机群和项目之间的关系的集群拓扑。

在该图中,区域 europe-west1us-central1 有两个名为 gke-usgke-eu 的 GKE 集群。这些集群会分组到一个机群中,以便多集群 Ingress 控制器能够识别这些集群。

启用 API

您为多集群 Ingress 启用的 API 取决于您使用的多集群 Ingress 价格

如果多集群 Ingress 是您正在使用的唯一 Anthos 功能,那么使用独立价格可能更为经济。项目的结算方式取决于您是启用还是停用 Anthos API (anthos.googleapis.com)。

  • 如果启用了 Anthos API,则根据集群 vCPU 数量和 Anthos 价格对项目进行结算。
  • 如果 Anthos API 被停用,那么您的项目将根据您项目中的后端多集群 Ingress Pod 的数量计费。

如果您的项目在 Google Cloud 组件或功能上使用其他 Anthos,则应使用 Anthos 许可。

您可以随时将多集群 Ingress 结算模式从独立更改为 Anthos 或任何其他方式,而不会影响多集群 Ingress 资源或流量。如需更改结算模式,您可以按照以下说明中介绍的方法启用或停用 Anthos API。

Anthos 价格

如需启用 Anthos 价格,请执行以下步骤:

  1. 在项目中启用 Anthos、多集群 Ingress、Connect 和 GKE API:

    gcloud services enable \
        anthos.googleapis.com \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

    在项目中启用 anthos.googleapis.com 后,任何已注册到 Connect 的集群都会按照 Anthos 价格计费。

独立价格

如需启用独立价格,请执行以下步骤:

  1. 确认您的项目中停用了 Anthos API:

    gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
    

    PROJECT_ID 替换为在其中运行 GKE 集群的项目的 ID。

    如果输出为空响应,则您的项目中会停用 Anthos API,并且系统会使用独立价格对任何多集群 Ingress 资源计费。

  2. 在项目中启用多集群 Ingress、Connect 和 GKE API:

    gcloud services enable \
        multiclusteringress.googleapis.com \
        gkehub.googleapis.com \
        container.googleapis.com \
        --project=PROJECT_ID
    

部署集群

在本部分中,您将在 europe-west1us-central1 区域中创建两个名为 gke-usgke-eu 的 GKE 集群。

我们建议您在创建集群时启用 Workload Identity,因为这可让您集群中的工作负载进行身份验证,而无需下载、手动轮替或管理 Google Cloud 服务帐号密钥。如果您创建集群时未启用 Workload Identity,则必须使用服务帐号密钥手动将集群注册到机群中。

Workload Identity

  1. us-central1-b 区域中创建 gke-us 集群:

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b 区域中创建 gke-eu 集群:

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

手动

  1. us-central1-b 区域中创建 gke-us 集群:

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. europe-west1-b 区域中创建 gke-eu 集群:

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    

配置集群凭据

在本部分中,您将配置具有易记名称的集群凭据。这可让您在跨多个集群部署资源时更轻松地在集群之间切换。

  1. 检索集群的凭据:

    gcloud container clusters get-credentials gke-us \
        --zone=us-central1-b \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --zone=europe-west1-b \
        --project=PROJECT_ID
    

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

  2. 重命名集群上下文:

    kubectl config rename-context gke_PROJECT_ID_us-central1-b_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1-b_gke-eu gke-eu
    

将集群注册到机群

您必须使用 Connect 将集群注册到机群。您可以使用 Google Cloud 服务帐号或通过 Workload Identity 手动注册集群。

Workload Identity

  1. 如果您为集群启用了 Workload Identity,请运行以下命令来注册集群:

    gcloud container hub memberships register gke-us \
        --gke-cluster us-central1-b/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. 确认您的集群已成功注册到 Connect:

    gcloud container hub memberships list --project=PROJECT_ID
    

    输出内容类似如下:

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

手动

如果您没有为集群启用 Workload Identity,请执行以下步骤注册集群:

  1. 确保您已满足注册集群的前提条件

  2. 创建服务帐号并下载服务帐号的私钥 JSON 文件

  3. 使用您下载的私钥 JSON 文件将您的集群注册到机群:

    gcloud container hub memberships register gke-us \
         --gke-cluster us-central1-b/gke-us \
         --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
         --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
        --project=PROJECT_ID
    

    请替换以下内容:

    • SERVICE_ACCOUNT_KEY_PATH:您在注册前提条件中下载的服务帐号私钥 JSON 文件的本地文件路径。此服务帐号密钥作为 Secret(名为 creds-gcp)存储在 gke-connect 命名空间中。
  4. 确认您的集群已成功注册到 Connect:

    gcloud container hub memberships list --project=PROJECT_ID
    

    输出内容类似如下:

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

指定配置集群

配置集群是您选择作为所有成员集群中 Ingress 的集中控制点的 GKE 集群。与 GKE Ingress 不同,多集群 Ingress 控制器并不位于单个集群中,它是 Google 的一项托管式服务,监视着配置集群中的资源。此 GKE 集群用作多集群 API 服务器,以存储 MultiClusterIngressMultiClusterService 等资源。任何成员集群都可以成为配置集群,但一次只能有一个配置集群。

如需详细了解配置集群,请参阅配置集群设计

如果配置集群已关停或无法访问,则 MultiClusterIngressMultiClusterService 对象无法跨成员集群进行更新。如果配置集群出现中断,负载平衡器和流量可以继续独立于配置集群运行。

启用多集群 Ingress 并在同一步骤中选择配置集群。您选择作为配置集群的 GKE 集群必须已注册到队列。

  1. 识别要指定为配置集群的集群的 URI:

    gcloud container hub memberships list
    

    输出内容类似如下:

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    
  2. 启用多集群 Ingress,然后选择 gke-us 作为配置集群:

    gcloud beta container hub ingress enable \
      --config-membership=gke-us
    

    请注意,控制器正在引导时,上述过程可能需要几分钟时间。如果成功,则输出类似于以下内容:

    Waiting for Feature to be created...done.
    Waiting for controller to start...done.
    

    如果不成功,则该命令将超时,如下所示:

    Waiting for controller to start...failed.
    ERROR: (gcloud.alpha.container.hub.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.
    

    如果上一步失败,请检查功能状态。功能状态应该会指明具体出了什么问题:

    gcloud beta container hub ingress describe
    

    输出内容类似如下:

    createTime: '2021-02-04T14:10:25.102919191Z'
    membershipStates:
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: ERROR
          description: '...is not a VPC-native GKE Cluster.'
          updateTime: '2021-08-10T13:58:50.298191306Z'
      projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
        state:
          code: OK
          updateTime: '2021-08-10T13:58:08.499505813Z'
    

    如需详细了解此类错误消息,请参阅问题排查和操作

共享 VPC 部署

可以为共享 VPC 网络中的集群部署多集群 Ingress,但所有参与的后端 GKE 集群都必须位于同一项目中。不支持在使用同一 Cloud Load Balancing VIP 的不同项目中部署 GKE 集群。

在非共享 VPC 网络中,多集群 Ingress 控制器会管理防火墙规则,以允许运行状况检查从 Cloud Load Balancing 传递到容器工作负载。

在共享 VPC 网络中,多集群 Ingress 无法管理这些防火墙规则,因为防火墙由宿主项目管理,服务项目管理员无权访问。共享 VPC 网络的集中式安全模型有意将网络控制权集中起来。在共享 VPC 网络中,宿主项目管理员必须代表多集群 Ingress 为 Cloud Load Balancing 流量手动创建必要的防火墙规则。

以下命令显示了在集群位于共享 VPC 网络上时必须创建的防火墙规则。来源范围是 Cloud Load Balancing 用于向 Google Cloud 后端发送流量的范围。多集群 Ingress 的运行生命周期内必须存在此规则,并且只有在不再使用多集群 Ingress 或 Cloud Load Balancing 到 GKE 负载平衡时,才能移除此规则。

如果您的集群位于共享 VPC 网络中,请创建该防火墙规则:

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --project HOST_PROJECT \
    --network SHARED_VPC \
    --direction INGRESS \
    --allow tcp:0-65535 \
    --source-ranges 130.211.0.0/22,35.191.0.0/16

请替换以下内容:

  • FIREWALL_RULE_NAME:新防火墙规则的名称。
  • HOST_PROJECT:共享 VPC 宿主项目的 ID。
  • SHARED_VPC:共享 VPC 网络的名称。

已知问题

字段 config_membership 的 InvalidValueError

已知问题会阻止 gcloud 命令行工具与多集群 Ingress 进行交互。此问题是在 346.0.0 版中引入的,在 348.0.0 版中已得到修复。我们不建议将 gcloud 工具版本 346.0.0 和 347.0.0 与多集群 Ingress 搭配使用。

字段“resource”的值无效

Google Cloud Armor 无法与在以下 GKE 版本上运行的多集群 Ingress 配置集群进行通信:

  • 1.18.19-gke.1400 及更高版本
  • 1.19.10-gke.700 及更高版本
  • 1.20.6-gke.700 及更高版本

配置 Google Cloud Armor 安全政策时,系统显示以下消息:

Invalid value for field 'resource': '{"securityPolicy": "global/securityPolicies/"}': The given policy does not exist

为避免此问题,请将配置集群升级到 1.21 或更高版本,或使用以下命令更新 BackendConfig CustomResourceDefinition

kubectl patch crd backendconfigs.cloud.google.com --type='json' -p='[{"op": "replace", "path": "/spec/versions/1/schema/openAPIV3Schema/properties/spec/properties/securityPolicy", "value":{"properties": {"name": {"type": "string"}}, "required": ["name" ],"type": "object"}}]'

后续步骤