Как использовать квоты ресурсов Kubernetes
Квоты ресурсов предотвращают конкуренцию за ресурсы и «захват земель», контролируя, сколько процессора или памяти может потреблять приложение.
«Контроль» — это слово, которое приходит на ум, когда кто-то упоминает, что ему необходимо управлять вычислительными ресурсами Kubernetes, особенно процессором и памятью. Эти разговоры обычно происходят после того, как платформа Kubernetes уже некоторое время развернута и разработчики активно используют кластер. И в большинстве случаев эта тема возникает после того, как возникает проблема.
Проблемы с ресурсами возникают часто, когда реализация Kubernetes развертывается без учета будущего роста кластера. Проблемы также могут быть связаны с уровнем опыта команды, которая развертывает кластер Kubernetes и управляет им.
Без контроля одно мошенническое приложение или разработчик может подорвать бизнес. Это случайно происходит, когда несколько разработчиков совместно используют кластер с фиксированным количеством узлов. Эти ограничения ресурсов могут привести к разногласиям, поиску виноватых и «захвату» доступных ресурсов среди разработчиков. Это очень плохая ситуация как для администраторов кластера, так и для разработчиков.
Существует несколько способов управления тем, как приложения используют вычислительные ресурсы в среде Kubernetes. В большинстве случаев квот ресурсов и предельных диапазонов достаточно. Обратите внимание, что в Kubernetes управление хранилищем использует необычный подход с использованием плагина Persistent Volume, в котором определяются свойства для адресации и управления различными требованиями к хранилищу.
Квоты ресурсов Kubernetes — это способ контролировать использование вычислительных ресурсов. Эта статья покажет вам, как использовать эту функцию для управления поведением разработчиков и контроля потребления ресурсов приложения.
Что такое квоты ресурсов?
Короче говоря, квоты ресурсов предоставляют ограничения, которые ограничивают потребление ресурсов для каждого пространства имен. Их можно применять только на уровне пространства имен, то есть их можно применять к вычислительным ресурсам и ограничивать количество объектов внутри пространства имен.
Квота ресурсов Kubernetes определяется объектом ResourceQuota
. При применении к пространству имен оно может ограничивать вычислительные ресурсы, такие как ЦП и память, а также создание следующих объектов:
- Стручки
- Услуги
- Секреты
- Постоянные объемные заявки (PVC)
- Карты конфигурации
Kubernetes поддерживает два типа квот ЦП и памяти для управления вычислительными ресурсами. Они контролируются с помощью лимитов и запросов, как поясняется в документации LimitRange.
Короче говоря, запрос определяет гарантированные ресурсы ЦП или памяти для контейнеров, а лимит — это пороговое значение памяти или ЦП, которое контейнер может использовать в зависимости от того, что доступно на основе об использовании других контейнеров.
Это изображение иллюстрирует разницу между запросами и ограничениями в квотах ресурсов Kubernetes.
(Майкл Кализо, CC BY-SA 4.0)
В следующем упражнении показано, как использовать квоты ресурсов для создания ограничений, которые ограничивают приложение определенными ресурсами на основе определенного порога. Это также показывает полезность внедрения квот ресурсов для получения контроля над реализацией Kubernetes.
Предварительные условия
Прежде чем начать, убедитесь, что на вашем локальном компьютере развернут Kubernetes. Вот моя конфигурация:
- Миникуб v1.14.2
- Операционная система Федора 33
- доступ в Интернет
Если вам нужна помощь в развертывании Minikube на ноутбуке с Linux, вы можете выполнить действия, описанные в книге Брайанта Сона Начало работы с Minikube. Или, если вы используете Windows или macOS, вы можете выполнить следующие действия.
Настройка квоты ресурсов
В этом примере создается квота ЦП, но для квоты памяти или их комбинации процесс аналогичен.
В реальном производственном сценарии ресурсы ЦП обычно занимают первое место среди вычислительных ресурсов, которыми вам необходимо управлять, чтобы избежать конкуренции за ресурсы. Это верно, когда на вашем сервере работает несколько приложений (вычислений).
Начните с создания нового пространства имен, к которому вы будете применять квоту ЦП:
$ kubectl create namespace quota-test
namespace/quota-test created
Создайте файл с именем cpu-quota.yaml
и поместите в него следующую квоту (созданную для этой демонстрации):
apiVersion: v1
kind: ResourceQuota
metadata:
name: test-cpu-quota
spec:
hard:
requests.cpu: "100m"
limits.cpu: "200m"
Примените квоту к вашему кластеру Kubernetes с помощью:
$ kubectl apply -f cpu-qouta.yaml
resourcequota/test-cpu-quota created
Убедитесь, что квота была применена с помощью команды kubectl описать
:
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 0 200m
requests.cpu 0 100m
Обратите внимание на столбец Используемые ресурсы
; это значение будет меняться по мере развертывания модулей.
Теперь, когда вы определили свою квоту, проверьте ее. В этом примере разверните три разных модуля в одном пространстве имен, чтобы проверить, сможете ли вы контролировать использование ресурсов на основе определенных вами ограничений. Три модуля:
- PodA: Этот модуль, экземпляр которого будет создан первым, будет использовать 50 % доступного процессора.
- PodB: этот модуль будет использовать остальные 50 % доступного ЦП; это будет второй экземпляр модуля.
- PodC: Определенная квота должна препятствовать развертыванию третьего модуля.
Теперь, когда вы знаете сценарий, разверните модули.
Развертывание модулей
Подписка:
$ kubectl create -n quota-test -f- <<EOF
apiVersion: v1
kind: Pod
metadata:
name: poda
spec:
containers:
- name: quota-test
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
resources:
requests:
cpu: "50m"
limits:
cpu: "100m"
restartPolicy: Never
EOF
Проверьте использование ЦП, еще раз описав квоту и отметив ограничения и запросы значений Used CPU
:
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 100m 200m
requests.cpu 50m 100m
Подб:
$ kubectl create -n quota-test -f- <<EOF
apiVersion: v1
kind: Pod
metadata:
name: podb
spec:
containers:
- name: quota-test
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
resources:
requests:
cpu: "50m"
limits:
cpu: "100m"
restartPolicy: Never
EOF
Еще раз проверьте использование ресурсов ЦП. Как и ожидалось, PodB можно запланировать, поскольку это позволяет квота:
$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name: test-cpu-quota
Namespace: quota-test
Resource Used Hard
-------- ---- ----
limits.cpu 200m 200m
requests.cpu 100m 100m
ПодC:
Теперь попробуйте создать экземпляр третьего модуля, даже если вы знаете, что PodA и Pod B максимизировали определенный вами порог квоты ЦП:
$ kubectl create -n quota-test -f- <<EOF
apiVersion: v1
kind: Pod
metadata:
name: podc
spec:
containers:
- name: quota-test
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
resources:
requests:
cpu: "5m"
limits:
cpu: "10m"
restartPolicy: Never
EOF
Как и ожидалось, экземпляр третьего модуля не будет создан, поскольку определенная квота не позволяет создавать модули:
Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m
Как показывает этот пример, правильно определенные квоты ресурсов — это мощный инструмент, который администратор Kubernetes может использовать для управления поведением разработчиков.
Очистить
Удалите созданное вами пространство имен (в данном случае quota-test
):
$ kubectl delete -n quota-test
Планирование квот
Существует множество способов контролировать, как пользователи могут развертывать приложения, чтобы избежать «захвата земель» в кластере Kubernetes. Грамотная реализация квот, диапазонов ограничений и других встроенных функций способствует стабильности кластера.
Внедрение квот на вычислительные ресурсы — это важное проектное решение, над которым необходимо тщательно подумать, особенно при развертывании Kubernetes для запуска критически важных корпоративных приложений.
При определении квот важно включать в планирование разработчиков. Благодаря своим знаниям в области применения они являются вашими лучшими ресурсами для оценки того, что требуется.