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

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

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

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

Тип нагрузки Когда использовать
Deployment Stateless-приложения, rolling update, rollback, масштабирование реплик. Deployment управляет ReplicaSet, а ReplicaSet поддерживает нужное количество подов.
StatefulSet Stateful-сервисы, которым нужны устойчивые имена подов, порядок запуска/обновления и постоянные тома через 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 отображается перечень созданных деплойментов в контексте неймспейса.

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 — автоматическое горизонтальное масштабирование;
  • ReplicaSets — список ReplicaSet, созданных Deployment, с количеством подов, статусом и образом;
  • Pods — список подов с фильтрами по имени, неймспейсу, статусу, родительскому объекту, узлу и QoS;
  • Безопасность — результаты сканирования образов и анализа конфигураций, если соответствующие модули установлены в кластере;
  • Лейблы и аннотации, События, Манифест.
Скриншот: шаблон пода 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, Шаблон пода, Шаблоны PVC, Безопасность, Лейблы и аннотации, События, Манифест. Во вкладке StatefulSet отображаются partition, minReadySeconds, revisionHistoryLimit, podManagementPolicy, serviceName, политика хранения PVC, селектор подов и метрики CPU/Memory за последний час.

Скриншот: страница 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, шаблон пода, 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. Нажатие на строку пода открывает страницу просмотра пода.

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

  • зелёная — Running, Completed;
  • жёлтая — Pending;
  • красная — Terminating, CrashLoopBackOff, Failed;
  • серая — Unknown.
  1. При необходимости посмотрите логи на вкладке Логи страницы пода или события на вкладке События созданной нагрузки.

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


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

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

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

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

Страница Deployment

В графическом интерфейсе объект HPA встроен в виде вкладки на страницу объекта Deployment. На вкладке HPA страницы Deployment задайте целевое среднее использование CPU и/или Memory за последние 5 минут. При превышении значения количество подов увеличится в пределах заданного диапазона реплик; при снижении нагрузки — уменьшится. Объект HPA создаётся с автоматически сгенерированным именем и управляется только с этой вкладки. Также объект HPA доступен для создания и редактирования со страницы “Кастомные ресурсы” раздела “Администрирование” кластера и неймспейса.

Скриншот: HPA

Скриншот интерфейса: Скриншот: HPA

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

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

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

HPA

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

  • в кластере должен быть установлен shturval-metrics-collector. Если у вас нет доступа к shturvalserviceconfigs, то наличие установленного сервиса вы можете понять по отображению графиков утилизации CPU и RAM в графическом интерфейсе нагрузки;
  • для HPA по CPU/Memory у контейнеров должны быть заданы requests, иначе метрики не будут рассчитаны.

Пример 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
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

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

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

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


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

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

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

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


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

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

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