设置多集群 Ingress


本页面介绍如何使用多集群 Ingress 跨不同区域的多个 Google Kubernetes Engine (GKE) 集群(例如,使用两个集群)路由流量。

如需查看多集群 Ingress (MCI)、多集群网关 (MCG) 与使用独立网络端点组(LB 和独立 NEG)的负载均衡器之间的详细比较,请参阅选择适用于 GKE 的多集群负载均衡 API

如需详细了解如何部署多集群 Ingress,请参阅跨集群部署 Ingress

这些步骤需要具备更高的权限,并且应由 GKE 管理员执行。

准备工作

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

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

要求和限制

多集群 Ingress 有以下要求:

  • Google Cloud CLI 290.0.0 版及更高版本。

如果您使用 Standard 模式集群,请确保满足以下要求。Autopilot 集群已满足这些要求。

多集群 Ingress 有以下限制:

  • 仅支持外部应用负载均衡器
  • 请勿在同一项目中创建多个前缀为 mci- 且不受多集群 Ingress 管理的 Compute Engine 负载均衡器,否则它们将被删除。Google Cloud 使用前缀 mci-[6 char hash] 来管理多集群 Ingress 所部署的 Compute Engine 资源。
  • 配置 HTTPS 时需要预先分配的静态 IP 地址。临时 IP 地址不支持 HTTPS。

概览

在本练习中,您将执行以下步骤:

  1. 选择您要使用的价格。
  2. 部署集群。
  3. 配置集群凭据。
  4. 将集群注册到舰队
  5. 指定配置集群。此集群可以是专用控制平面,也可以运行其他工作负载。

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

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

在该图中,区域 europe-west1us-central1 中有两个名为 gke-usgke-eu 的 GKE 集群。这些集群会向一个舰队注册,以便多集群 Ingress 控制器能够识别这些集群。 借助舰队,您可以对 GKE 集群进行逻辑分组和标准化,从而简化基础架构的管理,并使用多集群功能(如多集群 Ingress)。您可以阅读舰队管理文档,详细了解舰队的优势及其创建方法。

选择价格

如果多集群 Ingress 是您正在使用的唯一 GKE Enterprise 功能,我们建议您使用独立价格。如果您的项目使用其他 GKE Enterprise on Google Cloud 组件或功能,则应该启用整个 GKE Enterprise 平台。这样,您就可以使用所有 GKE Enterprise 功能并按 vCPU 数量单独付费。

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

  • 如果启用了 GKE Enterprise API (anthos.googleapis.com),则根据集群 vCPU 数量和 GKE Enterprise 价格对项目进行结算。
  • 如果停用了 GKE Enterprise API,则您的项目将根据您项目中的后端多集群 Ingress Pod 的数量进行结算。

您可以随时将多集群 Ingress 结算模式从独立切换至 GKE Enterprise,或者从 GKE Enterprise 切换为独立,而不会影响多集群 Ingress 资源或流量。

独立价格

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

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

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

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

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

  2. 在项目中启用所需的 API:

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

GKE Enterprise 价格

如需启用 GKE Enterprise 价格,请在项目中启用所需的 API:

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

在项目中启用 anthos.googleapis.com 后,注册到 Connect 的任何集群都将根据 GKE Enterprise 价格计费。

部署集群

europe-west1us-central1 区域中创建两个名为 gke-usgke-eu 的 GKE 集群。

Autopilot

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

    gcloud container clusters create-auto gke-us \
        --region=us-central1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

  2. europe-west1 区域中创建 gke-eu 集群:

    gcloud container clusters create-auto gke-eu \
        --region=europe-west1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

标准

创建两个启用了适用于 GKE 的工作负载身份联合的集群。

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

    gcloud container clusters create gke-us \
        --region=us-central1 \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

  2. europe-west1 区域中创建 gke-eu 集群:

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

配置集群凭据

为集群配置凭据并重命名集群上下文,这样在部署资源时就可以更轻松地在集群之间切换。

  1. 检索集群的凭据:

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

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

  2. 重命名集群上下文:

    kubectl config rename-context gke_PROJECT_ID_us-central1_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1_gke-eu gke-eu
    

将集群注册到舰队

按照以下说明向项目的舰队注册集群。

  1. 注册集群:

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

    gcloud container fleet memberships list --project=PROJECT_ID
    

    输出内容类似如下:

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

在您注册集群后,GKE 会将 gke-mcs-importer Pod 部署到您的集群。

您可以在向您的舰队注册 GKE 集群中详细了解如何注册集群。

指定配置集群

配置集群是您选择作为所有成员集群中 Ingress 的集中控制点的 GKE 集群。此集群必须已向舰队注册。如需了解详情,请参阅配置集群设计

启用多集群 Ingress,然后选择 gke-us 作为配置集群:

gcloud container fleet ingress enable \
    --config-membership=gke-us \
    --location=us-central1 \
    --project=PROJECT_ID

配置集群最多需要 15 分钟来完成注册。成功的输出内容类似如下:

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

失败的输出内容类似如下:

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

如果上一步失败,请检查功能状态:

gcloud container fleet ingress describe \
    --project=PROJECT_ID

成功的输出内容类似如下:

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'

如需详细了解如何排查多集群 Ingress 错误,请参阅问题排查和运维

共享 VPC

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

在非共享 VPC 网络中,多集群 Ingress 控制器会管理防火墙规则,以允许健康检查从负载均衡器传递到容器工作负载。

在共享 VPC 网络中,宿主项目管理员必须代表多集群 Ingress 控制器手动创建负载均衡器流量的防火墙规则。

以下命令显示了在集群位于共享 VPC 网络上时必须创建的防火墙规则。来源范围是负载均衡器用于向后端发送流量的范围。此规则必须在 MultiClusterIngress 资源的运行生命周期内存在。

如果您的集群位于共享 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 网络的名称。

已知问题

本部分介绍多集群 Ingress 的已知问题

字段 config_membership 的 InvalidValueError

已知问题会阻止 Google Cloud CLI 与多集群 Ingress 进行交互。此问题是在 346.0.0 版中引入的,在 348.0.0 版中已得到修复。我们不建议将 gcloud CLI 版本 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"}}]'

后续步骤