yandex
Калькулятор ценТарифыАкцииДокументацияО насКарьера в Cloud.ruНовостиЮридические документыКонтактыРешенияРеферальная программаКейсыПартнерство с Cloud.ruБезопасностьEvolutionAdvancedEvolution StackОблако VMwareML SpaceВ чем отличия платформ?БлогОбучение и сертификацияМероприятияИсследования Cloud.ruЛичный кабинетВойтиЗарегистрироватьсяEvolution ComputeEvolution Managed KubernetesEvolution Object StorageEvolution Managed PostgreSQL®Облако для мобильных и веб‑приложенийАналитика данных в облакеEvolution Bare MetalEvolution SSH KeysEvolution ImageСайт в облакеEvolution DNSEvolution VPCEvolution Load BalancerEvolution Magic RouterEvolution DiskХранение данных в облакеEvolution Container AppsEvolution Artifact RegistryEvolution Managed ArenadataDBEvolution Managed TrinoEvolution Managed SparkАналитика данных в облакеEvolution ML InferenceEvolution Distributed TrainEvolution ML FinetuningEvolution NotebooksCurator Anti-DDoSCurator Anti‑DDoS+WAFUserGate: виртуальный NGFWStormWall: Anti-DDoSEvolution TagsEvolution Task HistoryCloud MonitoringCloud LoggingАренда GPUAdvanced Object Storage ServiceAdvanced Elastic Cloud ServerAdvanced Relational Database Service for PostgreSQLРазработка и тестирование в облакеAdvanced Image Management ServiceAdvanced Auto ScalingDirect ConnectCDNCross-platform connectionAdvanced Enterprise RouterAdvanced Cloud Backup and RecoveryAdvanced Data Warehouse ServiceAdvanced Elastic Volume ServiceAdvanced Cloud Container EngineAdvanced FunctionGraphAdvanced Container Guard ServiceAdvanced Software Repository for ContainerAdvanced Document Database Service with MongoDBAdvanced Relational Database Service for MySQLAdvanced Relational Database Service for SQL ServerCloud AdvisorAdvanced Server Migration ServiceAdvanced Data Replication ServiceAdvanced API GatewayAdvanced CodeArtsAdvanced Distributed Message Service for KafkaAdvanced Distributed Message Service for RabbitMQAdvanced DataArts InsightAdvanced CloudTableAdvanced MapReduce ServiceAdvanced Cloud Trace ServiceAdvanced Application Performance ManagementAdvanced Identity and Access ManagementAdvanced Enterprise Project Management ServiceVMware: виртуальный ЦОД с GPUVMware: виртуальный ЦОДУдаленные рабочие столы (VDI)VMware: сервер Bare MetalИнфраструктура для 1С в облакеУдаленные рабочие столыМиграция IT‑инфраструктуры в облако3D-моделирование и рендерингVMware: резервное копирование виртуальных машинVMware: резервный ЦОДVMware: резервное копирование в облакоVMware: миграция виртуальных машин
Поиск
Связаться с нами

Что такое Kubernetes Deployment

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

В этой статье начну с того, как устроен Kubernetes и для чего он нужен, а продолжу описанием роли Deployment, командами для работы и структурой YAML-манифеста. А еще расскажу, как, собственно, управлять приложениями с помощью Deployment.

Инструкции
Иллюстрация для статьи на тему «Что такое Kubernetes Deployment»
Продукты из этой статьи:
Иконка-Evolution Artifact Registry
Evolution Artifact Registry
Иконка-Evolution Container Apps
Evolution Container Apps
Иконка-Evolution Managed Kubernetes
Evolution Managed Kubernetes

Что такое контейнер и для чего нужен Kubernetes

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

Контейнер — изолированный экземпляр приложения, где есть все для его запуска: код, нужные библиотеки, настройки, переменные среды. Благодаря этому контейнер одинаково запустится на вашем ноутбуке, рабочем компьютере или виртуальной машине с разными ОС.

Дарим до 20 000 бонусов
Дарим до 20 000 бонусов
4 000 бонусов — физическим лицам, 20 000 бонусов — юридическим
Содержимое контейнера по слоям. Например, зависимости — все то, что приложение использует для своей работы, в том числе библиотеки и другие приложенияСодержимое контейнера по слоям. Например, зависимости — все то, что приложение использует для своей работы, в том числе библиотеки и другие приложения

Теперь обзорно пройдусь по устройству Kubernetes, чтобы от него плавно перейти к Deployment и его функционалу.

Kubernetes (K8s) — один из самых популярных оркестраторов. K8s масштабирует контейнеры под нагрузку, обеспечивает отказоустойчивость, балансировку нагрузки между узлами кластера и эффективное распределение ресурсов. Без Kubernetes это все пришлось бы делать вручную, а при большом количестве микросервисов это сложно.

Кластер K8s состоит из двух типов узлов: управляющего и рабочих. Расскажу подробнее о каждом.

Мастер-узел (Master node) — управляющий узел, который следит за состоянием рабочих узлов (нод) и управляет их нагрузкой. Например, масштабирует их при необходимости, восстанавливает рабочее состояние, если какой-то контейнер или нода вышли из строя.

Мастер-узел состоит из:

  • ETCD. Надежное распределенное хранилище типа «ключ-значение». Используется для всех данных кластера: конфигураций, информации о состоянии, секретах.

  • API-сервер. Центральная точка доступа к Kubernetes. Принимает REST-запросы, проверяет их и вносит изменения в etcd. Все остальные компоненты взаимодействуют через kube-apiserver.

  • Controller manager. Запускает различные контроллеры: репликации, endpoint, namespace, serviceaccounts. Они поддерживают желаемое состояние системы.

  • Sheduler. Определяет, на какой ноде запустить каждый новый под. Для этого учитывает политики, требования к ресурсам, доступность и ограничения.

Управление всеми компонентами мастер-узла осуществляется с помощью команды kubectl. Работает все так: kubectl отправляет запрос на API-сервер, тот распознает запрос, передает его по цепочке и возвращает обратно. Через команду можно развертывать приложения, проверять состояние ресурсов (подов и сервисов), смотреть логи, масштабировать кластеры и управлять их конфигурацией.

Поды (pods) — это группы тесно связанных контейнеров, которые используют одно и то же сетевое пространство и ресурсы. Внутри одного пода контейнеры свободно обмениваются информацией.

Как устроен кластер KubernetesКак устроен кластер Kubernetes

Рабочая нода (Worker Node) — узел, который отвечает за запуск контейнерных приложений, развернутых в кластере. Он выполняет рабочую нагрузку и содержит компоненты, необходимые для запуска подов.

Из чего состоят рабочие ноды:

  • kube-proxy. Управляет сетевыми правилами и балансировкой, чтобы сделать доступ к сервисам безопасным. Может работать на iptables или на user-space прокси.

  • kubelet. Агент на каждом узле, который получает команды от API-сервера и обеспечивает запуск, остановку, мониторинг контейнеров через container runtime.

  • container, или container runtime. Среда выполнения контейнеров. Из примеров: Docker, containerd или CRI-O.

Что такое Deployment, как он устроен и зачем нужен

Мы разобрались, что из себя представляет K8s. Дальше поговорим о Deployment, или развертывании.

Deployment — объект Kubernetes, который управляет жизненным циклом подов. В его манифесте вы указываете, сколько реплик подов должно работать всегда, в какой версии и количестве копий.

Манифест (manifest) — YAML-конфигурационный файл, или YAML-манифест. Там подробно описаны параметры приложения: сколько экземпляров надо запустить, какие образы контейнеров использовать, какие порты открывать. А еще — какие сущности создавать (поды, деплойменты, сервисы), их параметры, специфика размещения, логика масштабирования и маршрутизации.

Deployment облегчает жизнь разработчикам и администраторам. Вы даете вводные и описания для Deployment, а он управляет подами на основе полученной от вас информации. Расскажу, для чего пригодится развертывание:

  • Поддержание нужного количества экземпляров приложения. Deployment контролирует, чтобы указанное вами количество копий приложения (replicas) работало одновременно. Если какой-то экземпляр падает или становится недоступным, Deployment немедленно создает новый под, чтобы всегда поддерживать заданное количество реплик.

  • Бесшовное обновление. Deployment создает новые реплики приложения с новым кодом и постепенно отключает старые. Так переход на новую версию получается бесшовным, во время обновления приложение не простаивает.

  • Откат к предыдущим версиям. Kubernetes сохраняет историю всех развертываний. Если обновление привело к ошибке или нестабильной работе, вы можете откатить все изменения.

  • Масштабирование прямо во время работы сервиса: вы можете быстро задать большее или меньшее количество реплик.

Запускайте контейнеры в облаке с Evolution Container Apps
Запускайте контейнеры в облаке с Evolution Container Apps
Создавайте микросервисы в готовой облачной среде на основе Docker-образов, а управление всей инфраструктурой доверьте нам.
Узнать больше

Основные компоненты Kubernetes Deployment

Kubernetes Deployment состоит из трех ключевых компонентов: реплик, селекторов и шаблонов. Рассмотрю каждый из них и объясню, что они делают.

Replicas — количество экземпляров

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

Selector — выбор подов

Механизм, который помогает определять, какие именно поды контролировать. Selector сравнивает метки подов и выбирает нужные объекты. Правильная настройка селектора защищает систему от конфликтов и ошибок.

Template — шаблоны подов

Это образец, по которому создаются новые поды. Здесь указывается, какой контейнер использовать, какие порты открыть и какие дополнительные параметры задать.

Пример YAML-манифеста

Покажу, из какого набора параметров состоит YAML-файл и дам к каждому пояснения:

Теперь расшифрую, что в этом файле чем является:

  • apiVersion — версия API Kubernetes для этого объекта.

  • apps/v1 — актуальная версия для Deployment, которая гарантирует поддержку всех фич в продакшене.

  • kind — какой ресурс создается. В примере файла, который привожу выше, создается Deployment — контроллер, который управляет жизненным циклом подов.

  • metadata — служебные поля для идентификации ресурса.

  • name: myapp — уникальное имя ресурса Deployment. Это имя используется для управления Deployment через kubectl.

  • labels: app: myapp — набор меток (label) для поиска, группировки и селекции. Используются в Service, kubectl, selectors.

  • spec — основное тело спецификации для объекта Deployment.

  • replicas: 3 — сколько копий (подов) всегда должно быть запущено одновременно.

  • selector — правило, по которому Deployment выбирает свои поды. Здесь указывается, что управлять надо всеми подами с лейблом app: myapp.

  • template — шаблон, из которого будут создаваться новые поды при деплое, обновлении или восстановлении.

  • metadata.labels — здесь задаются те же лейблы, что и в селекторе.

Важно! selector.matchLabels и template.metadata.labels должны совпадать, иначе контроллер не сможет управлять созданными подами, не будет считать их своими. В итоге поведение контроллера будет непредсказуемым или некорректным.

  • spec.containers — список контейнеров. В одном поде их может быть несколько.

  • name: myapp — имя контейнера. В пределах одного пода оно должно быть уникально, при этом разные контейнеры в разных подах могут называться одинаково.

  • image: nginx:1.25 — адрес docker-образа, который будет запускаться. В моем примере указан официальный nginx версии 1.25.

  • ports.containerPort — объявление, к какому порту контейнера можно обращаться для приложений внутри и вне пода. В моем примере приложение слушает порт 80. Это не открывает порт наружу — для этого нужен Service.

  • env — список переменных окружения, которые будут доступны внутри приложения в контейнере. Здесь внутри контейнера будет доступно ENV=PROD, например, для переключения в боевой режим.

  • volumeMounts — список точек монтирования внешних volume в контейнере.

  • name: myapp-storage — имя volume из секции ниже.

  • mountPath: /data — папка внутри контейнера, куда будет примонтирован volume. Все, что пишется в /data, будет храниться в этом volume.

  • volumes — определение всех volume, которые могут использоваться внутри пода.

  • name: myapp-storage — имя, по которому volume подключается в volumeMounts.

  • emptyDir: {} — встроенный тип volume: временное хранилище, которое при запуске пода создается пустым. Очищается после удаления пода.

Доверьте артефакты Evolution Artifact Registry
Доверьте артефакты Evolution Artifact Registry
Храните Docker-образы, Helm-чарты, DEB- и RPM-пакеты в надежном облаке. Не нужно настраивать инфраструктуру самостоятельно — мы уже позаботились о безопасности.
Узнать больше

Также есть дополнительные команды, которые можно учитывать при описании состояния:

1. resources

Ограничения и гарантии ресурсов поду или контейнеру: CPU и памяти.

  • requests — какое минимальное количество ресурсов планировщик Kubernetes выделит поду.

  • limits — лимит, который контейнер не может превысить. А если попытается, то будет ограничен или убит.

2. probes (health checks)

Позволяют Kubernetes автоматически проверять, «жив» и «готов» ли контейнер.

3. args и command

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

  • command — переопределяет ENTRYPOINT. Нужно начинать с этой программы.

  • args — заменяет и добавляет CMD, или отдельные параметры запуска.

4. envFrom (массовый импорт из ConfigMap/Secret)

Импортирует все ключи из указанных объектов как переменные окружения.

Жизненный цикл Deployment

Жизненный цикл Deployment охватывает несколько ключевых этапов, каждый из которых важен для эффективного управления приложениями и контроля их состояния. Расскажу, что это за этапы и что происходит на каждом из них.

Шаг 1. Создание и развертывание

Вы создаете YAML-манифест или используете Helm-чарт — пакет готовых шаблонов манифестов с настраиваемыми параметрами. С Helm-чартами проще управлять сложными приложениями, так как несколько манифестов собрано в едином пакете.

Команда kubectl apply или helm install отправляет манифест на API-сервер, который сохраняет желаемое состояние: надо указать нужное количество реплик, шаблонов подов и другие параметры. Deployment Controller создаст ReplicaSet, Scheduler назначит ноды, а kubelet запустит на них контейнеры.

Шаг 2. Синхронизация состояния

Через отчеты kubelet Deployment Controller непрерывно отслеживает состояние кластера и сравнивает его с желаемым состоянием, указанным в манифесте. Если поды выходят из строя или не отвечают, контроллер автоматически создает новые, чтобы поддерживать нужное количество активных экземпляров.

Шаг 3. Обновление Deployment

При изменениях в манифесте Deployment (например, при замене образа контейнера) контроллер создает новый ReplicaSet, и поды постепенно заменяются на обновленные.

В случае проблем с новой версией можно вернуться к предыдущей. Kubernetes хранит историю обновлений, что позволяет быстро откатиться назад командой kubectl rollout undo.

Шаг 4. Самовосстановление

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

Шаг 5. Завершение

Когда Deployment достигает конца своего жизненного пути или становится ненужным, его удаляют вместе со всеми связанными ресурсами командой kubectl delete.

Стратегии обновления

Есть две стратегии обновления Deployment:

  • Rolling Update, или постепенное обновление. Deployment постепенно создает поды с новой версией приложения и одновременно удаляет поды со старой. Обновление происходит поэтапно, благодаря чему сервис не простаивает: пока часть подов обновляется, остальные работают.

  • Recreate, или пересоздание. Deployment убивает все существующие поды и создает другие, с обновленной версией. Это приводит к простою на время обновления, но может быть необходимо для приложений, которые не могут работать в двух разных версиях одновременно.

Управляйте контейнерными приложениями в Evolution Managed Kubernetes
Управляйте контейнерными приложениями в Evolution Managed Kubernetes
Гибко выбирайте конфигурацию рабочих и мастер-узлов с гарантированной долей vCPU.
Узнать больше

Базовые команды для работы с Deployment через kubectl

Работа с Deployment в Kubernetes включает несколько основных команд, которые позволяют создавать, проверять, масштабировать, обновлять и удалять приложения. Ниже описываю эти команды для командной строки и рассказываю об их назначении:

  • Создание и применение Deployment:

deployment.yaml — файл с описанием настроек вашего приложения.

  • Проверка статуса Deployment. Чтобы просмотреть, было ли создано развертывание, выполните:

Пример вывода в случае, когда развертывание еще создаетсяПример вывода в случае, когда развертывание еще создается

Если нужна подробная информация, введите:

Пример вывода, когда развертывание создается. Отображается информация о том, сколько подов уже готовоПример вывода, когда развертывание создается. Отображается информация о том, сколько подов уже готово
  • Масштабирование приложений:

Пример команды, если надо увеличить количество экземпляров до пяти:

  • Обновление и откат изменений. Чтобы выполнить обновление, используйте команду:

  • Откат к предыдущей версии приложения:

  • Просмотр истории и удаление Deployment. Узнать историю изменений Deployment можно с помощью команды:

  • Удалить Deployment:

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

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

Я собрал 14 команд, которые пригодятся в повседневной работе с Kubernetes. Вот они:

1. Просмотреть поды во всех пространствах имен (namespaces):

2. Показать ресурсы любого типа, например деплойменты или сервисы:

3. Получить сведения об одном объекте:

4. Вывести логи контейнера:

5. Запустить команду внутри контейнера, нужен доступ через shell:

6. Применить или обновить конфигурацию:

7. Посмотреть события (event) в кластере:

8. Удалить объект:

9. Просмотр всех available namespaces:

10. Сменить namespace по умолчанию:

11. Показать состояние нод:

12. Быстро редактировать объект:

13. Получить все ресурсы текущего namespace:

14. Поиск объектов по меткам:

Заключение

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

Продукты из этой статьи:
Иконка-Evolution Artifact Registry
Evolution Artifact Registry
Иконка-Evolution Container Apps
Evolution Container Apps
Иконка-Evolution Managed Kubernetes
Evolution Managed Kubernetes
25 октября 2025

Вам может понравиться