15分钟上手!kube-prometheus驱动的HPA自动伸缩实战
你是否还在手动调整Kubernetes集群资源?面对流量波动,如何让应用自动扩缩容并精准控制成本?本文将带你通过kube-prometheus实现基于自定义指标的Pod自动伸缩,从环境配置到HPA规则部署,全程实操零理论。
核心组件与工作原理
kube-prometheus提供的监控栈与Kubernetes HPA(Horizontal Pod Autoscaler,水平 Pod 自动伸缩器)通过以下流程协同工作:
- 指标采集:node-exporter收集节点指标,kube-state-metrics提供K8s对象指标
- 指标转换:prometheus-adapter将Prometheus指标转换为Kubernetes API可识别的自定义指标
- 伸缩决策:HPA控制器定期查询自定义指标API,触发Pod扩缩容
核心配置文件:
- 自定义指标规则:custom-metrics.libsonnet
- Prometheus Adapter部署:prometheusAdapter-deployment.yaml
环境准备与配置
1. 启用Custom Metrics插件
在example.jsonnet中添加custom-metrics组件:
local kp = (import 'kube-prometheus/main.libsonnet') +
(import 'kube-prometheus/addons/custom-metrics.libsonnet') + {
// 自定义配置...
};
{ ['setup/0namespace-' + name + '.yaml']: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
{ ['manifests/' + name + '.yaml']: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) }
2. 生成并应用配置
执行以下命令编译生成Kubernetes资源文件并部署:
jsonnet -J vendor example.jsonnet | gojsontoyaml > manifests/custom-metrics.yaml
kubectl apply -f manifests/setup/
kubectl apply -f manifests/
验证prometheus-adapter状态:
kubectl get pods -n monitoring | grep prometheus-adapter
自定义指标配置详解
custom-metrics.libsonnet定义了6类指标转换规则,核心规则解析:
容器级指标规则
{
seriesQuery: '{__name__=~"^container_.*",container!="POD",namespace!="",pod!=""}',
resources: {
overrides: {
namespace: { resource: 'namespace' },
pod: { resource: 'pod' },
},
},
name: { matches: '^container_(.*)$', as: '' },
metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>,container!="POD"}) by (<<.GroupBy>>)',
}
此规则将容器指标(如container_cpu_usage_seconds_total)转换为Pod关联的自定义指标,支持按Pod粒度聚合。
自定义业务指标
如需暴露应用吞吐量等业务指标,需添加ServiceMonitor监控应用Pod:
# 示例:[examples/example-app/servicemonitor-frontend.yaml](https://link.gitcode.com/i/81a00b17829e72207c28445a150ea6c8)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: frontend
spec:
selector:
matchLabels:
app: frontend
endpoints:
- port: web
path: /metrics
HPA规则实战
基于CPU使用率的基础伸缩
创建HPA资源文件hpa-basic.yaml:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: example-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
基于自定义指标的高级伸缩
使用Prometheus Adapter提供的请求延迟指标配置HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: example-app
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: http_request_duration_seconds_avg
target:
type: AverageValue
averageValue: 500m # 500毫秒
监控与故障排除
验证自定义指标
通过API验证指标是否可用:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/namespaces/default/pods/*/http_request_duration_seconds_avg" | jq .
常见问题排查
- 指标未找到:检查prometheusAdapter-configMap.yaml中的rules配置
- 权限问题:验证prometheusAdapter-clusterRole.yaml是否包含必要的RBAC权限
- HPA不触发:查看HPA事件日志:
kubectl describe hpa example-app
故障排除参考文档:troubleshooting.md
最佳实践与优化建议
- 指标选择:优先使用
rate()函数处理计数器指标,避免直接使用累计值 - 伸缩阈值:CPU使用率建议设置60-80%,内存建议80%,自定义指标预留30%缓冲空间
- 稳定窗口:通过
stabilizationWindowSeconds减少抖动:behavior: scaleDown: stabilizationWindowSeconds: 300 - 资源限制:为所有工作负载设置resources.limits,避免单个Pod占用过多资源
完整示例参考:examples/continuous-delivery/argocd/
总结与扩展
通过kube-prometheus实现HPA自动伸缩的核心价值在于:
- 统一监控与伸缩体系,避免多系统集成复杂性
- 支持任意Prometheus指标,满足复杂业务场景
- 基于JSONNET的配置即代码,便于版本控制与审计
进阶方向:
- 结合external-metrics.libsonnet支持外部指标
- 使用Pyrra优化SLO驱动的自动伸缩
- 集成KEDA实现事件驱动的弹性伸缩
官方文档:custom-metrics.libsonnet | HPA官方文档
行动步骤:
- 克隆仓库:
git clone https://gitcode.com/gh_mirrors/ku/kube-prometheus - 查看示例:examples/
- 提交反馈:CONTRIBUTING.md
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



