You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让EKS HPA优先缩容新节点上的Pod?

解决HPA缩容优先保留原节点Pod的方案

针对你遇到的HPA缩容时误删原节点Pod、导致冗余节点留存的问题,以下是几个可行的解决思路:

1. 配置HPA缩容策略优先删除最新创建的Pod

Kubernetes HPA默认的缩容策略是优先删除最新创建的Pod(Newest),如果你的场景中扩容生成的Pod晚于初始Pod创建,直接配置该策略即可让缩容时优先清理新节点上的Pod:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: your-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: your-app-deployment
  minReplicas: 4
  maxReplicas: 8
  behavior:
    scaleDown:
      selectPolicy: Newest  # 明确指定优先删除最新创建的Pod
      stabilizationWindowSeconds: 300  # 可选,设置缩容稳定窗口,避免频繁扩缩容

如果你的HPA之前被修改为Oldest或Random策略,改回Newest就能解决问题——因为扩容时新节点上的Pod都是后创建的,缩容会先删这些Pod,原节点的初始Pod得以保留。

2. 给节点打标签+配置Pod亲和性,固定初始Pod到原节点

通过节点标签和Pod亲和性规则,让初始Pod只能调度到原4个节点,扩容Pod只能到新节点,从调度层面隔离两类Pod:

  • 给原4个节点打专属标签:
    kubectl label nodes <node-name-1> <node-name-2> <node-name-3> <node-name-4> node-role=original
    
  • 给集群自动扩容生成的新节点打标签(可通过集群扩容工具的模板配置自动添加,比如EKS节点组、AKS虚拟机规模集):
    kubectl label nodes <new-node-name> node-role=scaling
    
  • 修改Deployment的亲和性配置,让Pod优先调度到原节点,资源不足时才调度到新节点:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: your-app-deployment
    spec:
      replicas: 4
      template:
        spec:
          affinity:
            nodeAffinity:
              # 优先调度到原节点
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                preference:
                  matchExpressions:
                  - key: node-role
                    operator: In
                    values:
                    - original
              # 允许调度到原节点或新节点
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: node-role
                    operator: In
                    values:
                    - original
                    - scaling
    

配合HPA的Newest缩容策略,就能确保缩容时只清理新节点上的Pod,原节点的Pod位置完全固定。

3. 配置Cluster Autoscaler优先删除新节点

如果你的集群开启了Cluster Autoscaler,可以给新节点设置更低的缩容优先级标签,让Cluster Autoscaler在节点空闲时优先回收新节点:

  • 给新节点添加缩容优先级标签:
    kubectl label nodes <new-node-name> cluster-autoscaler.kubernetes.io/scale-down-priority=0
    
  • 给原节点设置更高的缩容优先级:
    kubectl label nodes <original-node-name> cluster-autoscaler.kubernetes.io/scale-down-priority=10
    

(标签数值越小,缩容优先级越高,默认值为10)
这样即使缩容时偶有原节点Pod被删除,Cluster Autoscaler也会优先回收新节点,避免长期留存冗余节点产生额外成本。


内容的提问来源于stack exchange,提问作者KimiNoWae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:27:34