我在我们的k8s集群上创建了HPA,它应该在90%的内存利用率上自动扩展。但是,它在没有达到目标百分比的情况下向上扩展。我使用了以下配置:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
namespace: {{ .Values.namespace }}
name: {{ include "helm-generic.fullname" . }}
labels:
{{- include "helm-generic.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "helm-generic.fullname" . }}
minReplicas: 1
maxReplicas: 2
metrics:
- type: Resource
resource:
name: memory
targetAverageUtilization: 90
所以对于这个配置,它创建了2个pod,这是maxReplicas的数量。如果我为maxReplicas添加4,它将创建3个。
这是我从kubectl得到的描述hpa
$ kubectl describe hpa -n trunkline
Name: test-v1
Namespace: trunkline
Labels: app.kubernetes.io/instance=test-v1
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=helm-generic
app.kubernetes.io/version=0.0.0
helm.sh/chart=helm-generic-0.1.3
Annotations: meta.helm.sh/release-name: test-v1
meta.helm.sh/release-namespace: trunkline
CreationTimestamp: Wed, 12 Oct 2022 17:36:54 +0300
Reference: Deployment/test-v1
Metrics: ( current / target )
**resource memory on pods (as a percentage of request): 59% (402806784) / 90%**
resource cpu on pods (as a percentage of request): 11% (60m) / 80%
Min replicas: 1
Max replicas: 2
Deployment pods: **2 current / 2**desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
Events: <none>
如您所见,pod内存%为59,目标为90,我预计仅生产1个pod。
2条答案
按热度按时间2nc8po8w1#
这是按预期工作。
targetAverageUtilization
是所有目标匹配Pod的 * 平均值 *。HPA的理念是:
***纵向扩展?*我们有2个单元, 平均 * 内存利用率仅为59%,低于90%,无需纵向扩展
***缩减?**由于59%是当前负载下2个单元的 * 平均值 *,因此如果只有一个单元承担所有负载,则利用率将提高到59%*2=118%,即超过90%,因此我们需要再次进行扩展,而不是进行缩减
kkbh8khc2#
水平盒自动定标器有一个非常具体的公式来计算目标副本计数:
在您显示的输出中,
currentMetricValue
为59%,desiredMetricValue
为90%。将其乘以currentReplicas
的2,您将得到大约1.3个副本,四舍五入为2。此公式,尤其是
ceil()
向上取整行为,会使HPA的缩减速度非常慢,尤其是在副本数量较少的情况下。更广泛地说,在Kubernetes可观测内存上的自动缩放可能不会以您期望的方式工作。(C、C++和Rust是最值得注意的例外),垃圾收集器通常倾向于分配一大块操作系统内存并重用它,而不是在负载降低时将其返回到操作系统。如果从Kubernetes的Angular 来看,您有一个达到90%内存的Pod,内存使用可能永远不会减少。您可能需要根据不同的度量标准进行自动缩放,或者附加一个外部度量标准系统(如Prometheus),以获得更详细的内存管理器统计信息,以便进行操作。