15分钟上手!kube-prometheus驱动的HPA自动伸缩实战

15分钟上手!kube-prometheus驱动的HPA自动伸缩实战

【免费下载链接】kube-prometheus prometheus-operator/kube-prometheus: kube-prometheus项目提供了在Kubernetes集群中部署Prometheus监控解决方案的一体化方法,包括Prometheus Server、Alertmanager、Grafana以及其他相关的监控组件,旨在简化在K8s环境下的监控配置与管理。 【免费下载链接】kube-prometheus 项目地址: https://gitcode.com/gh_mirrors/ku/kube-prometheus

你是否还在手动调整Kubernetes集群资源?面对流量波动,如何让应用自动扩缩容并精准控制成本?本文将带你通过kube-prometheus实现基于自定义指标的Pod自动伸缩,从环境配置到HPA规则部署,全程实操零理论。

核心组件与工作原理

kube-prometheus提供的监控栈与Kubernetes HPA(Horizontal Pod Autoscaler,水平 Pod 自动伸缩器)通过以下流程协同工作:

  1. 指标采集node-exporter收集节点指标,kube-state-metrics提供K8s对象指标
  2. 指标转换prometheus-adapter将Prometheus指标转换为Kubernetes API可识别的自定义指标
  3. 伸缩决策:HPA控制器定期查询自定义指标API,触发Pod扩缩容

核心配置文件:

环境准备与配置

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 .

常见问题排查

  1. 指标未找到:检查prometheusAdapter-configMap.yaml中的rules配置
  2. 权限问题:验证prometheusAdapter-clusterRole.yaml是否包含必要的RBAC权限
  3. HPA不触发:查看HPA事件日志:
    kubectl describe hpa example-app
    

故障排除参考文档:troubleshooting.md

最佳实践与优化建议

  1. 指标选择:优先使用rate()函数处理计数器指标,避免直接使用累计值
  2. 伸缩阈值:CPU使用率建议设置60-80%,内存建议80%,自定义指标预留30%缓冲空间
  3. 稳定窗口:通过stabilizationWindowSeconds减少抖动:
    behavior:
      scaleDown:
        stabilizationWindowSeconds: 300
    
  4. 资源限制:为所有工作负载设置resources.limits,避免单个Pod占用过多资源

完整示例参考:examples/continuous-delivery/argocd/

总结与扩展

通过kube-prometheus实现HPA自动伸缩的核心价值在于:

  • 统一监控与伸缩体系,避免多系统集成复杂性
  • 支持任意Prometheus指标,满足复杂业务场景
  • 基于JSONNET的配置即代码,便于版本控制与审计

进阶方向:

官方文档:custom-metrics.libsonnet | HPA官方文档


行动步骤

  1. 克隆仓库:git clone https://gitcode.com/gh_mirrors/ku/kube-prometheus
  2. 查看示例:examples/
  3. 提交反馈:CONTRIBUTING.md

【免费下载链接】kube-prometheus prometheus-operator/kube-prometheus: kube-prometheus项目提供了在Kubernetes集群中部署Prometheus监控解决方案的一体化方法,包括Prometheus Server、Alertmanager、Grafana以及其他相关的监控组件,旨在简化在K8s环境下的监控配置与管理。 【免费下载链接】kube-prometheus 项目地址: https://gitcode.com/gh_mirrors/ku/kube-prometheus

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值