У меня есть приложение Java, работающее на K8s с минимальным: 2 и максимальным: 6 модулями в развертывании. минимальная куча: 256 МБ, максимальная - 512 МБ. запрос и ограничение памяти - 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/horizontal-pod-autoscale/ формула для получения приблизительного представления о желаемых модулях: desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

Из мониторинга K8s я заметил, что он пытается масштабироваться, когда использование памяти увеличивается примерно до 40%. Если я правильно понимаю, как работает приведенная выше формула, desiredReplicas = ceil[2*(0.4/0.6)] = 2, то масштабирование не должно увеличиваться.

Я правильно понимаю?

3
user2501711 30 Июн 2020 в 04:06

1 ответ

Лучший ответ

Выглядит правильно, но я немного догадываюсь, потому что вы не поделились выводом kubectl top pods. Возможно, ваше развертывание масштабируется не из-за использования памяти, а в первую очередь из-за загрузки ЦП.

Если вы видите документы первые показатели, которые достигают цели, запускают процесс автомасштабирования:

Kubernetes 1.6 добавляет поддержку масштабирования на основе нескольких метрик. Вы можете использовать версию API автомасштабирования / v2beta2, чтобы указать несколько показателей для масштабирования горизонтального автомасштабирования модулей. Затем контроллер Horizontal Pod Autoscaler оценит каждую метрику и предложит новую шкалу на основе этой метрики. Самая большая из предложенных шкал будет использоваться в качестве новой шкалы.

Вы также можете попробовать метрику Value для целевой памяти для устранения неполадок:

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

Хороший способ увидеть текущие показатели - просто получить статус полного вывода на HPA:

$ kubectl get hpa <hpa-name> -o=yaml
2
Rico 30 Июн 2020 в 04:29