Администратор кластера kubernetes должен позаботиться о том, что бы пользователи (devops инженеры) случайно не сломали кластер.
Например, у devops дрогнула рука (ошибся в скрипте деплоя). И вместо двух подов в deployment он написал 100500. Kubernetes честно попытается запустить указанное количество подов. Разумеется затребованных ресурсов не хватит и администратора кластера догонят суровые будни.
Или, ваше хранилище имеет общий размер 1Tb, а пользователь запросил 1,5Tb.
Или… много еще чего может придумать пользователь…
Что бы такого не случилось, админ должен явно определить квоты на используемые ресурсы. Для этого в kubernetes существуют ResourceQuota.
ResoqurceQuota определяет ограничения на namespace.
- Количество объектов, создаваемых в namespace, по типу.
- Общий объем вычислительных ресурсов.
- Объём и количество дискового пространства для volumes.
Квоты работаю следующим образом:
- Создается ResourceQuota в namespace.
- Пользователи создают объекты в namespace. Система отслеживает, не превышают ли запрошенные ресурсы лимиты, описанные в квотах.
- Если создание нового ресурса превышает квоту, API сервер возвращает 403-ю ошибку (FORBIDDEN) с сообщением о том, какие квоты были превышены.
Если в namespace включена квота на вычислительные ресурсы: cpu и memory. В создаваемых пользователем ресурсах должны быть явно описаны лимиты. Если лимиты не описаны, система отклонит создание новых ресурсов. Для избегания подобной ситуации администратор должен устанавливать LimitRanger на namespace.
Типы квот
Вычислительные
- limits.cpu
- limits.memory
- requests.cpu
- requests.memory
Хранения
- requests.storage
- persistentvolumeclaims
- <storage-class-name>.storageclass.storage.k8s.io/requests.storage
- <storage-class-name>.storageclass.storage.k8s.io/persistentvolumeclaims
Количество объектов
- configmaps
- pods
- replicationcontrollers
- resourcequotas
- services
- services.loadbalancers
- services.nodeports
- secrets
Пример 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"
		