1

我设置了我的 Horizo​​ntalPodAutoscaler,如下所述https://cloud.google.com/kubernetes-engine/docs/tutorials/external-metrics-autoscaling根据来自我的 Pub/Sub 的未确认消息的数量来监听缩放。我的愿望是,如果有超过 1 条未确认的消息,则 pod 会扩展。当我跑步时,k describe hpa我得到:

Namespace:                                                                               default
Labels:                                                                                  <none>
Annotations:                                                                             kubectl.kubernetes.io/last-applied-configuration:
                                                                                           {"apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"foobar-gke-prod","namespace":"defau...
CreationTimestamp:                                                                       Mon, 25 May 2020 18:01:33 -0700
Reference:                                                                               Deployment/foobar-gke-prod
Metrics:                                                                                 ( current / target )
  "pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  200m / 1
Min replicas:                                                                            3
Max replicas:                                                                            9
Deployment pods:                                                                         5 current / 5 desired

返回的指标数据让我感到困惑。根据控制台指标,当我运行该命令时,未确认的知识消息数量约为 4。所以我不明白是什么200m意思?为什么不说4?

这是我对 HPA 的配置

# Template from https://cloud.google.com/kubernetes-engine/docs/tutorials/external-metrics-autoscaling
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: foobar-gke-prod
spec:
  minReplicas: 3
  maxReplicas: 9
  metrics:
  - external:
      metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
      metricSelector:
        matchLabels:
          resource.labels.subscription_id: prod_foobar_subscription
      targetAverageValue: "1"
    type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: foobar-gke-prod
4

1 回答 1

1

参考示例:

Name:                                                                                    pubsub
...
Metrics:                                                                                 ( current / target )
"pubsub.googleapis.com|subscription|num_undelivered_messages" (target average value):  2250m / 2
Min replicas:                                                                            1
Max replicas:                                                                            4
Conditions:
Type            Status  Reason            Message
----            ------  ------            -------
AbleToScale     True    SucceededRescale  the HPA controller was able to update the target scale to 4
ScalingLimited  True    TooManyReplicas   the desired replica count is more than the maximum replica count
Events:
Type    Reason             Age   From                       Message
----    ------             ----  ----                       -------
Normal  SuccessfulRescale  7s    horizontal-pod-autoscaler  New size: 4; reason: external metric pubsub.googleapis.com|subscription|num_undelivered_messages(&LabelSelector{MatchLabels:map[string]string{resource.labels.subscription_id: echo-read,},MatchExpressions:[],}) above target
  • Metrics 部分给出了 HPA 观察到的最后一个指标值。小数值表示为毫单位。例如,在上面的输出中有 4 个应用程序副本,当前 Pub/Sub 订阅中未确认的消息数为 9。因此每个副本的平均消息数为 2.25 或 2250m

返回的指标数据让我感到困惑。根据控制台指标,当我运行该命令时,未确认的知识消息数量约为 4。所以我不明白200m是什么意思?为什么不说4?

  • 这意味着在您的情况下,在 HPA 测量时,每个运行副本200m/1的平均未传递消息数为 0.2(20%)。

注意事项:

  • 确保您大致同时在指标控制台和 HPA 上进行读数,以避免由于在读取期间运行缩放而导致的差异。
  • 读取 5 个 pod 的 4 条消息将导致 800m 的负载,但此时 hpa 可能已经在运行另一个扩展事件。

  • 我鼓励您同时阅读指标控制台和 hpa 并再次验证。

如果您仍然认为此处的结果与更新后的 hpa 描述不匹配,我们可以再看看。


编辑:

有没有办法让这个指标不是跨 pod 的平均值?即,如果有 5 条未确认的消息,度量数据将读取 5000m?

来自 Kubernetes API 参考ExternalMetricSource v2beta1 Autoscaling

  • targetAverageValue是全局指标的每个 pod 的目标值(作为数量)。

  • targetValue是指标的目标值(作为数量)。

注意targetAverageValuetargetValue是互斥的。

因此,如果您想要总数而不是平均值,只需将它们交换到您的 HPA 上。

于 2020-05-26T10:23:20.110 回答