外部指标的值在 kubernetes hpa 中很奇怪

1 kubernetes

我正在研究 kubernetes 并测试一些示例。

我在将外部指标应用于 hpa 时遇到问题。

我用普罗米修斯适配器做了一个外部指标。

所以我可以使用外部指标

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/
Run Code Online (Sandbox Code Playgroud)

命令。

结果如下。

{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"external.metrics.k8s.io/v1beta1","resources":[{"name":"redis_keys","singularName":"","namespaced":true,"kind":"ExternalMetricValueList","verbs":["get"]}]}
Run Code Online (Sandbox Code Playgroud)

我可以使用获得指标值

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/default/redis_keys
Run Code Online (Sandbox Code Playgroud)

命令。

结果如下。

{"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{"selfLink":"/apis/external.metrics.k8s.io/v1beta1/namespaces/default/redis_keys"},"items":[{"metricName":"redis_keys","metricLabels":{},"timestamp":"2020-10-28T08:39:09Z","value":"23"}]}
Run Code Online (Sandbox Code Playgroud)

我将该指标应用于 hpa。

以下是 hpa 配置。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: taskqueue-autoscaler
spec:
  scaleTargetRef:
          #apiVersion: extensions/v1beta1
    apiVersion: apps/v1
    kind: Deployment
    name: taskqueue-consumer
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: redis_keys
      targetAverageValue: 20
Run Code Online (Sandbox Code Playgroud)

制作hpa后,

我测试了这个命令。

kubectl get hpa
Run Code Online (Sandbox Code Playgroud)

结果很奇怪。

NAME                   REFERENCE                       TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
taskqueue-autoscaler   Deployment/taskqueue-consumer   11500m/20 (avg)   1         10        2          63m
Run Code Online (Sandbox Code Playgroud)

我认为它的值(11500m)是错误的,因为查询值的结果是23。

在这种情况下我应该在哪里查看?

小智 5

实际上这是正确的,但它也很复杂,因为它会涉及到 HPA 资源的一些不同的事情,这些事情并不是立即显而易见的。所以我会一次解释一件事。

首先,计量单位。Metrics API 将在可能的情况下尝试返回整个单位,但也会返回毫单位,这可能会导致上述情况。实际上,您看到的是 11.5 转换为 11500m,但两者是相同的。查看有关HPA 指标“数量”的链接,其中包含更多内容。

接下来,您现在会看到两个副本,其指标 API 的值为 23。由于您已将指标设置为外部指标的 AverageValue,因此它将指标的值除以指标 API 中的副本数量。查看 HPA 资源时,集群结果为 11.5 或 11500m。这解释了为什么您只看到 2 个副本,而指标值“高于”您的阈值。查看有关使用多个和自定义指标自动缩放的链接,特别是有关“对象”指标的部分。在页面下方,他们滑入有关外部指标的这一行,确认您看到上述内容的原因。

外部指标支持 Value 和 AverageValue 目标类型,其功能与使用 Object 类型时完全相同。

希望这会有所帮助,并且进行一些调整应该可以使其更好地符合您的期望。祝你好运!