HPA 扩展,即使当前 CPU 低于目标 CPU

问题描述 投票:0回答:2

我正在 Kubernetes 中使用 Horizontal Pod Autoscaler。我已将 HPA 设置为在平均 CPU 利用率超过 35% 时启动新实例。然而,这似乎并没有按预期工作。 即使 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

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

kubernetes google-cloud-platform google-kubernetes-engine cpu-usage hpa
2个回答
9
投票

缩放基于

requests
的百分比,而不是
limits
。我认为我们应该更改这个答案,正如已接受答案中的示例所示:

 limits:
   cpu: 1000m

但是

targetCPUUtilizationPercentage
是基于
requests
的,例如:

requests:
   cpu: 1000m

对于每个 Pod 的资源指标(如 CPU),控制器从 HorizontalPodAutoscaler 所针对的每个 Pod 的资源指标 API 中获取指标。然后,如果设置了目标利用率值,则控制器会计算利用率值占每个 Pod 中容器上的等效资源请求的百分比。如果设置了目标原始值,则直接使用原始指标值。然后,控制器获取所有目标 Pod 的利用率或原始值(取决于指定的目标类型)的平均值,并生成用于缩放所需副本数量的比率。

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#how-does-a-horizontalpodautoscaler-work


3
投票

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

targetCPUUtilizationPercentage
与 Pod 资源的关系
requests

targetCPUUtilizationPercentage
根据 pod 指定的所需 CPU 配置百分比。在 Kubernetes 上,如果不向 CPU 指定
HPA
,我们就无法创建
requests
。添加一些限制也是有意义的,因为大多数时候我们不想使用所有可用的物理 CPU。

假设这是我们的

requests

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

在 HPA 内的

targetCPUUtilizationPercentage
中,我们指定 75%。

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

但是如果我们将

requests
定义为:

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

现在,我们的 Pod 指定的 100% CPU 仅是单核的 50%。很好,所以这个 pod 的 100% cpu 资源使用率意味着,在硬件上,单个核心的使用率为 50%。

这对于

targetCPUUtilizationPercentage
来说无关紧要,如果我们保持
75%
的值,当我们的单核大约使用
37.5%
时,HPA 将开始工作,因为这是
pod
请求的所有 CPU 的 75%。

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

理解上述问题中的场景

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

因此,对于具有 低 CPU 资源/限制 的服务,较大的扩展时间窗口

scaleUp
HPA 中的设置) 可能是理想的选择。

© www.soinside.com 2019 - 2024. All rights reserved.