-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e92d7e3
commit 5372373
Showing
7 changed files
with
700 additions
and
0 deletions.
There are no files selected for viewing
266 changes: 266 additions & 0 deletions
266
content/ru/docs/tasks/configure-pod-container/assign-cpu-resource.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,266 @@ | ||
--- | ||
title: Задание ресурсов CPU для контейнеров и Pod'ов | ||
content_type: task | ||
weight: 20 | ||
--- | ||
|
||
<!-- overview --> | ||
|
||
На этой странице показывается, как настроить *запрос* CPU и *лимит* CPU | ||
для контейнера. Контейнер не сможет использовать больше ресурсов CPU, | ||
чем для него ограничено. Если в системе есть свободное время CPU, | ||
контейнеру гарантируется выдача запрошенных им ресурсов CPU. | ||
|
||
## {{% heading "prerequisites" %}} | ||
|
||
|
||
{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} | ||
|
||
На кластере должен быть хотя бы 1 доступный для работы CPU, чтобы запускать учебные примеры. | ||
|
||
Для некоторых шагов с этой страницы понадобится запущенный | ||
[сервер метрик](https://github.com/kubernetes-incubator/metrics-server) | ||
на вашем кластере. Если сервер метрик уже запущен, следующие шаги можно пропустить. | ||
|
||
Если вы используете {{< glossary_tooltip term_id="minikube" >}}, выполните следующую команду, | ||
чтобы запустить сервер метрик: | ||
|
||
```shell | ||
minikube addons enable metrics-server | ||
``` | ||
|
||
Проверим, работает ли сервер метрик (или другой провайдер API ресурсов метрик, | ||
`metrics.k8s.io`), выполните команду: | ||
|
||
```shell | ||
kubectl get apiservices | ||
``` | ||
|
||
Если API ресурсов метрик доступно, в выводе будет присутствовать | ||
ссылка на `metrics.k8s.io`. | ||
|
||
|
||
``` | ||
NAME | ||
v1beta1.metrics.k8s.io | ||
``` | ||
|
||
|
||
|
||
|
||
<!-- steps --> | ||
|
||
## Создание пространства имён | ||
|
||
Создадим {{< glossary_tooltip term_id="namespace" >}}, чтобы создаваемые в этом упражнении | ||
ресурсы были изолированы от остального кластера. | ||
|
||
```shell | ||
kubectl create namespace cpu-example | ||
``` | ||
|
||
## Установка запроса CPU и лимита CPU | ||
|
||
Чтобы установить запрос CPU для контейнера, подключите поле `resources:requests` | ||
в манифест ресурсов контейнера. Для установки ограничения по CPU подключите `resources:limits`. | ||
|
||
В этом упражнении мы создадим Pod, имеющий один контейнер. Зададим для контейнера запрос в | ||
0.5 CPU и лимит в 1 CPU. Конфигурационный файл для такого Pod'а: | ||
|
||
{{< codenew file="pods/resource/cpu-request-limit.yaml" >}} | ||
|
||
Раздел `args` конфигурационного файла содержит аргументы для контейнера в момент старта. | ||
Аргумент `-cpus "2"` говорит контейнеру попытаться использовать 2 CPU. | ||
|
||
Создадим Pod: | ||
|
||
```shell | ||
kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example | ||
``` | ||
|
||
Удостоверимся, что Pod запущен: | ||
|
||
```shell | ||
kubectl get pod cpu-demo --namespace=cpu-example | ||
``` | ||
|
||
Посмотрим детальную информацию о Pod'е: | ||
|
||
```shell | ||
kubectl get pod cpu-demo --output=yaml --namespace=cpu-example | ||
``` | ||
|
||
В выводе видно, что Pod имеет один контейнер с запросом в 500 милли-CPU и с ограничением в 1 CPU. | ||
|
||
```yaml | ||
resources: | ||
limits: | ||
cpu: "1" | ||
requests: | ||
cpu: 500m | ||
``` | ||
Запустим `kubectl top`, чтобы получить метрики Pod'a: | ||
|
||
```shell | ||
kubectl top pod cpu-demo --namespace=cpu-example | ||
``` | ||
|
||
В этом варианте вывода Pod'ом использовано 974 милли-CPU, что лишь чуть меньше | ||
заданного в конфигурации Pod'a ограничения в 1 CPU. | ||
|
||
``` | ||
NAME CPU(cores) MEMORY(bytes) | ||
cpu-demo 974m <something> | ||
``` | ||
Напомним, что установкой параметра `-cpu "2"` для контейнера было задано попытаться использовать 2 CPU, | ||
однако в конфигурации присутствует ограничение всего в 1 CPU. Использование контейнером CPU было отрегулировано, | ||
поскольку он попытался занять больше ресурсов, чем ему позволено. | ||
{{< note >}} | ||
Другое возможное объяснение для выделения менее 1.0 CPU в отсутствии на ноде достаточного количества | ||
свободных CPU ресурсов. Напомним, что в начальных условиях для этого упражнения было наличие у кластера | ||
хотя бы 1 CPU, доступного для использования. Если контейнер запущен на ноде, имеющей в своём распоряжении всего 1 CPU, | ||
контейнер не сможет использовать более 1 CPU независимо от заданных для него ограничений. | ||
{{< /note >}} | ||
Удалим Pod: | ||
```shell | ||
kubectl delete pod cpu-demo --namespace=cpu-example | ||
``` | ||
|
||
## Единицы измерения CPU | ||
|
||
Ресурсы CPU измеряются в *CPU* единицах. Один CPU, в Kubernetes, соответствует: | ||
|
||
* 1 AWS vCPU | ||
* 1 GCP Core | ||
* 1 Azure vCore | ||
* 1 гипертрединговое ядро на физическом процессоре Intel с Гипертредингом | ||
|
||
Дробные значения возможны. Контейнер, запрашивающий 0.5 CPU, получит вполовину меньше ресурсов, | ||
чем контейнер, запрашивающий 1 CPU. Можно использовать окончание m для обозначения милли. Например, | ||
100m CPU, 100 milliCPU и 0.1 CPU обозначают одно и то же. Точность выше 1m не поддерживается. | ||
|
||
CPU всегда запрашивается в абсолютных величинах, не в относиительных; 0.1 будет одинаковой частью от CPU | ||
для одноядерного, двухъядерного или 48-ядерного процессора. | ||
|
||
## Запрос ресурсов CPU больше доступного на ноде | ||
|
||
Запросы и лимиты CPU устанавливаются для контейнеров, но также полезно рассматривать и Pod | ||
имеющим эти характеристики. Запросом CPU для Pod'а является сумма запросов CPU всех его контейнеров. | ||
Аналогично и лимит CPU для Pod'а - сумма всех ограничений CPU у его контейнеров. | ||
|
||
Планирование Pod'а основано на запросах. Pod попадает в расписание запуска на ноде лишь в случае | ||
достаточного количества доступных ресурсов CPU на ноде, чтобы удовлетворить запрос CPU Pod'а. | ||
|
||
В этом упражнении мы создадим Pod с запросом CPU, превышающим мощности любой ноды в вашем кластере. | ||
Ниже представлен конфигурационный файл для Pod'а с одним контейнером. Контейнер запрашивает 100 CPU, | ||
что почти наверняка превышет имеющиеся мощности любой ноды в кластере. | ||
|
||
{{< codenew file="pods/resource/cpu-request-limit-2.yaml" >}} | ||
|
||
Создадим Pod: | ||
|
||
```shell | ||
kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example | ||
``` | ||
|
||
Проверим статус Pod'а: | ||
|
||
```shell | ||
kubectl get pod cpu-demo-2 --namespace=cpu-example | ||
``` | ||
|
||
Вывод показывает Pending статус у Pod'а. То есть Pod не запланирован к запуску | ||
ни на одной ноде и будет оставаться в статусе Pending постоянно: | ||
|
||
|
||
``` | ||
NAME READY STATUS RESTARTS AGE | ||
cpu-demo-2 0/1 Pending 0 7m | ||
``` | ||
|
||
Посмотрим подробную информацию о Pod'е, включающую в себя события: | ||
|
||
|
||
```shell | ||
kubectl describe pod cpu-demo-2 --namespace=cpu-example | ||
``` | ||
|
||
В выводе отражено, что контейнер не может быть запланирован из-за нехватки ресурсов | ||
CPU на нодах: | ||
|
||
|
||
``` | ||
Events: | ||
Reason Message | ||
------ ------- | ||
FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3). | ||
``` | ||
|
||
Удалим Pod: | ||
|
||
```shell | ||
kubectl delete pod cpu-demo-2 --namespace=cpu-example | ||
``` | ||
|
||
## Если ограничения на CPU не заданы | ||
|
||
Если ограничения на использование контейнером CPU не установлены, возможны следующие варианты: | ||
|
||
* У контейнера отсутствует верхняя граница количества CPU доступных ему ресурсов. В таком случае | ||
он может занять все ресурсы CPU, доступные на ноде, на которой он запущен. | ||
|
||
* Контейнер запущен в пространстве имён, в котором задана стандартная величина ограничения | ||
ресурсов CPU. Тогда контейнеру автоматически присваивается это ограничение. Администраторы | ||
кластера могут использовать [LimitRange](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core/), | ||
чтобы задать стандартную величину ограничения ресурсов CPU. | ||
|
||
## Мотивация для использования запросов и лимитов CPU | ||
|
||
Вы можете распоряжаться ресурсами CPU на нодах вашего кластера эффективнее, если для | ||
запущенных контейнеров установлены запросы и ограничения на использование ресурсов CPU. | ||
Задание небольшого запроса CPU даёт Pod'у хорошие шансы быть запланированным. Установка | ||
лимита на ресурсы CPU, большего, чем запрос, позволяет достичь 2 вещей: | ||
|
||
* При увеличении нагрузки Pod может задействовать дополнительные ресурсы CPU. | ||
* Количество ресурсов CPU, которые Pod может задействовать при повышении нагрузки, ограничено | ||
некоторой разумной величиной. | ||
|
||
## Очистка | ||
|
||
Удалим созданное для этого упражнения пространство имён: | ||
|
||
```shell | ||
kubectl delete namespace cpu-example | ||
``` | ||
|
||
|
||
|
||
## {{% heading "whatsnext" %}} | ||
|
||
|
||
### Для разработчиков приложений | ||
|
||
* [Assign Memory Resources to Containers and Pods](/docs/tasks/configure-pod-container/assign-memory-resource/) | ||
|
||
* [Configure Quality of Service for Pods](/docs/tasks/configure-pod-container/quality-service-pod/) | ||
|
||
### Для администраторов кластера | ||
|
||
* [Configure Default Memory Requests and Limits for a Namespace](/docs/tasks/administer-cluster/memory-default-namespace/) | ||
|
||
* [Configure Default CPU Requests and Limits for a Namespace](/docs/tasks/administer-cluster/cpu-default-namespace/) | ||
|
||
* [Configure Minimum and Maximum Memory Constraints for a Namespace](/docs/tasks/administer-cluster/memory-constraint-namespace/) | ||
|
||
* [Configure Minimum and Maximum CPU Constraints for a Namespace](/docs/tasks/administer-cluster/cpu-constraint-namespace/) | ||
|
||
* [Configure Memory and CPU Quotas for a Namespace](/docs/tasks/administer-cluster/quota-memory-cpu-namespace/) | ||
|
||
* [Configure a Pod Quota for a Namespace](/docs/tasks/administer-cluster/quota-pod-namespace/) | ||
|
||
* [Configure Quotas for API Objects](/docs/tasks/administer-cluster/quota-api-object/) |
Oops, something went wrong.