# Limits vs Requests

Чтобы [Kubernetes](../4.3.6.2%20Kubernetes(k8s).md) смог максимально эффективно использовать доступную инфраструктуру и корректно выделить ресурсы, необходимые для работы вашего приложения, вам следует указать требования в ресурсам каждого контейнера. В данный момент есть возможность задавать два типа требований (`requests` и `limits`) для двух типов ресурсов - памяти ([memory](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.1%20AboutMemory/)) и процессора ([CPU](/2%20ComputerScience/2.0%20Linux/2.0.2%20Processor(CPU).md)).

## Limits

Ограничения по памяти (`limits`) с точки зрения Kubernetes считаются “несжимаемыми” (non-compressible), следовательно при превышении этих ограничений троттлинг невозможен - ядро будет агрессивно очищать кэш страниц (для освобождения ресурсов / достижения желаемого состояния рабочего узла) и контейнеры к конце концов могут быть остановлены (прерваны) хорошо известным [Linux](/2%20ComputerScience/2.0%20Linux/) Out of Memory (OOM) Killer.

`Limits` - жесткое ограничение ресурсов, доступных контейнеру и среде его выполнения (тут и далее имеется в виду Docker container runtime). Превышение указанных лимитов (`limits`) ресурсов зачастую приводит к троттлингу или остановке (termination) контейнера.

## Requests

Requests используется в [Kubernetes](../4.3.6.2%20Kubernetes(k8s).md) планировщиком для корректного размещения и запуска подов в существующей инфраструктуре, как бы говоря “запусти контейнеры данного пода там, где есть достаточное количество запрощенных ресурсов”.

Если значение `requests` для контейнера не указано => по умолчанию будет используется значение из `limits`. Если же не указано значение и `limits`, то по умолчанию это значение будет равно 0 (ограничивается ресурсами узла (ноды), на котором запускается под).

### Измерения

Значения параметров requests и limits измеряются в байтах, однако можно использовать и [суффиксы](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-memory). К примеру, настройка памяти JVM Xmx1g (1024³ bytes) будет соответствовать 1Gi в спецификации контейнера.

### Подбор значений

При описании пода (Pods) для каждого из его контейнеров могут быть заданы требования к ресурсам в следующем формате:
```yaml
...
resources:
  limits:
    cpu: "2"
    memory: 2Gi
  requests:
    cpu: "2"
    memory: 2Gi
...
```

Для хорошей настройки приложения часто приходится эмпирическим путем подбирать необходимые значения `requests` и `limits` и менять их на протяжении всего жизненного цикла приложения, поэтому не стоит пренебрегать сбором метрик, мониторингом и оповещением о использовании ресурсов.

### Inside Pod

Описание анализа внутренностей поды: [ссылка](https://gist.github.com/eldaroid/f759ccb490d8a80e004b4af9d18d2f94)

------------

[4.3.6.6 Resources Theme Folder](../4.3.6.6%20Resources/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.3.6.6.1 k8s CPU Theme](./4.3.6.6.1%20k8sCPU.md)