我们正在使用Redis Queues,并通过Prometheus Adapter显示一些指标,这样我们就可以使用HPA根据“Queued”状态的记录数量来扩展我们的部署。
我看到的问题是,无论我如何尝试过滤HPA指标,它都是在考虑整数,而不是我提供的特定matchLabels.metricSelector
。
HPA正常工作,但不考虑扫描器编号,而是考虑从外部API返回的所有内容。
请参阅下文。
“CloneRepo”和“Semgrep”的总和为370。如果我仅对“semgrep”扫描程序应用HPA,则由于总和为370,它将扩展到13个POD,而不是考虑预期值0。
它似乎没有考虑清单中的matchLabels.metricSelector
(或者它的定义不正确)。
有谁知道这里出了什么问题吗
K8s:1.27(在AWS EKS上运行)命名空间:扫描仪
Prometheus的RQ_JOBS指标的一个简单示例如下所示:
clonerepo - 370条记录处于“已排队”状态semgrep - 0条记录处于“已排队”状态
*rq_jobs
的Prometheus测量结果。请注意“scm_instance”和“queue”标签。
rq_jobs{container="rq-exporter-bitbucket", endpoint="http-metrics", instance="100.64.13.45:9726", job="rq-exporter-bitbucket", namespace="scanners", pod="rq-exporter-bitbucket-5879d9bd4b-zcnns", queue="clonerepo", scm_instance="rq-exporter-bitbucket", service="rq-exporter-bitbucket", status="queued"}
370
rq_jobs{container="rq-exporter-bitbucket", endpoint="http-metrics", instance="100.64.13.45:9726", job="rq-exporter-bitbucket", namespace="scanners", pod="rq-exporter-bitbucket-5879d9bd4b-zcnns", queue="semgrep", scm_instance="rq-exporter-bitbucket", service="rq-exporter-bitbucket", status="queued"}
0
字符串
HPA清单
- 请注意matchLabels部分,我们希望在这里过滤由Prometheus Adapter、Queue和SCM示例公开的Metric Name。
- 如果我将
autoscaling/v1
与targetAverageValue
一起使用,它就可以正常工作。当我切换到autoscaling/v2
时,HPA会转到CPU利用率,这与我在互联网上看到的有点不同。无论如何,这不是问题所在,对于v1,它是基于Numbers工作的,但不是预期的过滤。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: hpa-semgrep
namespace: scanners
annotations:
autoscaling.alpha.kubernetes.io/metrics: |
[
{
"type": "External",
"external": {
"metricName": "hpa_rq_jobs",
"metricSelector": {
"matchLabels": {
"queue": "semgrep",
"scm_instance": "rq-exporter-bitbucket"
}
},
"targetAverageValue": "30"
}
}
]
spec:
maxReplicas: 20
minReplicas: 2
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deploy-scanner-semgrep
型
以下是Prometheus适配器的定义:
external:
- seriesQuery: '{__name__=~"rq_jobs", namespace="scanners", scm_instance!="", status="queued"}'
resources:
overrides:
namespace:
resource: namespace
name:
matches: ^(.*)
as: "hpa_rq_jobs"
metricsQuery: sum(rq_jobs{status='queued', scm_instance!=""}) by (scm_instance, queue)
型
我们可以查询可用的指标,它们显然“看起来不错”。
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/scanners/hpa_rq_jobs| jq .
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "hpa_rq_jobs",
"metricLabels": {
"queue": "scmclone_repo",
"scm_instance": "rq-exporter-bitbucket"
},
"timestamp": "2023-11-26T11:45:26Z",
"value": "370"
},
{
"metricName": "hpa_rq_jobs",
"metricLabels": {
"queue": "semgrep",
"scm_instance": "rq-exporter-bitbucket"
},
"timestamp": "2023-11-26T11:45:26Z",
"value": "0"
}
]
}
型
从这一点上看,我们希望semgrep的HPA保持2个节点,但实际上,它变成了13个节点,这是公开的度量的记录总数。
"metricSelector": {
"matchLabels": {
"queue": "semgrep",
"scm_instance": "esi-bitbucket"
}
},
型
感谢你的帮助。
根据许多文档,自定义指标可以在HPA中公开和使用。autoscaling/v1
的重点是CPU和内存,而autoscaling/v2
允许自定义和外部指标以及其他规格。
从建议答案中的链接来看,这一个符合描述。HPA labelSelector not filtering external metrics。
1条答案
按热度按时间lbsnaicq1#
解决方案是在Prometheus适配器自定义/外部指标规则。
点击这里查看回复:https://github.com/kubernetes-sigs/prometheus-adapter/issues/255#issuecomment-588471197
简而言之,即使在
metricsQuery
中提供过滤器,它也需要<<.LabelMatchers>>
。字符串