kubernetes HorizontalPodAutoscaler清单未过滤metricall.matchLabels

ttisahbt  于 2024-01-06  发布在  Kubernetes
关注(0)|答案(1)|浏览(152)

我们正在使用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”标签。

  1. 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"}
  2. 370
  3. 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"}
  4. 0

字符串

HPA清单

  • 请注意matchLabels部分,我们希望在这里过滤由Prometheus Adapter、Queue和SCM示例公开的Metric Name。
  • 如果我将autoscaling/v1targetAverageValue一起使用,它就可以正常工作。当我切换到autoscaling/v2时,HPA会转到CPU利用率,这与我在互联网上看到的有点不同。无论如何,这不是问题所在,对于v1,它是基于Numbers工作的,但不是预期的过滤。
  1. apiVersion: autoscaling/v1
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4. name: hpa-semgrep
  5. namespace: scanners
  6. annotations:
  7. autoscaling.alpha.kubernetes.io/metrics: |
  8. [
  9. {
  10. "type": "External",
  11. "external": {
  12. "metricName": "hpa_rq_jobs",
  13. "metricSelector": {
  14. "matchLabels": {
  15. "queue": "semgrep",
  16. "scm_instance": "rq-exporter-bitbucket"
  17. }
  18. },
  19. "targetAverageValue": "30"
  20. }
  21. }
  22. ]
  23. spec:
  24. maxReplicas: 20
  25. minReplicas: 2
  26. scaleTargetRef:
  27. apiVersion: apps/v1
  28. kind: Deployment
  29. name: deploy-scanner-semgrep


以下是Prometheus适配器的定义:

  1. external:
  2. - seriesQuery: '{__name__=~"rq_jobs", namespace="scanners", scm_instance!="", status="queued"}'
  3. resources:
  4. overrides:
  5. namespace:
  6. resource: namespace
  7. name:
  8. matches: ^(.*)
  9. as: "hpa_rq_jobs"
  10. metricsQuery: sum(rq_jobs{status='queued', scm_instance!=""}) by (scm_instance, queue)


我们可以查询可用的指标,它们显然“看起来不错”。

  1. kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/scanners/hpa_rq_jobs| jq .
  2. {
  3. "kind": "ExternalMetricValueList",
  4. "apiVersion": "external.metrics.k8s.io/v1beta1",
  5. "metadata": {},
  6. "items": [
  7. {
  8. "metricName": "hpa_rq_jobs",
  9. "metricLabels": {
  10. "queue": "scmclone_repo",
  11. "scm_instance": "rq-exporter-bitbucket"
  12. },
  13. "timestamp": "2023-11-26T11:45:26Z",
  14. "value": "370"
  15. },
  16. {
  17. "metricName": "hpa_rq_jobs",
  18. "metricLabels": {
  19. "queue": "semgrep",
  20. "scm_instance": "rq-exporter-bitbucket"
  21. },
  22. "timestamp": "2023-11-26T11:45:26Z",
  23. "value": "0"
  24. }
  25. ]
  26. }


从这一点上看,我们希望semgrep的HPA保持2个节点,但实际上,它变成了13个节点,这是公开的度量的记录总数。

  1. "metricSelector": {
  2. "matchLabels": {
  3. "queue": "semgrep",
  4. "scm_instance": "esi-bitbucket"
  5. }
  6. },


感谢你的帮助。
根据许多文档,自定义指标可以在HPA中公开和使用。autoscaling/v1的重点是CPU和内存,而autoscaling/v2允许自定义和外部指标以及其他规格。
从建议答案中的链接来看,这一个符合描述。HPA labelSelector not filtering external metrics

lbsnaicq

lbsnaicq1#

解决方案是在Prometheus适配器自定义/外部指标规则。
点击这里查看回复:https://github.com/kubernetes-sigs/prometheus-adapter/issues/255#issuecomment-588471197
简而言之,即使在metricsQuery中提供过滤器,它也需要<<.LabelMatchers>>

  1. - seriesQuery: '{__name__=~"rq_jobs", namespace="scanners", scm_instance!="", status="queued"}'
  2. resources:
  3. overrides:
  4. namespace:
  5. resource: namespace
  6. name:
  7. matches: ^(.*)
  8. as: "hpa_rq_jobs"
  9. metricsQuery: sum(rq_jobs{status="queued", namespace="scanners", scm_instance!="", <<.LabelMatchers>>}) by (scm_instance, queue)

字符串

相关问题