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

Kubernetes HPA内存指标数值异常,求排查原因

问题描述

尝试基于平均内存利用率创建Kubernetes HPA,但HPA返回了异常的内存数值。

HPA配置

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: {{ include "kubernetes.fullname" $ }}-{{ . }}
  namespace: {{ $.Values.namespace }}
  labels:
    {{- include "kubernetes.labels" $ | nindent 4 }}
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ include "kubernetes.fullname" $ }}-{{ . }}
  minReplicas: {{ $.Values.autoscaling.minReplicas }}
  maxReplicas: {{ $.Values.autoscaling.maxReplicas }}
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 30Mi
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

相关命令输出

kubectl top pod 结果

NAMECPU(cores)MEMORY(bytes)
hpa-kubernetes-frontend-7969bdbdb5-2zr5p0m15Mi
hpa-kubernetes-frontend-7969bdbdb5-fb4sf0m16Mi
hpa-kubernetes-frontend-7969bdbdb5-fg2r40m15Mi

kubectl get hpa -w 输出

NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGE
hpa-kubernetes-frontendDeployment/hpa-kubernetes-frontend185575651555m/30Mi13318h

疑问:为何内存数值显示为185575651555m?


问题原因及解决办法

这个异常数值是单位解析错误+指标配置不匹配导致的:

  1. 单位解析逻辑问题:Kubernetes里内存的最小单位是字节,后缀m被错误解析成了毫字节(1字节=1000毫字节),而非常用的兆字节(Mi)。185575651555m换算后约为177Mi,是所有Pod内存使用量的总和,但和单Pod实际用量不符的核心原因,在于指标配置的逻辑错误。

  2. 指标类型与资源请求缺失:你的HPA使用AverageValue(目标平均内存用量)作为指标,但对应的Deployment未配置resources.requests.memory,导致HPA无法正确计算单Pod的平均内存值,反而把总用量错误转换单位后展示。

推荐解决方案:改用内存利用率指标

这是Kubernetes HPA的标准用法,需两步操作:

第一步:给Deployment配置内存请求

在Deployment的Pod模板中添加资源请求,HPA会基于该值计算利用率:

# Deployment的spec.template.spec.containers字段下增加
resources:
  requests:
    memory: "20Mi" # 根据业务实际设置合理值
    cpu: "100m"

第二步:修改HPA的内存指标配置

将内存指标从AverageValue改为Utilization,设置目标利用率:

metrics:
- type: Resource
  resource:
    name: memory
    target:
      type: Utilization
      averageUtilization: 75 # 示例:设置为请求内存的75%
- type: Resource
  resource:
    name: cpu
    target:
      type: Utilization
      averageUtilization: 80

备选方案(不推荐):修复AverageValue的单位问题

若一定要用绝对内存值触发扩容,可尝试:

  • 更新metrics-server到最新稳定版,部分旧版本存在单位解析bug
  • 将HPA中的averageValue改为字节单位,比如31457280(等价于30Mi)

验证

修改配置后执行kubectl apply -f <配置文件路径>,再运行kubectl get hpa,即可看到正常的内存数值展示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:50:31