Горизонтальное автомасштабирование пода Kubernetes (HPA) для конкретного контейнера в поде

В нашем развертывании в модуле имеется 4 контейнера. Мы определили ограничения ресурсов (ЦП и памяти) только для контейнера-1. Сервер метрик установлен в кластере. Наше требование — применить горизонтальное автоматическое масштабирование модулей (HPA) со следующими требованиями. :

  • Необходимо проверить процессор и память на наличие HPA.
  • Необходимо применить HPA (расчет памяти и ЦП) только для контейнера-1 в модуле.

Когда мы использовали следующий yaml HPA, он проверял как процессор, так и память. Но он учитывает все контейнеры в модуле. Потому что при подаче заявки нам выдала ошибку. Поэтому в этом методе нам пришлось предоставить ограничения ресурсов (процессора, памяти) и для других трех контейнеров. Тогда он правильно показывал процент текущей памяти и использования процессора.

Ошибка:

HPA не удалось вычислить количество реплик: не удалось получить информацию об использовании процессора: отсутствует запрос на процессор в контейнере-контейнере-2 тестового модуля Pod.

apiVersion: autoscaling/v1
  kind: HorizontalPodAutoscaler
  metadata:
    annotations:
      autoscaling.alpha.kubernetes.io/metrics: '[{"type":"Resource","resource":{"name":"memory","targetAverageUtilization":75}}]'
    name: test-hpa
    namespace: ns
  spec:
    maxReplicas: 5
    minReplicas: 2
    scaleTargetRef:
      apiVersion: apps/v1
      kind: Deployment
      name: test-pod
    targetCPUUtilizationPercentage: 65

Проблема здесь в том, что он учитывает не только контейнер-1 в модуле.

  1. Есть ли способ указать конкретный контейнер в hpa yaml? выполнение указанных требований?
  2. Кроме того, можем ли мы применить HPA без ограничения ресурсов (ЦП и память) в остальные три контейнера в модуле?

Я попробовал несколько Ямлов HPA, но они не соответствовали обоим требованиям. Также обратите внимание, что «apiVersion: autoscaling/v2beta2» не работает в нашем кластере из-за версии k8.

Зачастую лучше запускать только один контейнер в поде, поскольку вы можете отдельно контролировать количество реплик каждого компонента и не сталкиваться с подобными конфликтами. Можете ли вы разбить развертывание на более мелкие части?

David Maze 10.05.2024 11:46
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
1
1
127
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Официальная документация Kubernetes

API HorizontalPodAutoscaler также поддерживает источник метрик контейнера, где HPA может отслеживать использование ресурсов отдельных контейнеров в наборе модулей Pod, чтобы масштабировать целевой ресурс. Это позволяет вам настроить пороговые значения масштабирования для наиболее важных контейнеров в конкретном поде. Например, если у вас есть веб-приложение и дополнительный контейнер, который обеспечивает ведение журнала, вы можете масштабировать его в зависимости от использования ресурсов веб-приложения, игнорируя дополнительный контейнер и использование им ресурсов.

Если вы изменяете целевой ресурс, чтобы иметь новую спецификацию Pod с другим набором контейнеров, вам следует пересмотреть спецификацию HPA, если этот вновь добавленный контейнер также должен использоваться для масштабирования. Если указанный контейнер в источнике метрики отсутствует или присутствует только в подмножестве модулей, эти модули игнорируются и рекомендация пересчитывается. Алгоритм подробнее о расчете. Чтобы использовать ресурсы контейнера для автомасштабирования, определите источник метрики следующим образом: Если вы не указываете ограничение ЦП для Контейнера, применяется одна из следующих ситуаций:

type: ContainerResource
containerResource:
  name: cpu
  container: application
  target:
    type: Utilization
    averageUtilization: 60

Чтобы использовать ресурсы контейнера для автоматического масштабирования, определите источник метрики следующим образом: пример, в котором контроллер HPA масштабирует цель так, что среднее использование ЦП в контейнере приложения для всех модулей составляет 60 %.

Дополнительная информация с алгоритмом, используемым HPA

Если вы не указали ограничение ЦП

Контейнер не имеет верхнего предела ресурсов ЦП, которые он может использовать. Контейнер может использовать все ресурсы ЦП, доступные на узле, на котором работает модуль. Итак, в вашем случае это будет второй вариант, который вы указали в своем вопросе: столько, сколько осталось в узле/пространстве имен.

Обычно администратор кластера Kubernetes определяет ограничение для каждого пространства имен в кластере. Таким образом, Контейнер работает в пространстве имен, которое имеет ограничение ЦП по умолчанию, и Контейнеру автоматически назначается ограничение по умолчанию.

Квоты ресурсов должны быть определены для каждого пространства имен, что полезно для избавления от модулей, которые не имеют запросов или ограничений на ресурсы и поглощают все ресурсы. Это означает, что вы не можете запланировать модуль, пока не укажете требования к ресурсам для этого модуля в определенном пространстве имен, и это рекомендуется в качестве наилучшей практики.

для получения дополнительной информации вы можете прочитать эту документацию

Я также уже пробовал «тип: ContainerResource». Но дело в том, что это для процессора. Как мы можем применить это к памяти?

koko 09.05.2024 17:36

В качестве памяти вы можете использовать то же, что и CPU, просто измените имя на Memory вот так. type: ContainerResource containerResource: name: memory container: application target: type: Utilization averageUtilization: 60 Надеюсь, это сработает.

Zhakyp Zhoomart uulu 09.05.2024 18:48

Я проверял так. Но память не показывает. И я получаю эти ошибки при запуске. Версия K8, которую мы использовали, — 1.29. Ошибки: W0510 03:29:39.197088 810156 alerts.go:70] неизвестное поле «containerResource» W0510 03:29:39.197117 810156 alerts.go:70] неизвестное поле «spec.targetMemoryUtilizationPercentage» W0510 03:29:39.19712 3 810156 alerts.go :70] неизвестное поле "тип"

koko 10.05.2024 06:17

Это код, который я использовал: >> apiVersion: autoscaling/v1 вид: HorizontalPodAutoscaler метаданные: имя: пространство имен test-hpa: ns spec: ScaleTargetRef: apiVersion: apps/v1 вид: Имя развертывания: test-pod minReplicas: 5 maxReplicas: 2 targetCPUUtilizationPercentage: 65 targetMemoryUtilizationPercentage: 75 тип: ContainerResourceContainerResource: имя: контейнер процессора: контейнер-1 цель: тип: Utilization AverageUtilization: 65ContainerResource: имя: контейнер памяти: контейнер-1 цель: тип: Utilization AverageUtilization: 75

koko 10.05.2024 06:20
Ответ принят как подходящий

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

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/metrics: |
      [
        {
          "type": "Resource",
          "resource": {
            "name": "memory",
            "targetAverageUtilization": 75
          }
        },
        {
          "type": "ContainerResource",
          "ContainerResource": {
            "name": "cpu",
            "container": "container-1",
            "targetAverageUtilization": 65
          }
        },
        {
          "type": "ContainerResource",
          "ContainerResource": {
            "name": "memory",
            "container": "container-1",
            "targetAverageUtilization": 75
          }
        }
      ]
  name: test-hpa
  namespace: ns
spec:
  maxReplicas: 5
  minReplicas: 2
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-pod
  targetCPUUtilizationPercentage: 65

Здесь следующий блок аннотации предоставляет показатели памяти для модуля:

{
  "type": "Resource",
  "resource": {
    "name": "memory",
    "targetAverageUtilization": 75
  }
}

Показатели ЦП для модуля предоставлены: целевойCPUUtilizationPercentage: 65

А процессор и память будут предоставлены следующим блоком в аннотации.

{
      "type": "ContainerResource",
      "ContainerResource": {
        "name": "cpu",
        "container": "container-1",
        "targetAverageUtilization": 65
      }
    },
    {
      "type": "ContainerResource",
      "ContainerResource": {
        "name": "memory",
        "container": "container-1",
        "targetAverageUtilization": 75
      }
    }

Это обеспечивает использование, когда я описываю hpa.

kubectl describe hpa -n ns

Метрики:
(текущий/целевой) ресурс памяти на модулях (в процентах от запрос): 63% (5497292117333м) / 75%
ресурс процессора контейнера «container-1» на подах (в процентах от запрос): 0% (17м)/65% ресурсов памяти контейнера «контейнер-1» на подах (в процентах от запроса): 124% (2673916586666м) / 75% ресурса процессора на модулях (в процентах от запрос): 1% (47м) / 65%

Спасибо за ваш вклад @Zhakyp! Это помогло мне решить некоторые проблемы. Надеюсь, это поможет и кому-то еще. Возможно, это не лучший способ сделать это. Но только это сработало для нашей версии k8 (1.29).

Другие вопросы по теме