为 GKE 节点定义紧凑放置


您可以使用紧凑布置政策控制 Google Kubernetes Engine (GKE) 节点在可用区中的物理位置是否彼此靠近。

概览

在 GKE 集群中创建节点池和工作负载时,您可以定义紧凑放置政策,以指定这些节点或工作负载应放置在一个可用区内彼此靠近的物理位置。节点彼此靠近可以减少节点之间的网络延迟,这对紧密耦合的批量工作负载特别有用。

将紧凑放置与 GKE Autopilot 搭配使用

限制

  • GKE 在同一可用区的紧凑放置中预配工作负载。
  • 紧凑放置支持 Balanced 和 A100 GPU。如需了解详情,请参阅机器类型
  • 紧凑放置支持最多在 150 个节点上对 Pod 进行分组。
  • 不支持节点的实时迁移

启用紧凑放置政策

如需为 GKE Autopilot 启用紧凑放置,请将包含以下键的 nodeSelector 添加到 Pod 规范:

  • cloud.google.com/gke-placement-group 是您为应该在同一紧凑放置组中一起运行的 Pod 组分配的标识符。

  • 以下键之一,用于定义资源类型:

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"

以下示例摘自启用紧凑放置的 Pod 规范。放置组标识符为 placement-group-1,计算类为 Balanced

  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"

每个放置组最多只能包含 150 个节点。我们建议您将放置组限制为可受益于分组的工作负载,并尽可能将工作负载分布到不同的放置组中。

将紧凑放置与 GKE Standard 搭配使用

限制

GKE Standard 节点池中的紧凑放置具有以下限制:

创建紧凑放置政策

如需创建紧凑放置政策,请在创建节点池或集群期间在 Google Cloud CLI 中指定 placement-type=COMPACT 选项。启用此设置后,GKE 会尝试将节点放置在节点池中彼此靠近的物理位置。

如需在集群中使用现有资源政策,请在节点池或集群创建期间为 placement-policy 标志指定自定义政策的位置。这样便可灵活地使用预留的布置位置、多个具有相同布置政策的节点池,以及其他高级布置选项。但是,与指定 --placement-type=COMPACT 标志相比,您还需要执行更多手动操作。例如,您需要创建、删除和维护自定义资源政策。确保使用资源政策的所有节点池遵循虚拟机实例数上限。如果在某些节点池未达到其大小上限时达到此限制,则再添加任何节点都会失败。

如果您未指定 placement-typeplacement-policy 标志,则默认为对节点布置没有要求。

在新集群中创建紧凑放置政策

创建新集群时,您可以指定将应用于默认节点池的紧凑放置政策。对于您为集群创建的任何后续节点池,都需要指定是否应用紧凑放置。

如需创建默认节点池已应用紧凑放置政策的新集群,请使用以下命令:

gcloud container clusters create CLUSTER_NAME \
    --machine-type MACHINE_TYPE \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • MACHINE_TYPE:用于节点的机器类型,必须是 C2 机器类型(例如 c2-standard-4)。
  • --placement-type COMPACT:为默认节点池中的节点应用紧凑放置。
  • MAX_UNAVAILABLE:在节点池升级期间可能同时不可用的节点数上限。对于紧凑布置,我们建议使用快速、无超额配置升级,以优化升级期间找到共置节点的可能性。

在现有集群上创建紧凑放置政策

在现有集群上,您可以创建已应用紧凑放置政策的节点池。

如需创建已应用紧凑放置政策的节点池,请使用以下命令:

gcloud container node-pools create NODEPOOL_NAME \
    --machine-type MACHINE_TYPE \
    --cluster CLUSTER_NAME \
    --placement-type COMPACT \
    --max-surge-upgrade 0 \
    --max-unavailable-upgrade MAX_UNAVAILABLE

替换以下内容:

  • NODEPOOL_NAME:新节点池的名称。
  • MACHINE_TYPE:用于节点的机器类型,必须是 C2 机器类型(例如 c2-standard-4)。
  • CLUSTER_NAME:现有集群的名称。
  • --placement-type COMPACT:表示对新节点池中的节点应用紧凑放置。
  • MAX_UNAVAILABLE:在节点池升级期间可能同时不可用的节点数上限。对于紧凑布置,我们建议使用快速、无超额配置升级,以优化升级期间找到共置节点的可能性。

创建使用共享自定义布置政策的节点池

您可以手动创建资源政策并在多个节点池中使用。

  1. 在集群 Google Cloud 区域中创建资源政策:

    gcloud compute resource-policies create group-placement POLICY_NAME \
        --region REGION \
        --collocation collocated
    

    请替换以下内容:

    • POLICY_NAME:资源政策的名称。
    • REGION:集群所在的区域。
  2. 创建一个使用自定义资源政策的节点池:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

    请替换以下内容:

    • NODEPOOL_NAME:新节点池的名称。
    • MACHINE_TYPE:用于节点的机器类型,必须是 C2 机器类型(例如 c2-standard-4)。
    • CLUSTER_NAME:现有集群的名称。
    • MAX_UNAVAILABLE:在节点池升级期间可能同时不可用的节点数上限。对于紧凑布置,我们建议使用快速、无超额配置升级,以优化升级期间找到共置节点的可能性。

使用具有紧凑布置政策的 Compute Engine 预留

预留可帮助您确保硬件在指定可用区中可用,从而降低硬件不足而导致节点池创建失败的风险。

  1. 创建指定紧凑布置政策的预留:

    gcloud compute reservations create RESERVATION_NAME \
        --vm-count MACHINE_COUNT \
        --machine-type MACHINE_TYPE \
        --resource-policies policy=POLICY_NAME \
        --zone ZONE \
        --require-specific-reservation
    

    替换以下内容:

    • RESERVATION_NAME:预留的名称。
    • MACHINE_COUNT:预留节点的数量。
    • MACHINE_TYPE:用于节点的机器类型,必须是 C2 机器类型。例如,如需使用具有 4 个 vCPU 的预定义 C2 机器类型,请指定 c2-standard-4
    • POLICY_NAME:资源政策的名称。
    • ZONE:创建预留的可用区。
  2. 通过指定紧凑布置政策和您在上一步中创建的预留来创建节点池:

    gcloud container node-pools create NODEPOOL_NAME \
        --machine-type MACHINE_TYPE \
        --cluster CLUSTER_NAME \
        --placement-policy POLICY_NAME \
        --reservation-affinity specific \
        --reservation RESERVATION_NAME \
        --max-surge-upgrade 0 \
        --max-unavailable-upgrade MAX_UNAVAILABLE
    

替换以下内容:

  • NODEPOOL_NAME:新节点池的名称。
  • MACHINE_TYPE:用于节点的机器类型,必须是 C2 机器类型(例如 c2-standard-4)。
  • CLUSTER_NAME:现有集群的名称。

在使用紧凑放置的节点上创建工作负载

如需在使用紧凑放置的专用节点上运行工作负载,您可以使用多种 Kubernetes 机制,例如将 pod 分配给节点以及防止在一组节点上调度不需要的 pod来实现此目的。

在以下示例中,我们将污点添加到专用节点,并为 Pod 添加相应的容忍和亲和性。

  1. 将污点添加到具有紧凑放置政策的节点池中的节点:

    kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
    
  2. 在工作负载定义中,指定必要的容忍度和节点亲和性。以下是单个 Pod 的示例:

    apiVersion: v1
    kind: Pod
    metadata:
      ...
    spec:
      ...
      tolerations:
      - key: dedicated-pool
        operator: "Equal"
        value: "NODEPOOL_NAME"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dedicated-pool
                operator: In
                values:
                - NODEPOOL_NAME
    

在某些位置,可能无法使用紧凑放置政策创建大型节点池。要将此类节点池的大小限制为必要的大小,您应该考虑为需要紧凑放置的工作负载创建节点池。

使用紧凑放置进行节点自动预配

从 GKE 1.25 版开始,节点自动预配支持紧凑布置政策。借助节点自动预配,GKE 会根据集群资源需求自动预配节点池。如需了解详情,请参阅使用节点自动预配

如需为节点自动预配启用紧凑布置,请将 nodeSelector 添加到具有以下键的 Pod 规范中:

  • cloud.google.com/gke-placement-group 是您为应该在同一紧凑放置组中一起运行的 Pod 组分配的标识符。

  • cloud.google.com/machine-family 是机器系列名称。请使用一个支持紧凑布置的机器系列。对于具有计算和网络性能要求的工作负载,我们建议您使用 C2 或 C2D 机器系列。

以下示例是一个启用紧凑布置的 Pod 规范:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY

如果 Pod 配置已定义紧凑布置支持的机器类型,则可以省略 cloud.google.com/machine-family 键。例如,如果 Pod 规范包含 nvidia.com/gpu,并且集群配置为使用 A100 GPU,则无需添加 cloud.google.com/machine-family 键。

以下示例是一个用于定义 nvidia.com/gpu 请求的 Pod 规范,并且集群配置为使用 A100 GPU。此 Pod spec 不包含 cloud.google.com/machine-family 键:

  apiVersion: v1
  kind: Pod
  metadata:
    ...
  spec:
    ...
    nodeSelector:
      cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
      cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
    resources:
      limits:
        nvidia.com/gpu: 2

如需了解详情,请参阅如何配置 Pod 使用 GPU

优化布置组大小

由于 GKE 找到较小部署的最佳布置,因此我们建议您指示 GKE 避免在同一布置组中运行不同类型的 Pod。添加具有 cloud.google.com/gke-placement-group 键和您定义的紧凑布置标识符的容忍键。

以下示例是一个用于定义具有紧凑布置的 Pod 容忍设置的 Pod 规范:

apiVersion: v1
kind: Pod
metadata:
  ...
spec:
  ...
  tolerations:
  - key: cloud.google.com/gke-placement-group
    operator: "Equal"
    value: PLACEMENT_GROUP_IDENTIFIER
    effect: "NoSchedule"

如需详细了解如何将节点自动预配与 Pod 容忍设置结合使用,请参阅工作负载分离

后续步骤