创建共享集群以运行容器工作负载

本文档介绍了如何在 Google Distributed Cloud (GDC) 网闸隔离可用区中创建共享 Kubernetes 集群。共享集群跨多个项目,并包含全面的 GDC 托管式服务,这些服务提供高度规范的 Kubernetes 集群配置,其可配置性低于标准集群。如需详细了解标准集群,请参阅 Kubernetes 集群配置。

共享集群属于可用区级资源,无法跨多个可用区。如需在多可用区 Universe 中操作集群,您必须在每个可用区中手动创建集群。

本文档适用于应用运维人员群组中的应用开发者等受众群体,他们负责管理其组织内的容器工作负载。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

准备工作

  • 如需获得创建共享集群所需的权限,请让您的 IAM 组织管理员为您授予用户集群管理员角色 (user-cluster-admin)。此角色不绑定到命名空间。

  • 如需使用 API 或 Terraform 创建共享集群,请生成可用区级 API 服务器的 kubeconfig 文件来托管集群。将环境变量 MANAGEMENT_API_SERVER 设置为 kubeconfig 路径。如需了解详情,请参阅可用区级 Management API 服务器资源。

  • 查看集群限制,了解资源注意事项。

规划 Pod CIDR 块

如需为工作负载分配适当大小的 Pod CIDR 块,您必须在创建 Kubernetes 集群之前计算该集群所需的 IP 地址数量。创建集群后,大多数网络参数都无法更改。

Kubernetes 集群在分配 IP 地址时遵循以下逻辑:

  • Kubernetes 会为每个节点分配一个由 256 个地址组成的 /24 CIDR 块。此数量遵循 Kubernetes 集群每个节点最多 110 个 Pod 的默认上限。
  • 分配给节点的 CIDR 块的大小取决于每个节点的 Pod 数上限值。
  • 该地址块包含的地址数量始终至少是每个节点的 Pod 数上限的两倍。

请参阅以下示例,了解如何计算默认值每个节点掩码大小= /24 以容纳 110 个 Pod:

Maximum pods per node = 110
Total number of IP addresses required = 2 * 110 = 220

Per node mask size = /24
Number of IP addresses in a /24 = 2(32 - 24) = 256

根据所需的节点数量,确定要为 Kubernetes 集群配置的所需 Pod CIDR 掩码。在配置 CIDR 范围时,请规划未来向集群添加节点:

  Total number of nodes supported = 2(Per node mask size - pod CIDR mask)

假设默认每个节点的掩码大小= /24,请参阅下表,其中将 Pod CIDR 掩码映射到支持的节点数。

Pod CIDR 掩码 计算:2(每个节点的掩码大小 - CIDR 掩码) 支持的节点数上限(包括控制平面节点)
/21 2(24 - 21) 8
/20 2(24-20) 16
/19 2(24 - 19) 32
/18 2(24 - 18) 64

计算 Kubernetes 集群的 Pod CIDR 块后,请在下一部分中将其配置为集群创建工作流的一部分。

创建共享集群

完成以下步骤以创建共享 Kubernetes 集群:

控制台

  1. 在项目选择器中,选择您的组织。

    共享集群是组织级资源。如果您选择项目,则会创建一个标准集群,该集群的作用域为项目。如需了解详情,请参阅资源层次结构。

  2. 在导航菜单中,依次选择 Kubernetes Engine > 集群。

  3. 点击创建集群。

  4. 在名称字段中,指定集群的名称。

  5. 选择集群的 Kubernetes 版本。

  6. 选择要在其中创建集群的可用区。

  7. 点击关联项目,然后选择要关联到集群的现有项目。然后,点击保存。创建集群后,您可以在项目详情页面中附加或分离项目。您必须先将项目附加到集群,然后才能在集群中部署容器工作负载。

    使用控制台创建集群。

  8. 点击下一步。

  9. 为集群配置投放网络设置。创建集群后,您将无法更改这些投放网络设置。Kubernetes 集群默认且唯一支持的互联网协议是互联网协议版本 4 (IPv4)。

    1. 如果您想创建专用负载均衡器节点,请输入要创建的节点数。默认情况下,您会收到零个节点,并且负载均衡器流量会通过控制节点运行。

    2. 选择要使用的服务 CIDR(无类别域间路由)。系统会从此范围为已部署的服务(例如负载均衡器)分配 IP 地址。

    3. 选择要使用的 Pod CIDR。集群会从此范围中为您的 Pod 和虚拟机分配 IP 地址。

    4. 点击下一步。

  10. 查看为集群自动生成的默认节点池的详细信息。点击 修改以修改默认节点池。

  11. 如需创建其他节点池,请选择添加节点池。修改默认节点池或添加新节点池时,您可以使用以下选项对其进行自定义:

    1. 为节点池分配名称。创建节点池后,您将无法修改名称。
    2. 指定要在节点池中创建的工作器节点数。
    3. 选择最符合您工作负载要求的机器类别。 查看以下设置列表:

      • 机器类型
      • CPU
      • 内存
    4. 点击保存。

  12. 点击创建以创建集群。

共享集群创建过程最多可能需要 90 分钟才能完成。

API

  1. 创建 Cluster 自定义资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    spec:
      clusterNetwork:
        podCIDRSize: POD_CIDR
        serviceCIDRSize: SERVICE_CIDR
      initialVersion:
        kubernetesVersion: KUBERNETES_VERSION
      nodePools:
      - machineTypeName: MACHINE_TYPE
        name: NODE_POOL_NAME
        nodeCount: NUMBER_OF_WORKER_NODES
        taints: TAINTS
        labels: LABELS
        acceleratorOptions:
          gpuPartitionScheme: GPU_PARTITION_SCHEME
      releaseChannel:
        channel: UNSPECIFIED
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • CLUSTER_NAME:集群的名称。集群名称不得以 -system 结尾。-system 后缀预留给 GDC 创建的集群。
    • POD_CIDR:分配 Pod 虚拟 IP 地址的网络范围的大小。如果未设置,则使用默认值 21。
    • SERVICE_CIDR:分配服务虚拟 IP 地址的网络范围的大小。如果未设置,则使用默认值 23。
    • KUBERNETES_VERSION:集群的 Kubernetes 版本,例如 1.26.5-gke.2100。如需列出可供配置的 Kubernetes 版本,请参阅列出集群可用的 Kubernetes 版本。
    • MACHINE_TYPE:节点池的工作器节点的机器类型。查看可用的机器类型,了解可配置的类型。
    • NODE_POOL_NAME:节点池的名称。
    • NUMBER_OF_WORKER_NODES:要在节点池中预配的工作器节点数。
    • TAINTS:要应用于此节点池的节点的污点。此为可选字段。
    • LABELS:要应用于此节点池的节点的标签。它包含一个键值对列表。此为可选字段。
    • GPU_PARTITION_SCHEME:GPU 分区方案(如果您运行的是 GPU 工作负载)。此为可选字段。 例如 mixed-2。如果未设置此字段,则不会对 GPU 进行分区。如需详细了解可用的多实例 GPU (MIG) 配置文件,请参阅支持的 MIG 配置文件。

    共享集群创建过程最多可能需要 90 分钟才能完成。

  2. 创建 ProjectBinding 自定义资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: resourcemanager.gdc.goog/v1
    kind: ProjectBinding
    metadata:
      name: CLUSTER_NAME-PROJECT_NAME
      namespace: platform
      labels:
        resourcemanager.gdc.goog/projectbinding-for-user-project: "true"
    spec:
      clusterRef:
        name: CLUSTER_NAME
      selector:
        nameSelector:
          matchNames:
          - PROJECT_NAME
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • CLUSTER_NAME:集群的名称。
    • PROJECT_NAME:要绑定到的项目的名称。每个 ProjectBinding 资源只能映射到一个集群。如果项目需要访问多个集群,则必须为每个集群创建一个唯一的 ProjectBinding。

    您必须先将项目附加到集群,然后开发者才能将容器工作负载部署到集群。

Terraform

  1. 在 Terraform 配置文件中,插入以下代码段以创建 Cluster 自定义资源:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "CLUSTER_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "cluster.gdc.goog/v1"
        "kind" = "Cluster"
        "metadata" = {
          "name" = "CLUSTER_NAME"
          "namespace" = "platform"
        }
        "spec" = {
          "clusterNetwork" = {
            "podCIDRSize" = "POD_CIDR"
            "serviceCIDRSize" = "SERVICE_CIDR"
          }
          "initialVersion" = {
            "kubernetesVersion" = "KUBERNETES_VERSION"
          }
          "nodePools" = [{
            "machineTypeName" = "MACHINE_TYPE"
            "name" = "NODE_POOL_NAME"
            "nodeCount" = "NUMBER_OF_WORKER_NODES"
            "taints" = "TAINTS"
            "labels" = "LABELS"
            "acceleratorOptions" = {
              "gpuPartitionScheme" = "GPU_PARTITION_SCHEME"
            }
          }]
          "releaseChannel" = {
            "channel" = "UNSPECIFIED"
          }
        }
      }
    }
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • CLUSTER_RESOURCE_NAME:集群的唯一 Terraform 资源名称,例如 cluster-1。Terraform 会使用此名称来标识您的集群,而 GDC 不会使用此名称。
    • CLUSTER_NAME:集群的名称。集群名称不得以 -system 结尾。-system 后缀预留给 GDC 创建的集群。
    • POD_CIDR:分配 Pod 虚拟 IP 地址的网络范围的大小。如果未设置,则使用默认值 21。
    • SERVICE_CIDR:分配服务虚拟 IP 地址的网络范围的大小。如果未设置,则使用默认值 23。
    • KUBERNETES_VERSION:集群的 Kubernetes 版本,例如 1.26.5-gke.2100。如需列出可供配置的 Kubernetes 版本,请参阅列出集群可用的 Kubernetes 版本。
    • MACHINE_TYPE:节点池的工作器节点的机器类型。查看可用的机器类型,了解可配置的类型。
    • NODE_POOL_NAME:节点池的名称。
    • NUMBER_OF_WORKER_NODES:要在节点池中预配的工作器节点数。
    • TAINTS:要应用于此节点池的节点的污点。此为可选字段。
    • LABELS:要应用于此节点池的节点的标签。它包含一个键值对列表。此为可选字段。
    • GPU_PARTITION_SCHEME:GPU 分区方案(如果您运行的是 GPU 工作负载)。此为可选字段。 例如 mixed-2。如果未设置此字段,则不会对 GPU 进行分区。如需详细了解可用的多实例 GPU (MIG) 配置文件,请参阅支持的 MIG 配置文件。
  2. 在 Terraform 配置文件中,插入以下代码段以创建 ProjectBinding 自定义资源:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "PROJECT_BINDING_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "resourcemanager.gdc.goog/v1"
        "kind" = "ProjectBinding"
        "metadata" = {
          "name" = "CLUSTER_NAME-PROJECT_NAME"
          "namespace" = "platform"
          "labels" = {
            "resourcemanager.gdc.goog/projectbinding-for-user-project" = "true"
          }
        }
        "spec" = {
          "clusterRef" = {
            "name" = "CLUSTER_NAME"
          }
          "selector" = {
            "nameSelector" = {
              "matchNames" = [
                "PROJECT_NAME",
              ]
            }
          }
        }
      }
    }
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • PROJECT_BINDING_RESOURCE_NAME:项目绑定的 Terraform 资源名称,例如 project-binding-1。Terraform 使用此名称来标识您的项目绑定,GDC 不会使用此名称。
    • CLUSTER_NAME:集群的名称。
    • PROJECT_NAME:要绑定到的项目的名称。每个 ProjectBinding 资源只能映射到一个集群。如果项目需要访问多个集群,则必须为每个集群创建一个唯一的 ProjectBinding。

    您必须先将项目附加到集群,然后开发者才能将容器工作负载部署到集群。

  3. 使用 Terraform 应用新的自定义资源:

    terraform apply
    

共享集群创建过程最多可能需要 90 分钟才能完成。

后续步骤