创建集群

本页面介绍了如何在 Kubernetes 1.29.3-gke.600 版 GKE on Azure 中创建集群和节点池。

准备工作

如需完成本页面中的步骤,请执行以下操作:

  1. 按照配置前提条件中的步骤操作。

  2. 选择是在多个可用区还是在单个可用区中运行控制平面。

  3. 接下来,请选择要提供给集群的无类别域间路由 (CIDR) 范围。

控制平面可用区放置

默认情况下,GKE on Azure 会将单独的控制平面副本放置在所选区域内三个可用区所在的子网中。您可以选择这些可用区和子网。

如果您要使用默认控制平面副本放置,请跳到为集群选择 CIDR 范围

Azure NAT 网关和集群控制平面

每个控制平面副本还需要连接到 Google 托管的管理服务,才能在正常状态下运行。

如果您使用 Azure NAT 网关提供出站连接,则必须考虑可用区故障如何影响集群的控制平面。一个 NAT 网关端点与单个可用区隔离,或者是区域/非可用区端点,并且会导致单点故障。

如果要将控制平面副本放在单个可用区中,请使用单个子网和可用区。如果您使用 NAT 网关进行出站连接,请确保将端点置于同一可用区。

如果您想要将副本放置在两个或三个可用区,则可以在创建集群时传递子网和可用区的列表。当您传递两个子网和可用区时,GKE on Azure 会将两个副本放在提供的第一个可用区中。当您传入三个子网和可用区时,GKE on Azure 会将副本放在每个子网中。如需了解详情,请参阅将副本放在特定子网中

如需详细了解如何配置 Azure 子网和可用区以实现高可用性,请参阅 Azure 文档中的通过可用区级栈实现可用区隔离

将副本放入特定子网中

此部分为可选。

如需控制控制平面副本所在的可用区,请使用 --replica-placements 标志,并在创建集群时传递子网 ID 和可用区列表。您最多可以使用三个子网和可用区来放置控制平面副本。

如需设置子网列表的格式,请执行以下步骤。

  1. 使用 az 命令行工具检索 Azure 子网 ID:

    az network vnet subnet show \
      --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \
      --name SUBNET_NAME --query "id" -otsv
    

    替换以下内容:

    • CLUSTER_RESOURCE_GROUP_NAME:您要在其中运行集群的现有资源组名称
    • VNET_RESOURCE_GROUP_NAME:包含您的 VNet 的资源组名称
    • VNET_NAME:您的 VNet 名称
    • SUBNET_NAME:您的子网名称

    输出是子网的 ID。Azure 子网 ID 如下所示:

    /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/SUBNET_NAME
    

    对要在其中创建控制平面副本的每个子网重复此命令。将子网 ID 复制到文本编辑器中以执行后续步骤。

  2. 创建以英文逗号分隔的子网 ID 和 Azure 可用性可用区列表,并使用英文冒号分隔子网和可用区。例如,要在可用区 1 中的 subnet1、可用区 2 中的 subnet2 和区域 3 中的 subnet3 创建控制平面副本,请使用以下字符串:

    /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet1:1,/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet2:2,/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/subnet3:3
    

    复制此字符串,并在创建集群时将此字符串用作 --replica-placements 标志的值。

为您的集群选择 CIDR 范围

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

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

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

  • Service:100.64.0.0/16
  • Pod:100.96.0.0/11

这些范围足够大,可供您扩展集群,而不会出现任何问题。

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

有关选择范围的详细信息

GKE on Azure 使用 Pod 和 Service 的叠加网络,因此这些网络的 IP 地址范围在 VNet 内不必为可路由的地址范围。您使用的任何 IP 地址范围都必须保证可用。如需了解详情,请参阅 Dataplane V2

  • Pod 和 Service IP 范围可以与 VNet 网络重叠,前提是两者均不包含控制平面或节点池子网 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 中采用,在 VNet 中可能不使用。

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

  • VNet 网络: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 网络与 VNet 网络重叠,但以下配置也是有效配置,因为没有与控制平面副本重叠。

  • VNet 网络: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 范围与控制平面网络重叠。这种重叠可能会阻止工作负载与 VNet 网络中的控制平面副本进行通信:

  • VNet 网络: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

向 Azure 进行身份验证

GKE on Azure 提供了两种向 Azure 进行身份验证的方法:工作负载身份联合创建客户端证书。建议使用工作负载身份联合来进行身份验证,因为它更简单、更安全。

工作负载身份联合

工作负载身份联合允许 GKE on Azure 使用 Google 服务账号向 Azure 进行身份验证,以便随后管理 Azure AD 应用中的资源。与 AzureClient 相比,您无需手动管理证书并将其上传到 Azure AD。

如需在 Azure AD 应用中配置联合身份凭据,请运行以下命令。请注意,您最多可以向每个 Azure AD 应用添加 20 个凭据。

  1. 将 Azure 应用 ID 保存到环境变量:

    APPLICATION_ID=$(az ad app list --all \
      --query "[?displayName=='APPLICATION_NAME'].appId" --output tsv)
    PROJECT_ID="$(gcloud config get-value project)"
    PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" \
    --format "value(projectNumber)")
    
  2. 创建名为 credential.json 的 JSON 文件。

    {
      "name": "CREDENTIAL_NAME",
      "issuer": "https://accounts.google.com",
      "subject": "service-PROJECT_NUMBER@gcp-sa-gkemulticloud.iam.gserviceaccount.com",
      "audiences": ["api://AzureADTokenExchange"],
      "description": "Allow GKE on Azure to authenticate to the Azure AD application using a Google service account."
    }
    
    • CREDENTIAL_NAME:凭据名称。
    • PROJECT_NUMBER:托管集群的 Google Cloud 项目的编号。
  3. 在 Azure AD 应用中创建联合身份凭据:

    az ad app federated-credential create --id "${APPLICATION_ID}" --parameters credential.json
    

如需了解详情,请参阅 Azure 文档与 Google Cloud 的 Azure AD 工作负载身份联合

您还可以使用 Terraform 预配 Azure 联合身份凭据。如需了解详情,请参阅 azuread_application_federated_identity_credential

配置凭据后,请为集群创建或选择 SSH 密钥对。

创建 SSH 密钥对

创建集群时,您需要提供 SSH 密钥对。 如果您已经拥有要使用的密钥对,请跳过此步骤。

  1. 如需创建新密钥对,请使用 ssh-keygen 命令行工具:

    ssh-keygen -m PEM -t rsa -b 4096 -f KEY_PATH
    

    KEY_PATH 替换为新私钥的路径。

  2. 将密钥存储在环境变量中:

    SSH_PUBLIC_KEY=$(cat KEY_PATH.pub)
    

    例如,如需在 ~/.ssh/anthos-multicloud-key.pub 上创建新密钥对,并将公钥存储在环境变量中,请运行以下命令:

    ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/anthos-multicloud-key
    SSH_PUBLIC_KEY=$(cat ~/.ssh/anthos-multicloud-key.pub)
    

将公钥保存到环境变量后,您就可以创建集群了。

选择您的舰队宿主项目

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

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

跨项目注册

如果要使用集群所在的 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 控制台服务账号页面上找到您的服务账号。如需详细了解如何查找项目编号,请参阅识别项目

创建集群

如需创建集群,请运行以下命令:

  1. 将 Azure 资源组、VNet 和子网 ID 保存到环境变量:

    SUBSCRIPTION_ID=$(az account show --query "id" --output tsv)
    TENANT_ID=$(az account list \
      --query "[?id=='${SUBSCRIPTION_ID}'].{tenantId:tenantId}" --output tsv)
    CLUSTER_RG_ID=$(az group show --resource-group=CLUSTER_RESOURCE_GROUP_NAME \
      --query "id" -otsv)
    VNET_ID=$(az network vnet show --resource-group=VNET_RESOURCE_GROUP_NAME \
      --name=VNET_NAME --query "id" -otsv)
    SUBNET_ID=$(az network vnet subnet show \
      --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \
      --name default --query "id" -otsv)
    

    替换以下内容:

    • CLUSTER_RESOURCE_GROUP_NAME:您要在其中运行集群的现有资源组名称
    • VNET_RESOURCE_GROUP_NAME:包含您的 VNet 的资源组名称
    • VNET_NAME:您的 VNet 的名称
  2. 使用 Google Cloud CLI 创建集群:

    工作负载身份联合

    gcloud container azure clusters create CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --fleet-project FLEET_PROJECT \
        --azure-tenant-id "${TENANT_ID}" \
        --azure-application-id "${APPLICATION_ID}" \
        --azure-region AZURE_REGION \
        --pod-address-cidr-blocks POD_CIDR \
        --service-address-cidr-blocks SERVICE_CIDR \
        --vm-size VM_SIZE \
        --cluster-version 1.29.3-gke.600 \
        --ssh-public-key "$SSH_PUBLIC_KEY" \
        --resource-group-id "$CLUSTER_RG_ID" \
        --vnet-id "$VNET_ID" \
        --subnet-id "$SUBNET_ID" # Optional, see following note \
        --tags "control-plane=CLUSTER_NAME" \
        --admin-users ADMIN_USERS_LIST
    

    Azure 客户端

    gcloud container azure clusters create CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --fleet-project FLEET_PROJECT \
        --client CLIENT_NAME \
        --azure-region AZURE_REGION \
        --pod-address-cidr-blocks POD_CIDR \
        --service-address-cidr-blocks SERVICE_CIDR \
        --vm-size VM_SIZE \
        --cluster-version 1.29.3-gke.600 \
        --ssh-public-key "$SSH_PUBLIC_KEY" \
        --resource-group-id "$CLUSTER_RG_ID" \
        --vnet-id "$VNET_ID" \
        --subnet-id "$SUBNET_ID" # Optional, see following note \
        --tags "control-plane=CLUSTER_NAME" \
        --admin-users ADMIN_USERS_LIST
    

    请替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • GOOGLE_CLOUD_LOCATION:管理集群的 Google Cloud 位置
    • FLEET_PROJECT 替换为将在其中注册集群的队列宿主项目。 如果要从其他 Google Cloud 项目管理此集群,请参阅跨项目注册
    • AZURE_REGION:与您的 Google Cloud 区域关联的受支持的 Azure 区域
    • POD_CIDR:您的集群的 Pod 地址范围,例如 10.0.1.0/18
    • SERVICE_CIDR:您的集群的 Service 地址范围
    • VM_SIZE受支持的 Azure 虚拟机大小
    • ADMIN_USERS_LIST(可选):要向其授予管理特权的用户的电子邮件地址列表(以英文逗号分隔),例如“kai@example.com,hao@example.com,kalani@example.com”。默认为创建集群的用户
    • CLIENT_NAME:您的 AzureClient 名称
  3. 检查集群的状态:

    gcloud container azure clusters describe CLUSTER_NAME  --location GOOGLE_CLOUD_LOCATION
    

    替换以下内容:

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    输出包含有关集群状态和配置的信息。

向 Cloud Logging/Cloud Monitoring 授权

如需使 GKE on Azure 能够创建系统日志和指标并将其上传到 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) 不会在创建集群之前进行预配。

创建节点池

在创建节点池之前,您需要做好以下准备:

  • 可以使用 az 命令行工具检索 Azure 子网 ID 的权限。
  • 访问集群的 SSH 公钥。

如需创建节点池,请运行以下命令:

  1. 将 Azure VNet 子网 ID 和 SSH 公钥保存到环境变量中:

    SUBNET_ID=$(az network vnet subnet show \
      --resource-group=VNET_RESOURCE_GROUP_NAME --vnet-name=VNET_NAME \
      --name default --query "id" -otsv)
    SSH_PUBLIC_KEY=$(cat KEY_PATH.pub)
    

    替换以下内容:

    • VNET_RESOURCE_GROUP_NAME:包含 VNet 的资源组名称
    • VNET_NAME:您的 VNet 的名称
    • KEY_PATH:密钥对的路径
  2. 使用 Google Cloud CLI 创建节点池:

    gcloud container azure node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --node-version 1.29.3-gke.600 \
        --vm-size VM_SIZE \
        --max-pods-per-node 110 \
        --min-nodes MIN_NODES \
        --max-nodes MAX_NODES \
        --ssh-public-key "${SSH_PUBLIC_KEY}" \
        --subnet-id "${SUBNET_ID}"
    

    替换以下内容:

  3. 检查节点池的状态:

    gcloud container azure node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION
    

    替换以下内容:

    • NODE_POOL_NAME:节点池的唯一名称,例如 node-pool-1
    • CLUSTER_NAME:GKE on Azure 集群的名称
    • GOOGLE_CLOUD_LOCATION:管理集群的 Google Cloud 位置

    输出包含节点池的状态,包括是 PROVISIONING 还是 RUNNING

后续步骤