|
| 1 | +--- |
| 2 | +title: Задание ресурсов CPU для контейнеров и Pod'ов |
| 3 | +content_type: task |
| 4 | +weight: 20 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +На этой странице показывается, как настроить *запрос* CPU и *лимит* CPU |
| 10 | +для контейнера. Контейнер не сможет использовать больше ресурсов CPU, |
| 11 | +чем для него ограничено. Если в системе есть свободное время CPU, |
| 12 | +контейнеру гарантируется выдача запрошенных им ресурсов CPU. |
| 13 | + |
| 14 | +## {{% heading "prerequisites" %}} |
| 15 | + |
| 16 | + |
| 17 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 18 | + |
| 19 | +На кластере должен быть хотя бы 1 доступный для работы CPU, чтобы запускать учебные примеры. |
| 20 | + |
| 21 | +Для некоторых шагов с этой страницы понадобится запущенный |
| 22 | +[сервер метрик](https://github.com/kubernetes-incubator/metrics-server) |
| 23 | +на вашем кластере. Если сервер метрик уже запущен, следующие шаги можно пропустить. |
| 24 | + |
| 25 | +Если вы используете {{< glossary_tooltip term_id="minikube" >}}, выполните следующую команду, |
| 26 | +чтобы запустить сервер метрик: |
| 27 | + |
| 28 | +```shell |
| 29 | +minikube addons enable metrics-server |
| 30 | +``` |
| 31 | + |
| 32 | +Проверим, работает ли сервер метрик (или другой провайдер API ресурсов метрик, |
| 33 | +`metrics.k8s.io`), выполните команду: |
| 34 | + |
| 35 | +```shell |
| 36 | +kubectl get apiservices |
| 37 | +``` |
| 38 | + |
| 39 | +Если API ресурсов метрик доступно, в выводе будет присутствовать |
| 40 | +ссылка на `metrics.k8s.io`. |
| 41 | + |
| 42 | + |
| 43 | +``` |
| 44 | +NAME |
| 45 | +v1beta1.metrics.k8s.io |
| 46 | +``` |
| 47 | + |
| 48 | + |
| 49 | + |
| 50 | + |
| 51 | +<!-- steps --> |
| 52 | + |
| 53 | +## Создание пространства имён |
| 54 | + |
| 55 | +Создадим {{< glossary_tooltip term_id="namespace" >}}, чтобы создаваемые в этом упражнении |
| 56 | +ресурсы были изолированы от остального кластера. |
| 57 | + |
| 58 | +```shell |
| 59 | +kubectl create namespace cpu-example |
| 60 | +``` |
| 61 | + |
| 62 | +## Установка запроса CPU и лимита CPU |
| 63 | + |
| 64 | +Чтобы установить запрос CPU для контейнера, подключите поле `resources:requests` |
| 65 | +в манифест ресурсов контейнера. Для установки ограничения по CPU подключите `resources:limits`. |
| 66 | + |
| 67 | +В этом упражнении мы создадим Pod, имеющий один контейнер. Зададим для контейнера запрос в |
| 68 | +0.5 CPU и лимит в 1 CPU. Конфигурационный файл для такого Pod'а: |
| 69 | + |
| 70 | +{{< codenew file="pods/resource/cpu-request-limit.yaml" >}} |
| 71 | + |
| 72 | +Раздел `args` конфигурационного файла содержит аргументы для контейнера в момент старта. |
| 73 | +Аргумент `-cpus "2"` говорит контейнеру попытаться использовать 2 CPU. |
| 74 | + |
| 75 | +Создадим Pod: |
| 76 | + |
| 77 | +```shell |
| 78 | +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example |
| 79 | +``` |
| 80 | + |
| 81 | +Удостоверимся, что Pod запущен: |
| 82 | + |
| 83 | +```shell |
| 84 | +kubectl get pod cpu-demo --namespace=cpu-example |
| 85 | +``` |
| 86 | + |
| 87 | +Посмотрим детальную информацию о Pod'е: |
| 88 | + |
| 89 | +```shell |
| 90 | +kubectl get pod cpu-demo --output=yaml --namespace=cpu-example |
| 91 | +``` |
| 92 | + |
| 93 | +В выводе видно, что Pod имеет один контейнер с запросом в 500 милли-CPU и с ограничением в 1 CPU. |
| 94 | + |
| 95 | +```yaml |
| 96 | +resources: |
| 97 | + limits: |
| 98 | + cpu: "1" |
| 99 | + requests: |
| 100 | + cpu: 500m |
| 101 | +``` |
| 102 | +
|
| 103 | +Запустим `kubectl top`, чтобы получить метрики Pod'a: |
| 104 | + |
| 105 | +```shell |
| 106 | +kubectl top pod cpu-demo --namespace=cpu-example |
| 107 | +``` |
| 108 | + |
| 109 | +В этом варианте вывода Pod'ом использовано 974 милли-CPU, что лишь чуть меньше |
| 110 | +заданного в конфигурации Pod'a ограничения в 1 CPU. |
| 111 | + |
| 112 | +``` |
| 113 | +NAME CPU(cores) MEMORY(bytes) |
| 114 | +cpu-demo 974m <something> |
| 115 | +``` |
| 116 | +
|
| 117 | +Напомним, что установкой параметра `-cpu "2"` для контейнера было задано попытаться использовать 2 CPU, |
| 118 | +однако в конфигурации присутствует ограничение всего в 1 CPU. Использование контейнером CPU было отрегулировано, |
| 119 | +поскольку он попытался занять больше ресурсов, чем ему позволено. |
| 120 | +
|
| 121 | +{{< note >}} |
| 122 | +Другое возможное объяснение для выделения менее 1.0 CPU в отсутствии на ноде достаточного количества |
| 123 | +свободных CPU ресурсов. Напомним, что в начальных условиях для этого упражнения было наличие у кластера |
| 124 | +хотя бы 1 CPU, доступного для использования. Если контейнер запущен на ноде, имеющей в своём распоряжении всего 1 CPU, |
| 125 | +контейнер не сможет использовать более 1 CPU независимо от заданных для него ограничений. |
| 126 | +{{< /note >}} |
| 127 | +
|
| 128 | +Удалим Pod: |
| 129 | +
|
| 130 | +```shell |
| 131 | +kubectl delete pod cpu-demo --namespace=cpu-example |
| 132 | +``` |
| 133 | + |
| 134 | +## Единицы измерения CPU |
| 135 | + |
| 136 | +Ресурсы CPU измеряются в *CPU* единицах. Один CPU, в Kubernetes, соответствует: |
| 137 | + |
| 138 | +* 1 AWS vCPU |
| 139 | +* 1 GCP Core |
| 140 | +* 1 Azure vCore |
| 141 | +* 1 гипертрединговое ядро на физическом процессоре Intel с Гипертредингом |
| 142 | + |
| 143 | +Дробные значения возможны. Контейнер, запрашивающий 0.5 CPU, получит вполовину меньше ресурсов, |
| 144 | +чем контейнер, запрашивающий 1 CPU. Можно использовать окончание m для обозначения милли. Например, |
| 145 | +100m CPU, 100 milliCPU и 0.1 CPU обозначают одно и то же. Точность выше 1m не поддерживается. |
| 146 | + |
| 147 | +CPU всегда запрашивается в абсолютных величинах, не в относиительных; 0.1 будет одинаковой частью от CPU |
| 148 | +для одноядерного, двухъядерного или 48-ядерного процессора. |
| 149 | + |
| 150 | +## Запрос ресурсов CPU больше доступного на ноде |
| 151 | + |
| 152 | +Запросы и лимиты CPU устанавливаются для контейнеров, но также полезно рассматривать и Pod |
| 153 | +имеющим эти характеристики. Запросом CPU для Pod'а является сумма запросов CPU всех его контейнеров. |
| 154 | +Аналогично и лимит CPU для Pod'а - сумма всех ограничений CPU у его контейнеров. |
| 155 | + |
| 156 | +Планирование Pod'а основано на запросах. Pod попадает в расписание запуска на ноде лишь в случае |
| 157 | +достаточного количества доступных ресурсов CPU на ноде, чтобы удовлетворить запрос CPU Pod'а. |
| 158 | + |
| 159 | +В этом упражнении мы создадим Pod с запросом CPU, превышающим мощности любой ноды в вашем кластере. |
| 160 | +Ниже представлен конфигурационный файл для Pod'а с одним контейнером. Контейнер запрашивает 100 CPU, |
| 161 | +что почти наверняка превышет имеющиеся мощности любой ноды в кластере. |
| 162 | + |
| 163 | +{{< codenew file="pods/resource/cpu-request-limit-2.yaml" >}} |
| 164 | + |
| 165 | +Создадим Pod: |
| 166 | + |
| 167 | +```shell |
| 168 | +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example |
| 169 | +``` |
| 170 | + |
| 171 | +Проверим статус Pod'а: |
| 172 | + |
| 173 | +```shell |
| 174 | +kubectl get pod cpu-demo-2 --namespace=cpu-example |
| 175 | +``` |
| 176 | + |
| 177 | +Вывод показывает Pending статус у Pod'а. То есть Pod не запланирован к запуску |
| 178 | +ни на одной ноде и будет оставаться в статусе Pending постоянно: |
| 179 | + |
| 180 | + |
| 181 | +``` |
| 182 | +NAME READY STATUS RESTARTS AGE |
| 183 | +cpu-demo-2 0/1 Pending 0 7m |
| 184 | +``` |
| 185 | + |
| 186 | +Посмотрим подробную информацию о Pod'е, включающую в себя события: |
| 187 | + |
| 188 | + |
| 189 | +```shell |
| 190 | +kubectl describe pod cpu-demo-2 --namespace=cpu-example |
| 191 | +``` |
| 192 | + |
| 193 | +В выводе отражено, что контейнер не может быть запланирован из-за нехватки ресурсов |
| 194 | +CPU на нодах: |
| 195 | + |
| 196 | + |
| 197 | +``` |
| 198 | +Events: |
| 199 | + Reason Message |
| 200 | + ------ ------- |
| 201 | + FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3). |
| 202 | +``` |
| 203 | + |
| 204 | +Удалим Pod: |
| 205 | + |
| 206 | +```shell |
| 207 | +kubectl delete pod cpu-demo-2 --namespace=cpu-example |
| 208 | +``` |
| 209 | + |
| 210 | +## Если ограничения на CPU не заданы |
| 211 | + |
| 212 | +Если ограничения на использование контейнером CPU не установлены, возможны следующие варианты: |
| 213 | + |
| 214 | +* У контейнера отсутствует верхняя граница количества CPU доступных ему ресурсов. В таком случае |
| 215 | +он может занять все ресурсы CPU, доступные на ноде, на которой он запущен. |
| 216 | + |
| 217 | +* Контейнер запущен в пространстве имён, в котором задана стандартная величина ограничения |
| 218 | +ресурсов CPU. Тогда контейнеру автоматически присваивается это ограничение. Администраторы |
| 219 | +кластера могут использовать [LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core/), |
| 220 | +чтобы задать стандартную величину ограничения ресурсов CPU. |
| 221 | + |
| 222 | +## Мотивация для использования запросов и лимитов CPU |
| 223 | + |
| 224 | +Вы можете распоряжаться ресурсами CPU на нодах вашего кластера эффективнее, если для |
| 225 | +запущенных контейнеров установлены запросы и ограничения на использование ресурсов CPU. |
| 226 | +Задание небольшого запроса CPU даёт Pod'у хорошие шансы быть запланированным. Установка |
| 227 | +лимита на ресурсы CPU, большего, чем запрос, позволяет достичь 2 вещей: |
| 228 | + |
| 229 | +* При увеличении нагрузки Pod может задействовать дополнительные ресурсы CPU. |
| 230 | +* Количество ресурсов CPU, которые Pod может задействовать при повышении нагрузки, ограничено |
| 231 | +некоторой разумной величиной. |
| 232 | + |
| 233 | +## Очистка |
| 234 | + |
| 235 | +Удалим созданное для этого упражнения пространство имён: |
| 236 | + |
| 237 | +```shell |
| 238 | +kubectl delete namespace cpu-example |
| 239 | +``` |
| 240 | + |
| 241 | + |
| 242 | + |
| 243 | +## {{% heading "whatsnext" %}} |
| 244 | + |
| 245 | + |
| 246 | +### Для разработчиков приложений |
| 247 | + |
| 248 | +* [Assign Memory Resources to Containers and Pods](/docs/tasks/configure-pod-container/assign-memory-resource/) |
| 249 | + |
| 250 | +* [Configure Quality of Service for Pods](/docs/tasks/configure-pod-container/quality-service-pod/) |
| 251 | + |
| 252 | +### Для администраторов кластера |
| 253 | + |
| 254 | +* [Configure Default Memory Requests and Limits for a Namespace](/docs/tasks/administer-cluster/memory-default-namespace/) |
| 255 | + |
| 256 | +* [Configure Default CPU Requests and Limits for a Namespace](/docs/tasks/administer-cluster/cpu-default-namespace/) |
| 257 | + |
| 258 | +* [Configure Minimum and Maximum Memory Constraints for a Namespace](/docs/tasks/administer-cluster/memory-constraint-namespace/) |
| 259 | + |
| 260 | +* [Configure Minimum and Maximum CPU Constraints for a Namespace](/docs/tasks/administer-cluster/cpu-constraint-namespace/) |
| 261 | + |
| 262 | +* [Configure Memory and CPU Quotas for a Namespace](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) |
| 263 | + |
| 264 | +* [Configure a Pod Quota for a Namespace](/docs/tasks/administer-cluster/quota-pod-namespace/) |
| 265 | + |
| 266 | +* [Configure Quotas for API Objects](/docs/tasks/administer-cluster/quota-api-object/) |
0 commit comments