3

我有一个 Java 应用程序在 K8s 上运行,部署中有 min:2 和 max:6 pod。堆最小值:256Mb,堆最大值:512Mb。请求和限制内存为 1Gi 这是 hpa 规范:

  spec:
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 6
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 60
    - type: Resource
      resource:
        name: memory
        targetAverageUtilization: 60

在性能测试期间,我注意到部署正试图非常积极地扩展。

无负载时,内存利用率在 33% 左右,根据这个链接https://kubernetes.io/docs/tasks/run-application/horizo​​ntal -pod-autoscale/ 的公式大致了解一下想要的豆荚是desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

从 K8s 监控中,我注意到它会在内存利用率增加到 40% 左右时尝试扩展。如果我正确理解上述公式的工作原理desiredReplicas = ceil[2*(0.4/0.6)] = 2,那么它不应该按比例放大。

我理解正确吗?

4

1 回答 1

2

这看起来是正确的,但我猜了一段时间,因为你没有分享kubectl top pods. 您的部署可能不是因为内存利用率而扩展,而是因为首先是 CPU 利用率。

如果您看到文档,第一个达到目标的指标会启动自动缩放过程:

Kubernetes 1.6 增加了对基于多个指标的扩展的支持。您可以使用 autoscaling/v2beta2 API 版本为 Horizo​​ntal Pod Autoscaler 指定多个指标以进行扩展。然后,Horizo​​ntal Pod Autoscaler 控制器将评估每个指标,并根据该指标提出一个新的比例。最大的提议尺度将用作新尺度

您还可以尝试为您的内存目标使用价值指标来进行故障排除:

  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 60
    - type: Resource
      resource:
        name: memory
        targetAverageValue: 700M

查看当前指标的一个好方法是在 HPA 上获取完整输出的状态:

$ kubectl get hpa <hpa-name> -o=yaml
于 2020-06-30T04:29:10.677 回答