我正在 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
有谁知道这可能是什么原因吗?
缩放基于
requests
的百分比,而不是 limits
。我认为我们应该更改这个答案,正如已接受答案中的示例所示:
limits:
cpu: 1000m
但是
targetCPUUtilizationPercentage
是基于 requests
的,例如:
requests:
cpu: 1000m
对于每个 Pod 的资源指标(如 CPU),控制器从 HorizontalPodAutoscaler 所针对的每个 Pod 的资源指标 API 中获取指标。然后,如果设置了目标利用率值,则控制器会计算利用率值占每个 Pod 中容器上的等效资源请求的百分比。如果设置了目标原始值,则直接使用原始指标值。然后,控制器获取所有目标 Pod 的利用率或原始值(取决于指定的目标类型)的平均值,并生成用于缩放所需副本数量的比率。
这很棘手,可能是一个错误,但我不这么认为,大多数时候人们配置的值太低,正如我将解释的那样。
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 中的设置) 可能是理想的选择。