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

