0

我正在使用 Kubernetes 中的 Horizo​​ntal Pod Autoscaler。一旦平均 CPU 利用率超过 35%,我已将 HPA 设置为启动新实例。然而,这似乎没有按预期工作。即使 CPU 利用率远低于定义的目标利用率,HPA 也会触发重新调整。如下所示,“当前”利用率为 10%,与 35% 相差甚远。但是,它仍然将 pod 的数量从 5 个重新调整为 6 个。 在此处输入图像描述

我还检查了我的 Google Cloud Platform 仪表板(我们托管应用程序的地方)中的指标。这也表明请求的 CPU 利用率没有超过 35% 的阈值。但是,仍然发生了几次重新调整。 在此处输入图像描述

我的 HPA 的内容

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
 name: django
spec:
{{ if eq .Values.env "prod" }}
 minReplicas: 5
 maxReplicas: 35
{{ else if eq .Values.env "staging" }}
 minReplicas: 1
 maxReplicas: 3
{{ end }}
 scaleTargetRef:
   apiVersion: apps/v1
   kind: Deployment
   name: django-app
 targetCPUUtilizationPercentage: 35

有谁知道这可能是什么原因?

4

1 回答 1

3

这很棘手,可能是一个错误,但我不这么认为,大多数时候人们配置的值太低,我将解释。

targetCPUUtilizationPercentage与 Pod 的请求限制有何关系。

根据targetCPUUtilizationPercentagepod 可以使用的所有 CPU 配置百分比。HPA在 Kubernetes 上,如果不指定一些limitsCPU 使用率,我们就无法创建一个。

让我们假设这是我们的极限:

apiVersion: v1
kind: Pod
metadata:
  name: apache
spec:
  containers:
    - name: apache
      image: httpd:alpine
      resources:
        limits:
          cpu: 1000m

在我们的targetCPUUtilizationPercentage内部 HPA 中,我们指定 75%。

这很容易解释,因为我们要求单核的 100% (1000m = 1 个 CPU 核),所以当这个核大约使用 75% 时,HPA 就会开始工作。

但是,如果我们将我们的限制定义为:

spec:
  containers:
    - name: apache
      image: httpd:alpine
      resources:
        limits:
          cpu: 500m

现在,我们的 pod 可以利用的 100% CPU 只是单个内核的 50%。很好,所以这个 pod 100% 的 cpu 使用率意味着,在硬件上,单核的使用率是 50%。

这是无关紧要的targetCPUUtilizationPercentage,如果我们保持我们75%的 HPA 值,当我们的单核即将37.5%使用时就会开始工作,因为这是pod可以消耗的所有 CPU 的 75%。

从 pod/hpa 的角度来看,他们永远不知道自己受限于 CPU 或内存。

了解上述问题中的场景

对于上面问题中使用的某些程序 - CPU 峰值确实会发生- 但是仅在很小的时间范围内(例如 10 秒峰值)。由于这些尖峰的持续时间很短,指标服务器不会保存这个尖峰,而只会在 1m 窗口后保存指标。在这种情况下,这些窗口之间的尖峰将被排除。这解释了为什么在指标仪表板中看不到峰值,但 HPA 会发现峰值。

因此,对于CPU 限制较低的服务,较大的扩展时间窗口scaleUpHPA 中的设置)可能是理想的。

于 2021-03-20T20:27:07.383 回答