kubernetes HPA创建的pod多于预期

t0ybt7op  于 2022-11-02  发布在  Kubernetes
关注(0)|答案(2)|浏览(354)

我在我们的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。

2nc8po8w

2nc8po8w1#

这是按预期工作。
targetAverageUtilization是所有目标匹配Pod的 * 平均值 *。
HPA的理念是:

***纵向扩展?*我们有2个单元, 平均 * 内存利用率仅为59%,低于90%,无需纵向扩展
***缩减?**由于59%是当前负载下2个单元的 * 平均值 *,因此如果只有一个单元承担所有负载,则利用率将提高到59%*2=118%,即超过90%,因此我们需要再次进行扩展,而不是进行缩减

kkbh8khc

kkbh8khc2#

水平盒自动定标器有一个非常具体的公式来计算目标副本计数:

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

在您显示的输出中,currentMetricValue为59%,desiredMetricValue为90%。将其乘以currentReplicas的2,您将得到大约1.3个副本,四舍五入为2。
此公式,尤其是ceil()向上取整行为,会使HPA的缩减速度非常慢,尤其是在副本数量较少的情况下。
更广泛地说,在Kubernetes可观测内存上的自动缩放可能不会以您期望的方式工作。(C、C++和Rust是最值得注意的例外),垃圾收集器通常倾向于分配一大块操作系统内存并重用它,而不是在负载降低时将其返回到操作系统。如果从Kubernetes的Angular 来看,您有一个达到90%内存的Pod,内存使用可能永远不会减少。您可能需要根据不同的度量标准进行自动缩放,或者附加一个外部度量标准系统(如Prometheus),以获得更详细的内存管理器统计信息,以便进行操作。

相关问题