Облачная платформаВсе платформы

Настройка спецификаций Контейнера

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сценарий

CCE позволяет задавать запросы ресурсов и лимиты, такие как CPU и RAM, для добавляемых контейнеров при создании рабочей нагрузки. Kubernetes также позволяет использовать YAML для задания требований к другим типам ресурсов.

Запрос и Лимит

Для CPU и Память, значения Запрос и Лимит следующие:

  • Запрос: Система планирует под на узел, который удовлетворяет требованиям развертывания рабочей нагрузки на основе значения запроса.
  • Лимит: Система ограничивает ресурсы, используемые рабочей нагрузкой, на основе значения лимита.

Если узел имеет достаточные ресурсы, под на этом узле может использовать больше ресурсов, чем запрошено, но не более лимита.

Например, если вы задаете запрос памяти пода в 1 ГиБ и его лимит в 2 ГиБ, и под планируется на узел с 8 ГиБ памяти (без запущенных других подов), под может использовать более 1 ГиБ памяти при высокой нагрузке, но его использование памяти будет ограничено 2 ГиБ. Если процесс в контейнере пытается использовать более 2 ГиБ ресурсов, ядро системы пытается завершить процесс. В результате возникает ошибка out of memory (OOM).

Note

При создании рабочей нагрузки рекомендуется установить верхние и нижние лимиты ресурсов CPU и памяти. Если верхние и нижние лимиты ресурсов не установлены для рабочей нагрузки, утечка ресурсов этой нагрузки сделает ресурсы недоступными для других нагрузок, развернутых на том же узле. Кроме того, нагрузки без верхних и нижних лимитов ресурсов нельзя будет точно мониторить.

Конфигурация

В реальных сценариях рекомендуется соотношение Запрос к Лимит составляет примерно 1:1.5. Для некоторых чувствительных сервисов рекомендуемое соотношение 1:1. Если Запрос слишком мал, а Лимит слишком велик, ресурсы узла переосвоены. В периоды пиковых нагрузок память или CPU узла могут быть исчерпаны. В результате узел становится недоступным.

  • Квота CPU: единицей ресурсов CPU является ядро, которое может быть выражено количеством или целым числом с суффиксом единицы (m). Например, 0.1 ядра в количественном выражении эквивалентно 100m в выражении. Однако Kubernetes не допускает ресурсы CPU с точностью менее 1m.
    Таблица 1 Квоты CPU

    Параметр

    Описание

    Запрос CPU

    Минимальное количество ядер CPU, требуемое Контейнером. Ресурсы планируются для контейнера на основе этого значения. Контейнер может быть запланирован на узел только тогда, когда общее количество доступных ядер CPU на узле больше или равно количеству ядер CPU, запрошенных контейнером.

    Лимит CPU

    Максимальное количество ядер CPU, доступных Контейнеру.

    Рекомендованная конфигурация

    Фактическое доступное количество CPU узла ≥ Сумма лимитов CPU всех контейнеров на текущем узле ≥ Сумма запросов CPU всех контейнеров на текущем узле. Вы можете просмотреть фактическое доступное количество CPU узла в консоли CCE (Управление ресурсами > Узлы > Выделяемый).

  • Квота памяти: единицей ресурсов памяти по умолчанию является байт. Вы также можете использовать целое число с суффиксом единицы, например, 100 Mi. Обратите внимание, что единица чувствительна к регистру.
    Таблица 2 Описание квот памяти

    Параметр

    Описание

    Запрос памяти

    Минимальный объём памяти, требуемый Контейнером. Ресурсы планируются для контейнера на основе этого значения. Контейнер может быть размещён на узле только тогда, когда общее доступное количество памяти на узле больше или равно запрашиваемой контейнером памяти.

    Лимит памяти

    Максимальный объём памяти, доступный Контейнеру. Когда использование памяти превышает настроенный лимит памяти, экземпляр может быть перезапущен, что влияет на нормальное использование рабочей нагрузки.

    Рекомендованная конфигурация

    Фактическая доступная память узла ≥ Сумма лимитов памяти всех контейнеров на текущем узле ≥ Сумма запросов памяти всех контейнеров на текущем узле. Вы можете просмотреть фактическую доступную память узла в консоли CCE (Управление ресурсами > Узлы > Выделяемый).

Note

Выделяемые ресурсы рассчитываются на основе значения запроса ресурса (Запрос), которое указывает верхний предел ресурсов, которые могут запрашиваться подами на этом узле, но не отражает фактические доступные ресурсы узла (подробности см. Пример использования квот CPU и памяти). Формула расчёта следующая:

  • Выделяемый CPU = Всего CPU – Запрошенный CPU всех подов – Зарезервированный CPU для других ресурсов
  • Выделяемая память = Всего памяти – Запрошенная память всех подов – Зарезервированная память для других ресурсов

Пример использования квот CPU и памяти

Предположим, что Кластер содержит узел с 4 ядрами CPU и 8 ГиБ памяти. На кластере развернуты два пода (под 1 и под 2). Под 1 переосваивает ресурсы (то есть Лимит > Запрос). Спецификации двух подов следующие.

Под

Запрос CPU

Лимит CPU

Запрос памяти

Лимит памяти

Под 1

1 ядро

2 ядра

1 ГиБ

4 ГиБ

Под 2

2 ядра

2 ядра

2 ГиБ

2 ГиБ

Использование CPU и памяти узла следующее:

  • Выделяемые CPU = 4 ядра – (1 ядро, запрошенное подом 1 + 2 ядра, запрошенное подом 2) = 1 ядро
  • Выделяемая память = 8 ГиБ – (1 ГиБ, запрошенный подом 1 + 2 ГиБ, запрошенный подом 2) = 5 ГиБ

В этом случае оставшееся 1 ядро и 5 ГиБ могут быть использованы следующим новым подом.

Если под 1 находится под высокой нагрузкой в пиковые часы, он будет использовать больше CPU и памяти в пределах лимита. Поэтому фактические выделяемые ресурсы меньше, чем 1 ядро и 5 ГиБ.

Квоты других ресурсов

Обычно узлы поддерживают локальное временное хранилище, которое предоставляется локально смонтированными записываемыми устройствами или ОЗУ. EV не обеспечивает долгосрочную доступность данных. Подам можно использовать локальные EV для буферизации данных и хранения логов, либо монтировать тома emptyDir в контейнеры. Подробности см. Локальное временное хранилище.

Kubernetes позволяет указывать запрошенное значение и значение лимита временного хранилища в конфигурациях контейнера для управления локальным временным хранилищем. Для каждого контейнера в поде можно настроить следующие атрибуты:

  • spec.containers[].resources.limits.ephemeral-storage
  • spec.containers[].resources.requests.ephemeral-storage

В следующем примере под содержит два контейнера. Запрошенное значение каждого контейнера для локального временного хранилища составляет 2 ГиБ, а значение лимита — 4 ГиБ. Поэтому запрошенное значение пода для локального временного хранилища составляет 4 ГиБ, значение лимита — 8 ГиБ, а том emptyDir использует 500 МиБ локального временного хранилища.

apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: container-1
image: <example_app_image>
resources:resources:
requests: requests:
ephemeral-storage: "2Gi" ephemeral-storage: "2Gi"
limits: limits:
ephemeral-storage: "4Gi" ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
- name: container-2
image: <example_log_aggregator_image>
resources:resources:
requests: requests:
ephemeral-storage: "2Gi" ephemeral-storage: "2Gi"
limits: limits:
ephemeral-storage: "4Gi" ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
volumes:
- name: ephemeral
emptyDir:emptyDir:
sizeLimit: 500Mi sizeLimit: 500Mi