自动扩缩集群


本页面介绍如何自动扩缩标准 Google Kubernetes Engine (GKE) 集群。如需了解集群自动扩缩器的工作原理,请参阅集群自动扩缩器

借助 Autopilot 集群,您无需担心预配节点或节点池,因为节点池通过节点自动预配自动预配;并自动扩缩以满足工作负载的要求。

使用集群自动扩缩器

以下部分介绍如何使用集群自动扩缩器。

创建具有自动扩缩功能的集群

您可以使用 Google Cloud CLI 或 Google Cloud Console 创建启用了自动扩缩功能的集群。

gcloud

如需创建启用了自动扩缩功能的集群,请使用 --enable-autoscaling 标志并指定 --min-nodes--max-nodes

gcloud container clusters create CLUSTER_NAME \
    --enable-autoscaling \
    --num-nodes NUM_NODES \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:要创建的集群的名称。
  • NUM_NODES:要在每个位置创建的节点数。
  • MIN_NODES:为每个可用区中指定节点池自动扩缩的节点数下限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数下限,请使用 --total-min-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • MAX_NODES:为每个可用区中指定节点池自动扩缩的节点数上限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数上限,请使用 --total-max-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • COMPUTE_REGION:新集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE

示例:创建启用节点自动扩缩功能的集群并设置节点数下限和上限

以下命令会创建一个包含 90 个节点的集群;或者如果区域内有 3 个可用区,则每个可用区内 30 个节点。该集群已启用节点自动扩缩功能,可根据集群负载调整节点数量。集群自动扩缩器可以将默认节点池缩减到每个可用区 15 个节点,也可以将节点池扩容到每个可用区最多 50 个节点。

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes=30 \
    --min-nodes=15 --max-nodes=50 \
    --region=us-central

示例:创建启用节点自动扩缩功能的集群并设置节点总数

以下命令会创建一个包含 30 个节点的集群;或者如果区域内有 3 个可用区,则每个可用区内 10 个节点。该集群已启用节点自动扩缩功能,可根据集群负载调整节点数量。在此示例中,集群的总大小介于 10 到 60 个节点之间,无论这些节点在各个可用区之间的分布如何。

gcloud container clusters create my-cluster --enable-autoscaling \
    --num-nodes 10 \
    --region us-central1 \
    --total-min-nodes 10  --total-max-nodes 60

控制台

如需创建其中的默认节点池已启用自动扩缩功能的新集群,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 点击 创建

  3. 根据需要配置集群。

  4. 在导航窗格的节点池下,点击默认池 (default-pool)。

  5. 选中启用自动扩缩复选框。

  6. 根据需要更改节点数下限节点数上限字段的值。

  7. 点击创建

添加具有自动扩缩功能的节点池

您可以使用 gcloud CLI 或 Google Cloud Console 创建启用了自动扩缩功能的节点池。

gcloud

如需将具有自动扩缩功能的节点池添加到现有集群,请使用以下命令:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-autoscaling \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

替换以下内容:

  • POOL_NAME:所需节点池的名称。
  • CLUSTER_NAME:在其中创建节点池的集群的名称。
  • MIN_NODES:为每个可用区中指定节点池自动扩缩的节点数下限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数下限,请使用 --total-min-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • MAX_NODES:为每个可用区中指定节点池自动扩缩的节点数上限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数上限,请使用 --total-max-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • COMPUTE_REGION:新集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE

示例:添加启用了节点自动扩缩功能的节点池

以下命令创建具有节点自动扩缩功能的节点池,该节点池会将节点池扩容到最多 5 个节点以及缩容到最少 1 个节点:

gcloud container node-pools create my-node-pool \
    --cluster my-cluster \
    --enable-autoscaling \
    --min-nodes 1 --max-nodes 5 \
    --zone us-central1-c

控制台

如需将具有自动扩缩功能的节点池添加到现有集群,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    前往 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 点击 添加节点池

  4. 根据需要配置节点池。

  5. 大小下,选中启用自动扩缩功能复选框。

  6. 根据需要更改节点数下限节点数上限字段的值。

  7. 点击创建

为现有节点池启用自动扩缩功能

您可以使用 gcloud CLI 或 Google Cloud Console 为现有节点池启用自动扩缩功能。

gcloud

如需为现有节点池启用自动扩缩功能,请使用以下命令:

gcloud container clusters update CLUSTER_NAME \
    --enable-autoscaling \
    --node-pool=POOL_NAME \
    --min-nodes=MIN_NODES \
    --max-nodes=MAX_NODES \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:要更新的集群的名称。
  • POOL_NAME:所需节点池的名称。如果您只有一个节点池,请提供 default-pool 作为值。
  • MIN_NODES:为每个可用区中指定节点池自动扩缩的节点数下限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数下限,请使用 --total-min-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • MAX_NODES:为每个可用区中指定节点池自动扩缩的节点数上限。如需在 GKE 1.24 及更高版本中指定整个节点池的节点数上限,请使用 --total-max-nodes。标志 --total-min-nodes--total-max-nodes 与标志 --min-nodes--max-nodes 互斥。
  • COMPUTE_REGION:新集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE

控制台

要为现有节点池启用自动扩缩功能,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    前往 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 点击节点标签页。

  4. 节点池下,点击要修改的节点池的名称,然后点击 修改

  5. 大小下,选中启用自动扩缩功能复选框。

  6. 根据需要更改节点数下限节点数上限字段的值。

  7. 点击保存

验证是否已为现有节点池启用自动扩缩

您可以通过 Google Cloud CLI 或 Google Cloud 控制台来验证集群是否使用的是自动扩缩。

gcloud

描述集群中的节点池:

gcloud container node-pools describe NODE_POOL_NAME --cluster=CLUSTER_NAME |grep autoscaling -A 1

替换以下内容:

  • POOL_NAME:您选择的新节点池的名称。
  • CLUSTER_NAME:集群的名称。

如果启用了自动扩缩,则输出内容类似如下:

autoscaling:
  enabled: true

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine

  2. 在集群列表中,点击您要验证的集群的名称。

  3. 点击节点标签页。

  4. 节点池下,验证节点池是否为 Autoscalling 状态。

创建优先优化未使用的预留的节点池

您可以在创建节点池时使用 --location_policy=ANY 标志,以指示集群自动扩缩器优先利用未使用的预留

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location_policy=ANY

替换以下内容:

  • POOL_NAME:您选择的新节点池的名称。
  • CLUSTER_NAME:集群的名称。

为现有节点池停用自动扩缩功能

您可以使用 gcloud CLI 或 Google Cloud Console 为现有节点池停用自动扩缩功能。

gcloud

如需为特定节点池停用自动扩缩功能,请使用 --no-enable-autoscaling 标志:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-autoscaling \
    --node-pool=POOL_NAME \
    --region=COMPUTE_REGION

替换以下内容:

  • CLUSTER_NAME:要更新的集群的名称。
  • POOL_NAME:所需节点池的名称。
  • COMPUTE_REGION:新集群的 Compute Engine 区域。对于区域级集群,请使用 --zone=COMPUTE_ZONE

集群大小固定为集群的当前默认节点池大小,您可以手动更新

控制台

要为特定节点池停用自动扩缩功能,请执行以下操作:

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    前往 Google Kubernetes Engine

  2. 在集群列表中,点击您要修改的集群的名称。

  3. 点击节点标签页。

  4. 节点池下,点击要修改的节点池的名称,然后点击 修改

  5. 大小下,清除启用自动扩缩功能复选框。

  6. 点击保存

调整节点池的大小

对于启用了自动扩缩功能的集群,集群自动扩缩器会在大小下限 (--min-nodes) 和大小上限 (--max-nodes) 值或总大小下限 (--total-min-nodes) 和总大小上限 (--total-max-nodes) 值指定的范围内自动调整节点池的大小。这两组标志是互斥的。您无法通过更改这些值来手动调整节点池的大小。

如果您要手动调整启用了自动扩缩功能的集群中的节点池的大小,请执行以下操作:

  1. 停用节点池的自动扩缩功能
  2. 手动调整集群大小
  3. 重新启用自动扩缩功能并指定节点池的大小下限和上限

阻止 Pod 调度到选定节点上

您可以使用 startupstatus 污点来阻止 Pod 调度到选定节点上,具体取决于应用场景。

GKE 1.28 及更高版本中提供了此功能。

启动污点

如果有操作必须先完成,然后才能在节点上运行任何 Pod,请使用 startup 污点。例如,在节点上完成驱动程序安装之前,Pod 不应运行。

集群自动扩缩器会将具有 startup 污点的节点视为未就绪,但会在纵向扩容逻辑中考虑这些节点(假设它们很快就会准备就绪)。

启动污点定义为所有具有 startup-taint.cluster-autoscaler.kubernetes.io/ 前缀的污点

状态污点

如果 GKE 不应使用给定节点来运行 Pod,请使用 status 污点。

集群自动扩缩器会将具有 status 污点的节点视为已就绪,但在纵向扩容逻辑期间会忽略这些节点。即使污点节点已就绪,Pod 也不应运行。如果 Pod 需要更多资源,则 GKE 会纵向扩容集群并忽略污点节点。

状态污点定义为所有具有 status-taint.cluster-autoscaler.kubernetes.io/ 前缀的污点

忽略污点

忽略污点定义为所有具有 ignore-taint.cluster-autoscaler.kubernetes.io/ 前缀的污点

问题排查

检查您遇到的问题是否是由集群自动扩缩器的限制之一引起的。否则,请参阅集群自动扩缩器的以下问题排查信息:

集群未缩减

集群正确纵向扩容,然后尝试纵向缩容之后,利用率过低的节点将保持启用状态,并阻止集群纵向缩容。发生此错误是由以下某种原因造成的:

  • 限制可以防止自动扩缩器删除节点。如果节点包含满足以下任意条件的 Pod,则 GKE 可能会阻止删除该节点:

    • Pod 的亲和性或反亲和性规则阻止重新安排。
    • 在 GKE 1.21 版及更早版本中,Pod 具有本地存储空间。
    • Pod 不受控制器(如 Deployment、StatefulSet、Job 或 ReplicaSet)管理。

    如需解决此问题,请在 Pod 上设置集群自动扩缩器调度和逐出规则。如需了解详情,请参阅 Pod 调度和中断

  • 系统 Pod 正在在节点上运行。如需验证您的节点是否正在运行 kube-system pod,请执行以下步骤:

    1. 转到 Google Cloud 控制台中的日志浏览器页面。

      进入日志浏览器

    2. 点击查询构建器

    3. 使用以下查询查找所有网络政策日志记录:

        - resource.labels.location="CLUSTER_LOCATION"
        resource.labels.cluster_name="CLUSTER_NAME"
        logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fcluster-autoscaler-visibility"
        jsonPayload.noDecisionStatus.noScaleDown.nodes.node.mig.nodepool="NODE_POOL_NAME"
      

      替换以下内容:

      • CLUSTER_LOCATION:您的集群所在的区域。
      • CLUSTER_NAME:您的集群的名称。
      • PROJECT_ID:在其中创建集群的项目的 ID。
      • NODE_POOL_NAME:节点池的名称。

        如果有 kube-system Pod 正在节点池上运行,则输出内容包括:

        "no.scale.down.node.pod.kube.system.unmovable"
        

    如需解决此问题,您必须执行以下任一操作:

节点池大小不匹配

配置节点池大小时,会出现以下问题:

  • 现有节点池大小小于您为集群指定的最小节点数。

以下列表介绍了这种行为常见的可能原因:

  • 如果现有节点数较大,则说明您指定了新的最小节点数。
  • 手动缩减节点池或底层代管式实例组。此手动操作指定的节点数小于最小节点数。
  • 您在节点池中部署了被抢占的 Spot 虚拟机。
  • Pod 具有本地存储空间,GKE 控制平面版本低于 1.22。在具有控制平面版本 1.22 或更高版本的 GKE 集群中,具有本地存储空间的 Pod 不再阻止缩容。
  • 该 Pod 具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" 注释。

    如需了解缩减事件期间的更多问题排查步骤,请参阅集群未缩减

  • 进行缩减时,集群自动扩缩器会遵循 Pod 终止宽限期,最长为 10 分钟。10 分钟后,Pod 会被强制终止。

  • 您可能会发现节点池大小小于您为集群指定的节点数下限。出现这种行为的原因是自动扩缩器仅在需要确定缩减时才使用节点数下限参数。下面列出了此行为的可能常见原因。

如需解决此问题,请手动将节点池大小增加到最小节点数。如需了解详情,请参阅如何手动调整集群大小

如需详细了解集群自动扩缩器以及如何防止中断,请参阅集群自动扩缩器常见问题解答中的以下问题:

后续步骤