摘要:Kubernetes 的 Horizontal pod Autoscaler(HPA)不仅支持基于 CPU 和内存的自动扩缩容,还支持基于自定义指标的自动扩缩容。自定义指标可以是应用的业务指标,例如每秒请求数(QPS)、消息队列长度、数据库连接数等。通过自定义
Kubernetes 的 Horizontal pod Autoscaler(HPA)不仅支持基于 CPU 和内存的自动扩缩容,还支持基于自定义指标的自动扩缩容。自定义指标可以是应用的业务指标,例如每秒请求数(QPS)、消息队列长度、数据库连接数等。通过自定义指标,HPA 可以更灵活地根据业务需求调整 Pod 的副本数。
本文将详细介绍如何在 Kubernetes 中配置和使用自定义指标的 HPA,并结合 Prometheus 和 Prometheus Adapter 实现自定义指标的自动扩缩容。
HPA 的自定义指标功能依赖于 Kubernetes 的 Custom Metrics API。Custom Metrics API 允许用户将自定义指标暴露给 Kubernetes,HPA 可以通过这些指标动态调整 Pod 的副本数。
Prometheus:用于收集和存储自定义指标。Prometheus Adapter:将 Prometheus 的指标暴露给 Kubernetes 的 Custom Metrics API。HPA:根据自定义指标调整 Pod 的副本数。
Prometheus 收集应用的业务指标(如 QPS)。Prometheus Adapter 从 Prometheus 中读取指标,并通过 Custom Metrics API 暴露给 Kubernetes。HPA 从 Custom Metrics API 获取指标值,并根据目标值调整 Pod 的副本数。Prometheus Adapter 是连接 Prometheus 和 Kubernetes Custom Metrics API 的桥梁。
使用以下命令安装 Prometheus Adapter:
kubectl apply -f https://github.com/kubernetes-sigs/prometheus-adapter/releases/latest/download/components.yaml配置资源请求
HPA 需要 Pod 配置资源请求(requests),例如 CPU 和内存。如果未配置资源请求,HPA 将无法正常工作。
首先,我们部署一个示例应用,并确保 Prometheus 能够收集该应用的指标。以下是一个简单的 nginx Deployment 示例:
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentspec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2resources:requests:cpu: "200m"memory: "128Mi"使用以下命令创建 Deployment:
kubectl apply -f nginx-deployment.yamlPrometheus Adapter 需要配置规则,以将 Prometheus 的指标暴露给 Kubernetes。以下是一个示例配置:
rules:- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'resources:overrides:namespace: {resource: "namespace"}pod: {resource: "pod"}name:matches: "^(.*)_total"as: "${1}_per_second"metricsQuery: 'sum(rate(>{>}[2m])) by (>)'seriesQuery:查询 Prometheus 中的指标。resources:将 Prometheus 的标签映射到 Kubernetes 资源。name:将 Prometheus 的指标名称转换为 Kubernetes 可识别的名称。metricsQuery:定义如何计算指标值。kubectl apply -f prometheus-adapter-config.yaml以下是一个基于自定义指标(每秒请求数)的 HPA 示例:
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata:name: custom-metric-hpaspec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Podspods:metric:name: http_requests_per_secondtarget:type: AverageValueaverageValue: 100metric.name:自定义指标的名称(与 Prometheus Adapter 配置中的名称一致)。target.type:指标的目标类型,可以是 AverageValue 或 Value。target.averageValue:目标值,表示每个 Pod 的平均指标值。使用以下命令创建 HPA:
kubectl apply -f custom-metric-hpa.yaml创建 HPA 后,可以通过以下命令查看 HPA 的状态:
kubectl get hpa输出示例:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEcustom-metric-hpa Deployment/nginx-deployment 100/100 2 10 2 1mTARGETS:当前指标值与目标值的比率。REPLICAS:当前的 Pod 副本数。使用 kubectl run 创建一个临时的 Pod 来模拟负载:
kubectl run -i --tty load-generator --image=busybox --restart=Never -- /bin/sh -c "while true; do wget -q -O- http://nginx-deployment; done"通过以下命令观察 HPA 的变化:
kubectl get hpa -w当每秒请求数超过目标值(100)时,HPA 会自动增加 Pod 的副本数。
停止负载生成 Pod:
kubectl delete pod load-generator当负载降低后,HPA 会自动减少 Pod 的副本数。
选择与业务需求密切相关的指标,例如 QPS、队列长度等。避免选择过于频繁变化的指标,以免导致频繁扩缩容。通过自定义指标的 HPA,Kubernetes 可以根据业务需求动态调整 Pod 的副本数,从而实现更灵活的自动扩缩容。本文介绍了如何配置基于自定义指标的 HPA,并结合 Prometheus 和 Prometheus Adapter 实现自定义指标的自动扩缩容。
来源:小王论科技