Kubernetes集群自动扩缩容实战:HPA与VPA协同配置指南

Kubernetes自动扩缩容的技术选型

Kubernetes提供了两种自动扩缩容机制:水平Pod自动扩缩容(HPA)和垂直Pod自动扩缩容(VPA)。HPA通过增减Pod副本数应对负载变化,VPA通过调整Pod的资源请求(requests)和限制(limits)优化资源分配。两者解决不同层面的问题,在实际生产环境中往往需要协同使用。

选型原则很直接:当应用支持水平扩展(无状态服务、可并行处理),优先使用HPA;当应用受限于单实例资源瓶颈(数据库、单线程处理),使用VPA优化资源分配。对于有状态服务或无法水平扩展的应用,VPA是唯一的自动扩缩容手段。

HPA配置:基于CPU和自定义指标的扩缩容

基础HPA配置基于CPU利用率,适用于大多数Web服务:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-server-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 3
maxReplicas: 50
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000

自定义指标HPA需要部署Prometheus Adapter,将Prometheus采集的业务指标转换为Kubernetes自定义指标API。配置Prometheus Adapter的规则文件,将http_requests_total指标转换为每秒请求数,供HPA直接引用。

VPA配置:资源推荐与自动调整

VPA有三种运行模式,生产环境推荐分阶段启用:

1. Off模式:仅收集指标并生成推荐,不执行任何调整(初始部署阶段使用)

2. Initial模式:仅在Pod创建时应用推荐值,运行中的Pod不受影响(过渡阶段使用)

3. Auto模式:自动驱逐并重建Pod以应用新的资源值(稳定运行阶段使用)

VPA配置示例:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: api-server-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: api-server
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 4
memory: 8Gi
controlledResources: ["cpu", "memory"]

HPA与VPA协同工作的冲突解决

HPA和VPA同时作用于同一Deployment时,可能产生冲突:VPA调整CPU请求后,HPA基于CPU利用率的计算逻辑会受影响。解决方案有两种:

方案一:HPA使用自定义指标,VPA管理CPU和内存资源。这是官方推荐的方式,HPA基于QPS、延迟等业务指标扩缩容,VPA负责优化每个Pod的资源分配,两者职责明确不冲突。

方案二:HPA使用CPU指标但排除VPA管理的容器。通过在HPA的metrics配置中指定containerResource类型,只监控特定容器的CPU,避免VPA调整导致的指标漂移。

metrics:
- type: ContainerResource
containerResource:
name: cpu
container: sidecar
target:
type: Utilization
averageUtilization: 80

集群级别扩缩容:Cluster Autoscaler集成

当HPA扩容Pod时集群资源不足,Pod会进入Pending状态。此时需要Cluster Autoscaler自动添加节点。配置Cluster Autoscaler需要注意:

– 设置合理的节点组(Node Group)上下限,避免无限扩容

– 配置scale-down-unneeded-time参数,控制节点空闲多久后回收(默认10分钟,建议设为15-20分钟避免频繁伸缩)

– 为关键Pod添加cluster-autoscaler.kubernetes.io/safe-to-evict: “false”注解,防止CAS缩容时驱逐重要工作负载

– 在多云环境下,为不同实例规格配置多个节点组,让CAS根据Pod的资源需求选择最经济的节点类型

扩缩容行为调优与稳定性保障

扩缩容行为(behavior)配置决定了HPA的响应速度和平稳性:

behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
- type: Pods
value: 2
periodSeconds: 60
selectPolicy: Min
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 30
- type: Pods
value: 4
periodSeconds: 30
selectPolicy: Max

缩容策略选择Min意味着每次缩容取两个策略中影响较小的那个,避免大规模缩容导致负载抖动。扩容策略选择Max则相反,确保扩容足够迅速。缩容稳定窗口设为300秒,意味着负载下降后至少观察5分钟才会开始缩容,避免因短暂波动而频繁伸缩。

在监控方面,需要关注HPA的CurrentMetrics是否及时响应负载变化,VPA的推荐值是否合理,以及Cluster Autoscaler的节点分配是否满足预期。通过Grafana搭建扩缩容监控面板,将HPA副本数、VPA推荐值、节点数量和核心业务指标放在同一视图中,可以快速判断扩缩容是否正常工作。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-ji-qun-zi-dong-kuo-suo-rong-shi-zhan-hpa-yu-vpa/

(0)
小编小编
上一篇 12小时前
下一篇 12小时前

相关推荐