创建专用集群

本页面介绍如何在 Google Kubernetes Engine (GKE) 中创建专用集群。在专用集群中,节点仅具有预留 IP 地址,这可确保节点的工作负载与公共互联网隔离开来。具体而言,节点 IP 地址来自内部 RFC 1918 范围。其他预留范围中的预留 IP 地址现提供 Beta 版。

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

准备工作

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

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

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

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

使用 gcloud init

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

    gcloud init

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

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

使用 gcloud config

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

访问主节点

在专用集群中,主节点具有专用端点和公共端点。有三种配置组合可控制对集群端点的访问权限。

  • 停用公共端点访问权限。这将创建无法通过客户端访问公共端点的专用集群。
  • 启用公共端点访问权限和主节点授权网络。这将创建对公共端点具有有限访问权限的专用集群。
  • 启用公共端点访问权限,但停用主节点授权网络。这将创建对公共端点具有不受限制的访问权限的专用集群。

如需大致了解上述配置选项之间的差异,请参阅集群端点访问权限

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

在本部分中,您将创建一个名为 private-cluster-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 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

其中:

  • --create-subnetwork name=my-subnet-0 使 GKE 自动创建名为 my-subnet-0 的子网。
  • --enable-master-authorized-networks 用于指定仅限您授权的 IP 地址范围访问公共端点。
  • --enable-ip-alias 使集群成为 VPC 原生集群。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --enable-private-endpoint 表示使用主服务器 API 端点的专用 IP 地址管理集群。
  • --master-ipv4-cidr 172.16.0.32/28 用于指定主服务器的 RFC 1918 范围。此设置对于该集群是永久性的。使用非 RFC 1918 预留 IP 同样受支持(Beta 版)。
  • --no-enable-basic-auth 表示停用集群的基本身份验证。
  • --no-issue-client-certificate 会禁止颁发客户端证书。

控制台

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

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

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

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

  6. 选中专用集群复选框。

  7. 清除使用外部 IP 地址访问主节点复选框。

  8. 主 IP 范围设置为 172.16.0.32/28

  9. 在导航窗格的集群下,点击安全

  10. 确保已清除颁发客户端证书复选框。

  11. 在导航窗格的集群下,点击功能

  12. 确保已清除启用 Kubernetes 信息中心复选框。

  13. 点击创建

API

如需创建具有公共可访问主机的集群,请在 privateClusterConfig 资源中指定 enablePrivateEndpoint: true 字段。

此时,只有以下范围内的地址才能访问集群主节点:

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

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

如果要从 my-subnet-0 外部访问集群主节点,您必须至少向一个地址范围授予对专用端点的访问权限。

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

例如:

  • my-subnet-0:10.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。

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 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

其中:

  • --create-subnetwork name=my-subnet-1 使 GKE 自动创建名为 my-subnet-1 的子网。
  • --enable-master-authorized-networks 用于指定仅限您授权的 IP 地址范围访问公共端点。
  • --enable-ip-alias 使集群成为 VPC 原生集群。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --master-ipv4-cidr 172.16.0.0/28 用于指定主服务器的 RFC 1918 范围。此设置对于该集群是永久性的。使用非 RFC 1918 预留 IP 同样受支持(Beta 版)。
  • --no-enable-basic-auth 会停用集群的基本身份验证。
  • --no-issue-client-certificate 会禁止颁发客户端证书。

控制台

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

  3. 对于名称,请输入 my-subnet-1

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

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

  6. 选中专用集群复选框。

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

  8. 主 IP 范围设置为 172.16.0.0/28

  9. 选中启用主已授权网络复选框。

  10. 在导航窗格的集群下,点击安全

  11. 确保已清除颁发客户端证书复选框。

  12. 在导航窗格的集群下,点击功能

  13. 确保已清除启用 Kubernetes 信息中心复选框。

  14. 点击创建

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 master with a publicly-reachable endpoint
      "masterIpv4CidrBlock": string # CIDR block for the cluster master
      "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-0,并为集群节点创建一个主范围为 192.168.0.0/20 的子网 my-subnet-2。该子网有两个次要地址范围:my-pods-1 用于 Pod IP 地址,my-services-1 用于 Service IP 地址。

gcloud

创建网络

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

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

创建子网和次要范围

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

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

创建专用集群

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

gcloud container clusters create private-cluster-1 \
    --zone us-central1-c \
    --enable-master-authorized-networks \
    --network my-net-0 \
    --subnetwork my-subnet-2 \
    --cluster-secondary-range-name my-pods-2 \
    --services-secondary-range-name my-services-2 \
    --enable-private-nodes \
    --enable-ip-alias \
    --master-ipv4-cidr 172.16.0.16/28 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

控制台

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

  1. 访问 Cloud Console 中的“VPC 网络”页面。

    转到“VPC 网络”页面

  2. 点击创建 VPC 网络

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

  4. 确保子网创建模式已设置为自定义

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

  6. 区域下拉列表中,选择所需的区域。

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

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

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

  10. 专用 Google 访问通道中,点击开启

  11. 点击完成

  12. 点击创建

创建专用集群

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

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

  3. 对于名称,请输入 private-cluster-2

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

  5. 选中专用集群复选框。

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

  7. 主 IP 范围设置为 172.16.0.16/28

  8. 网络下拉列表中,选择 my-net-1

  9. 节点子网下拉列表中,选择 my-subnet-2

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

  11. Pod 次要 CIDR 范围下拉列表中,选择 my-pods-1

  12. Service 次要 CIDR 范围下拉列表中,选择 my-services-1

  13. 选中启用主已授权网络复选框。

  14. 在导航窗格的集群下,点击安全

  15. 确保已清除颁发客户端证书复选框。

  16. 在导航窗格的集群下,点击功能

  17. 确保已清除启用 Kubernetes 信息中心复选框。

  18. 点击创建

此时,只有以下范围内的地址才能访问集群主节点:

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

假设您有一组机器位于 my-net-1 之外,它们的地址在范围 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-2 的主要范围
  • 次要范围 my-pods-1
  • 您已授权的地址范围,例如 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 \
        --zone us-central1-c \
        --enable-master-authorized-networks \
        --master-authorized-networks existing-auth-nets,shell-IP/32
    

    其中:

    • existing-auth-nets 是您现有的主节点授权网络列表。您可以在控制台中找到主节点授权网络,也可以通过运行以下命令进行查找:

      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 \
        --zone us-central1-a \
        --project project-id
    

    其中,project-id 是您的项目 ID。

现在,您可以在 Cloud Shell 中使用 kubectl 访问专用集群。例如:

kubectl get nodes

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

在本部分中,您将创建一个专用集群,其中任何 IP 地址都可以访问主节点。

gcloud

运行以下命令:

gcloud container clusters create private-cluster-2 \
    --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 \
    --no-enable-basic-auth \
    --no-issue-client-certificate

其中:

  • --create-subnetwork name=my-subnet-3 使 GKE 自动创建名为 my-subnet-3 的子网。
  • --no-enable-master-authorized-networks 用于为集群停用已授权的网络。
  • --enable-ip-alias 使集群成为 VPC 原生集群。
  • --enable-private-nodes 表示集群的节点没有外部 IP 地址。
  • --master-ipv4-cidr 172.16.0.32/28 用于指定主服务器的 RFC 1918 范围。此设置对于该集群是永久性的。使用非 RFC 1918 预留 IP 同样受支持(Beta 版)。
  • --no-enable-basic-auth 表示停用集群的基本身份验证。
  • --no-issue-client-certificate 会禁止颁发客户端证书。

控制台

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

  3. 对于名称,请输入 private-cluster-2

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

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

  6. 选择专用集群选项。

  7. 保持使用外部 IP 地址访问主节点复选框处于选中状态。

  8. 主 IP 范围设置为 172.16.0.32/28

  9. 清除启用主已授权网络复选框。

  10. 在导航窗格的集群下,点击安全

  11. 确保已清除颁发客户端证书复选框。

  12. 在导航窗格的集群下,点击功能

  13. 确保已清除启用 Kubernetes 信息中心复选框。

  14. 点击创建

其他专用集群配置

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

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

如果要为专用节点提供出站互联网访问权限,可以使用 Cloud NAT,也可以自行管理 NAT 网关

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

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

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

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

在全球范围内访问主服务器的专用端点

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

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

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

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

启用主服务器专用端点全球访问权限

默认情况下,在创建专用集群时,系统不会为主服务器的专用端点启用全球访问权限。如需启用主服务器全球访问权限,请使用 gcloud 或 Google Cloud Console。

gcloud

添加 enable-master-global-access 标志以创建启用了主服务器专用端点的全球访问权限的专用集群:

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

您还可以为现有专用集群启用主服务器专用端点的全球访问权限:

gcloud beta container clusters update cluster-name \
  --enable-master-global-access

控制台

如需创建启用了主服务器全球访问权限的新专用集群,请执行以下步骤:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击创建集群按钮。

  3. 输入名称

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

  5. 选中专用集群复选框。

  6. 选中主服务器全球访问权限复选框。

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

  8. 点击创建

如需为现有专用集群启用主服务器全球访问权限,请执行以下步骤:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

    访问 Google Kubernetes Engine 菜单

  2. 点击集群的“修改”按钮(看起来像一支铅笔)。

  3. 主服务器全球访问权限下拉列表中,选择已启用

  4. 点击保存

验证主服务器专用端点全球访问权限

您可以通过运行以下命令并查看其输出,验证是否已启用主服务器专用端点的全球访问权限。

gcloud beta 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

在本地/集群 VPC 和集群主节点之间进行路由

当您创建具有专用主节点端点的 GKE 专用集群时,无法通过公共互联网访问集群的主节点,但需要能够通过 kubectl 等客户端工具访问它。如需启用集群主节点和本地网络之间的通信,则必须在本地网络与托管集群主节点的 Google 自有 VPC 网络之间进行路由。

显示本地 VPC 和集群主节点之间的路由的图表

Google VPC 使用 Cloud VPNCloud Interconnect 自动将连接到本地网络且指向主节点 CIDR 的路由导出到您的 VPC。但是,还必须将指向本地环境的路由从您的 VPC 导出到 Google VPC。

如需分享路由,请在您的 VPC 与 Google 自有 VPC 之间的对等互连中启用 --export-custom-routes 标志。

  1. 确定您的集群的 VPC 与 Google 自有 VPC 之间的对等互连:

    gcloud container clusters describe cluster-name
    

    此命令的输出内容包括集群的 privateClusterConfig.peeringName 字段。 这是您的集群与 Google 自有 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. 在对等互连中启用 --export-custom-routes

    gcloud compute networks peerings update peering --network network \
       --export-custom-routes
    

    其中,peering 是在上一步骤中确定的 privateClusterConfig.peeringName 的值,network 是您的 VPC 的名称。

    此标志会使 network 将其路由通告给您的集群主节点所在的 Google 自有 VPC。下一步骤说明如何将您的 VPC 到 Google 自有 VPC 的路由通告给本地环境。

  3. 此外,还必须将指向集群主节点 CIDR 的路由从您的 VPC 通告给您的本地环境。可以通过以下两种方法实现此目的:

    • 推荐方法:从 Cloud Router 通过 eBGP 将指向主子网的路由作为自定义路由进行通告。如需了解详情,请参阅通告自定义 IP 范围。建议采用此方法,原因是 eBGP 不可用时会撤消通告的路由来帮助禁用流量。

    • 在本地路由器或边缘设备上针对 Google Cloud 预配静态路由。

验证是否已启用自定义路由导出

使用以下命令验证您的 VPC 与 Google 自有 VPC 之间的对等互连中是否启用了 --export-custom-routes 选项:

gcloud compute networks peerings list

此命令的输出列出了 Compute Engine 网络的对等互连。找到该对等互连(您已在上述过程的第一步中找到其名称),并验证其 EXPORT_CUSTOM_ROUTES 列是否为 TrueSTATE 列是否为 ACTIVE

停用自定义路由导出

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

gcloud compute networks peerings update peering --network network --no-export-custom-routes

其中:

  • peeringprivateClusterConfig.peeringName 的值。
  • network 是您的 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. 访问 Cloud Console 中的 GKE 菜单。

    访问 GKE 菜单

  2. 在集群列表中,点击所需的集群。

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

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

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

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

gcloud

列出所有子网

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

gcloud compute networks subnets list --network network

其中,network 是专用集群所在的网络。如果您使用了自动创建的子网创建集群,请使用 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. 访问 Cloud Console 中的“VPC 网络”页面。

    转到“VPC 网络”页面

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

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

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

查看专用集群的端点

您可以使用 gcloud 命令行工具或 Cloud Console 查看专用集群的端点。

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. 访问 Cloud Console 中的 GKE 菜单。

    访问 GKE 菜单

  2. 从列表中,点击所需的集群。

  3. 集群下的详情标签中,找到端点字段。

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

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

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

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

kubectl run hello-deployment --image gcr.io/google-samples/hello-app:2.0

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

本部分介绍如何向专用集群添加防火墙规则。默认情况下,防火墙规则将集群主节点限制为只能启动与端口 443 (HTTPS) 和 10250 (kubelet) 上的节点的 TCP 连接。对于某些 Kubernetes 功能,您可能需要添加防火墙规则以允许在其他端口上进行访问。例如,在 Kubernetes 1.9 及更低版本中,kubectl top 会访问 heapster,这需要一条防火墙规则来允许在端口 8080 上建立 TCP 连接。如需授予此类访问权限,您可以添加防火墙规则。

添加防火墙规则,允许流量从集群主节点传输到以下所有端口:

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

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

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

第 1 步:查看集群主节点的 CIDR 块

为了添加防火墙规则,您需要使用集群主节点的 CIDR 块。

gcloud

运行以下命令:

gcloud container clusters describe cluster-name

其中,cluster-name 是您的专用集群的名称。

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

控制台

  1. 访问 Cloud Console 中的 GKE 菜单。

    访问 GKE 菜单

  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. 访问 Cloud Console 中的“防火墙规则”菜单。

    访问“防火墙规则”菜单

  2. 过滤资源框中填写 gke-cluster-name

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

第 3 步:添加防火墙规则

gcloud

运行以下命令:

gcloud compute firewall-rules create firewall-rule-name \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges master-CIDR-block \
    --rules protocol:port \
    --target-tags target

其中:

  • firewall-rule-name 是您为防火墙规则选择的名称。
  • master-CIDR-block 是您先前记下的集群主节点的 CIDR 块 (masterIpv4CidrBlock)。
  • protocol:port 是所需的端口及其协议(tcpudp)。
  • target 是您先前记下的目标 (Targets) 值。

控制台

  1. 访问 Cloud Console 中的“防火墙规则”菜单。

    访问“防火墙规则”菜单

  2. 点击创建防火墙规则

  3. 名称框中,为防火墙规则填写所需名称。

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

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

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

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

  8. 目标标记框中填写您先前记下的目标值。

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

  10. 来源 IP 地址范围框中填写您先前记下的集群主节点的 CIDR 块。

  11. 协议和端口中,点击指定的协议和端口,选中相关协议(TCP 或 UDP)对应的复选框,然后在框中填写所需的端口。

  12. 点击创建

使用 VPC Service Controls 保护专用集群

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

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

如需详细了解服务边界,请参阅 VPC Service Controls 文档的服务边界配置页面。

如果您在使用 GKE 专用集群的同时使用了 Container Registry,则需要执行其他步骤才能将该专用集群与 VPC Service Controls 配合使用。如需了解详情,请参阅为 GKE 专用集群设置 Container 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 对等互连连接。

gcloud

gcloud container clusters describe cluster-name \
--zone=zone-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

控制台

  1. 访问 Cloud Console 中的 GKE 菜单。

    访问 GKE 菜单

  2. 选择每个集群。

  3. 点击删除

删除网络

gcloud

gcloud compute networks delete net-0

控制台

  1. 在 Cloud Console 中,转到“VPC 网络”页面。

    转到“VPC 网络”页面

  2. 在网络列表中,针对 net-0,点击回收站图标。

  3. 在每个子网旁边,点击回收站图标。

要求、限制和局限

专用集群具有以下要求:

专用集群存在以下限制:

  • 您不能将现有非专用集群转换为专用集群。
  • 对于运行版本低于 1.14.4 的集群,集群主节点、节点、PodService IP 范围不能与 172.17.0.0/16 重叠。
  • 对于运行 1.14.4 或更高版本的集群,您可以将 172.17.0.0/16 用于主 IP 范围,但节点、Pod 或 Service IP 范围不能与 172.17.0.0/16 重叠。
  • 如果删除集群主节点与集群节点之间的 VPC 对等互连、删除允许入站流量从集群主节点传输到端口 10250 上的节点的防火墙规则,或者删除通往默认互联网网关的默认路由,则会导致专用集群停止运行。若要在删除默认路由后使专用集群再次出现,您需要静态预配受限的 VIP。
  • 您最多可在一个项目中添加 50 个已获授权的网络(已加入白名单的 CIDR 块)。如需了解详情,请参阅将已获授权的网络添加到现有集群

专用集群存在以下限制:

  • 集群主节点的 RFC 1918 块的大小必须为 /28。
  • 虽然 GKE 可以检测到与集群主节点地址块的重叠,但它无法检测到共享 VPC 网络中的重叠。
  • 专用集群中的所有节点都是在没有公共 IP 地址的情况下创建的;它们对 Google API 和服务的访问受限。如果要为专用节点提供出站互联网访问权限,可以使用 Cloud NAT,也可以自行管理 NAT 网关。如需允许节点与 Google API 和服务通信,请在您的子网上启用专用 Google 访问通道
  • 对于您在 2020 年 1 月 15 日之前创建的所有专用集群,每个网络最多只能有 25 个专用集群(假设对等互连不用于其他目的)。如需了解详情,请参阅重复使用 VPC 对等互连

问题排查

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

集群与活动对等互连重叠

表现
尝试创建专用集群会返回错误,例如 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 outUnable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout
潜在原因
kubectl 无法与集群主节点通信。
解决方法
您需要为集群添加已授权的网络,将网络的 IP 地址加入白名单。

由于省略了标志而无法创建集群

表现
gcloud container clusters create 返回一个错误,例如 Cannot specify --enable-private-endpoint without --enable-private-nodes.
潜在原因
您未指定必要的标志。
解决方法
确保指定必要的标志。如果没有同时启用专用节点,则无法为集群主节点启用专用端点。

由于主 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 块。

无法创建子网

表现
当您尝试创建具有自动子网的专用集群或创建自定义子网时,可能会遇到以下错误: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)
潜在原因
专用集群中的节点没有对公共互联网的出站访问权限。 这些节点仅具有 Google API 和服务(包括 Container Registry)的有限访问权限。
解决方法
您不能直接从 Docker Hub 提取映像。请改为使用 Container Registry 上托管的映像。请注意,虽然可从专用集群访问 Container Registry 的 Docker Hub 镜像,但不应仅依赖于它。镜像只是缓存,因此会定期移除映像,专用集群无法回退到 Docker Hub。

后续步骤