Skip to content

Commit 2aa998f

Browse files
authored
Merge pull request #22058 from vitalyzhakov/master
Localize RU assing CPU resource and memory resouce
2 parents 841abd6 + 5372373 commit 2aa998f

File tree

7 files changed

+700
-0
lines changed

7 files changed

+700
-0
lines changed
Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,266 @@
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

Comments
 (0)