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 结果
| NAME | CPU(cores) | MEMORY(bytes) |
|---|---|---|
| hpa-kubernetes-frontend-7969bdbdb5-2zr5p | 0m | 15Mi |
| hpa-kubernetes-frontend-7969bdbdb5-fb4sf | 0m | 16Mi |
| hpa-kubernetes-frontend-7969bdbdb5-fg2r4 | 0m | 15Mi |
kubectl get hpa -w 输出
| NAME | REFERENCE | TARGETS | MINPODS | MAXPODS | REPLICAS | AGE |
|---|---|---|---|---|---|---|
| hpa-kubernetes-frontend | Deployment/hpa-kubernetes-frontend | 185575651555m/30Mi | 1 | 3 | 3 | 18h |
疑问:为何内存数值显示为185575651555m?
问题原因及解决办法
这个异常数值是单位解析错误+指标配置不匹配导致的:
单位解析逻辑问题:Kubernetes里内存的最小单位是字节,后缀
m被错误解析成了毫字节(1字节=1000毫字节),而非常用的兆字节(Mi)。185575651555m换算后约为177Mi,是所有Pod内存使用量的总和,但和单Pod实际用量不符的核心原因,在于指标配置的逻辑错误。指标类型与资源请求缺失:你的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
相关产品推荐
相关产品推荐

