Содержание

Kubernetes: ResourceQuota

Администратор кластера kubernetes должен позаботиться о том, что бы пользователи (devops инженеры) случайно не сломали кластер.

Например, у devops дрогнула рука (ошибся в скрипте деплоя). И вместо двух подов в deployment он написал 100500. Kubernetes честно попытается запустить указанное количество подов. Разумеется затребованных ресурсов не хватит и администратора кластера догонят суровые будни.

Или, ваше хранилище имеет общий размер 1Tb, а пользователь запросил 1,5Tb.

Или… много еще чего может придумать пользователь…

Что бы такого не случилось, админ должен явно определить квоты на используемые ресурсы. Для этого в kubernetes существуют ResourceQuota.

ResoqurceQuota определяет ограничения на namespace.

Квоты работаю следующим образом:

  1. Создается ResourceQuota в namespace.
  2. Пользователи создают объекты в namespace. Система отслеживает, не превышают ли запрошенные ресурсы лимиты, описанные в квотах.
  3. Если создание нового ресурса превышает квоту, API сервер возвращает 403-ю ошибку (FORBIDDEN) с сообщением о том, какие квоты были превышены.

Если в namespace включена квота на вычислительные ресурсы: cpu и memory. В создаваемых пользователем ресурсах должны быть явно описаны лимиты. Если лимиты не описаны, система отклонит создание новых ресурсов. Для избегания подобной ситуации администратор должен устанавливать LimitRanger на namespace.

Типы квот

Вычислительные

Хранения

Количество объектов

Пример ResourceQuota:

---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: q-test-quota
  namespace: q-test
spec:
  hard:
    # Вычислительные квоты
    requests.cpu: "0.2"
    requests.memory: 200Mi
    limits.cpu: "2"
    limits.memory: 2Gi
    # Квоты на количество объектов
    pods: "2"
    services: "2"
    services.nodeports: "0"
    # Квоты хранения
    persistentvolumeclaims: "2"
    managed-nfs-storage.storageclass.storage.k8s.io/requests.storage: 8Gi
    managed-nfs-storage.storageclass.storage.k8s.io/persistentvolumeclaims: "1"