创建 VPC 原生集群

本页面介绍了如何在 Google Kubernetes Engine (GKE) 中配置 VPC 原生集群

如需详细了解 VPC 原生集群的优势和要求,请参阅 VPC 原生集群的概览。

准备工作

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

  • 确保您已启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 确保您已安装 Google Cloud CLI
  • 使用以下某种方法为您的项目设置默认 Google Cloud CLI 设置:
    • 使用 gcloud init(如果您想要在系统引导下完成项目默认设置)。
    • 使用 gcloud config(如果您想要单独设置项目 ID、可用区和区域。

    gcloud init

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

      gcloud init

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

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

    gcloud config

    1. 设置默认项目 ID
      gcloud config set project PROJECT_ID
    2. 设置默认的 Compute Engine 区域(例如 us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. 设置默认的 Compute Engine 可用区(例如 us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud 更新到最新版本:
      gcloud components update

    通过设置默认位置,您可以避免 gcloud CLI 中出现以下错误:One of [--zone, --region] must be supplied: Please specify location

步骤

按照以下步骤创建 VPC 原生集群并验证其已配置的 Pod 和 Service IP 地址范围。

在现有子网中创建集群

以下说明介绍了如何使用您所选的次要范围分配方法在现有子网中创建 VPC 原生 GKE 集群。

gcloud

  • 如需使用由 GKE 管理的次要范围分配方法,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --enable-ip-alias \
        --subnetwork=SUBNET_NAME \
        --cluster-ipv4-cidr=POD_IP_RANGE \
        --services-ipv4-cidr=SERVICES_IP_RANGE
    
  • 如需使用由用户管理的次要范围分配方法,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --enable-ip-alias \
        --subnetwork=SUBNET_NAME \
        --cluster-secondary-range-name=SECONDARY_RANGE_PODS \
        --services-secondary-range-name=SECONDARY_RANGE_SERVICES
    

替换以下内容:

  • CLUSTER_NAME:GKE 集群的名称。
  • COMPUTE_REGION:集群的 计算区域。 如需创建可用区级集群,请将此标志替换为 --zone=COMPUTE_ZONE,其中 COMPUTE_ZONE计算可用区
  • SUBNET_NAME:现有子网的名称。子网的主要 IP 地址范围用于节点。子网必须位于集群所使用的地区。如果此项被省略,GKE 将尝试使用集群所在区域中的 default VPC 网络中的子网。
  • 如果次要范围分配方法由 GKE 管理
    • POD_IP_RANGE:以 CIDR 表示法表示的 IP 地址范围(例如 10.0.0.0/14),或 CIDR 地址块的子网掩码大小(例如 /14)。此项用于为 Pod 创建子网次要 IP 地址范围。如果您省略 --cluster-ipv4-cidr 选项,GKE 会自动选择 /14 范围(218 个地址)。系统会从 10.0.0.0/8(范围为 224 个地址)中随机选择自动选择的范围,且该范围不会包括分配给虚拟机和现有路由的 IP 地址范围,或分配给其他集群的范围。自动选择的范围可能与预留的 IP 地址动态路由或与此集群建立对等互连的 VPC 内的路由相冲突。如果您使用其中任一项,则应指定 --cluster-ipv4-cidr 以防止发生冲突。
    • SERVICES_IP_RANGE:以 CIDR 表示法表示的 IP 地址范围(例如 10.4.0.0/19)或 CIDR 地址块的子网掩码大小(例如 /19)。此项用于为 Service 创建子网次要 IP 地址范围。
  • 如果次要范围分配方法由用户管理
    • SECONDARY_RANGE_PODS:指定的 SUBNET_NAME 中现有次要 IP 地址范围的名称。GKE 将整个子网次要 IP 地址范围用于集群的 Pod。
    • SECONDARY_RANGE_SERVICES:指定的 SUBNET_NAME 中现有次要 IP 地址范围的名称。GKE 将整个子网次要 IP 地址范围用于集群的 Service。

控制台

  1. 进入控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 在导航窗格的集群下,点击网络

  4. 网络下拉列表中,选择一个 VPC。

  5. 节点子网下拉列表中,选择集群的子网。

  6. 确保选中启用 VPC 原生流量路由(使用别名 IP)复选框。

  7. 如果您希望由 GKE 管理次要范围分配方法,请选中自动创建次要范围复选框。如果您已为所选子网创建了次要范围,并希望由用户管理次要范围分配方法,请取消选中此复选框。

  8. Pod 地址范围字段中,输入 pod 范围,例如 10.0.0.0/14

  9. Service 地址范围字段中,输入服务范围,例如 10.4.0.0/19

  10. 配置集群。

  11. 点击创建

API

创建 VPC 原生集群时,您需要定义 IPAllocationPolicy 对象。您可以引用现有子网次要 IP 地址范围,也可以指定 CIDR 地址块。如需创建次要范围分配方法由用户管理的集群,请引用现有子网次要 IP 地址范围。如果您希望通过 GKE 管理范围分配方法,请提供 CIDR 地址块。

{
  "name": CLUSTER_NAME,
  "description": DESCRIPTION,
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "clusterIpv4CidrBlock"      : string,
    "servicesIpv4CidrBlock"     : string,
    "clusterSecondaryRangeName" : string,
    "servicesSecondaryRangeName": string,

  },
  ...
}

此输出包括以下值:

  • "clusterIpv4CidrBlock":Pod 的 CIDR 范围的大小/位置, 决定了 Pod 的次要范围的大小。它可以是采用 CIDR 表示法的“IP/大小”(例如 10.0.0.0/14)或“/大小”(例如 /14)。从 VPC 的可用空间中选择具有给定大小的空白空间。如果您将此项留空,则系统会查找有效范围并使用默认大小创建该范围。
  • "servicesIpv4CidrBlock" 是 Service 的 CIDR 范围的大小/位置。请参阅 "clusterIpv4CidrBlock" 的说明。
  • "clusterSecondaryRangeName":Pod 的次要范围的名称。该次要范围必须已经存在,且属于与集群关联的子网(例如使用 --subnetwork 标志指定的子网)。
  • "serviceSecondaryRangeName":Service 的次要范围的名称。该次要范围必须已经存在,且属于与集群关联的子网(例如使用 --subnetwork 标志指定的子网)。

Terraform

您可以使用 Terraform 模块通过 Terraform 来创建 VPC 原生集群。

例如,您可以将以下地址块添加到 Terraform 配置:

module "gke" {
  source  = "terraform-google-modules/kubernetes-engine/google"
  version = "~> 12.0"

  project_id        = "PROJECT_ID"
  name              = "CLUSTER_NAME"
  region            = "COMPUTE_REGION"
  network           = "NETWORK_NAME"
  subnetwork        = "SUBNET_NAME"
  ip_range_pods     = "SECONDARY_RANGE_PODS"
  ip_range_services = "SECONDARY_RANGE_SERVICES"
}

替换以下内容:

  • PROJECT_ID:您的项目 ID。
  • CLUSTER_NAME:GKE 集群的名称。
  • COMPUTE_REGION:集群的计算区域
  • NETWORK_NAME:现有网络的名称。
  • SUBNET_NAME:现有子网的名称。子网的主要 IP 地址范围用于节点。子网必须位于集群所使用的区域中。
  • SECONDARY_RANGE_PODS:指定的 SUBNET_NAME 中现有次要 IP 地址范围的名称。GKE 将整个子网次要 IP 地址范围用于集群的 Pod。
  • SECONDARY_RANGE_SERVICES:指定的 SUBNET_NAME 中现有次要 IP 地址范围的名称。GKE 将整个子网次要 IP 地址范围用于集群的 Service。

同时创建集群和子网

以下说明介绍了如何同时创建 VPC 原生 GKE 集群和子网。使用一个命令执行这两个步骤时,次要范围分配方法由 GKE 管理。

gcloud

如需同时创建 VPC 原生集群和子网,请执行以下命令:

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --enable-ip-alias \
    --create-subnetwork name=SUBNET_NAME,range=NODE_IP_RANGE \
    --cluster-ipv4-cidr=POD_IP_RANGE \
    --services-ipv4-cidr=SERVICES_IP_RANGE

替换以下内容:

  • CLUSTER_NAME:GKE 集群的名称。
  • COMPUTE_REGION:集群的计算区域。如需创建可用区级集群,请将此标志替换为 --zone=COMPUTE_ZONE,其中 COMPUTE_ZONE计算可用区
  • SUBNET_NAME:要创建的子网的名称。子网的区域与集群区域(或包含可用区级集群的区域)相同。如果您希望 GKE 为您生成名称,请使用空字符串 (name="")。
  • NODE_IP_RANGE:以 CIDR 表示法表示的 IP 地址范围(例如 10.5.0.0/20),或 CIDR 地址块的子网掩码大小(例如 /20)。此项用于为节点创建子网主要 IP 地址范围。如果此项被省略,GKE 会在 VPC 中选择大小为 /20 的可用 IP 范围。
  • POD_IP_RANGE:以 CIDR 表示法表示的 IP 地址范围(例如 10.0.0.0/14),或 CIDR 地址块的子网掩码大小(例如 /14)。此项用于为 Pod 创建子网次要 IP 地址范围。如果此项被省略,GKE 将使用包含 218 个地址的随机选择 /14 范围。系统会从 10.0.0.0/8(范围为 224 个地址)中随机选择自动选择的范围,且该范围不会包括分配给虚拟机和现有路由的 IP 地址范围,或分配给其他集群的范围。自动选择的范围可能与预留的 IP 地址动态路由或与此集群建立对等互连的 VPC 内的路由相冲突。如果您使用其中任一项,则应指定 --cluster-ipv4-cidr 以防止发生冲突。
  • SERVICES_IP_RANGE:以 CIDR 表示法表示的 IP 地址范围(例如 10.4.0.0/19),或 CIDR 地址块的子网掩码大小(例如 /19)。此项用于为 Service 创建子网次要 IP 地址范围。如果此项被省略,GKE 将使用默认的 Service IP 地址范围大小 (/20)。

控制台

您无法使用控制台同时创建集群和子网。您应先创建子网,然后在现有子网中创建集群

API

如需创建 VPC 原生集群,请在您的集群资源中定义 [IPAllocationPolicy] 对象:

{
  "name": CLUSTER_NAME,
  "description": DESCRIPTION,
  ...
  "ipAllocationPolicy": {
    "useIpAliases": true,
    "createSubnetwork": true,
    "subnetworkName": SUBNET_NAME
  },
  ...
}

createSubnetwork 字段会自动为集群创建和预配子网。subnetworkName 是可选字段;如果您将此字段留空,系统会自动为子网选择一个名称。

使用非 RFC 1918 专用 IP 地址范围

GKE 集群可以将 RFC 1918 范围之外的专用 IP 地址范围用于节点、Pod 和 Service。如需查看可用作子网范围的内部 IP 地址的非 RFC 1918 专用范围的列表,请参阅 VPC 网络文档中的有效范围

非 RFC 1918 专用 IP 地址范围与专用集群和非专用集群兼容。

非 RFC 1918 专用范围是子网范围 - 您可以单独使用这些范围,也可以结合使用 RFC 1918 子网范围。节点、Pod 和 Service 会按照 VPC 原生集群的 IP 范围中所述继续使用子网范围。如果使用非 RFC 1918 范围,请注意以下几点:

  • 在创建集群的节点之前,子网范围(即使是使用非 RFC 1918 范围的子网范围)必须手动分配或由 GKE 分配。除非您替换集群,否则无法改用或停用非 RFC 1918 子网范围。

  • 内部 TCP/UDP 负载均衡器仅使用子网的主要 IP 地址范围中的 IP 地址。如需创建具有非 RFC 1918 地址的内部 TCP/UDP 负载均衡器,子网的主要 IP 地址范围必须为非 RFC 1918。

集群外部的目的地可能无法从专用的非 RFC 1918 范围接收流量。例如,RFC 1112(E 类)专用范围通常用作多播地址。如果集群之外的目的地无法处理来源为 RFC 1918 范围之外的专用 IP 地址的数据包,您可以执行以下操作:

  • 使用 RFC 1918 范围作为子网的主要 IP 地址范围。这样,集群中的节点会使用 RFC 1918 地址。

  • 确保您的集群正在运行 IP 伪装代理,并且目的地不在 nonMasqueradeCIDRs 列表中。这样,从 Pod 发送的数据包的来源 (SNAT) 会更改为节点地址 (RFC 1918)。

启用以不公开方式使用的公共 IP 地址范围

GKE 集群能够以不公开方式将某些公共 IP 地址范围用作内部子网 IP 地址范围。除了 VPC 网络文档中所述的特定受限范围,您能以不公开方式使用任何公共 IP 地址。

您的集群必须是 VPC 原生集群,才能使用以不公开方式使用的公共 IP 地址范围。不支持基于路由的集群。

专用公共范围是子网范围 - 您可以单独使用,也可以与使用专用地址的其他子网范围结合使用。节点、Pod 和 Service 会按照 VPC 原生集群的 IP 范围中所述继续使用子网范围。在以不公开方式重用公共 IP 地址时,请注意以下几点:

  • 使用公共 IP 地址范围作为子网范围时,您的集群将无法再与使用该公开范围内的互联网进行通信,也就是说,此范围会变为集群 VPC 网络中的内部 IP 地址范围。

  • 在创建集群的节点之前,子网范围(即使是以不公开方式使用公共 IP 地址范围的子网范围)必须手动分配或由 GKE 分配。除非您替换集群,否则无法改用或停用以不公开方式使用的公共 IP 地址。

默认情况下,GKE 会在节点上实现 SNAT 到公共 IP 目的地。对 Pod CIDR 使用以非公开方式使用的公共 IP 地址范围时,这会导致应用于 Pod 到 Pod 流量的 SNAT 规则。为避免这种情况,您有两种选择:

使用以不公开方式使用公共地址范围的集群示例

以下示例使用 gcloud CLI 创建使用以不公开方式重用的公共 IP 地址范围的集群。您必须使用以下标志:

  • --enable-ip-alias:这会创建 VPC 原生集群,在您以不公开方式使用公共 IP 地址范围时需要此集群。

以下命令会创建一个具有以下属性的 VPC 原生专用集群:

  • 节点使用子网的 10.0.0.0/24 主要 IP 地址范围。
  • Pod 以不公开方式将 5.0.0.0/16 公共 IP 地址范围用作 Pod 的子网次要 IP 地址范围。
  • Service 以不公开方式将 5.1.0.0/16 公共 IP 地址范围用作 Service 的子网次要 IP 地址范围。
  • 控制平面的内部 IP 地址范围为 172.16.0.16/28
gcloud container clusters create CLUSTER_NAME \
  --enable-ip-alias \
  --enable-private-nodes \
  --disable-default-snat \
  --zone=COMPUTE_ZONE \
  --create-subnetwork name=cluster-subnet,range=10.0.0.0/24 \
  --cluster-ipv4-cidr=5.0.0.0/16 \
  --services-ipv4-cidr=5.1.0.0/16 \
  --master-ipv4-cidr=172.16.0.16/28

将双栈网络用于 VPC 原生集群

从 GKE 1.24.1 版开始,您可以在新的或现有的双栈子网上创建使用双栈网络的 VPC 原生集群。本部分介绍如何完成以下任务:

  • 创建双栈子网。
  • 更新现有双栈子网。
  • 创建 VPC 原生集群,并使用 GKE Dataplane V2 和 IPv4-IPv6 栈类型。

如需详细了解使用双栈网络的 GKE 集群的优势和要求,请参阅 VPC 原生集群文档

创建双栈子网

如需创建双栈子网,请运行以下命令:

gcloud compute networks subnets create SUBNET_NAME \
    --stack-type=ipv4-ipv6 \
    --ipv6-access-type=ACCESS_TYPE \
    --network=NETWORK_NAME \
    --range=PRIMARY_RANGE \
    --region=COMPUTE_REGION

替换以下内容:

  • SUBNET_NAME:您选择的子网的名称。
  • ACCESS_TYPE:是否可路由到公共互联网。对专用集群使用 INTERNAL,对公共集群使用 EXTERNAL。如果未指定 --ipv6-access-type,则默认访问类型为 EXTERNAL
  • NETWORK_NAME:将要包含新子网的 VPC 网络的名称。此 VPC 网络必须是自定义模式网络。如需了解详情,请参阅如何将 VPC 网络从自动模式切换到自定义模式
  • PRIMARY_RANGE:新子网的主要 IPv4 IP 地址范围(采用 CIDR 表示法)。如需了解详情,请参阅子网范围
  • COMPUTE_REGION:集群的计算区域

将现有子网更新为双栈子网

如需将现有子网更新为双栈子网,请运行以下命令。更新子网不会影响子网中的任何现有 IPv4 集群。

gcloud compute networks subnets update SUBNET_NAME \
    --stack-type=ipv4-ipv6 \
    --ipv6-access-type=ACCESS_TYPE \
    --region=COMPUTE_REGION

替换以下内容:

  • SUBNET_NAME:子网的名称。
  • ACCESS_TYPE:是否可路由到公共互联网。对专用集群使用 INTERNAL,对公共集群使用 EXTERNAL。如果未指定 --ipv6-access-type,则默认访问类型为 EXTERNAL
  • COMPUTE_REGION:集群的计算区域

创建使用双栈网络的 VPC 原生集群

如需创建使用现有双栈子网的 VPC 原生集群,请运行以下命令:

gcloud beta container clusters create CLUSTER_NAME \
    --enable-ip-alias \
    --enable-dataplane-v2 \
    --stack-type=ipv4-ipv6 \
    --cluster-version=VERSION \
    --network=NETWORK_NAME \
    --subnetwork=SUBNET_NAME \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • VERSION:GKE 版本,必须为 1.24.1 或更高版本。您还可以使用 --release-channel 选项来选择发布渠道。发布版本必须为 1.24.1 或更高版本。
  • NETWORK_NAME:将要包含新子网的 VPC 网络的名称。此 VPC 网络必须是自定义模式网络。如需了解详情,请参阅如何将 VPC 网络从自动模式切换到自定义模式
  • SUBNET_NAME:子网的名称。
  • COMPUTE_REGION:集群的计算区域

同时创建双栈集群和子网

您可以同时创建子网和双栈集群。GKE 会创建一个 IPv6 子网,并为该子网分配一个外部 IPv6 主要范围。

gcloud beta container clusters create CLUSTER_NAME \
    --enable-ip-alias \
    --stack-type=ipv4-ipv6 \
    --ipv6-access-type=ACCESS_TYPE \
    --cluster-version=VERSION \
    --network=NETWORK_NAME \
    --create-subnetwork name=SUBNET_NAME,range=PRIMARY_RANGE \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:您选择的新集群的名称。
  • ACCESS_TYPE:是否可路由到公共互联网。对专用集群使用 INTERNAL,对公共集群使用 EXTERNAL。如果未指定 --ipv6-access-type,则默认访问类型为 EXTERNAL
  • VERSION:GKE 版本,必须为 1.24.1 或更高版本。您还可以使用 --release-channel 选项来选择发布渠道。发布渠道的默认版本必须为 1.24.1 或更高版本。
  • NETWORK_NAME:将要包含新子网的 VPC 网络的名称。此 VPC 网络必须是自定义模式网络。如需了解详情,请参阅如何将 VPC 网络从自动模式切换到自定义模式
  • SUBNET_NAME:您选择的新子网的名称。
  • PRIMARY_RANGE:新子网的主要 IPv4 地址范围(采用 CIDR 表示法)。如需了解详情,请参阅子网范围
  • COMPUTE_REGION:集群的计算区域

验证 Pod IP 地址范围和 Service IP 地址范围

创建 VPC 原生集群后,您可以验证其 Pod 范围和 Service 范围。

gcloud

要验证集群,请运行以下命令:

gcloud beta container clusters describe CLUSTER_NAME

输出具有 ipAllocationPolicy 块,如下所示:

 ipAllocationPolicy:
   ...
   createSubnetwork: true
   ipv6AccessType: INTERNAL 
   podCidrOverprovisionConfig: {}
   servicesIpv4Cidr: 10.5.160.0/20
   servicesIpv4CidrBlock: 10.5.160.0/20
   servicesIpv6CidrBlock: 2600:2d00:0:4:188f:ce54:5f00:0/112
   servicesSecondaryRangeName: gke-ipv6-2-services-ebc6a146
   stackType: ipv4-ipv6
   subnetIpv6CidrBlock: 2600:1900:4121:f8ae::/64
   useIpAliases: true
 ```

The following fields include network information:
  • IPv4 网络信息:

    • clusterIpv4Cidr 是 Pod 的次要范围
    • servicesIpv4Cidr 是 Service 的次要范围
  • IPv6 网络信息(如果集群具有双栈网络):

    • ipv6AccessType:是否可路由到公共互联网。INTERNAL(用于专用集群)和 EXTERNAL(用于公共集群)。
    • servicesIpv6CidrBlock:主要 IPv6 地址范围。
    • stackType:双栈网络定义。
    • subnetIpv6CidrBlock:新子网的次要 IPv6 地址范围。

控制台

要验证集群,请执行以下步骤:

  1. 进入控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要检查的集群的名称。

网络部分中显示的次要范围:

  • Pod 地址范围是 Pod 的次要范围
  • 服务地址范围是服务的次要范围

问题排查

本部分介绍了如何解决 VPC 原生集群的相关问题。

默认网络资源尚未就绪

表现

您会收到类似于以下内容的错误消息:

projects/[PROJECT_NAME]/regions/XXX/subnetworks/default
潜在原因

同一子网上存在并行操作。例如,正在创建其他 VPC 原生集群,或正在子网上添加或删除次要范围。

解决方法

重试此命令。

IPCidrRange 值无效

表现

您会收到类似于以下内容的错误消息:

resource.secondaryIpRanges[1].ipCidrRange': 'XXX'. Invalid IPCidrRange: XXX conflicts with existing subnetwork 'default' in region 'XXX'
潜在原因

正在同时创建其他 VPC 原生集群,且该集群正尝试在同一 VPC 网络中分配相同的范围。

正在向同一 VPC 网络中的子网添加相同的次要范围。

解决方法

如果您没有指定任何次要范围,并且在创建集群时收到该错误,请重试集群创建命令。

Pod 没有足够的可用 IP 空间

表现

集群在较长时间内处于预配状态。

集群创建返回托管实例组 (MIG) 错误。

向集群添加一个或多个节点时,系统会显示以下错误:

[IP_SPACE_EXHAUSTED] Instance 'INSTANCE_NAME' creation failed: IP space of 'projects/PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME-SECONDARY_RANGE_NAME' is exhausted.
潜在原因

Pod IP 地址范围中未分配的空间对于集群中请求的节点而言不够大。例如,如果集群的 Pod IP 地址范围的网络掩码大小为 /23(512 个地址),并且每个节点的 Pod 数上限为 110,则您最多只能创建两个节点。每个节点分配有一个网络掩码大小为 /24 的别名 IP 地址范围。

解决方案

您可以使用连续的多 Pod CIDR 向集群添加 Pod IP 地址范围。

在审核并规划适当大小的主要 IP 地址范围和次要 IP 地址范围后,创建一个替换集群。请参阅 VPC 原生集群的 IP 范围IP 范围规划

创建一个新的节点池,并采用较小的每个节点的 Pod 数上限。如果可以的话,请将工作负载迁移到该节点池,然后删除原有的节点池。通过减少每个节点的 Pod 数上限,您可以使固定的 Pod 次要 IP 地址范围支持更多的节点。如需详细了解所涉及的计算,请参阅 Pod 的子网次要 IP 地址范围节点限制范围

确认是否已停用默认 SNAT

使用以下命令检查默认 SNAT 的状态:

gcloud container clusters describe CLUSTER_NAME

CLUSTER_NAME 替换为您的集群名称。

输出内容类似如下:

networkConfig:
  disableDefaultSnat: true
  network: ...

无法在没有 --enable-ip-alias 的情况下使用 --disable-default-snat

此错误消息和“must disable default sNAT (--disable-default-snat) before using public IP address privately in the cluster”表示您应在创建集群时明确设置 --disable-default-snat 标志,因为您是在专用集群中使用公共 IP 地址。

如果您看到类似“cannot disable default sNAT ...”的错误消息,则表示无法在集群中停用默认 SNAT。请检查您的集群配置。

在停用默认 SNAT 的情况下调试 Cloud NAT

如果您使用 --disable-default-snat 标志创建了一个专用集群,并且为 Cloud NAT 设置了互联网访问,但没有看到来自 Pod 的互联网绑定流量,请确保 Pod 范围包含在 Cloud NAT 配置中。

如果 Pod 到 Pod 的通信存在问题,请检查节点的 iptables 规则以验证 Pod 范围是否未被 iptables 规则伪装。如需了解详情,请参阅 GKE IP 伪装文档。如果您尚未为集群配置 IP 伪装代理,GKE 会自动确保 Pod 到 Pod 的通信未被伪装。但是,如果配置了 IP 伪装代理,则该代理将替换默认的 IP 伪装规则。验证是否在 IP 伪装代理中配置了其他规则,以忽略对 Pod 范围的伪装。

双栈集群网络通信未按预期工作

潜在原因
GKE 集群创建的防火墙规则不包含分配的 IPv6 地址。
解决方法
您可以按照以下步骤验证防火墙规则
  1. 验证防火墙规则内容:

    gcloud compute firewall-rules describe FIREWALL_RULE_NAME
    

    请将 FIREWALL_RULE_NAME 替换为防火墙规则的名称。

    每个双栈集群都会创建一条防火墙规则,以允许节点和 pod 互相通信。防火墙规则内容如下所示:

    allowed:
    - IPProtocol: esp
    - IPProtocol: ah
    - IPProtocol: sctp
    - IPProtocol: tcp
    - IPProtocol: udp
    - IPProtocol: '58'
    creationTimestamp: '2021-08-16T22:20:14.747-07:00'
    description: ''
    direction: INGRESS
    disabled: false
    enableLogging: false
    id: '7326842601032055265'
    kind: compute#firewall
    logConfig:
      enable: false
    name: gke-ipv6-4-3d8e9c78-ipv6-all
    network: https://www.googleapis.com/compute/alpha/projects/my-project/global/networks/alphanet
    priority: 1000
    selfLink: https://www.googleapis.com/compute/alpha/projects/my-project/global/firewalls/gke-ipv6-4-3d8e9c78-ipv6-all
    selfLinkWithId: https://www.googleapis.com/compute/alpha/projects/my-project/global/firewalls/7326842601032055265
    sourceRanges:
    - 2600:1900:4120:fabf::/64
    targetTags:
    - gke-ipv6-4-3d8e9c78-node
    

    sourceRanges 值必须与 subnetIpv6CidrBlock 相同。targetTags 值必须与 GKE 节点上的标记相同。如需解决此问题,请使用集群 ipAllocationPolicy信息更新防火墙规则

限制

  • 您无法将 VPC 原生集群转换为基于路由的集群,也不能将基于路由的集群转换为 VPC 原生集群。
  • VPC 原生集群需要 VPC 网络。旧式网络不受支持。
  • 与任何 GKE 集群一样,Service (ClusterIP) 地址只能从集群内部访问。如果您需要从位于集群外部但位于集群 VPC 网络和区域内的虚拟机实例访问 Kubernetes Service,请创建一个内部 TCP/UDP 负载平衡器
  • 如果在子网中使用所有 Pod IP 地址,则您无法在不将集群置于不稳定状态的情况下替换子网的次要 IP 地址范围。但是,您可以使用连续的多 Pod CIDR 创建其他 Pod IP 地址范围。

后续步骤