如何让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
相关产品推荐
相关产品推荐

