Поиск по сайту:

Как установить лимиты ресурсов пода Kubernetes


Установка ограничений ресурсов для ваших модулей Kubernetes предотвращает влияние ошибочного контейнера на другие рабочие нагрузки. Kubernetes позволяет ограничивать ресурсы, включая потребление ЦП и памяти. Поды могут быть остановлены при превышении их лимитов, сохраняя общую стабильность кластера.

Ресурсные единицы

Перед определением лимитов стоит отметить, как Kubernetes выражает доступность ресурсов.

Потребление ЦП измеряется с точки зрения используемых виртуальных ЦП. Ограничение 0,5 виртуальных ЦП означает, что модуль может потреблять половину доступного времени одного из доступных виртуальных ЦП. Виртуальный ЦП — это то, что вы увидите в рекламе на страницах хостинга облачных провайдеров. При использовании «голого» оборудования это один гиперпоток на вашем процессоре.

Память измеряется в байтах. Вы можете указать его как целое число байтов или как более удобное количество, например 512Mi или 1Gi.

Создание лимита ЦП

Чтобы добавить ограничение ЦП для контейнеров подов, включите поле resources:limits в манифест вашего контейнера:

apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: demo
spec:
  containers:
    - name: my-container
      image: example/example
      resources:
        limits:
          cpu: "0.5"

В приведенном выше примере количество ваших контейнеров ограничено до 0,5 виртуальных ЦП. Они будут регулироваться таким образом, чтобы они не могли потреблять более половины доступного процессорного времени в течение периода 100 мс.

Создание лимита памяти

Лимиты памяти создаются аналогичным образом. Измените поле limits:cpu в манифесте на limits:memory:

limits:
  memory: "512Mi"

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

Ограничения хранения

Все узлы Kubernetes имеют доступное временное хранилище. Это хранилище используется модулями для хранения кешей и журналов. В эфемерном пуле хранения кластер Kubernetes также хранит образы контейнеров.

Вы можете установить ограничения на использование эфемерного хранилища модуля. Это бета-функция, предназначенная для того, чтобы кеш одного модуля не мог использовать весь пул хранения. Используйте поле манифеста контейнера limits:ephemeral-storage:

limits:
  ephemeral-storage: "1Gi"

Этот контейнер теперь будет ограничен использованием 1Gi доступного эфемерного хранилища. Поды, пытающиеся использовать больше памяти, будут удалены. Если в модуле есть несколько контейнеров, модуль вытесняется, если сумма использования хранилища всеми контейнерами превышает общий предел хранилища.

Kubernetes обычно отслеживает использование хранилища, периодически сканируя временную файловую систему хранилища узла. Затем он суммирует использование хранилища для каждого модуля и контейнера. Существует дополнительная поддержка квот хранения файловой системы на уровне ОС, что обеспечивает более точный мониторинг.

Вам понадобится файловая система с поддержкой квот проекта, такая как XFS или ext4. Убедитесь, что файловая система смонтирована с включенным отслеживанием квот проекта, затем включите флаг функции LocalStorageCapacityIsolationFSQuotaMonitoring в kubelet. Руководство по настройке этой системы содержится в документации Kubernetes.

Запросы ресурсов

В дополнение к ограничениям ресурсов вы можете установить запросы ресурсов. Они доступны для ЦП, памяти и временного хранилища — измените поле limits на requests в каждом из приведенных выше примеров.

Настройка запроса ресурсов указывает объем этого ресурса, который, как вы ожидаете, будет использовать контейнер. Kubernetes учитывает эту информацию при определении того, на какой узел запланировать под.

Используя память в качестве примера, request 512Mi приведет к тому, что модуль будет запланирован на узел с не менее чем 512Mi доступной памяти. Доступность рассчитывается путем суммирования запросов памяти всех существующих модулей на узле и вычитания этого из общего объема памяти узла.

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

В отличие от лимита, Kubernetes всегда позволяет контейнерам превышать их запрос ресурсов. Они могут потреблять любые неиспользуемые объемы ресурсов, которые были запрошены другими контейнерами, но в настоящее время не используются.

Использование запросов и лимитов

Различное поведение запросов и лимитов означает, что вы должны внимательно относиться к используемым значениям. Обычно лучше держать запросы низкими. Затем вы устанавливаете как можно более высокие ограничения, не влияя на способность ваших рабочих нагрузок сосуществовать.

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

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

Заключение

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

Это особенно важно в случае с памятью. Без ограничений контейнер с ошибочным процессом может быстро использовать всю память, предлагаемую его узлом. Такой сценарий нехватки памяти может вывести из строя другие модули, запланированные для этого узла, поскольку диспетчер памяти на уровне ОС начнет убивать процессы, чтобы уменьшить использование памяти.

Установка лимита памяти позволяет Kubernetes завершить работу контейнера до того, как он начнет влиять на другие рабочие нагрузки в кластере, не говоря уже о внешних процессах. Вы теряете свою рабочую нагрузку, но кластер в целом становится более стабильным.




Все права защищены. © Linux-Console.net • 2019-2024