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

如何配置Kubernetes HPA基于Pod的最大可用内存进行扩缩容?

基于单个Pod内存使用率最小值的Kubernetes HPA自定义扩缩容策略

核心需求匹配

你需要的是仅当所有Pod的内存可用率都低于目标阈值时才触发扩容(即只要存在至少一个Pod的内存可用率≥目标值,就维持当前副本数),对应到指标逻辑就是:以所有Pod内存使用率的最小值作为HPA的判断依据——当该最小值超过目标使用率(即可用率低于目标)时,触发扩容;反之则不扩容。

实现方案

Kubernetes原生HPA默认使用指标平均值,因此需要借助Prometheus + Prometheus Adapter来定义自定义指标,实现基于Pod使用率最小值的扩缩容逻辑。

1. 自定义指标配置(Prometheus Adapter)

首先在Prometheus Adapter的ConfigMap中添加两条规则:一条计算单个Pod的内存使用率,另一条取所有Pod使用率的最小值。

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-adapter
  namespace: monitoring # 根据你的Prometheus Adapter部署namespace调整
data:
  config.yaml: |-
    rules:
    # 规则1:计算单个Pod的内存使用率(已用/限制*100)
    - seriesQuery: 'container_memory_working_set_bytes{namespace!="", pod!=""}'
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: 'container_memory_working_set_bytes'
        as: 'pod_memory_usage_percent'
      metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) / sum(kube_pod_container_resource_limits_memory_bytes{<<.LabelMatchers>>}) by (<<.GroupBy>>) * 100'
    # 规则2:取当前namespace下所有Pod内存使用率的最小值
    - seriesQuery: 'pod_memory_usage_percent{namespace!="", pod!=""}'
      resources:
        overrides:
          namespace: {resource: "namespace"}
      name:
        matches: 'pod_memory_usage_percent'
        as: 'pod_min_memory_usage_percent'
      metricsQuery: 'min by (namespace) (<<.Series>>{<<.LabelMatchers>>})'

更新ConfigMap后,重启Prometheus Adapter Pod使配置生效。

2. HPA配置

创建HPA资源,使用上述自定义的pod_min_memory_usage_percent指标,目标值设为你需要的内存使用率阈值(对应可用率=100%-阈值)。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-memory-hpa
  namespace: your-namespace # 替换为你的业务namespace
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: your-deployment # 替换为你的目标Deployment名称
  minReplicas: 1
  maxReplicas: 10 # 根据业务需求调整最大副本数
  metrics:
  - type: Pods
    pods:
      metric:
        name: pod_min_memory_usage_percent
      target:
        type: AverageValue
        averageValue: 50 # 目标使用率50%,对应可用内存50%
  # 可选:自定义扩缩容行为
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 30
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60

逻辑验证

  • 当集群中有7个Pod,6个使用率90%(可用10%)、1个使用率40%(可用60%)时,pod_min_memory_usage_percent的值为40,低于目标50,HPA不会触发扩容。
  • 当最后一个Pod的使用率升至51%(可用49%)时,pod_min_memory_usage_percent的值为51,超过目标50,HPA触发扩容。

注意事项

  • 必须为Pod配置内存limits,否则使用率计算会因分母为0失败。
  • 确保Prometheus已正确采集container_memory_working_set_bytes(来自cAdvisor)和kube_pod_container_resource_limits_memory_bytes(来自kube-state-metrics)指标。
  • 缩容逻辑可根据需求调整:比如当pod_min_memory_usage_percent远低于目标值时触发缩容,需修改HPA的目标值或扩缩容策略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:45:30