创建 VPC 原生集群


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

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

准备工作

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

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

限制

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

在现有子网中创建集群

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

gcloud

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

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

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

请替换以下内容:

  • CLUSTER_NAME:GKE 集群的名称。
  • COMPUTE_LOCATION:集群的 Compute Engine 位置
  • 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:指定项中现有次要 IP 地址范围的名称。

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建,然后在Standard 或 Autopilot 部分中点击配置

  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. 点击创建

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_LOCATION"
  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_LOCATION:集群的 Compute Engine 位置。对于 Terraform,则为 Compute Engine 区域。
  • NETWORK_NAME:现有网络的名称。
  • SUBNET_NAME:现有子网的名称。子网的主要 IP 地址范围用于节点。子网必须位于集群所使用的区域中。
  • SECONDARY_RANGE_PODS:指定项中现有次要 IP 地址范围的名称。
  • SECONDARY_RANGE_SERVICES:指定项中现有次要 IP 地址范围的名称。

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 表示法,例如 10.0.0.0/14。从 VPC 的可用空间中选择具有给定大小的空白空间。如果您将此项留空,则系统会查找有效范围并使用默认大小创建该范围。
  • "servicesIpv4CidrBlock":Service 的 CIDR 范围。请参阅 "clusterIpv4CidrBlock" 的说明。
  • "clusterSecondaryRangeName":Pod 的次要范围的名称。此次要范围必须已存在且属于与集群关联的子网。
  • "serviceSecondaryRangeName":Service 的次要范围的名称。此次要范围必须已存在且属于与集群关联的子网。

创建集群并选择控制平面 IP 地址范围

默认情况下,具有 Private Service Connect 的集群使用主要子网范围来预配分配给控制平面端点的内部 IP 地址。您可以替换此默认设置,方法是仅在创建集群期间选择其他子网范围。以下部分介绍了如何使用 Private Service Connect 创建集群并替换子网范围。

gcloud

创建使用 Private Service Connect 且定义为公共集群的集群

gcloud container clusters create CLUSTER_NAME \
    --private-endpoint-subnetwork=SUBNET_NAME \
    --location=COMPUTE_LOCATION

添加 --enable-private-nodes 标志以将 Private Service Connect 集群创建为专用集群。

替换以下内容:

  • CLUSTER_NAME:GKE 集群的名称。
  • SUBNET_NAME:现有子网的名称。
  • COMPUTE_LOCATION:集群的 Compute Engine 位置

GKE 会创建使用 Private Service Connect 的集群

创建定义为专用集群的集群:

在 GKE 1.29 及更高版本中,您可以创建一个使用 Private Service Connect 的集群:

gcloud container clusters create CLUSTER_NAME --enable-ip-alias \
    --enable-private-nodes  \
    --private-endpoint-subnetwork=SUBNET_NAME \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:GKE 集群的名称。
  • SUBNET_NAME:现有子网的名称。如果您没有为 private-endpoint-subnetwork 标志提供值,但需要使用 master-ipv4-cidr,GKE 会创建一个新子网,该子网使用您在 master-ipv4-cidr 中定义的值。GKE 会使用新子网为控制平面预配内部 IP 地址。
  • COMPUTE_LOCATION:集群的 Compute Engine 位置

控制台

创建定义为公共集群的集群:

如需向新集群的控制层面分配子网,您必须先添加子网。 然后,完成以下步骤:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 在 Standard 或 Autopilot 部分,点击配置

  4. 名称部分,输入您的集群名称。

  5. 对于 Standard 集群,在导航窗格中的集群下,点击网络

  6. IPv4 网络访问部分,执行以下操作:

    1. 如需创建公共 GKE 集群,请选择公共集群
    2. 如需创建专用 GKE 集群,请选择专用集群

    在这两种情况下,您以后都可以在修改集群配置时更改集群隔离模式

  7. 高级网络选项部分中,选中替换控制层面的默认专用端点子网复选框。

  8. 专用端点子网列表中,选择您创建的子网。

  9. 点击完成。根据需要添加其他已获授权的网络。

同时创建集群和子网

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

gcloud

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

gcloud container clusters create CLUSTER_NAME \
    --location=COMPUTE_LOCATION \
    --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_LOCATION:集群的 Compute Engine 位置
  • 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)。

控制台

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

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 子网范围。

  • 内部直通网络负载均衡器仅使用子网的主要 IP 地址范围中的 IP 地址。如需创建具有非 RFC 1918 地址的内部直通负载均衡器,子网的主要 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 地址,则 SNAT 规则适用于 Pod 到 Pod 的流量。为避免这种情况,您有两种选择:

使用 IPv4/IPv6 双栈网络创建双栈集群

您可以在新的或现有的双栈子网上创建使用 IPv4/IPv6 双栈网络的集群。

本指南介绍如何完成以下任务:

  • 创建双栈子网(适用于 Autopilot 集群 1.25 或更高版本以及 Standard 集群 1.24 或更高版本)。
  • 将现有子网更新为双栈子网(适用于 Autopilot 集群 1.25 或更高版本以及 Standard 集群 1.24 或更高版本)。
  • 创建使用双栈网络的集群(适用于 Autopilot 集群 1.25 或更高版本,以及 Standard 集群 1.24 或更高版本)。使用双栈子网时,GKE Autopilot 集群默认为双栈集群。创建集群后,您可以将 Autopilot 集群更新为仅限 IPv4。
  • 同时创建双栈集群和双栈子网(适用于 Autopilot 集群 1.25 或更高版本以及 Standard 集群 1.24 或更高版本)。

如需详细了解使用双栈网络的 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:将要添加新子网的网络的名称。此网络必须满足以下条件:
  • 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:集群的 计算区域

创建使用双栈网络的集群

如需创建使用现有双栈子网的集群,您可以使用 gcloud CLI 或 Google Cloud 控制台:

gcloud

  • 对于 Autopilot 集群,请运行以下命令:

      gcloud container clusters create-auto CLUSTER_NAME \
          --location=COMPUTE_LOCATION \
          --network=NETWORK_NAME \
          --subnetwork=SUBNET_NAME
    

    替换以下内容:

    • CLUSTER_NAME:新 Autopilot 集群的名称。
    • COMPUTE_LOCATION:集群的 Compute Engine 位置
    • NETWORK_NAME:包含子网的 VPC 网络的名称。此 VPC 网络必须是自定义模式 VPC 网络。如需了解详情,请参阅如何将 VPC 网络从自动模式切换到自定义模式
    • SUBNET_NAME:双栈子网的名称。 如需了解详情,请参阅如何创建双栈子网

      使用双栈子网时,GKE Autopilot 集群默认为双栈集群。创建集群后,您可以将 Autopilot 集群更新为仅限 IPv4。

  • 对于 Standard 集群,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --enable-ip-alias \
        --enable-dataplane-v2 \
        --stack-type=ipv4-ipv6 \
        --network=NETWORK_NAME \
        --subnetwork=SUBNET_NAME \
        --location=COMPUTE_LOCATION
    

    请替换以下内容:

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 在 Standard 或 Autopilot 部分,点击配置

  4. 根据需要配置集群。

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

  6. 网络列表中,选择您的网络的名称。

  7. 节点子网列表中,选择双栈子网的名称。

  8. 对于 Standard 集群,请选择 IPv4 和 IPv6(双栈)单选按钮。只有当您选择了双栈子网时,此选项才可用。

    使用双栈子网时,Autopilot 集群默认为双栈集群。

  9. 点击创建

同时创建双栈集群和子网

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

  • 对于 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=COMPUTE_LOCATION \
        --network=NETWORK_NAME \
        --create-subnetwork name=SUBNET_NAME
    

    替换以下内容:

    • CLUSTER_NAME:新 Autopilot 集群的名称。
    • COMPUTE_LOCATION:集群的 Compute Engine 位置
    • NETWORK_NAME:包含子网的 VPC 网络的名称。此 VPC 网络必须是使用唯一本地 IPv6 单播地址 (ULA) 的自定义模式 VPC 网络。如需了解详情,请参阅如何将 VPC 网络从自动模式切换到自定义模式
    • SUBNET_NAME:新子网的名称。 GKE 可以根据您的组织政策创建子网:
      • 如果您的组织政策允许双栈,并且网络是自定义模式,则 GKE 会创建双栈子网,并为子网分配外部 IPv6 主要范围。
      • 如果您的组织政策不允许双栈,或者网络处于自动模式,则 GKE 会创建单栈 (IPv4) 子网。
  • 对于 Standard 集群,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --enable-ip-alias \
        --stack-type=ipv4-ipv6 \
        --ipv6-access-type=ACCESS_TYPE \
        --network=NETWORK_NAME \
        --create-subnetwork name=SUBNET_NAME,range=PRIMARY_RANGE \
        --location=COMPUTE_LOCATION
    

    替换以下内容:

    • CLUSTER_NAME:您选择的新集群的名称。
    • ACCESS_TYPE:是否可路由到公共互联网。对专用集群使用 INTERNAL,对公共集群使用 EXTERNAL。如果未指定 --ipv6-access-type,则默认访问类型为 EXTERNAL
    • NETWORK_NAME:将要添加新子网的网络的名称。此网络必须满足以下条件:
    • SUBNET_NAME:您选择的新子网的名称。
    • PRIMARY_RANGE:新子网的主要 IPv4 地址范围(采用 CIDR 表示法)。如需了解详情,请参阅子网范围
    • COMPUTE_LOCATION:集群的 Compute Engine 位置

更新现有集群上的堆栈类型

您可以更改现有集群的堆栈类型。在更改现有集群上的堆栈类型之前,请考虑以下限制:

  • 运行 1.25 版或更高版本的新 GKE 集群支持更改堆栈类型。从 1.24 版升级到 1.25 版或 1.26 版的 GKE 集群在启用双栈网络时可能会遇到验证错误。 如果出现错误,请与 Google Cloud 支持团队联系。

  • 更改堆栈类型是一种中断性操作,因为 GKE 会重启控制平面和节点中的组件。

  • 重新创建节点时,GKE 会遵循已配置的维护窗口。也就是说,在下一个维护窗口之前,集群堆栈类型将无法在集群上运行。如果您不想等待,可将 --cluster-version 标志设置为控制层面已在运行的同一 GKE 版本,从而手动升级节点池。如果您使用此解决方法,则必须使用 gcloud CLI。如需了解详情,请参阅维护窗口的注意事项

  • 更改堆栈类型不会自动更改现有 Service 的 IP 系列。以下条件适用:

    • 如果将单栈更改为双栈,则现有 Service 仍然是单栈。
    • 如果将双栈更改为单栈,则使用 IPv6 地址的现有 Service 会进入错误状态。删除 Service 并使用正确的 ipFamilies 创建一个 Service。 如需了解详情,请参阅有关如何设置 Deployment 的示例

如需更新现有 VPC 原生集群,您可以使用 gcloud CLI 或 Google Cloud 控制台:

gcloud

运行以下命令:

  gcloud container clusters update CLUSTER_NAME \
      --stack-type=STACK_TYPE \
      --location=COMPUTE_LOCATION

替换以下内容:

  • CLUSTER_NAME:您要更新的集群的名称。
  • STACK_TYPE:堆栈类型。替换为以下某个值:
    • ipv4:将双栈集群更新为仅限 IPv4 的集群。 GKE 使用集群子网的主要 IPv4 地址范围。
    • ipv4-ipv6:将现有 IPv4 集群更新为双栈。只有在底层子网支持双栈时,您才能将集群更改为双栈。如需了解详情,请参阅将现有子网更新为双栈子网
  • COMPUTE_LOCATION:集群的 Compute Engine 位置

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在要修改的集群旁边,点击 操作,然后点击 修改

  3. 网络部分的堆栈类型旁边,点击 修改

  4. 修改堆栈类型对话框中,选中所需的集群堆栈类型对应的复选框。

  5. 点击保存更改

创建 IPv4/IPv6 双栈 Service

您可以创建 ClusterIPNodePort 类型的 IPv4/IPv6 双栈 Service。运行 1.29 版或更高版本的新 GKE 集群支持 LoadBalancer 类型的双栈 Service。如需了解详情,请参阅 IPv4/IPv6 双栈 LoadBalancer Service

对于每种 Service 类型,您可以将 ipFamiliesipFamilyPolicy 字段定义为 IPv4、IPv6 或双栈。如需了解详情,请参阅 IPv4/IPv6 双栈 Service

验证堆栈类型、Pod 和 Service IP 地址范围

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

gcloud

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

gcloud container clusters describe CLUSTER_NAME

输出具有 ipAllocationPolicy 块。stackType 字段描述了网络定义的类型。对于每种类型,您可以看到以下网络信息:

  • IPv4 网络信息:

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

    • ipv6AccessType:是否可路由到公共互联网。INTERNAL 表示专用 IPv6 地址,EXTERNAL 表示公共 IPv6 地址。
    • subnetIpv6CidrBlock:新子网的次要 IPv6 地址范围。
    • servicesIpv6CidrBlock:为双栈集群上的 IPv6 服务分配的地址范围。

控制台

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

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

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

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

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

问题排查

本部分介绍了如何解决 VPC 原生集群的相关问题。您还可以查看 GKE IP 地址利用率数据分析

默认网络资源尚未就绪

表现

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

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信息更新防火墙规则

后续步骤