Как задеплоить приложение (step-by-step)

Создание нагрузок в неймспейсе и проверка статуса развёртывания.

Развёртывание приложения выполняется через создание объектов Kubernetes в разделе Нагрузки выбранного неймспейса. Рабочая нагрузка (workload) в Kubernetes запускается в подах, а для production-сценариев подами обычно управляют контроллеры: они поддерживают нужное количество подов, пересоздают их при сбоях и применяют изменения из манифеста.

Выберите тип нагрузки под задачу:

Тип нагрузкиКогда использовать
DeploymentStateless-приложения, rolling update, rollback, масштабирование реплик. Deployment управляет ReplicaSet, а ReplicaSet поддерживает нужное количество подов.
StatefulSetStateful-сервисы, которым нужны устойчивые имена подов, порядок запуска/обновления и постоянные тома через PersistentVolumeClaim.
DaemonSetАгенты и демоны, которые должны запускаться на каждом подходящем узле: мониторинг, логирование, сетевые компоненты.
JobРазовая задача, которая должна выполниться до завершения.
CronJobПериодическая задача по cron-расписанию.
PodРазовые или отладочные случаи. Для production используйте Deployment, StatefulSet, DaemonSet, Job или CronJob.
ReplicaSetОбычно создаётся и управляется Deployment. В интерфейсе доступен для просмотра, но параметры ReplicaSet редактируют через Deployment.

Официальное описание объектов workload см. в документации Kubernetes: Workloads.


Что подготовить до деплоя

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

  1. Опубликуйте образ в ваш внутренний registry.
  2. Используйте стабильные теги версий вместо latest в production: например, v1.0.0, semver или git-sha.
  3. Если ваш приватный registry не требует аутентификации, достаточно указывать его адрес в манифестах нагрузки. Для настройки аутентификации приватного registry см. Как подключить приватный registry.
  4. Если в кластере включены политики проверки подписей образов, подпишите образ и передайте публичный ключ в политику. Подробнее — Подпись контейнеров и проверка образов.

Шаг 1. Выберите кластер и неймспейс

  1. В левом меню выберите нужный кластер.
  2. Выберите целевой неймспейс из списка доступных (отображаются только неймспейсы, к которым у вас есть права доступа).

Шаг 2. Создайте нагрузку

Перейдите в раздел Нагрузки и выберите тип объекта. На вкладке Deployments отображается перечень созданных деплойментов в контексте неймспейса. В списке Deployments можно удалить один объект или несколько сразу. Как выбрать объекты и подтвердить удаление — в разделе Множественное удаление.

Deployment

Deployment управляет и масштабирует поды приложения: создаёт ReplicaSet, поддерживает нужное количество реплик, применяет обновления, позволяет откатывать версии и восстанавливает поды при сбоях. Это основной вариант для stateless-приложений.

  1. Нажмите + Добавить Deployment.
Скриншот: создание Deployment

Создание Deployment

  1. Заполните описание деплоймента.

Блок «Управление развертыванием»:

  • количество реплик — по умолчанию 1;
  • тип деплоймента — по умолчанию RollingUpdate;
  • приостановлен ли деплоймент — по умолчанию значение не задано;
  • для типа RollingUpdate — максимальное значение недоступных и дополнительных реплик, по умолчанию 25%;
  • ProgressDeadlineSeconds — время ожидания развертывания в секундах, прежде чем оно будет признано завершённым с ошибкой; по умолчанию 600 сек (10 минут);
  • RevisionHistoryLimit — количество ReplicaSets для возможности отката; по умолчанию 10.
Скриншот: шаблон пода

Шаблон пода

Блок «Шаблон пода» (Pod template):

  • использовать ли hostPID — по умолчанию не выбрано;
  • использовать ли сеть хоста — по умолчанию не выбрано;
  • Image Pull Secrets — выберите секреты из выпадающего списка (секреты создаются на вкладке Хранилище раздела Неймспейс);
  • приоритет пода относительно других подов в кластере;
  • имя хоста контейнера;
  • Tolerations — нажмите + и заполните поля;
  • узлы — нажмите + в селекторе узлов;
  • ServiceAccountName — выберите из выпадающего списка;
  • подключение токена учётной записи — по умолчанию не задано.
Скриншот: init-контейнеры

Init-контейнеры

Блоки «Контейнеры инициализации (Init контейнеры)» и «Контейнеры»:

  • имя контейнера;
  • образ;
  • Image Pull Policy — по умолчанию IfNotPresent;
  • команды и аргументы (при необходимости);
  • порты — нажмите + для добавления;
Скриншот: порты

Порты

  • вычислительные ресурсы — requests и limits для CPU (в CPU или m) и Memory (B, Ki, Mi, Gi);
Скриншот: requests и limits

Requests и limits

  • Volume mounts — нажмите +;
Скриншот: volume mounts

Volume mounts

  • переменные окружения — нажмите +.
Скриншот: переменные окружения

Переменные окружения

Подробнее о параметрах шаблона пода, контейнеров, Security context и томов — на вкладке Pod ниже.

  1. Нажмите Добавить.

Просмотр Deployment

На странице просмотра доступны вкладки:

  • Deployment — сведения о дате создания, статусе, состоянии, типе развёртывания, признаке паузы, селекторе подов, количестве реплик и метриках CPU/Memory за последний час;
  • Шаблон пода — контейнеры, init-контейнеры и volumes;
  • HPA — автоматическое горизонтальное масштабирование;
  • VPA — автоматическое вертикальное масштабирование запросов и лимитов CPU/Memory;
  • ReplicaSets — список ReplicaSet, созданных Deployment, с количеством подов, статусом, образом и номером версии;
  • Pods — список подов с фильтрами по имени, неймспейсу, статусу, родительскому объекту, узлу и QoS;
  • Безопасность — результаты сканирования образов и анализа конфигураций, если соответствующие модули установлены в кластере;
  • Лейблы и аннотации, События, Манифест.

На вкладке Deployment доступны кнопки Управление горизонтальным автомасштабированием (переход на вкладку HPA) и Управление вертикальным автомасштабированием (переход на вкладку VPA). Вкладка VPA и кнопка перехода к ней отображаются при наличии права на просмотр VPA.

При наличии прав на изменение Deployment вы можете перезапустить его поды (Rollout Restart) или вернуть к предыдущей версии (Rollout Undo).

Нажатие на кнопку Перезапустить поды запустит команду rollout restart deployment для подов нагрузки. При этом будет выполнено постепенное завершение и запуск новых экземпляров (подов) без прерывания работы Deployment. При этом сами настройки Deployment не меняются. Перед запуском подтвердите действие. Повторный перезапуск недоступен в процесс перезапуска подов или когда обновление Deployment стоит на паузе.

Откатить к предыдущей версии - возвращает Deployment к одной из сохранённых версий (ревизий), восстанавливая ранее известное стабильное состояние приложения без простоя. В окне Rollout Undo <имя> выберите необходимую Версию, которую требуется восстановить. В списке у каждой строки номер ревизии, имя ReplicaSet и дата его создания. Если версия одна, поле Версия уже заполнено.

Версию хранит ReplicaSet: номер ревизии записан в его аннотации deployment.kubernetes.io/revision. Новая версия появляется, только когда меняется шаблон пода. Изменение числа реплик не приводит к созданию новой версии. Перезапуск подов не меняет образ и остальные настройки, но Kubernetes считает его изменением шаблона и поэтому создаётся ReplicaSet со следующим номером. На вкладке ReplicaSets версия, на которой Deployment работает сейчас, отмечена как Текущая.

Номер при откате не уменьшается1. Kubernetes подставляет шаблон выбранной ревизии и записывает откат как новую версию. Количество сохраняемых версий ReplicaSet задаётся revisionHistoryLimit нагрузки, по умолчанию установлено 10.

1 Пример: Deployment с одним подом сразу после создания имеет версию 1 и один ReplicaSet. После перезапуска подов появляется второй ReplicaSet с версией 2, она становится текущей, а в окне отката можно выбрать только версию 1. После отката на версию 1 приложение снова работает с первым шаблоном, но тот же ReplicaSet получает следующий номер и отмечается как текущая версия 3. Версии 1 в списке больше нет и следующий откат предложит версию 2. Каждый следующий откат снова увеличивает номер ревизии.

Скриншот: шаблон пода Deployment

Шаблон пода Deployment

Скриншот: ReplicaSets Deployment

ReplicaSets Deployment

Скриншот: безопасность Deployment

Безопасность Deployment

StatefulSet

StatefulSet разворачивает набор подов с устойчивыми идентификаторами и сохранением данных при перезапуске; гарантирует уникальные имена и устойчивую сетевую идентичность подов.

  1. Нажмите + Создать StatefulSet.
  2. В блоке Описание задайте имя StatefulSet.
  3. При необходимости определите лейблы и совпадающие лейблы подов в блоке Селектор подов.
  4. Задайте спецификацию:
    • количество реплик;
    • количество партиций;
    • minReadySeconds;
    • revisionHistoryLimit — по умолчанию 10;
    • podManagementPolicy: OrderedReady (по умолчанию) или Parallel;
    • serviceName;
    • политика хранения PersistentVolumeClaim — whenDeleted и whenScaled (по умолчанию Retain, также доступно Delete).
  5. Определите шаблоны PersistentVolumeClaim: нажмите +, задайте имя, Access Modes (по умолчанию ReadWriteOnce), Storage Class Name, размер (B, Ki, Mi, Gi) и нажмите Сохранить.

Доступные режимы доступа PVC:

  • ReadWriteOnce (RWO) — чтение и запись только с одного узла;
  • ReadOnlyMany (ROX) — только чтение с нескольких узлов;
  • ReadWriteMany (RWX) — чтение и запись с нескольких узлов;
  • ReadWriteOncePod (RWOP) — чтение и запись только одним подом.

Storage Class Name указывает класс хранилища, например, standard, fast или slow. Размер PVC задаётся в стандартных единицах Kubernetes: B, Ki, Mi, Gi.

Скриншот: шаблон PVC

Шаблон PVC

  1. Определите init-контейнеры и/или контейнеры, шаблон пода; при необходимости назначьте Volumes. Параметры шаблона пода и контейнеров — как при создании Pod (см. вкладку Pod ниже).

Просмотр и редактирование StatefulSet

На странице просмотра доступны вкладки StatefulSet, Pods, Шаблон пода, VPA, Шаблоны PVC, Безопасность, Лейблы и аннотации, События, Манифест. Во вкладке StatefulSet отображаются partition, minReadySeconds, revisionHistoryLimit, podManagementPolicy, serviceName, политика хранения PVC, селектор подов и метрики CPU/Memory за последний час. На вкладке StatefulSet доступна кнопка Управление вертикальным автомасштабированием — переход на вкладку VPA. Вкладка VPA и кнопка отображаются при наличии права на просмотр VPA.

При наличии прав на изменение StatefulSet вы можете перезапустить его поды (Rollout Restart) или вернуть предыдущую версию (Rollout Undo).

Нажатие на кнопку Перезапустить поды запустит постепенное завершение и запуск новых подов без прерывания работы StatefulSet. При этом имена подов сохраняются, настройки самого StatefulSet не меняются. Перед запуском подтвердите действие. Повторный перезапуск недоступен, пока идёт перезапуск подов или когда обновление StatefulSet стоит на паузе.

Откатить к предыдущей версии возвращает StatefulSet к одной из сохранённых версий (ревизий) и восстанавливает ранее известное стабильное состояние приложения без простоя. Ревизию хранит ресурс ControllerRevision. Версию для восстановления возможно выбрать в окне Rollout Undo <имя>: у каждой строки номер, имя ревизии и дата создания. Номер при откате не уменьшается и выбранный шаблон записывается как следующая ревизия.

Скриншот: страница StatefulSet

Страница StatefulSet

Редактировать можно спецификацию StatefulSet, политику хранения PVC, шаблон пода, init-контейнеры, контейнеры и volumes. Также можно изменить YAML на вкладке Манифест: после изменения выполните Проверить, затем сохраните результат.

DaemonSet

DaemonSet обеспечивает запуск пода на каждом узле кластера; количество реплик не задаётся.

  1. Нажмите + Создать DaemonSet.
  2. В блоке Описание задайте имя DaemonSet.
  3. При необходимости определите лейблы и совпадающие лейблы подов в блоке Селектор подов.
  4. Задайте спецификацию:
    • minReadySeconds — по умолчанию 0;
    • revisionHistoryLimit — по умолчанию 10;
    • максимальное количество недоступных и дополнительных подов.
  5. Определите init-контейнеры и/или контейнеры, шаблон пода; при необходимости назначьте Volumes. Параметры — как при создании Pod (см. вкладку Pod ниже).
Скриншот: страница DaemonSet

Страница DaemonSet

Просмотр и редактирование DaemonSet

На странице просмотра доступны вкладки DaemonSet, Pods, Шаблон пода, Безопасность, Лейблы и аннотации, События, Манифест. Во вкладке DaemonSet отображаются дата создания, статус, состояние, minReadySeconds, revisionHistoryLimit, максимальное количество недоступных и дополнительных подов, селектор подов и метрики CPU/Memory за последний час.

При наличии прав на изменение DaemonSet вы можете перезапустить его поды (Rollout Restart) или вернуть предыдущую версию (Rollout Undo).

Нажатие на кнопку Перезапустить поды запустит постепенное завершение и запуск новых подов на узлах, где работает DaemonSet, без прерывания его работы. Сами настройки DaemonSet не меняются. Перед запуском подтвердите действие. Повторный перезапуск недоступен, пока идёт перезапуск подов или когда обновление DaemonSet стоит на паузе.

Откатить к предыдущей версии возвращает DaemonSet к одной из сохранённых версий (ревизий) и восстанавливает ранее известное стабильное состояние приложения без простоя. Отдельного списка ReplicaSet у DaemonSet нет: ревизию хранит ресурс ControllerRevision. Версию для восстановления выберите в окне Rollout Undo <имя>: у каждой строки номер, имя ревизии и дата создания. Если в списке одна версия, поле Версия предзаполнено. Номер при откате не уменьшается1: выбранный шаблон записывается как следующая ревизия.

1 Если были версии 1 и 2 и вы откатились с 2 на 1, эта ревизия становится версией 3. Следующий откат предложит версию 2.

Редактировать можно спецификацию DaemonSet, шаблон пода, init-контейнеры, контейнеры и volumes. YAML доступен на вкладке Манифест; после изменения выполните проверку и сохраните изменения.

Pod

Pod — минимальная вычислительная единица (один или несколько контейнеров). Отдельные поды подходят для разовых или отладочных задач; для production рекомендуется управлять подами через Deployment, StatefulSet или DaemonSet.

На странице Pods отображаются имя пода, отношение работающих контейнеров к общему количеству контейнеров, количество рестартов, дата создания, неймспейс, статус, родительский объект, узел, QoS и лейблы. Доступны фильтры по имени, неймспейсу, статусу, родительскому объекту, узлу и QoS. В списке подов можно удалить один под или несколько сразу. Как выбрать объекты и подтвердить удаление — в разделе Множественное удаление.

Скриншот: список Pods

Список Pods

  1. Нажмите + Добавить Pod.
Скриншот: создание Pod

Создание Pod

  1. В блоке Спецификация пода задайте hostPID, сеть хоста, политику перезапуска, Image Pull Secrets, Tolerations, селектор узлов, ServiceAccountName и другие параметры.

Политики перезапуска:

  • Always — контейнер перезапускается после любого завершения; значение по умолчанию;
  • OnFailure — контейнер перезапускается только при завершении с ошибкой;
  • Never — завершённый контейнер не перезапускается автоматически.

При настройке Tolerations можно указать ключ и значение taint узла, оператор Exists или Equal, эффект NoSchedule, PreferNoSchedule, NoExecute или Любой, а также tolerationSeconds. Если выбран эффект NoExecute, tolerationSeconds задаёт период, после которого под будет вытеснен с узла. По умолчанию для этого случая используется 5 минут.

Скриншот: tolerations

Tolerations

  1. Настройте Init контейнеры, Контейнеры и Volumes.
Скриншот: шаблон пода

Шаблон пода

Security context пода

На уровне пода можно настроить параметры безопасности, которые применяются ко всем контейнерам:

  • fsGroup — группа файловой системы для изменения владельца и прав файлов при монтировании тома;
  • политика изменения fsGroup: OnRootMismatch или Always. Политика не применяется к томам secret, configMap и emptyDir;
  • runAsGroup, runAsUser, runAsNonRoot;
  • supplementalGroups;
  • параметры ядра sysctl. При небезопасных sysctl под не будет запущен, пока хотя бы на одном узле не будут включены эти параметры;
  • профиль Seccomp: профиль по умолчанию, пользовательский профиль на узле или отключение профиля. Подробнее — Seccomp.
Скриншот: Security context пода

Security context пода

Init-контейнеры и контейнеры

В блоках Init контейнеры и Контейнеры задайте:

  • имя контейнера и образ;
  • рабочий каталог (Workdir), команды и аргументы;
  • Image Pull Policy: Always, IfNotPresent или Never;
  • порты, переменные окружения, requests и limits для CPU/Memory;
  • mounts томов: mountPath, mountPropagation, subPath, subPathExpr;
  • Security context контейнера.

Security context контейнера переопределяет настройки, заданные на уровне пода. Если включён привилегированный режим (privileged: true), контейнер получает все Linux capabilities; профиль Seccomp для такого контейнера в графическом интерфейсе задать нельзя.

Скриншот: Security context контейнера

Security context контейнера

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

Volumes

В блоке Volumes добавьте тома, которые будут смонтированы в контейнеры:

  • ConfigMap — данные конфигурации, при необходимости defaultMode;
  • DownwardAPI — передача в контейнеры сведений о Pod: аннотации, метки, имя, namespace;
  • EmptyDir — эфемерный том для чтения и записи несколькими контейнерами Pod; можно выбрать medium и размер;
  • PersistentVolumeClaim — подключение существующего PVC, при необходимости только для чтения;
  • Secret — конфиденциальные данные, монтируется read-only;
  • HostPath — файл или каталог с файловой системы узла.
Скриншот: параметры ConfigMap volume

Параметры ConfigMap volume

Скриншот: параметры DownwardAPI volume

Параметры DownwardAPI volume

Скриншот: параметры EmptyDir volume

Параметры EmptyDir volume

Скриншот: параметры PVC volume

Параметры PVC volume

Скриншот: параметры Secret volume

Параметры Secret volume

Скриншот: параметры HostPath volume

Параметры HostPath volume

Просмотр Pod

На странице Pod доступны вкладки Pod, Контейнеры, Volumes, Безопасность, Лейблы и аннотации, События, Манифест, Терминал, Логи.

QoS пода определяется по requests и limits контейнеров:

  • Guaranteed — у каждого контейнера request CPU/Memory равен limit CPU/Memory;
  • Burstable — хотя бы у одного контейнера есть request или limit;
  • BestEffort — ни у одного контейнера нет requests и limits.

QoS учитывается при вытеснении подов с узла при Node Pressure: сначала вытесняются BestEffort, затем Burstable, затем Guaranteed.

Вкладка Терминал отображается, если хотя бы в одном контейнере есть shell. Bash не поддерживается. Корректная работа терминала гарантируется только в Google Chrome.

Скриншот: терминал Pod

Терминал Pod

На вкладке Логи можно выбрать контейнер, включить или отключить автообновление, временные метки и предыдущий лог, задать количество записей, диапазон времени, поиск по тексту и скачать .log файл.

Скриншот: логи Pod

Логи Pod

Job

Job управляет выполнением параллельных или одноразовых задач с повторным запуском при сбоях.

  1. Нажмите + Добавить Job.
  2. Заполните Описание, Шаблон задачи (Template Job) и сведения о контейнере. Параметры init-контейнеров, контейнеров и шаблона пода — как при создании Pod (см. вкладку Pod ниже).
  3. Нажмите Сохранить.
Скриншот: страница Job

Страница Job

На странице просмотра Job доступны вкладки Job, Pods, Шаблон пода, Лейблы и аннотации, События, Безопасность, Манифест. Во вкладке Job отображаются состояние, статус, lastScheduleTime, lastSuccessfulTime, completions, completionMode, ttlSecondsAfterFinished, parallelism, backoffLimit, activeDeadlineSeconds, селектор подов и метрики CPU/Memory за последний час.

CronJob

CronJob запускает периодические задачи по cron-расписанию.

  1. Нажмите + Добавить CronJob.
  2. Заполните Описание, Спецификацию CronJob, Шаблон задачи (Template Job) и сведения о контейнере. Параметры контейнеров — как при создании Pod (см. вкладку Pod ниже).
  3. Нажмите Сохранить.
Скриншот: страница CronJob

Страница CronJob

На странице CronJob доступны вкладки CronJob, Pods, Jobs, Шаблон Job, Лейблы и аннотации, События, Безопасность, Манифест. Во вкладке CronJob отображаются расписание, concurrencyPolicy, startingDeadlineSeconds, successfulJobsHistoryLimit, failedJobsHistoryLimit, состояние Приостановлено/Не приостановлено, селектор подов и метрики CPU/Memory за последний час.

Вкладка Jobs содержит Jobs, созданные CronJob, со статусом и образом.

ReplicaSet поддерживает заданное количество идентичных подов и обычно создаётся Deployment. В большинстве сценариев не создавайте и не редактируйте ReplicaSet напрямую: изменяйте Deployment, который им управляет.

На странице ReplicaSets отображаются наборы реплик в неймспейсе. Если ReplicaSet входит в Deployment, его параметры на странице ReplicaSet недоступны для редактирования.

Скриншот: страница ReplicaSet

Страница ReplicaSet

На странице просмотра доступны вкладки ReplicaSet, Pods, Шаблон пода, Безопасность, Лейблы и аннотации, События, Манифест. Во вкладке ReplicaSet отображаются дата создания, статус, родительский объект, количество реплик, minReadySeconds, селектор подов и метрики CPU/Memory за последний час. На вкладке Манифест YAML можно просмотреть и скопировать.


Шаг 3. Проверьте статус развёртывания

  1. Откройте созданную нагрузку в разделе Нагрузки.
  2. Перейдите на вкладку Pods — поды должны перейти в статус Running (или Completed для Job).
Скриншот: вкладка Pods у Deployment

Pods Deployment

На вкладке Pods доступны фильтрация по имени, неймспейсу, статусу, родительскому объекту, узлу и QoS; сортировка по дате создания и количеству рестартов. Возможные значения статуса в фильтре: Running, Pending, Terminating, CrashLoopBackOff, Completed, Failed, Unknown. Нажатие на строку пода открывает страницу просмотра пода. На вкладке Pods у Deployment, ReplicaSet, StatefulSet и DaemonSet можно удалить один под или несколько сразу. Как выбрать объекты и подтвердить удаление — в разделе Множественное удаление.

Цветовая индикация статуса пода:

  • зелёная — RunningПод назначен на узел, все контейнеры созданы., CompletedКонтейнеры завершили работу с кодом выхода 0. Так отображается успешно закончившийся под, например, под Job., SucceededВсе контейнеры завершились успешно и не перезапускаются.;
  • жёлтая — PendingОжидание планирования пода на узел или загрузки образов. Один или несколько контейнеров ещё не готовы к запуску.;
  • красная — TerminatingДля пода запрошено удаление, kubelet выполняет штатное завершение. Пока объект не удалён из API, в статусе отображается Terminating., CrashLoopBackOffКонтейнер завершается с ошибкой и перезапускается заново. Kubernetes увеличивает паузу между попытками запуска., FailedВсе контейнеры завершились. При этом как минимум один из которых завершился с ошибкой.;
  • серая — UnknownНе удалось получить состояние пода. Обычно это означает ошибку связи с узлом, на котором должен выполняться под..
  1. При необходимости посмотрите логи на вкладке Логи страницы пода или события на вкладке События созданной нагрузки.

Подробнее — Траблшутинг нагрузок.


Шаг 4. Изменение и масштабирование

Для автоматического масштабирования доступны два механизма:

  • HPA (Horizontal Pod Autoscaler) — изменяет количество подов по метрикам CPU, Memory или кастомным метрикам. В платформе настраивается для Deployment.
  • VPA (Vertical Pod Autoscaler) — подбирает requests и limits контейнеров на основе данных потребления CPU и Memory. В платформе настраивается для Deployment и StatefulSet.

Для работы HPA по CPU/Memory и для расчёта рекомендаций VPA в кластере должны собираться метрики:

Во избежание конфликтов рекомендуется использовать один способ автомасштабирования для нагрузки: горизонтальное (HPA) или вертикальное (VPA). Если нужны оба механизма, настройте в HPA и VPA контроль разных ресурсов. Например: HPA по CPU и VPA по Memory, либо HPA по кастомной метрике, а VPA по CPU и Memory. Если HPA использует CPU и Memory, используйте VPA в режиме Off или Initial.

Настройте масштабирование в графическом интерфейсе или примените манифест.

HPA и VPA доступны на вкладках нагрузки, а также в разделе Администрирование кластера или неймспейса на странице Кастомные ресурсы:

  • HPA — API-группа autoscaling.k8s.io, ресурс HorizontalPodAutoscaler;
  • VPA — API-группа autoscaling.k8s.io, ресурс VerticalPodAutoscaler.

Масштабирование Deployment или StatefulSet

На вкладке Deployment или StatefulSet страницы просмотра найдите блок количество реплик, измените количество реплик и сохраните изменения.

Скриншот: страница Deployment

Страница Deployment

HPA

В графическом интерфейсе объект HPA встроен вкладкой на страницу Deployment. На вкладке Deployment кнопка Управление горизонтальным автомасштабированием открывает вкладку HPA. Объект создаётся с автоматически сгенерированным именем.

При превышении целевых значений количество подов увеличится в пределах заданного диапазона реплик; при снижении нагрузки — уменьшится. Если метрик несколько, число подов считается по каждой, и берётся большее.

Блок реплик

ПолеПараметр в манифестеОписание
Минимально репликspec.minReplicasОбязательное. Меньше этого числа подов не будет.
Максимально репликspec.maxReplicasОбязательное. Больше этого числа подов не будет.
Фактически репликstatus.currentReplicasСколько подов работает сейчас. Только просмотр.
Состояниеstatus.conditionsГотов ли HPA масштабировать нагрузку. Только просмотр.

Правила политики увеличения репликspec.behavior.scaleUp и Правила политики уменьшения репликspec.behavior.scaleDown ограничивают, как быстро меняется число реплик. Если правила не заданы, используются значения Kubernetes по умолчанию. У обоих блоков одни и те же поля.

ПолеПараметр в манифестеОписание
Тип допустимого изменения политикиselectPolicyКакое правило применить, если их несколько. По умолчанию MaxНаибольшее количество изменения реплик: выбирается правило, которое сильнее меняет число подов. Также доступны MinНаименьшее количество изменения реплик: выбирается правило, которое слабее меняет число подов, DisabledПолностью выключает масштабирование. В правилах уменьшения HPA не уберёт поды, даже если нагрузка упала; в правилах увеличения — не добавит, даже если нагрузка выросла. Другое направление при этом может работать. Пример: Disabled в уменьшении — реплики могут расти, но не сжаться.
Количество разрешенных измененийpolicies[].valueСколько подов или какой процент можно добавить или убрать за период.
Единицы измененияpolicies[].typeКоличество — число в подах, % — в процентах от текущего числа подов.
Период времени разрешенных действий (сек)policies[].periodSecondsПромежуток, за который число подов меняется не больше чем на заданное количество. Пример: 4 и Количество при 60 секундах — за минуту можно добавить или убрать не больше 4-х подов. От 1 до 1800 (30 минут).
Стабилизационный интервал (сек)stabilizationWindowSecondsПериод, в который перепроверяется нагрузка до масштабирования, чтобы не реагировать на случайный короткий скачок. От 0 до 3600 секунд (час). Если не задано: при увеличении 0 (не ждать, добавить сразу), при уменьшении 300 секунд (5 минут). Пример: уменьшение, интервал 300, работает 8 подов. На минуту посетителей стало мало, хватило бы 3. HPA подождёт: если нагрузка быстро вернётся — останется 8; если в течение 5 минут нагрузка низкая — уменьшит.

Можно задать несколько правил (Добавить политику) и удалить лишнее.

Скриншот: HPA

Вкладка HPA: реплики и политики изменения числа реплик

Целевые значения метрикКакую загрузку CPU и памяти считать нормой. Если сейчас выше — HPA добавит поды, если ниже — уберёт можно задать для всех подов нагрузки (вкладка Pod) и для отдельных контейнеров (вкладка Containers) одновременно.

Вкладка PodСредняя загрузка CPU и памяти по всем подам нагрузки. По ней HPA понимает, хватает подов или нет

ПолеПараметр в манифестеОписание
CPUresource.name: cpuДо какой загрузки CPU увеличивать число подов. Если Не задано, CPU не учитывается. UtilizationПроцент от requests контейнеров — в процентах, AverageValueСреднее абсолютное значение по подам — абсолютное значение.
Memoryresource.name: memoryДо какой загрузки Memory увеличивать число подов. Если Не задано, Memory не учитывается. UtilizationПроцент от requests контейнеров — в процентах, AverageValueСреднее абсолютное значение по подам — абсолютное значение.
Значениеresource.target.averageUtilization или resource.target.averageValueКакую загрузку CPU или памяти держать. Для Utilization — в процентах от requests, для AverageValue — абсолютное значение.
Фактические значения метрикstatus.currentMetricsКакая загрузка сейчас. Только просмотр.
Скриншот: целевые значения метрик HPA для пода

Целевые значения метрик HPA, вкладка Pod

Вкладка ContainersЗагрузка выбранного контейнера. Нужна, если в поде несколько контейнеров и важно следить за одним из них

На вкладке Containers метрики контейнеров необязательны. Чтобы задать их, нажмите Добавить метрики контейнера. Пока ничего не добавлено, отображается Контейнерные метрики не настроены. Для каждого контейнера можно задать только один набор метрик. Набор можно Удалить.

ПолеПараметр в манифестеОписание
ContainercontainerResource.containerОбязательное. Какой контейнер измерять — имя из шаблона пода.
CPUcontainerResource.name: cpuДо какой загрузки CPU этого контейнера увеличивать число подов. Если Не задано, CPU не учитывается. UtilizationПроцент от requests контейнера — в процентах, AverageValueСреднее абсолютное значение по этому контейнеру во всех подах — абсолютное значение.
MemorycontainerResource.name: memoryДо какой загрузки Memory этого контейнера увеличивать число подов. Если Не задано, Memory не учитывается. UtilizationПроцент от requests контейнера — в процентах, AverageValueСреднее абсолютное значение по этому контейнеру во всех подах — абсолютное значение.
ЗначениеcontainerResource.target.averageUtilization или containerResource.target.averageValueКакую загрузку этого контейнера держать. Для Utilization — в процентах от requests, для AverageValue — абсолютное значение.
Скриншот: контейнерные метрики HPA не настроены

Контейнерные метрики HPA не настроены

Скриншот: целевые значения метрик HPA для контейнера

Целевые значения метрик HPA для контейнера

VPA

VPA (Vertical Pod Autoscaler) изменяет размер запросов и лимитов CPU и Memory контейнеров на основе данных потребления CPU и Memory. В интерфейсе объект VPA встроен вкладкой на страницы Deployment и StatefulSet. Для одной нагрузки можно создать только один объект VPA.

Вкладка VPA и кнопка Управление вертикальным автомасштабированием отображаются при наличии права на просмотр VPA. Кнопка на вкладке Deployment или StatefulSet открывает вкладку VPA.

На вкладке VPA задайте, когда применять подобранные ресурсы и в каких рамках их считать.

Политика автомасштабированияКогда и как VPA применяет подобранные CPU и память к подам: только посмотреть рекомендации или менять запросы у живых подов

ПолеПараметр в манифестеОписание
Режим обновленияspec.updatePolicy.updateModeКак применять рекомендации к подам. По умолчанию AutoЗадаёт запросы при создании пода и может пересоздать уже работающий под, если запросы сильно отличаются от рекомендации. Сейчас это то же, что Recreate. Также доступны RecreateЗадаёт запросы при создании пода. Если у работающего пода запросы сильно отличаются от рекомендации — удаляет под, контроллер создаёт новый уже с нужными запросами, InitialЗадаёт запросы только когда под создаётся. У уже работающих подов ничего не меняет, OffЗапросы подов не меняет. Рекомендации всё равно считает — можно посмотреть и ничего не применять.
Минимальное количество репликspec.updatePolicy.minReplicasСколько подов должно остаться в работе при масштабировании. Если живых меньше — масштабирование не запустится.
Требования к вытеснению Podsspec.updatePolicy.evictionRequirementsДополнительные условия, без которых VPA не пересоздаст под. Можно не задавать. Если правил несколько — должны выполниться все. Не больше четырёх; одинаковые пары «ресурс + условие» задать нельзя.
РесурсыevictionRequirements[].resourcesК каким ресурсам относится условие: CPU, Memory или одновременно: CPU и Memory. Если выбраны CPU и Memory, достаточно, чтобы условие выполнилось хотя бы по одному.
Условия вытесненияevictionRequirements[].changeRequirementКогда VPA может пересоздать под. Выше запрошенногоРекомендуемые ресурсы больше, чем сейчас в запросах — ресурсы пода увеличивают или Ниже запрошенногоРекомендуемые ресурсы меньше, чем сейчас в запросах — ресурсы пода уменьшают.

Для StatefulSet, если приложение не готово к перерывам в работе (например, база данных без высокой доступности), используйте режимы Initial или Off: VPA не будет пересоздавать поды и ограничится рекомендациями или назначением запросов при обновлении нагрузки.

Скриншот: политика автомасштабирования VPA

Политика автомасштабирования VPA

Политика ресурсовПолитика для подбора CPU и памяти: не меньше и не больше указанных значений и какие ресурсы изменять. Можно задать общее правило для всех контейнеров и отдельно — для конкретного. Правило контейнера важнее общего правила.

Вкладка ПодОбщее правило для всех контейнеров, у которых нет своей политики

ПолеПараметр в манифестеОписание
Разрешено минимально (CPU, Memory)minAllowed.cpu, minAllowed.memoryНижняя граница CPU и память, которые VPA может подобрать. Даже если контейнер потребляет меньше — ниже этого значения не опустится при масштабировании. Если не задано — ограничения нет. Для CPU: CPU, m; для Memory: Gi, Mi, Ki, B.
Разрешено максимально (CPU, Memory)maxAllowed.cpu, maxAllowed.memoryВерхняя граница CPU и память, которые VPA может подобрать. Даже если контейнер потребляет больше — выше этого значения не поднимется при масштабировании. Если не задано — ограничения нет. Для CPU: CPU, m; для Memory: Gi, Mi, Ki, B.
Контролирование request/limitscontrolledValuesЧто менять. По умолчанию Limits и Requests — и запросы, и лимиты (лимит меняется пропорционально запросу). Только Requests — только запросы, лимиты не затрагиваются.
Контролируемые ресурсыcontrolledResourcesКакие ресурсы необходимо контролировать. По умолчанию CPU и Memory. Можно оставить только CPU или только Memory.
Скриншот: политика ресурсов VPA для пода

Политика ресурсов VPA для пода

Вкладка КонтейнерыПравила для одного контейнера. Они важнее общего правила

Политики для отдельных контейнеров необязательны: добавьте их только для тех контейнеров шаблона пода, которым нужны свои ограничения. На один контейнер — одна политика.

ПолеПараметр в манифестеОписание
КонтейнерcontainerNameОбязательное. Имя контейнера из шаблона пода. Для него действуют свои рамки.
АвтомасштабированиеmodeВключён — VPA подбирает ресурсы этому контейнеру. Выключен — контейнер не трогает и рекомендаций по нему не считает.
Разрешено минимально (CPU, Memory)minAllowed.cpu, minAllowed.memoryСамое маленькое CPU и память, которые VPA может подобрать этому контейнеру. Даже если контейнер потребляет меньше — ниже этого значения не опустит. Если не задано — ограничения нет. Для CPU: CPU, m; для Memory: Gi, Mi, Ki, B.
Разрешено максимально (CPU, Memory)maxAllowed.cpu, maxAllowed.memoryСамое большое CPU и память, которые VPA может подобрать этому контейнеру. Даже если контейнер потребляет больше — выше этого значения не поднимет. Если не задано — ограничения нет. Для CPU: CPU, m; для Memory: Gi, Mi, Ki, B.
Контролирование request/limitscontrolledValuesЧто менять у этого контейнера. По умолчанию Limits и Requests — и запросы, и лимиты (лимит меняется пропорционально запросу). Только Requests — только запросы, лимиты не трогает.
Контролируемые ресурсыcontrolledResourcesКакие ресурсы контролировать для этого контейнера. По умолчанию CPU и Memory. Можно оставить только CPU или только Memory.
Скриншот: добавление политики ресурсов контейнера

Добавление политики ресурсов контейнера VPA

Скриншот: политика ресурсов VPA для контейнера

Политика ресурсов VPA для контейнера

После создания VPA все поля доступны для редактирования.

ПолеПараметр в манифестеОписание
Состояния VPAstatus.conditionsРаботает ли VPA. Зелёный — да, красный — есть проблема. Нажмите на тип, чтобы увидеть причинуПочему состояние стало таким, сообщениеПодробности и когда состояние последний раз менялосьlastTransitionTime.
Рекомендации VPAstatus.recommendationПодобранные CPU и память: сколько выделить контейнерам. Пока данных нет — прочерки.

Подготовьте YAML-манифесты и примените объекты через Импорт манифестов.

HPA (Horizontal Pod Autoscaler) изменяет количество подов Deployment или StatefulSet по метрикам CPU, памяти или кастомным метрикам.

Предварительные требования:

  • для HPA по CPU/Memory у контейнеров должны быть заданы requests, иначе метрики не будут рассчитаны.

Метрики type: Resource задают средние CPU и Memory по подам. Метрики type: ContainerResource — по выбранному контейнеру. Если метрик несколько, HPA берёт наибольшее из рассчитанных значений числа реплик.

Правила изменения числа реплик (spec.behavior): scaleUp и scaleDown с selectPolicy (Max, Min, Disabled), списком policies (type: Pods или Percent, value, periodSeconds) и stabilizationWindowSeconds. Если behavior не задан, используются значения Kubernetes по умолчанию.

Пример HPA:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
  namespace: my-namespace
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  behavior:
    scaleUp:
      selectPolicy: Max
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
      - type: Pods
        value: 4
        periodSeconds: 15
    scaleDown:
      selectPolicy: Max
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  - type: ContainerResource
    containerResource:
      name: cpu
      container: app
      target:
        type: Utilization
        averageUtilization: 60

Проверьте статус HPA:

kubectl get hpa my-app-hpa -n my-namespace
kubectl describe hpa my-app-hpa -n my-namespace

В выводе отображаются текущее и желаемое количество реплик, текущие значения метрик и события масштабирования.

VPA (Vertical Pod Autoscaler) подбирает requests и limits контейнеров на основе данных потребления CPU и Memory. В платформе VPA настраивается для Deployment и StatefulSet.

Объект VerticalPodAutoscaler состоит из ссылки на нагрузку (targetRef: apiVersion, kind, name), политики обновления (updatePolicy), политики ресурсов (resourcePolicy) и рассчитанных рекомендаций в статусе. Если рекомендатель не задан, используется рекомендатель по умолчанию.

Предварительные требования:

  • для одной нагрузки создавайте только один объект VPA: несколько VPA на одни и те же поды дают неопределённое поведение.

Режимы работы VPA (spec.updatePolicy.updateMode): AutoЗадаёт запросы при создании пода и может пересоздать уже работающий под, если запросы сильно отличаются от рекомендации. Сейчас это то же, что Recreate, RecreateЗадаёт запросы при создании пода. Если у работающего пода запросы сильно отличаются от рекомендации — удаляет под, контроллер создаёт новый уже с нужными запросами, InitialЗадаёт запросы только когда под создаётся. У уже работающих подов ничего не меняет, OffЗапросы подов не меняет. Рекомендации всё равно считает — можно посмотреть и ничего не применять.

Политика ресурсов задаёт рамки для подбора CPU и памяти:

  • containerName: "*" — общее правило для контейнеров, у которых нет своей политики; правило с именем контейнера важнее;
  • mode: Auto — VPA подбирает ресурсы этому контейнеру, Off — не трогает и рекомендаций по нему не считает;
  • minAllowed / maxAllowed — самое маленькое и самое большое CPU и память, которые VPA может подобрать. Даже если потребление другое — ниже минимума не опустит и выше максимума не поднимет;
  • controlledValues: RequestsAndLimits (по умолчанию — и запросы, и лимиты, лимит меняется пропорционально запросу) или RequestsOnly (только запросы);
  • controlledResources: cpu, memory или оба (по умолчанию оба).

Требования к вытеснению (updatePolicy.evictionRequirements) — дополнительные условия, без которых VPA не пересоздаст под. Все заданные условия должны выполниться. Выше запрошенного (TargetHigherThanRequests) — подобранные ресурсы больше, чем сейчас в запросах, под увеличивают. Ниже запрошенного (TargetLowerThanRequests) — меньше, чем сейчас в запросах, под уменьшают. Если в условии несколько ресурсов, достаточно, чтобы оно выполнилось хотя бы по одному.

Пример VPA:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
  namespace: my-namespace
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Auto"
    minReplicas: 1
    evictionRequirements:
    - resources: ["cpu", "memory"]
      changeRequirement: TargetHigherThanRequests
  resourcePolicy:
    containerPolicies:
    - containerName: "*"
      minAllowed:
        cpu: 100m
        memory: 128Mi
      maxAllowed:
        cpu: "2"
        memory: 4Gi
      controlledResources:
        - cpu
        - memory
      controlledValues: RequestsAndLimits
    - containerName: app
      mode: Auto
      minAllowed:
        cpu: 100m
        memory: 128Mi
      maxAllowed:
        cpu: "1"
        memory: 2Gi
      controlledResources:
        - cpu
        - memory
      controlledValues: RequestsAndLimits

Проверьте VPA:

kubectl get vpa -n my-namespace
kubectl describe vpa my-app-vpa -n my-namespace

Когда рекомендации применены к поду, в аннотациях пода появляются vpaObservedContainers и vpaUpdates, например:

metadata:
  annotations:
    vpaObservedContainers: recommender
    vpaUpdates: 'Pod resources updated by vpa-recommender: container 0: cpu request, memory request, cpu limit, memory limit'

Для StatefulSet без высокой доступности предпочтительны режимы Initial или Off, чтобы VPA не вытеснял поды.

Официальное описание: Vertical Pod Autoscaler, ограничения VPA и совместная работа с HPA.

Создать HPA или VPA можно через импорт манифеста: нажмите иконку импорта, вставьте или загрузите YAML, выполните Проверить и после успешной проверки нажмите Загрузить.

Скриншот: окно импорта манифеста

Окно импорта манифеста

Скриншот: успешная проверка манифеста перед загрузкой

Проверка манифеста пройдена


Безопасность доставки

При создании нагрузки проверьте настройки безопасности подов и образов:

  • задайте runAsUser, runAsGroup, runAsNonRoot и другие параметры Security context там, где это применимо;
  • используйте профили Seccomp для ограничения системных вызовов пода или контейнера. Подробнее — Seccomp;
  • учитывайте, что Security context контейнера переопределяет Security context пода;
  • не включайте привилегированный режим без необходимости: он отменяет часть защит, включая Seccomp;
  • храните учётные данные registry в Kubernetes Secrets, а не в открытом виде в манифестах;
  • используйте подпись контейнерных образов и политики проверки подписей, если это требуется контуром безопасности. Подробнее — Модифицирующие политики и подпись образов.

Вкладка Безопасность у нагрузок показывает результаты сканирования образов на уязвимости и анализа соответствия политикам безопасности, если в кластере установлены соответствующие модули.


Удаление нагрузки

  • Deployment, ReplicaSet, StatefulSet, DaemonSet, Job, CronJob, Pod — в списке можно удалить один объект или несколько сразу; кнопка Удалить на странице просмотра; значок удаления на вкладке Манифест. Как выбрать объекты и подтвердить удаление — в разделе Множественное удаление.
  • CronJob — дополнительно доступны варианты Удалить полностью и Удалить с пересозданием (откроется форма создания с предзаполненными данными удалённой CronJob).
  • Pod — на вкладке Pods у Deployment, ReplicaSet, StatefulSet, DaemonSet, Job и CronJob тоже можно удалить один под или несколько сразу. На странице просмотра: Удалить (корректное завершение) или Удалить принудительно для подов в состоянии Terminating.

Связанные разделы