====== Kubernetes: ResourceQuota ====== Администратор кластера 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 * .storageclass.storage.k8s.io/requests.storage * .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"