为 GKE 节点定义紧凑放置


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

概览

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

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

在 Autopilot 集群中,您可以通过向 Pod 规范添加节点选择器来为特定工作负载请求紧凑布置。您使用的政策可以是默认的 Autopilot 紧凑布置政策,也可以是使用 N2 机器系列或 N2D 机器系列的现有 Compute Engine 紧凑布置政策。

限制

启用紧凑布置政策

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

  • cloud.google.com/gke-placement-group:您为应该在同一紧凑布置组中一起运行的 Pod 组分配的标识符。每个布置组最多只能包含 1,500 个节点。我们建议您将布置组限制为可受益于分组的工作负载,并尽可能将工作负载分布到不同的布置组中。

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

    • cloud.google.com/compute-class: "Balanced"
    • cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
  • cloud.google.com/placement-policy-name:(可选)现有 Compute Engine 紧凑布置政策的名称。您只能在 GKE 1.31.1-gke.2010000 及更高版本中指定自定义紧凑布置政策。

    如需了解相关说明,请参阅本页面上的创建紧凑布置政策部分。

以下示例 Pod 规范使用自定义紧凑布置政策启用紧凑布置:

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: "placement-group-1"
    cloud.google.com/compute-class: "Balanced"
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME

PLACEMENT_POLICY_NAME 替换为现有的 Compute Engine 紧凑布置政策的名称。如需为 Autopilot 使用默认的紧凑布置政策,请省略 cloud.google.com/placement-policy-name 行。

将紧凑布置与 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 会根据集群资源需求自动预配节点池。如需了解详情,请参阅使用节点自动预配

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

apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
  nodeSelector:
    cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
    cloud.google.com/machine-family: MACHINE_FAMILY
    cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity

替换以下内容:

  • PLACEMENT_GROUP_IDENTIFIER:您为应该在同一紧凑布置组中一起运行的 Pod 组分配的标识符。
  • MACHINE_FAMILY:机器家族的名称。请使用一个支持紧凑布置的机器系列。 对于具有计算和网络性能要求的工作负载,我们建议您使用 C2 或 C2D 机器家族。
  • PLACEMENT_POLICY_NAME:(可选)现有 Compute Engine 紧凑布置政策的名称。当节点自动预配功能创建新的节点池以将您的 Pod 合为一组时,GKE 会使用指定的紧凑布置政策。您只能在 GKE 1.31.1-gke.2010000 及更高版本中指定自定义紧凑布置政策。

    如需了解相关说明,请参阅本页面上的创建紧凑布置政策部分。

如果 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 容忍设置结合使用,请参阅工作负载分离

后续步骤