创建集群

本页面介绍如何创建 GKE on AWS 集群。您还可以使用 Terraform 创建 VPC 和集群

准备工作

在创建集群之前,请务必满足前提条件。具体而言,您必须提供以下资源:

  • 集群将在其中运行的 AWS VPC。
  • 最多三个 AWS 子网用于三个控制平面副本。每个子网必须位于不同的 AWS 可用区中。
  • GKE on AWS 在管理集群时承担的 AWS IAM 角色。这需要一组特定的 IAM 权限
  • KMS 对称 CMK 密钥,用于静态加密集群数据 (etcd) 和配置。
  • 每个控制层面副本的 AWS IAM 实例配置文件。这需要一组特定的 IAM 权限
  • EC2 SSH 密钥对(可选),如果您需要对运行每个控制平面副本的 EC2 实例的 SSH 访问权限。

您需负责创建和管理这些资源,这些资源可以在所有 GKE 集群之间共享。所有其他底层集群范围内的 AWS 资源均由 GKE on AWS 管理。

为您的集群选择 CIDR 范围

在 GKE on AWS 中创建集群时,您需要提供用于 Pod 和 Service 的 IPv4 地址范围。

这些 IP 地址范围使用无类别域间路由 (CIDR) 表示法指定,例如 100.64.0.0/16

我们建议 Service 和 Pod 使用以下 CIDR 范围:

  • 服务:100.64.0.0/16
  • Pod:100.96.0.0/11

这些范围足够大,您可以放心地扩大集群,而不会遇到任何问题。

以下各部分提供了更多详细信息。

有关选择范围的详细信息

GKE on AWS 针对 Pod 和 Service 使用覆盖网络,因此这些网络的 IP 范围不需要在 VPC 内路由。您使用的任何 IP 地址范围都必须保证可用。如需了解详情,请参阅 Dataplane V2

  • Pod 和 Service IP 范围可以与 VPC 网络重叠,前提是两者均不包含控制平面或节点池子网 IP 范围。

  • Pod 和 Service IP 范围必须位于以下专用 IP 范围内:

    • 10.0.0.0/8172.16.0.0/12192.168.0.0/16 - 专用 IP 地址 (RFC 1918)
    • 100.64.0.0/10 - 共享地址空间 (RFC 6598)
    • 192.0.0.0/24 - IETF 协议分配 (RFC 6890)
    • 192.0.2.0/24198.51.100.0/24203.0.113.0/24 - 文档 (RFC 5737)
    • 192.88.99.0/24 - IPv6 到 IPv4 中继(已弃用)(RFC 7526)
    • 198.18.0.0/15 - 基准测试 (RFC 2544)

我们建议使用 100.64.0.0/10 内的 IP 范围 (RFC 6598)。此范围在运营商级 NAT 中采用,在 VPC 中可能不使用。

例如,以下是有效的配置,其中 Pod、Service 和节点网络不重叠(VPC 使用 RFC 1918 专用 IP 地址,而 Pod 和 Service 网络覆盖在 RFC 6598 专用 IP 上)。

  • VPC 网络:10.0.0.0/16172.16.1.0/24172.16.2.0/24
  • Pod 网络:100.65.0.0/16
  • Service 网络:100.66.0.0/16

尽管 Pod 和 Service 网络与 VPC 网络重叠,但以下配置也是有效配置,因为没有与控制平面副本重叠。

  • VPC 网络:10.0.0.0/16
  • Pod 网络:10.0.1.0/24
  • Service 网络:10.0.2.0/24
  • 控制平面副本子网:10.0.3.0/2410.0.4.0/2410.0.5.0/24

以下配置无效,因为 Pod IP 范围与控制平面网络重叠。这种重叠可能会阻止工作负载与 VPC 网络中的控制平面副本进行通信:

  • VPC 网络:10.0.0.0/16
  • Pod 网络:10.0.1.0/24
  • Service 网络:10.1.0.0/24
  • 控制平面副本子网:10.0.1.0/2410.0.2.0/2410.0.3.0/24

有关 Pod 地址范围的详细信息

Kubernetes 会将地址分配给 Pod 地址范围中的 Pod 对象。每个节点的集群 Pod 范围被拆分为多个较小的范围。当 Pod 被安排在特定节点上时,Kubernetes 会从该节点范围分配 Pod IP。

如需计算 Pod 地址范围的大小,您需要估算集群中所需的节点数量以及每个节点上运行的 Pod 数量。

下表根据您要运行的节点和 Pod 的数量为 Pod CIDR 范提供大小建议。

Pod 地址范围表

Pod 地址范围 最大 Pod IP 地址数 最大节点数 最大 Pod 数
/24
最小 Pod 地址范围
256 个地址 1 个节点 110 个 Pod
/23 512 个地址 2 个节点 220 个 Pod
/22 1024 个地址 4 个节点 440 个地址
/21 2048 个地址 8 个节点 880 个 Pod
/20 4096 个地址 16 个节点 1760 个 Pod
/19 8192 个地址 32 个节点 3520 个 Pod
/18 16384 个地址 64 个节点 7040 个 Pod
/17 32768 个地址 128 个节点 14080 个 Pod
/16 65536 个地址 256 个节点 28160 个 Pod
/15 131072 个地址 512 个节点 56320 个 Pod
/14 262144 个地址 1024 个节点 112640 个 Pod

有关服务地址范围的详细信息

Kubernetes 会为服务对象(例如,此地址范围内的负载均衡器)分配虚拟 IP 地址。

如要计算 Service 地址范围的大小,您需要估算集群中所需的服务数量。

下表根据您要运行的 Service 数量提供了 Service CIDR 范围的规模建议。

“Service 地址范围”表格

Service 地址范围 最大 Service 数
/27
最小 Service 地址范围
32 个 Service
/26 64 个 Service
/25 128 个 Service
/24 256 个 Service
/23 512 个 Service
/22 1024 个 Service
/21 2048 个 Service
/20 4096 个 Service
/19 8192 个 Service
/18 16384 个 Service
/17 32768 个 Service
/16
最大 Service 地址范围
65536 个 Service

选择您的舰队宿主项目

舰队是 Google Cloud 的概念,用于将集群整理成更大的组。通过舰队,您可以跨多个云管理多个集群,并在这些云中应用一致的政策。创建集群时,GKE Multi-Cloud API 会自动向舰队注册集群。

创建集群时,您可以指定要在其中管理集群的舰队宿主项目。由于 GKE on AWS 使用集群名称作为舰队成员名称,因此您必须确保集群名称在舰队中是唯一的。

跨项目注册

如果要使用集群所在的 Google Cloud 项目以外的舰队宿主项目,则必须对 Multi-Cloud 服务代理服务账号应用额外的 IAM 政策绑定。这样,服务账号就可以使用舰队宿主项目管理舰队。

  1. 如需将服务代理添加到项目中,请运行以下命令:

    gcloud beta services identity create --service=gkemulticloud.googleapis.com \
      --project=CLUSTER_PROJECT_NUMBER
    

    CLUSTER_PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。

  2. 使用以下命令分配此绑定:

    gcloud projects add-iam-policy-binding FLEET_PROJECT_ID \
      --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com" \
      --role="roles/gkemulticloud.serviceAgent"
    

    替换以下内容:

    • FLEET_PROJECT_ID:舰队主机项目的 Google Cloud 项目
    • CLUSTER_PROJECT_NUMBER:您的 Google Cloud 项目编号

多云服务代理账号名称采用以下格式:service-CLUSTER_PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com

您可以在 Google Cloud Console 服务账号页面上找到您的服务账号。如需详细了解如何查找项目编号,请参阅识别项目

创建您的集群

使用以下命令在 GKE on AWS 下创建集群。如需详细了解此命令(包括其可选参数),请参阅 gcloud container aws 参考页面。

gcloud container aws clusters create CLUSTER_NAME \
  --aws-region AWS_REGION \
  --location GOOGLE_CLOUD_LOCATION \
  --cluster-version CLUSTER_VERSION \
  --fleet-project FLEET_PROJECT \
  --vpc-id VPC_ID \
  --subnet-ids CONTROL_PLANE_SUBNET_1,CONTROL_PLANE_SUBNET_2,CONTROL_PLANE_SUBNET_3 \
  --pod-address-cidr-blocks POD_ADDRESS_CIDR_BLOCKS \
  --service-address-cidr-blocks SERVICE_ADDRESS_CIDR_BLOCKS \
  --role-arn API_ROLE_ARN \
  --database-encryption-kms-key-arn DB_KMS_KEY_ARN \
  --admin-users ADMIN_USERS_LIST \
  --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
  --iam-instance-profile CONTROL_PLANE_PROFILE \
  --tags "Name=CLUSTER_NAME-cp"

替换以下内容:

  • CLUSTER_NAME:您选择的集群名称
  • AWS_REGION:要在其中创建集群的 AWS 区域
  • GOOGLE_CLOUD_LOCATION:要在其中管理此集群的 Google Cloud 位置的名称,如 Google Cloud 管理区域中所定义。
  • CLUSTER_VERSION:要在集群上安装的 Kubernetes 版本
  • FLEET_PROJECT:将在其中注册集群的舰队宿主项目。如果要从其他 Google Cloud 项目管理此集群,请参阅跨项目注册
  • VPC_ID:此集群的 AWS VPC 的 ID
  • CONTROL_PLANE_SUBNET_1CONTROL_PLANE_SUBNET_2CONTROL_PLANE_SUBNET_3:集群的三个控制平面实例的子网 ID
  • POD_ADDRESS_CIDR_BLOCKS:集群的 pod 的 CIDR 地址范围
  • SERVICE_ADDRESS_CIDR_BLOCKS:集群的服务的 CIDR 地址范围
  • API_ROLE_ARN:GKE Multi-Cloud API 角色的 ARN
  • CONTROL_PLANE_PROFILE:与集群关联的 IAM 实例的配置文件。如需详细了解如何更新 IAM 实例配置文件,请参阅更新 AWS IAM 实例配置文件
  • DB_KMS_KEY_ARN:用于加密集群的 Secret 的 AWS KMS 密钥的 Amazon 资源名称 (ARN)
  • CONFIG_KMS_KEY_ARN:用于加密用户数据的 AWS KMS 密钥的 Amazon 资源名称 (ARN)
  • ADMIN_USERS_LIST(可选):要向其授予管理特权的用户的电子邮件地址列表(以英文逗号分隔),例如“kai@example.com,hao@example.com,kalani@example.com”。默认为创建集群的用户

如果存在,--tags 参数会将给定的 AWS 标记应用于由 GKE on AWS 管理的所有底层 AWS 资源。此示例使用控制平面节点所属集群的名称来标记它们。

除非您使用 --ssh-ec2-key-pair 标志指定 SSH 密钥对,否则将无法通过 SSH 连接到这些控制层面节点。

如需查看特定 Google Cloud 位置上所有受支持的 Kubernetes 版本,请运行以下命令。

gcloud container aws get-server-config --location GCP_LOCATION

向 Cloud Logging/Cloud Monitoring 授权

为了让 GKE on AWS 能够创建系统日志和指标并将其上传到 Google Cloud,它必须获得授权。

要授权 Kubernetes 工作负载身份 gke-system/gke-telemetry-agent 将日志写入 Google Cloud Logging,并将指标写入 Google Cloud Monitoring,请运行以下命令:

gcloud projects add-iam-policy-binding GOOGLE_PROJECT_ID \
  --member="serviceAccount:GOOGLE_PROJECT_ID.svc.id.goog[gke-system/gke-telemetry-agent]" \
  --role=roles/gkemulticloud.telemetryWriter

GOOGLE_PROJECT_ID 替换为集群的 Google Cloud 项目 ID。

此 IAM 绑定授予 Google Cloud 项目中所有集群上传日志和指标的访问权限。您只需在为项目创建第一个集群后运行此命令。

除非您已在 Google Cloud 项目中至少创建了一个集群,否则添加此 IAM 绑定将失败。这是因为在创建集群之前不会预配其所引用的工作负载身份池 (GOOGLE_PROJECT_ID.svc.id.goog)。

后续步骤