Kubernetes HPA не уменьшается после уменьшения нагрузки

#kubernetes #hpa

#kubernetes #hpa

Вопрос:

Kubernetes HPA работает корректно, когда загрузка модуля увеличилась, но после уменьшения нагрузки масштаб развертывания не меняется. Это мой файл HPA:

 apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: baseinformationmanagement
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: baseinformationmanagement
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  

Моя версия kubernetes:

 > kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.1", GitCommit:"d647ddbd755faf07169599a625faf302ffc34458", GitTreeState:"clean", BuildDate:"2019-10-02T17:01:15Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:22:30Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
  

И это мое описание HPA:

 > kubectl describe hpa baseinformationmanagement
Name:                                                     baseinformationmanagement
Namespace:                                                default
Labels:                                                   <none>
Annotations:                                              kubectl.kubernetes.io/last-applied-configuration:
                                                            {"apiVersion":"autoscaling/v2beta2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"baseinformationmanagement","name...
CreationTimestamp:                                        Sun, 27 Sep 2020 06:09:07  0000
Reference:                                                Deployment/baseinformationmanagement
Metrics:                                                  ( current / target )
  resource memory on pods  (as a percentage of request):  49% (1337899008) / 70%
  resource cpu on pods  (as a percentage of request):     2% (13m) / 50%
Min replicas:                                             1
Max replicas:                                             3
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>
  

Комментарии:

1. возможно kubernetes.io/docs/tasks/run-application/… это может вам помочь, особенно если вы сможете обновиться до 1.18

2. Как долго вы ждали? HPA намеренно немного консервативен в уменьшении; когда я экспериментировал с ним в прошлом, может потребоваться более 5 минут, прежде чем он начнет завершать работу модулей.

3. Не могли бы вы показать результат $ kubectl describe hpa bankchannel ? Наблюдаете ли вы там значения, которые должны уменьшить развертывание?

4. @DavidMaze Около 23 часов

5. @DawidKruk Я добавил это к своему вопросу.

Ответ №1:

Ваш HPA определяет целевые параметры как памяти, так и процессора. Примечания к документации по автоскейлингу горизонтального модуля:

Если в HorizontalPodAutoscaler указано несколько метрик, это вычисление выполняется для каждой метрики, а затем выбирается наибольшее из желаемых значений количества реплик.

Фактическая целевая реплика зависит от текущего количества реплик и текущего и целевого использования (та же ссылка):

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

В частности, для памяти: currentReplicas равно 2; currentMetricValue равно 49; desiredMetricValue равно 80. Таким образом, количество целевых реплик равно

 desiredReplicas = ceil[       2        * (         49        /         80         )]
desiredReplicas = ceil[       2        *                   0.61                    ]
desiredReplicas = ceil[                          1.26                              ]
desiredReplicas = 2
  

Даже если ваша служба полностью бездействует, это приведет к появлению (как минимум) 2 реплик, если только служба не решит освободить память обратно в ОС; обычно это зависит от языковой среды выполнения и немного выходит из-под вашего контроля.

Простое удаление целевой памяти и автоматическое масштабирование только на основе процессора могут лучше соответствовать вашим ожиданиям.

Комментарии:

1. Спасибо, это было очень полезно для меня. Могу ли я разделить HPA памяти и процессора для каждого развертывания?

2. Я не думаю, что имеет смысл иметь два разных автоскалера, нацеленных на одно и то же развертывание, если это ваш вопрос.