kubernetes HorizontalPodAutoscaler清单未过滤metricall.matchLabels

ttisahbt  于 5个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(68)

我们正在使用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/v1targetAverageValue一起使用,它就可以正常工作。当我切换到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

lbsnaicq

lbsnaicq1#

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

- 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", namespace="scanners", scm_instance!="", <<.LabelMatchers>>}) by (scm_instance, queue)

字符串

相关问题