创建专用集群

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍如何创建专用 Google Kubernetes Engine (GKE) 集群,该集群是一种 VPC 原生集群。在专用集群中,节点仅具有内部 IP 地址,这意味着节点和 Pod 默认与互联网隔离。

节点的内部 IP 地址来自您为集群选择的子网的主要 IP 地址范围。Pod IP 地址和 Service IP 地址来自同一子网的两个子网次要 IP 地址范围。如需了解详情,请参阅 VPC 原生集群的 IP 地址范围

GKE 1.14.2 版及更高版本支持任何内部 IP 地址范围,包括专用范围(RFC 1918 和其他专用范围)以及专门使用的公共 IP 地址范围。如需查看有效内部 IP 地址范围的列表,请参阅 VPC 文档。

如需详细了解专用集群的工作原理,请参阅专用集群

准备工作

在进行下一步骤之前,请先熟悉要求、限制和局限

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。

创建无法通过客户端访问公共端点的专用集群

在本部分中,您将创建以下资源:

  • 名为 private-cluster-0 的专用集群,该集群具有专用节点,但没有对公共端点的客户端访问权限。
  • 名为 my-net-0 的网络。
  • 名为 my-subnet-0 的子网。

gcloud

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

    gcloud container clusters create private-cluster-0 \
        --create-subnetwork name=my-subnet-0 \
        --enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --enable-private-endpoint \
        --master-ipv4-cidr 172.16.0.32/28
    
  • 对于 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto private-cluster-0 \
        --create-subnetwork name=my-subnet-0 \
        --enable-master-authorized-networks \
        --enable-private-nodes \
        --enable-private-endpoint
    

其中:

  • --create-subnetwork name=my-subnet-0 使 GKE 自动创建名为 my-subnet-0 的子网。
  • --enable-master-authorized-networks 用于指定仅限您授权的 IP 地址范围访问公共端点。
  • --enable-ip-alias 使集群成为 VPC 原生集群(对于 Autopilot 而言并非必需)。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --enable-private-endpoint 表示使用控制层面 API 端点的专用 IP 地址管理集群。
  • --master-ipv4-cidr 172.16.0.32/28 指定控制层面的内部 IP 地址范围(对于 Autopilot 而言可选)。此设置对于该集群是永久性的,并且在 VPC 中必须是唯一的。系统支持使用非 RFC 1918 内部 IP 地址

控制台

创建网络和子网

  1. 前往 Google Cloud 控制台中的 VPC 网络页面。

    进入“VPC 网络”

  2. 点击 创建 VPC 网络

  3. 对于名称,输入 my-net-0

  4. 对于子网创建模式,选择自定义

  5. 新子网部分的名称中,输入 my-subnet-0

  6. 地区列表中,选择所需的地区。

  7. 对于 IP 地址范围,输入 10.2.204.0/22

  8. 专用 Google 访问通道设置为开启

  9. 点击完成

  10. 点击创建

创建专用集群

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

    前往 Google Kubernetes Engine

  2. 点击 创建

  3. 在“标准”或 Autopilot 部分,点击配置

  4. 名称输入 private-cluster-0

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

  6. 网络列表中,选择 my-net-0

  7. 节点子网列表中,选择 my-subnet-0

  8. 选择专用集群单选按钮。

  9. 取消选中使用外部 IP 地址的控制平面复选框。

  10. (对于 Autopilot 而言为可选):将控制层面 IP 地址范围设置为 172.16.0.32/28

  11. 点击创建

API

如需创建不具备可公开访问的控制层面的集群,请在 privateClusterConfig 资源中指定 enablePrivateEndpoint: true 字段。

此时,只有以下范围内的地址才能访问控制层面:

  • my-subnet-0 的主要范围。
  • 用于 Pod 的次要范围。

例如,假设您在 my-subnet-0 的主要范围内创建了一个虚拟机。 在该虚拟机上,您可以配置 kubectl 以使用控制层面的内部 IP 地址

如果您想从 my-subnet-0 外部访问控制层面,则必须至少授权一个地址范围访问专用端点。

假设您的虚拟机位于默认网络中,并且与您的集群位于同一区域,但不在 my-subnet-0 中。

例如:

  • my-subnet-010.0.0.0/22
  • Pod 次要范围:10.52.0.0/14
  • 虚拟机地址:10.128.0.3

您可以使用以下命令授权虚拟机访问控制层面:

gcloud container clusters update private-cluster-0 \
    --enable-master-authorized-networks \
    --master-authorized-networks 10.128.0.3/32

创建对公共端点的访问受限的专用集群

使用此配置创建专用集群时,您可以选择使用自动生成的子网或自定义的子网。

使用自动生成的子网

在本部分中,您将创建一个名为 private-cluster-1 的专用集群,其中 GKE 会自动为您的集群节点生成子网。该子网启用了专用 Google 访问通道。在该子网中,GKE 会自动创建两个次要范围:一个用于 Pod,另一个用于 Service。

您可以使用 Google Cloud CLI 或 GKE API。

gcloud

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

    gcloud container clusters create private-cluster-1 \
        --create-subnetwork name=my-subnet-1 \
        --enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --master-ipv4-cidr 172.16.0.0/28
    
  • 对于 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto private-cluster-1 \
        --create-subnetwork name=my-subnet-1 \
        --enable-master-authorized-networks \
        --enable-private-nodes
    

其中:

  • --create-subnetwork name=my-subnet-1 使 GKE 自动创建名为 my-subnet-1 的子网。
  • --enable-master-authorized-networks 用于指定仅限您授权的 IP 地址范围访问公共端点。
  • --enable-ip-alias 使集群成为 VPC 原生集群(对于 Autopilot 而言并非必需)。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --master-ipv4-cidr 172.16.0.0/28 指定控制层面的内部 IP 地址范围(对于 Autopilot 而言可选)。此设置对于该集群是永久性的,并且在 VPC 中必须是唯一的。系统支持使用非 RFC 1918 内部 IP 地址

API

Cluster API 资源中指定 privateClusterConfig 字段:

{
  "name": "private-cluster-1",
  ...
  "ipAllocationPolicy": {
    "createSubnetwork": true,
  },
  ...
    "privateClusterConfig" {
      "enablePrivateNodes": boolean # Creates nodes with internal IP addresses only
      "enablePrivateEndpoint": boolean # false creates a cluster control plane with a publicly-reachable endpoint
      "masterIpv4CidrBlock": string # CIDR block for the cluster control plane
      "privateEndpoint": string # Output only
      "publicEndpoint": string # Output only
  }
}

此时,只有以下范围内的地址才能访问集群控制层面:

  • my-subnet-1 的主要范围。
  • 用于 Pod 的次要范围。

假设您有一组机器位于 VPC 网络之外,它们的地址在范围 203.0.113.0/29 内。您可以通过输入以下命令向这些机器授予对公共端点的访问权限:

gcloud container clusters update private-cluster-1 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

现在,只有以下范围内的地址才能访问控制层面:

  • my-subnet-1 的主要范围。
  • 用于 Pod 的次要范围。
  • 您已授权的地址范围,例如 203.0.113.0/29

使用自定义子网

在本部分中,您将创建以下资源:

  • 名为 private-cluster-2 的专用集群。
  • 名为 my-net-2 的网络。
  • 用于集群节点的主范围为 192.168.0.0/20my-subnet-2 子网。您的子网具有以下次要地址范围:

    • my-pods(对于 Pod IP 地址)。
    • my-services(对于 Service IP 地址)。

gcloud

创建网络

首先,为您的集群创建一个网络。以下命令会创建一个网络 my-net-2

gcloud compute networks create my-net-2 \
    --subnet-mode custom

创建子网和次要范围

接下来,在 my-net-2 网络中创建一个子网 my-subnet-2,其次要范围为 my-pods(用于 Pod)和 my-services(用于 Service):

gcloud compute networks subnets create my-subnet-2 \
    --network my-net-2 \
    --range 192.168.0.0/20 \
    --secondary-range my-pods=10.4.0.0/14,my-services=10.0.32.0/20 \
    --enable-private-ip-google-access

创建专用集群

现在,使用您创建的网络、子网以及次要范围创建一个专用集群 private-cluster-2

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

    gcloud container clusters create private-cluster-2 \
        --enable-master-authorized-networks \
        --network my-net-2 \
        --subnetwork my-subnet-2 \
        --cluster-secondary-range-name my-pods \
        --services-secondary-range-name my-services \
        --enable-private-nodes \
        --enable-ip-alias \
        --master-ipv4-cidr 172.16.0.16/28 \
        --no-enable-basic-auth \
        --no-issue-client-certificate
    
  • 对于 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto private-cluster-2 \
        --region us-central1 \
        --enable-master-authorized-networks \
        --network my-net-2 \
        --subnetwork my-subnet-2 \
        --cluster-secondary-range-name my-pods \
        --services-secondary-range-name my-services \
        --enable-private-nodes
    

控制台

创建网络、子网和次要范围

  1. 前往 Google Cloud 控制台中的 VPC 网络页面。

    进入“VPC 网络”

  2. 点击 创建 VPC 网络

  3. 对于名称,输入 my-net-2

  4. 对于子网创建模式,选择自定义

  5. 新子网部分的名称中,输入 my-subnet-2

  6. 地区列表中,选择所需的地区。

  7. 对于 IP 地址范围,输入 192.168.0.0/20

  8. 点击创建次要 IP 范围。在子网范围名称部分,输入 my-services;在次要 IP 范围部分,输入 10.0.32.0/20

  9. 点击添加 IP 范围。在子网范围名称部分,输入 my-pods;在次要 IP 范围部分,输入 10.4.0.0/14

  10. 专用 Google 访问通道设置为开启

  11. 点击完成

  12. 点击创建

创建专用集群

创建使用子网的专用集群:

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

    前往 Google Kubernetes Engine

  2. 点击 创建

  3. 在“标准”或 Autopilot 部分,点击配置

  4. 名称输入 private-cluster-2

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

  6. 选择专用集群单选按钮。

  7. 如需创建可从授权外部 IP 范围访问的控制层面,请保持使用外部 IP 地址访问主节点复选框处于选中状态。

  8. (对于 Autopilot 而言为可选):将控制层面 IP 地址范围设置为 172.16.0.16/28

  9. 网络列表中,选择 my-net-2

  10. 节点子网列表中,选择 my-subnet-2

  11. 清除自动创建次要范围复选框。

  12. Pod 次要 CIDR 范围列表中,选择 my-pods

  13. Service 次要 CIDR 范围列表中,选择 my-services

  14. 选中启用控制平面授权网络复选框。

  15. 点击创建

此时,只有以下范围内的地址才能访问控制层面:

  • my-subnet-2 的主要范围。
  • 次要范围 my-pods

假设您有一组机器位于 my-net-2 之外,它们的地址在范围 203.0.113.0/29 内。您可以通过输入以下命令向这些机器授予对公共端点的访问权限:

gcloud container clusters update private-cluster-2 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

此时,只有以下范围内的地址才能访问控制层面:

  • my-subnet-2 的主要范围。
  • 次要范围 my-pods
  • 您已授权的地址范围,例如 203.0.113.0/29

使用 Cloud Shell 访问专用集群

您在使用自动生成的子网部分中创建的专用集群 private-cluster-1 具有公共端点,并且启用了已获授权的网络。如果要使用 Cloud Shell 访问集群,则必须将 Cloud Shell 的公共 IP 地址添加到集群的已获授权的网络列表中。

为此,请按以下说明操作:

  1. 在 Cloud Shell 命令行窗口中,使用 dig 查找 Cloud Shell 的外部 IP 地址:

    dig +short myip.opendns.com @resolver1.opendns.com
    
  2. 将 Cloud Shell 的外部地址添加到集群的授权网络列表中:

    gcloud container clusters update private-cluster-1 \
        --enable-master-authorized-networks \
        --master-authorized-networks EXISTING_AUTH_NETS,SHELL_IP/32
    

    替换以下内容:

    • EXISTING_AUTH_NETS:现有的已获授权的网络列表的 IP 地址。您可以在控制台中查找授权网络,也可以通过运行以下命令来查找:

      gcloud container clusters describe private-cluster-1 --format "flattened(masterAuthorizedNetworksConfig.cidrBlocks[])"
      
    • SHELL_IP:您的 Cloud Shell 的外部 IP 地址。

  3. 获取凭据,以便使用 kubectl 访问集群:

    gcloud container clusters get-credentials private-cluster-1 \
        --project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

  4. 在 Cloud Shell 中使用 kubectl 访问专用集群:

    kubectl get nodes
    

    输出内容类似如下:

    NAME                                               STATUS   ROLES    AGE    VERSION
    gke-private-cluster-1-default-pool-7d914212-18jv   Ready    <none>   104m   v1.21.5-gke.1302
    gke-private-cluster-1-default-pool-7d914212-3d9p   Ready    <none>   104m   v1.21.5-gke.1302
    gke-private-cluster-1-default-pool-7d914212-wgqf   Ready    <none>   104m   v1.21.5-gke.1302
    

创建对公共端点具有不受限制的访问权限的专用集群

在本部分中,您将创建一个专用集群,使得任何 IP 地址都可以访问控制层面。

gcloud

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

    gcloud container clusters create private-cluster-3 \
        --create-subnetwork name=my-subnet-3 \
        --no-enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --master-ipv4-cidr 172.16.0.32/28
    
  • 对于 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto private-cluster-3 \
        --create-subnetwork name=my-subnet-3 \
        --no-enable-master-authorized-networks \
        --enable-private-nodes
    

其中:

  • --create-subnetwork name=my-subnet-3 使 GKE 自动创建名为 my-subnet-3 的子网。
  • --no-enable-master-authorized-networks 用于为集群停用已授权的网络。
  • --enable-ip-alias 使集群成为 VPC 原生集群(对于 Autopilot 而言并非必需)。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --master-ipv4-cidr 172.16.0.32/28 指定控制层面的内部 IP 地址范围(对于 Autopilot 而言可选)。此设置对于该集群是永久性的,并且在 VPC 中必须是唯一的。系统支持使用非 RFC 1918 内部 IP 地址

控制台

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

    前往 Google Kubernetes Engine

  2. 点击 创建

  3. 在“标准”或 Autopilot 部分,点击配置

  4. 名称输入 private-cluster-3

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

  6. 选择专用集群选项。

  7. 保持使用外部 IP 地址的访问权限控制复选框处于选中状态。

  8. (对于 Autopilot 而言为可选):将控制层面 IP 地址范围设置为 172.16.0.32/28

  9. 网络节点子网保留设置为 default。这会使 GKE 为您的集群生成子网。

  10. 取消选中启用控制平面授权网络复选框。

  11. 点击创建

其他专用集群配置

除上述配置外,您还可以使用以下配置运行专用集群。

授予专用节点出站互联网访问权限

如需为专用节点提供出站互联网访问权限(例如从外部注册表拉取映像),请使用 Cloud NAT 创建并配置一个 Cloud Router 路由器。Cloud NAT 允许专用集群通过互联网建立出站连接,以发送和接收数据包。

Cloud Router 路由器允许区域内的所有节点将 Cloud NAT 用于所有主要 IP 范围和别名 IP 范围。此外,它还会为 NAT 网关自动分配外部 IP 地址。

有关创建和配置 Cloud Router 路由器的说明,请参阅 Cloud NAT 文档中的创建使用 Cloud Router 路由器的 Cloud NAT 配置

在共享 VPC 网络中创建专用集群

如需了解如何在共享 VPC 网络中创建专用集群,请参阅在共享 VPC 中创建专用集群

将 Windows Server 容器应用部署到专用集群

如需了解如何将 Windows Server 容器应用部署到专用集群,请参阅 Windows 节点池文档

在全球范围内访问控制层面的专用端点

控制层面的专用端点由控制层面的 VPC 网络中的内部 TCP/UDP 负载平衡器实现。内部客户端或通过 Cloud VPN 隧道和 Cloud Interconnect VLAN 连接进行连接的客户端可以访问内部 TCP/UDP 负载均衡器。

默认情况下,这些客户端必须与负载均衡器位于同一区域

启用控制层面全球访问权限时,可在全球范围内访问内部 TCP/UDP 负载均衡器:客户端虚拟机和本地系统可以从任意地区连接到控制层面的专用端点(受授权网络配置的限制)。

如需详细了解内部 TCP/UDP 负载均衡器和全球访问权限,请参阅内部负载均衡器和连接的网络

启用控制层面专用端点全球访问权限

默认情况下,在创建专用集群时,系统不会为控制层面的专用端点启用全球访问权限。如需启用控制层面全球访问权限,请根据您的集群模式使用以下工具:

  • 对于标准集群,您可以使用 Google Cloud CLI 或 Google Cloud Console。
  • 对于 Autopilot 集群,您可以使用 google_container_cluster Terraform 资源。

gcloud

添加 enable-master-global-access 标志以创建启用了控制层面专用端点的全球访问权限的专用集群:

gcloud container clusters create CLUSTER_NAME \
    --enable-private-nodes \
    --enable-ip-alias \
    --master-ipv4-cidr=172.16.16.0/28 \
    --enable-master-global-access

您还可以为现有专用集群启用控制层面专用端点的全球访问权限:

gcloud container clusters update CLUSTER_NAME \
    --enable-master-global-access

控制台

如需创建启用了控制层面全球访问权限的新专用集群,请执行以下步骤:

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

    前往 Google Kubernetes Engine

  2. 点击 创建

  3. 输入名称

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

  5. 选择专用集群

  6. 选中启用控制层面全局访问权限复选框。

  7. 根据需要配置其他字段。

  8. 点击创建

如需为现有专用集群启用控制层面全球访问权限,请执行以下步骤:

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

    转到 Google Kubernetes Engine

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

  3. 网络部分的控制平面授权网络旁边,点击 修改

  4. 修改控制平面授权网络对话框中,选中启用控制层面授权网络复选框。

  5. 点击保存更改

验证控制层面专用端点全球访问权限

如需验证是否启用了控制层面专用端点的全球访问权限,请运行以下命令并查看其输出。

gcloud container clusters describe CLUSTER_NAME

输出包括 privateClusterConfig 部分,您可以在其中查看 masterGlobalAccessConfig 的状态。

privateClusterConfig:
  enablePrivateNodes: true
  masterIpv4CidrBlock: 172.16.1.0/28
  peeringName: gke-1921aee31283146cdde5-9bae-9cf1-peer
  privateEndpoint: 172.16.1.2
  publicEndpoint: 34.68.128.12
  masterGlobalAccessConfig:
    enabled: true

从本地网络连接到控制层面的专用端点

创建 GKE 专用集群并停用控制层面的公共端点后,您仍可以使用 kubectl 等工具从本地网络连接到控制层面的专用端点。本部分介绍从本地网络访问控制层面专用端点所需的网络要求。

下图展示了本地网络和 GKE 控制层面节点之间的路由路径:

显示本地 VPC 和集群控制层面之间的路由的图表

要从本地网络连接到控制层面的专用端点,请完成以下任务:

  1. 确认集群的 VPC 网络与控制层面 VPC 网络之间的对等互连:

    gcloud container clusters describe CLUSTER_NAME
    

    此命令的输出内容包括集群的 privateClusterConfig.peeringName 字段。这是集群与控制层面 VPC 网络之间的对等互连的名称。例如:

    privateClusterConfig:
      enablePrivateNodes: true
      masterIpv4CidrBlock: 172.16.1.0/28
      peeringName: gke-1921aee31283146cdde5-9bae-9cf1-peer
      privateEndpoint: 172.16.1.2
      publicEndpoint: 34.68.128.12
    
  2. 配置 VPC 网络,以将其在对等互连关系中的自定义路由导出到控制层面的 VPC 网络。 控制层面的 VPC 网络已配置为导入自定义路由。这为控制层面提供了一个将数据包发送回本地资源的路径。

    更新对等互连连接,从而为您在上一步中确定的对等互连连接启用导出自定义路由。

  3. 要提供从本地网络到控制层面 VPC 网络的流量的路径,请执行以下操作之一:

    • 对于 Cloud Interconnect 和 Cloud VPN:使用 Cloud Router 路由器自定义路由通告来通告控制层面的 CIDR 范围。如果停用了控制层面全球访问权限,此自定义路由通告必须位于集群所属地区的 Cloud Router 路由器的 BGP 会话上。如果启用了控制层面全球访问权限,您可以将此自定义路由通告放置在任何区域的 Cloud Router 路由器上。如需了解详情,请参阅通告自定义 IP 地址范围

    • 对于不使用动态路由的传统 VPN 隧道::您必须在本地路由器中为控制层面的 CIDR 范围配置静态路由。

本地路由通告的注意事项

本地网络向集群的 VPC 网络中的 Cloud Router 路由器通告的 CIDR 必须遵守以下条件:

  • 虽然集群的 VPC 将接受默认路由,但控制层面的 VPC 网络始终拒绝以 0.0.0.0/0 为目的地的路由(默认路由),因为控制层面的 VPC 网络已有本地默认路由路由,并始终先考虑该本地路由。如果本地路由器在 VPC 网络中通告默认路由,则还必须通告具体的本地目的地,以便控制层面拥有返回本地网络的路径。这些更具体的目的地会在 VPC 网络中产生更具体的自定义动态路由,并且控制层面 VPC 网络会通过 VPC 对等互连接受这些更具体的路由。

  • 当控制层面的 VPC 网络接受其他广泛路由时,它们会中断与 Google API 和服务的公共 IP 地址的连接。作为代表性示例,您不应通告目的地为 0.0.0.0/1128.0.0.0/1 的路由。如需了解替代方法,请参阅上一点。

  • 请密切关注 Cloud Router 路由器限制,特别是已知路由的唯一目的地数量上限。

停用自定义路由导出

如需停用从您的 VPC 导出自定义路由,请运行以下命令:

gcloud compute networks peerings update PEERING_NAME \
    --network VPC_NAME \
    --no-export-custom-routes

请替换以下内容:

  • PEERING_NAMEprivateClusterConfig.peeringName 的值。
  • VPC_NAME:您的 VPC 的名称。

如需查找 peeringName,请参阅上述说明的第一步,启用自定义路由导出。

验证节点没有外部 IP 地址

创建专用集群后,请验证集群的节点没有外部 IP 地址。

gcloud

运行以下命令:

kubectl get nodes --output wide

输出的 EXTERNAL-IP 列为空:

STATUS ... VERSION        EXTERNAL-IP  OS-IMAGE ...
Ready      v.8.7-gke.1                 Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google
Ready      v1.8.7-gke.1                Container-Optimized OS from Google

控制台

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

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击集群名称。

  3. 集群页面上,点击节点标签页。

  4. 节点池下,点击节点池名称。

  5. 节点池详情页面的实例组下,点击实例组的名称。例如 gke-private-cluster-0-default- pool-5c5add1f-grp

  6. 在实例列表中,确认实例没有外部 IP 地址。

查看集群的子网和次要地址范围

创建专用集群后,您可以查看您或 GKE 为集群预配的子网和次要地址范围。

gcloud

列出所有子网

如需列出集群网络中的子网,请运行以下命令:

gcloud compute networks subnets list \
    --network NETWORK_NAME

NETWORK_NAME 替换为专用集群的网络。如果您使用了自动创建的子网创建集群,请使用 default

在命令输出中,找到集群子网的名称。

查看集群的子网

获取自动创建的子网的相关信息:

gcloud compute networks subnets describe SUBNET_NAME

SUBNET_NAME 替换为子网的名称。

输出结果显示节点的主要地址范围(第一个 ipCidrRange 字段)以及 Pod 和 Service 的次要范围(在 secondaryIpRanges 下):

...
ipCidrRange: 10.0.0.0/22
kind: compute#subnetwork
name: gke-private-cluster-1-subnet-163e3c97
...
privateIpGoogleAccess: true
...
secondaryIpRanges:
- ipCidrRange: 10.40.0.0/14
  rangeName: gke-private-cluster-1-pods-163e3c97
- ipCidrRange: 10.0.16.0/20
  rangeName: gke-private-cluster-1-services-163e3c97
...

控制台

  1. 转到 Google Cloud 控制台中的 VPC 网络页面。

    进入“VPC 网络”

  2. 点击子网的名称。例如 gke-private-cluster-0-subnet-163e3c97

  3. IP 地址范围下,您可以看到子网的主要地址范围。这是用于节点的范围。

  4. 次要 IP 范围下,您可以看到 Pod 和 Service 的 IP 地址范围。

查看专用集群的端点

您可以使用 gcloud CLI 或 Google Cloud 控制台查看专用集群的端点。

gcloud

运行以下命令:

gcloud container clusters describe CLUSTER_NAME

输出内容会显示专用和公共端点:

...
privateClusterConfig:
enablePrivateEndpoint: true
enablePrivateNodes: true
masterIpv4CidrBlock: 172.16.0.32/28
privateEndpoint: 172.16.0.34
publicEndpoint: 35.239.154.67

控制台

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

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击集群名称。

  3. 集群基本信息下的详情标签页中,找到端点字段。

从映像注册表中拉取容器映像

在专用集群中,容器运行时可以从 Artifact Registry 中拉取容器映像,不能从互联网上的任何其他容器映像注册表中拉取映像。这是因为专用集群中的节点没有外部 IP 地址,因此默认情况下节点无法与 Google 网络外部的服务通信。

专用集群中的节点如果位于已启用专用 Google 访问通道的子网中,则可以与 Google 服务(例如 Artifact Registry)通信。

以下命令会创建一个 Deployment,以从 Google 拥有的 Artifact Registry 代码库中拉取示例映像。

kubectl run hello-deployment --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

针对特定用例添加防火墙规则

本部分介绍如何向专用集群添加防火墙规则。默认情况下,防火墙规则将集群控制层面限制为只能启动与端口 443 (HTTPS) 和 10250 (kubelet) 上的节点和 Pod 的 TCP 连接。对于某些 Kubernetes 功能,您可能需要添加防火墙规则以允许在其他端口上进行访问。

需要额外防火墙规则的 Kubernetes 功能包括:

添加防火墙规则,允许流量从集群控制层面传输到以下所有端口:

  • 每个节点的指定端口 (hostPort)。
  • 在这些节点上运行的每个 Pod 的指定端口。
  • 在这些节点上运行的每个 Service 的指定端口。

如需了解防火墙规则,请参阅 Cloud Load Balancing 文档中的防火墙规则

如需在专用集群中添加防火墙规则,您需要记录集群控制层面的 CIDR 块和使用的目标。记录完成后,就可以创建规则了。

第 1 步:查看控制层面的 CIDR 块

为了添加防火墙规则,您需要使用集群控制层面的 CIDR 块。

gcloud

运行以下命令:

gcloud container clusters describe CLUSTER_NAME

CLUSTER_NAME 替换为您的专用集群名称。

在命令输出中,记下 masterIpv4CidrBlock 字段中的值。

控制台

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

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击集群名称。

网络下的详细信息标签页中,记下控制平面地址范围字段中的值。

第 2 步:查看现有防火墙规则

您需要指定集群的现有防火墙规则针对的目标(在这种情况下,就是目标节点)。

gcloud

运行以下命令:

gcloud compute firewall-rules list \
    --filter 'name~^gke-CLUSTER_NAME' \
    --format 'table(
        name,
        network,
        direction,
        sourceRanges.list():label=SRC_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        targetTags.list():label=TARGET_TAGS
    )'

在命令输出中,记下目标字段中的值。

控制台

  1. 转到 Google Cloud 控制台中的防火墙页面。

    转到“防火墙”

  2. 过滤表部分,输入 gke-CLUSTER_NAME

在结果中,记下目标字段中的值。

第 3 步:添加防火墙规则

gcloud

运行以下命令:

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges CONTROL_PLANE_RANGE \
    --rules PROTOCOL:PORT \
    --target-tags TARGET

请替换以下内容:

  • FIREWALL_RULE_NAME:您为防火墙规则选择的名称。
  • CONTROL_PLANE_RANGE:您之前收集的集群控制平面 IP 地址范围 (masterIpv4CidrBlock)。
  • PROTOCOL:PORT:端口及其协议(tcpudp)。
  • TARGET:您先前收集的目标 (Targets) 值。

控制台

  1. 转到 Google Cloud 控制台中的防火墙页面。

    转到“防火墙”

  2. 点击 创建防火墙规则

  3. 对于名称,输入防火墙规则的名称。

  4. 网络列表中,选择相关网络。

  5. 流量方向中,点击入站

  6. 对匹配项执行的操作中,点击允许

  7. 目标列表中,选择指定的目标标记

  8. 目标标记部分,输入您之前记下的目标值。

  9. 来源过滤条件列表中,选择 IP 范围

  10. 来源 IP 地址范围部分,输入集群控制层面的 CIDR 地址块。

  11. 协议和端口中,点击指定的协议和端口,选中相关协议(tcpudp),然后在协议字段中输入端口号。

  12. 点击创建

使用 VPC Service Controls 保护专用集群

为进一步保障 GKE 专用集群的安全,您可以使用 VPC Service Controls 来保护它们。

VPC Service Controls 可为 GKE 专用集群提供额外的安全保护,有助于降低发生数据渗漏的风险。使用 VPC Service Controls,您可以将项目添加到服务边界,从而防止资源和服务受到源自边界外部的请求的影响。

如需详细了解服务边界,请参阅服务边界详情和配置

如果您在使用 GKE 专用集群的同时使用了 Container Registry 或 Artifact Registry,则需要执行其他步骤才能将该专用集群与 VPC Service Controls 配合使用。如需了解详情,请参阅为 GKE 专用集群设置 Container Registry 或 Artifact Registry 页面。

重复使用 VPC 对等互连

您在 2020 年 1 月 15 日之后创建的所有专用集群会重复使用 VPC 网络对等互连连接

您在 2020 年 1 月 15 日之前创建的所有专用集群会使用唯一的 VPC 网络对等互连连接。每个 VPC 网络可以与多达 25 个其他 VPC 网络对等互连,这意味着对于这些集群,每个网络最多只能有 25 个专用集群(假设对等互连不用于其他目的)。

此功能不会反向移植到之前的版本。如需在旧的专用集群上启用 VPC 网络对等互连重复使用功能,您可以删除集群并重新创建。升级集群并不会使其重用现有的 VPC 网络对等互连连接。

如果集群启用了 VPC 网络对等互连重复使用功能,则每个位置最多可以支持 75 个专用集群。可用区和区域被视为不同的位置。

例如,您最多可在 us-east1-a 中创建 75 个地区级专用集群,另外在 us-east1 中创建 75 个区域级专用集群。如果在共享 VPC 网络中使用专用集群,这同样适用。单个 VPC 网络的连接数上限为 25,这意味着您只能使用 25 个非重复的位置创建专用集群。

VPC 网络对等互连重复使用功能仅适用于同一位置的集群,例如同一区域中的区域级集群或同一可用区中的可用区级集群。如果您在每个区域的所有可用区中同时创建区域级集群和可用区级集群,则该区域最多可以有四个 VPC 网络对等互连。

您可以使用 gcloud CLI 或 Google Cloud Console 检查专用集群是否会重复使用 VPC 网络对等互连连接。

gcloud

gcloud container clusters describe CLUSTER_NAME \
    --format="value(privateClusterConfig.peeringName)"

如果您的集群正在重复使用 VPC 对等互连连接,则输出会以 gke-n 开头。例如 gke-n34a117b968dee3b2221-93c6-40af-peer

控制台

检查集群详情页面中的 VPC 对等互连行。如果您的集群正在重复使用 VPC 对等互连连接,则输出会以 gke-n 开头。例如 gke-n34a117b968dee3b2221-93c6-40af-peer

清理

完成本页面上的任务后,请按照以下步骤移除资源,以防止您的帐号产生不必要的费用:

删除集群

gcloud

gcloud container clusters delete -q private-cluster-0 private-cluster-1 private-cluster-2 private-cluster-3

控制台

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

    转到 Google Kubernetes Engine

  2. 选择每个集群。

  3. 点击 删除

删除网络

gcloud

gcloud compute networks delete my-net-0

控制台

  1. 转到 Google Cloud 控制台中的 VPC 网络页面。

    进入“VPC 网络”

  2. 在网络列表中,点击 my-net-0

  3. VPC 网络详细信息页面上,点击 删除 VPC 网络

  4. 删除网络对话框中,点击删除

要求、限制和局限

专用集群具有以下要求:

专用集群存在以下限制:

  • 您不能将现有非专用集群转换为专用集群。
  • 对于运行 1.16.9 之前版本或 1.17.0 到 1.17.4 版本的集群,无法从 172.17.0.0/16 CIDR 访问集群控制层面。
  • 对于运行版本低于 1.14.4 的集群,集群控制平面、节点、Pod 或 Service IP 地址范围不能与 172.17.0.0/16 重叠。
  • 172.17.0.0/16 用作控制层面 IP 地址范围时,不能将此范围用于节点、pod 或 Service IP 地址。此限制适用于运行 1.14.4 版或更高版本的区域级集群,以及运行 1.16.9 - 1.17.0 版或 1.17.4 版和更高版本的地区级集群。
  • 如果删除集群控制层面与集群节点之间的 VPC 对等互连、删除允许入站流量从集群控制层面传输到端口 10250 上的节点的防火墙规则,或者删除通往默认互联网网关的默认路由,则会导致专用集群停止运行。如果您删除默认路由,则必须确保将流量路由到必要的 Google 服务。如需了解详情,请参阅自定义路由
  • 为 VPC 启用自定义路由导出时,创建与 Google IP 范围重叠的路由可能会破坏您的集群。
  • 您最多可在一个项目中添加 50 个授权网络(允许的 CIDR 块)。如需了解详情,请参阅将已获授权的网络添加到现有集群

专用集群存在以下限制:

  • 集群控制层面的 RFC 1918 块的大小必须为 /28
  • 虽然 GKE 可以检测到与控制层面地址块的重叠,但它无法检测到共享 VPC 网络中的重叠。
  • 专用集群中的所有节点都是在没有公共 IP 地址的情况下创建的;它们对 Google API 和服务的访问受限。如需为专用节点提供出站互联网访问权限,可以使用 Cloud NAT
  • 创建专用集群时,系统会自动启用专用 Google 访问通道,除非您使用共享 VPC。除非您使用 NAT 访问互联网,否则不得停用专用 Google 访问通道。
  • 对于您在 2020 年 1 月 15 日之前创建的所有专用集群,每个网络最多只能有 25 个专用集群(假设对等互连不用于其他目的)。如需了解详情,请参阅重复使用 VPC 对等互连
  • 每个专用集群都要求您的 VPC 与 Google 的 VPC 之间存在对等互连路由,但一次只能执行一项对等互连操作。如果您尝试同时创建多个专用集群,则创建集群的操作可能会超时。为避免这种情况,请依次创建新的专用集群,以便每个后续专用集群都存在 VPC 对等互连路由。如果 VPC 上有操作正在运行,则尝试创建单个专用集群的操作也可能会超时。
  • 如果您扩展子网的主要 IP 地址范围以容纳其他节点,则必须将扩展子网的主要 IP 地址范围添加到集群的授权网络列表中。否则,系统不会更新与控制平面相关的入站允许防火墙规则,并且在扩展 IP 地址空间中创建的新节点将无法向控制平面注册。这可能会导致系统持续删除并替换新节点的服务中断现象。在执行节点池升级或节点因活跃探测失败而自动替换时,可能会发生此类服务中断现象。
  • 请勿创建优先级高于自动创建的防火墙规则的防火墙规则或分层防火墙政策规则

问题排查

以下部分介绍了如何解决与专用集群相关的常见问题。

集群与活动对等互连重叠

表现

如果尝试创建专用集群,则系统会返回类似于以下内容的错误:

Google Compute Engine: An IP range in the peer network overlaps with an IP
range in an active peer of the local network.
潜在原因

您选择了重叠的控制层面 CIDR。

解决方法

删除集群,然后使用其他控制层面 CIDR 重新创建集群。

无法访问专用集群的控制平面

通过实现任一集群端点访问配置,提高集群控制层面的可达性。如需了解详情,请参阅集群端点访问权限

表现

创建专用集群后,如果尝试针对集群运行 kubectl 命令,则系统会返回类似于以下内容之一的错误:

Unable to connect to the server: dial tcp [IP_ADDRESS]: connect: connection
timed out.
Unable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout.
潜在原因

kubectl 无法与集群控制层面通信。

解决方法

验证是否已为 kubeconfig 生成集群的凭据或已激活正确的上下文。如需详细了解如何设置集群凭据,请参阅生成 kubeconfig 条目

验证是否允许使用控制平面的外部 IP 地址对其进行访问。停用对集群控制平面的外部访问权限会将集群与互联网隔离开来。此配置在创建集群后不可变。使用此配置时,只有已获授权的内部网络 CIDR 范围或预留的网络有权访问控制平面。

  1. 验证来源 IP 地址是否已获授权访问控制平面:

      gcloud container clusters describe CLUSTER_NAME \
          --format="value(masterAuthorizedNetworksConfig)"\
          --region=COMPUTE_REGION
    

    替换以下内容:

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

    如果来源 IP 地址未获得授权,则输出可能会返回空结果(只有大括号)或不包含来源 IP 地址的 CIDR 范围

    cidrBlocks:
      cidrBlock: 10.XXX.X.XX/32
      displayName: jumphost
      cidrBlock: 35.XXX.XXX.XX/32
      displayName: cloud shell
    enabled: true
    
  2. 添加已获授权的网络以访问控制平面。

如果您从本地环境或与集群位置不同的区域运行 kubectl 命令,请确保已启用控制平面专用端点全球访问权限。如需了解详情,请参阅在全球范围内访问控制平面的专用端点

  1. 描述集群以查看主服务器访问配置响应:

    gcloud container clusters describe CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --flatten "privateClusterConfig.masterGlobalAccessConfig"
    

    替换以下内容:

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

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

      enabled: true
    
  2. 如果返回 null,请启用主服务器全球访问权限

由于 IPv4 CIDR 块重叠而无法创建集群

表现

gcloud container clusters create 会返回如下所示的错误:

The given master_ipv4_cidr 10.128.0.0/28 overlaps with an existing network
10.128.0.0/20.
潜在原因

您指定了一个与 VPC 中现有子网重叠的控制层面 CIDR 块。

解决方法

--master-ipv4-cidr 指定一个与现有子网不重叠的 CIDR 块。

由于服务范围已被其他集群使用,因此无法创建集群

表现

如果尝试创建专用集群,则系统会返回类似于以下内容的错误:

Services range [ALIAS_IP_RANGE] in network [VPC_NETWORK], subnetwork
[SUBNET_NAME] is already used by another cluster.
潜在原因

以下任意一个:

  • 您选择的服务范围正在被其他集群使用,或者该集群并未删除。
  • 某个集群正在使用这个已删除的服务范围,但备用范围元数据未正确清理。GKE 集群的备用范围保存在 Compute Engine 元数据中,应该在删除集群后移除。即使集群已成功删除,元数据也可能未被移除。
解决方法

请按照以下步骤操作:

无法创建子网

表现

当您尝试创建具有自动子网的专用集群或创建自定义子网时,可能会遇到以下错误:

An IP range in the peer network overlaps
with an IP range in one of the active peers of the local network.
潜在原因

您指定的控制层面 CIDR 范围与集群中的其他 IP 地址范围重叠。如果您最近删除了某个专用集群并且尝试使用相同的控制层面 CIDR 创建新的专用集群,也可能发生这种情况。

解决方法

尝试使用其他 CIDR 范围。

无法从公共 Docker Hub 中拉取映像

表现

集群中运行的 Pod 在 kubectl describe 中显示警告:

Failed to pull image: rpc error: code = Unknown desc = Error response
from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
while waiting for connection (Client.Timeout exceeded while awaiting
headers)
潜在原因

专用集群中的节点没有外部 IP 地址,因此不符合互联网访问要求。但是,如果您已启用专用 Google 访问通道并满足其网络要求,则节点可以访问 Google API 和服务(包括 Artifact Registry 和 Container Registry)。

解决方法

请使用以下任一解决方案:

  • 将您专用集群中的映像从 Docker Hub 复制到 Artifact Registry。如需了解详情,请参阅从第三方注册表迁移容器

  • GKE 会自动检查 mirror.gcr.io 中是否存在经常访问的 Docker Hub 映像的已缓存副本。

  • 如果必须从 Docker Hub 或其他公共代码库拉取映像,请使用 Cloud NAT 或基于实例的代理(即静态 0.0.0.0/0 路由的目标)。

触发准入网络钩子超时的 API 请求

表现

如果准入网络钩子配置为使用具有 443 以外的 servicePort 的 Service,触发该准入网络钩子的 API 请求超时,导致请求失败:

Error from server (Timeout): request did not complete within requested timeout 30s
潜在原因

默认情况下,除端口 443 (HTTPS) 和 10250 (kubelet) 外,防火墙不允许与节点的 TCP 连接。如果没有允许流量的自定义防火墙规则,尝试在端口 443 以外的端口上与 pod 通信的准入网络钩子会失败。

解决方法

为特定用例添加防火墙规则

由于健康检查失败,因此无法创建集群

表现

创建专用集群后,它会卡在健康检查步骤,并报告类似于以下内容的某项错误:

All cluster resources were brought up, but only 0 of 2 have registered.
All cluster resources were brought up, but: 3 nodes out of 4 are unhealthy
潜在原因

以下任意一项:

  • 集群节点无法从 Cloud Storage API (storage.googleapis.com) 下载所需的二进制文件。
  • 限制出站流量的防火墙规则。
  • 共享 VPC IAM 权限不正确。
  • 专用 Google 访问通道要求您为 *.gcr.io 配置 DNS。
解决方法

请使用以下任一解决方案:

kubelet 无法创建 pod 沙盒

表现

创建专用集群后,它会报告类似于以下内容的某项错误:

Warning  FailedCreatePodSandBox  12s (x9 over 4m)      kubelet  Failed to create pod sandbox: rpc error: code = Unknown desc = Error response from daemon: Get https://k8s.gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
潜在原因

calico-nodenetd Pod 无法访问 *.gcr.io

解决方法

请使用以下任一解决方案:

已创建专用集群节点,但未加入集群

通常,在专用集群所用的 VPC 上使用自定义路由和第三方网络设备时,默认路由 (0.0.0.0/0) 会重定向到设备,而不是默认互联网网关。除了控制层面连接外,您还需要确保可以到达以下目的地:

  • *.googleapis.com
  • *.gcr.io
  • gcr.io

为所有三个网域配置专用 Google 访问通道。利用此最佳做法,新节点可以启动并加入集群,同时使互联网出站流量受到限制。

后续步骤