我在Kubernetes中使用了Horizontal Pod Autoscaler。我设置了HPA,一旦平均CPU利用率超过35%,就启动新示例。然而,这似乎并不像预期的那样工作。即使CPU利用率远远低于定义的目标利用率,HPA也会触发重新缩放。如下图所示,“当前”利用率为10%,与35%相距甚远。但仍然,它将pod的数量从5调整为6。
我还检查了Google Cloud Platform Jmeter 板(我们托管应用程序的地方)中的指标。这也表明请求的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
字符串
有人知道这可能是什么原因吗?
2条答案
按热度按时间tf7tbtn21#
缩放比例是基于
requests
的百分比,而不是limits
。我认为我们应该改变这个答案,因为在接受的答案中的例子显示:字符串
但是
targetCPUUtilizationPercentage
是基于requests
的,比如:型
对于每个pod的资源指标(类似于CPU),控制器从HorizontalPodAutoscaler针对的每个Pod的资源度量API获取度量。然后,如果设置了目标利用率值,则控制器计算利用率值作为每个Pod中的容器上的等效资源请求的百分比。如果设置了目标原始值,直接使用原始指标值。然后,控制器在所有目标Pod上获取利用率或原始值(取决于指定的目标类型)的平均值,并产生用于缩放所需副本数量的比率。
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#how-does-a-horizontalpodautoscaler-work
pdsfdshx2#
这很棘手,可能是一个bug,但我不这么认为,大多数时候人们配置的值太低,我将解释。
targetCPUUtilizationPercentage
与Pod资源requests
的关系。targetCPUUtilizationPercentage
根据pod指定的所需CPU配置百分比。在Kubernetes上,如果不将requests
指定为CPU,我们就无法创建HPA
。添加一些限制也是有意义的,因为大多数时候我们不想使用所有可用的物理CPU。假设这是我们的
requests
:字符串
在我们的
targetCPUUtilizationPercentage
内部HPA中,我们指定75%。这很容易解释,因为我们要求100% (1000 m = 1个CPU核心) 的单核,所以当这个核心的使用率约为75%时,HPA将开始工作。
但是如果我们将
requests
定义为:型
现在,我们的pod指定的100%的CPU仅为单个核心的50%。好吧,所以这个pod的100%的CPU资源使用率在硬件上意味着单个核心的50%使用率。
这对于
targetCPUUtilizationPercentage
来说是无关紧要的,如果我们保持75%
的值,HPA将在我们的单核使用率大约为37.5%
时开始工作,因为这是pod
请求的所有CPU的75%。从pod/hpa的Angular 来看,它们永远不知道它们在CPU或内存上受到限制。
理解上题场景
对于上面问题中使用的某些程序- * CPU峰值确实会出现 * -但仅在很短的时间内 (例如10秒尖峰)。由于这些尖峰的短持续时间,度量服务器不保存该尖峰,但仅在1 m窗口之后保存度量。在这种情况下,将排除这些窗口之间的尖峰。这解释了为什么在指标 Jmeter 板,但由HPA拾取。
因此,对于具有 * 低CPU资源/限制 * 的服务,较大的纵向扩展时间窗口 (HPA中的
scaleUp
设置) 可能是理想的。