Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

Как автоматизировать деплой с использованием Kubernetes

Kubernetes — оркестратор данных, или платформа для управления виратуальными пакетами. Рассказываем, как автоматизировать деплой с помощью Kubernetes, и рассматриваем реальные рейсы.

515 открытий4К показов
Как автоматизировать деплой с использованием Kubernetes

Что такое Kubernetes и зачем он нужен

Kubernetes (или K8s) — это открытая система содержания контейнеров, которая автоматизирует развёртывание, масштабирование и управление контейнерными приложениями. Разработали её энтузиасты из Google: Джо Беда, Брендан Бёрнс и Крейг МакЛаки. А позже Kubernetes была передана подразделению Linux Foundation с открытым исходным кодом.

Kubernetes — это платформа для работы с виртуальными контейнерами данных, которая позволяет хранить и обеспечивать работу контейнеров и узлов в частности.

Kubernetes мониторит состояние контейнеров данных, поддерживает связи между ними или изолирует их друг от друга при необходимости. Кроме того, он следит за нагрузкой на систему и позволяет оперативно масштабировать систему. В этом и есть весь смысл определения Kubernetes как оркестратора данных: он «говорит», кому, когда и насколько «громко» нужно «играть». Каждый контейнер — это «музыкант».

Из чего состоит Kubernetes

Объясняем на примере сотрудников:

  • Pod (под), сотрудник низшего звена — это наименьшая единица развёртывания в Kubernetes, которая представляет собой один или несколько контейнеров, работающих вместе. Каждый под имеет свой IP-адрес и общую файловую систему.
  • Node (узел), менеджер — это рабочая машина в кластере; то, что запускает работу программ. Это может быть виртуальная или физическая машина. В каждом узле работает агент kubelet, который отвечает за управление подов на этом узле.
  • Кластер, старший менеджер, состоит из одного или нескольких узлов, которые объединены для совместной работы. Кластер управляется Control Plane.
  • Etcd, управляющий, — база данных, которая хранит всю информацию и зависимости, необходимые для правильной работы кластеров. Иначе кластеры будут функционировать неправильно. Именно Etcd проверяет состояние работы всех кластеров, узлов и подов для правильной и корректной работы всей системы.
  • Control Plane (управляющий слой или панель управления), директор, — это интерфейс для развёртывания контейнерных приложений и управления кластером. Состоит из нескольких ключевых компонентов: kube-apiserver — интерфейс API для взаимодействия с кластером, kube-scheduler — отвечает за планирование, kube-controller-manager — выполняет разнообразные задачи контроллеров, cloud-controller-manager — интегрируется с облачными провайдерами для управления ресурсами кластера.

Различные модели развертывания обеспечивают гибкость при управлении приложениями:

  • Deployment используется для масштабирования, обновления версий приложения без прерываний работы пользователей;
  • StatefulSet нужен для управления состоянием приложений;
  • DaemonSet гарантирует, что копия pod будет запущена на каждом узле кластера. DaemonsSet используют для сбора логов мониторинга системных ресурсов.

Kubernetes поддерживает работу и с другими системами, например, с Docker. Если коротко: Docker используется для «упаковки» приложений в контейнеры, а K8s — для управления контейнерами. Для того чтобы все приложения и зависимости работали корректно, их в первую очередь нужно правильно «упаковать» и подготовить к оркестровке — здесь и приходит на помощь Docker. Использование Kubernetes и Docker вместе позволяет разработчикам быстрее писать код, правильно его подготавливать для использования приложениями и умело управлять всеми приложениями и зависимостями в контейнерах.

У Docker есть функции и инструменты, которые помогают предупредить возможные ошибки на разных этапах: например, функция автоматической сборки, рекомендации по уязвимостям, а использование Docker Hub позволяет забыть о возможных угрозах безопасности образов.

Что такое автоматизация деплоя

Автоматизация деплоя — это процесс, при котором развёртывание приложений осуществляется с минимальным участием человека. Основная цель здесь — именно сокращение ручных операций для снижения вероятности ошибок и увеличения скорости развёртывания контейнеров.

Процесс автоматизации включает в себя работу с локальными серверами разработки и облачными платформами.

Ещё плюсы — автоматизация Kubernetes:

  1. Для стандартизации процессов, которая обеспечивает стабильное поведение и открываемость приложений в разных средах;
  2. Возможность легко масштабировать приложение без долгого времени на настройку.

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

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

Автоматизированные процессы исключают человеческий фактор, — здесь должна быть картинка «я что-то нажал и оно всё сломалось» :) — а это, в свою очередь, значительно повышает надёжность всей системы за счёт стандартного скрипта поведения приложений при каждом запуске.

Любые масштабы — ещё один плюс автоматизации. Добавьте новые сервера или среды без необходимости дополнительной ручной настройки.

Как настроить окружение Kubernetes для деплоя

В первую очередь (ну а вдруг вы ещё не установили K8s и Docker) — базовые рекомендации:

Как автоматизировать деплой с использованием Kubernetes 1
  (Установите Docker Desktop, проработайте процес контейнеризации, убедитесь, что K8s включена в Docker Desktop https://docs.docker.com/guides/deployment-orchestration/kube-deploy/)  
  1. Для начала необходимо подготовить сервера. Как правило, для этого используют виртуальные машины или облачные сервисы (например, AWS, GCP). Убедитесь, что на всех узлах установлены необходимые зависимости: Docker и kubeadm.
  2. Установите kubeadm, kubelet и kubectl;
  3. На главном узле запустите команду для инициализации мастера узла;
  4. Настройка сетевого плагина — для этого установите Flannel.

Создание и конфигурация кластера включает в себя следующие этапы:

  • Подготовка серверов (обновление ОС, правильно заданное время хоста, добавление репозитория, инсталляция пакетов, необходимых для кластера, запуск Docker и kubelet, установка кластера);
  • Установка мастера;
  • Настройка виртуальной сети;
  • Подключение вычислительных узлов;
  • Управление кластером с узлов, не принадлежащих кластеру;
  • Установка и получение доступа к Web-UI;
  • (опционально) установка WeaveScope;
  • Запуск приложения.

Подготовка приложения к деплою

Здесь обязательные шаги — это подготовка окружения (развёртывание кластера, проверка, настройка container registry), подготовка репозитория, создание набора ресурсов в Deployment, настройка Service, настройка Ingress и ввод команды «werf converge» для сборки и развёртывания приложения.

Как автоматизировать деплой с Kubernetes

  1. Первый шаг — это создание Deployment манифестов. Deployment манифесты позволяют управлять репликами подов. 
  2. Второй шаг — автоматическое масштабирование. HorizontalPodAutoscaler автоматически увеличивает или уменьшает количество подов в зависимости от нагрузки. 
  3. Третий шаг — использование ConfigMaps и Secrets. ConfigMaps управляет конфигурацией приложений вне контейнеров, а Secrets обеспечивает безопасное хранение конфиденциальных данных. 
  4. Четвёртый шаг — настройка Service и Ingress. Service даёт стабильный IP-адрес для взаимодействия с подами, а Ingress помогает управлять внешним доступом к сервисам внутри кластера.

Какие инструменты нужны для автоматизации CI/CD с Kubernetes

  • Helm упрощает управление приложениями в Kubernetes. 
  • GitOps c ArgoCD и Flux. ArgoCD обеспечивает непрерывную доставку через GitOps. Flux также можно использовать для GitOps’а. 
  • Такие инструменты, как Jenkins, GitLab CI, CircleCI можно интегрировать с Kubernetes через плагины или скрипты.

Как мониторить деплои и управлять ими

  • Prometheus и Grafana используются для мониторинга состояния кластера и его компонентов. 
  • Elasticsearch, Fluentd и Kibana-стек обеспечивают масштабируемое логирование в Kubernetes. 
  • Kubernetes допускает возможность отката до предыдущих версий в случае непредвиденных ошибок при обновлении деплоя.

Всё это может звучать сложно, однако правильная настройка сервисов и инструментов при автоматизации значительно упрощает процесс ввода деплоя в продакшн.

Несколько советов для автоматизации деплоя

Корректное управление версиями и окружениями — самый важный фактор для успешной автоматизации деплоя в Kubernetes. Вот несколько советов:

  • Используйте семантическое версионирование (semver) — легко контролируйте изменения: от исправления ошибок и введения новых функций до внесения значительных изменений в код.
  • Применяйте неизменяемые теги для контейнерных образов — так каждый деплой будет использовать выбранную версию приложения.
  • Разделяйте разные окружения (development, staging, production) с помощью namespaces — так данные будут надёжно изолированы.
  • Используйте ConfigMaps и Secrets для каждого окружения отдельно.

Как достичь безопасности и доступности серверов х100 с помощью Kubernetes:

  • Настройте роли и права доступа для пользователей и сервисов — лучше до минимально возможного уровня доступа.
  • Используйте инструмент Network Policies для управления трафиком между подами внутри кластера.
  • Включите PSP для контроля над тем, какие поды могут быть развёрнуты в кластере.
  • Автоматизируйте масштабирование подов на основе нагрузки.
  • Используйте PDBs для управления перерывами в работе приложений, например, во время обновлений.

Как сократить затраты на инфраструктуру:

  • Устанавливайте запросы и лимиты ресурсов CPU/Memory для каждого пода. Это предотвращает неопределённое поведение при перегрузке системы.
  • Настройте правила размещения подов на узлах кластера для лучшей балансировки нагрузки.
  • Используйте Spot Instances для автоматизации мелких задач.
  • Используйте Cluster Autoscaler для автоматического добавления или удаления узлов в зависимости от потребностей нагрузки.

Какие есть примеры автоматизации деплоя с помощью Kubernetes

№1 — Автоматизация деплоя для микросервисного приложения

Проект: Exerica, ИИ-инструмент для анализа финансовых и статистических документов.

Ранее использовалось: GitLab, Docker Swarm с помощью Ansible.

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

Что выбрали: self-managed Kubernetes.

Дополнительные инструменты: Helm, ExternalDNS, cert-manager

Этапы автоматизации: разработка структуры диаграмм для Helm, сборка диаграмм, создание единой конфигурации, унификация шаблонов, развёртывание релиза.

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

№2 — Использование GitOps для управления кластерами Kubernetes

Проект: ИТМО, научно-образовательная корпорация.

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

Ранее использовалось: код в GitLab → мастер-ветка с помощью любого CI/CD инструмента → установка в кластер с помощью команды «helm install». Но схема была на самая удобная, поскольку требовала от девопсов слишком много сил и времени на управление приложениями.

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

Этапы автоматизации: выбор в качестве GitOps-оператора ArgoCD, настройка ArgoCD, настройка Application, настройка AppProject, настройка ApplicationSet.

Результат: ИТМО свела к минимуму участие девопсов в деплое, поскольку переехали на другую методологию развертывания. С GitOps появилось дополнительное приложение, позволяющее следить за изменениями проектов в сравнении с заданными в git конфигами. Теперь гораздо проще управлять сотнями приложений в кластере.

№3 — Настройка CI/CD процесса с Jenkins и Kubernetes для крупного проекта

Проект: TestProject, платформа контроля качества с ИИ-инструментами.

Какие проблемы решает интеграция Jenkins и Kubernetes: поддержка серверов (сборки, среды тестирования, оркестровка), автоматическое развёртывание параллельных сред, естественная интеграция с процессами разработки и выпуска микросервисов.

Как автоматизировать деплой с использованием Kubernetes 2

Этапы автоматизации: установка и настройка Jenkins x Serverless, импорт существующего проекта в Jenkins (создание нового репозитория, добавление необходимых файлов для Jenkins, создание пользовательских пакетов сборки для Jenkins, выбор источника для пакетов сборки, добавление поддержки модульного тестирования), интеграционное тестирование в Jenkins с помощью API.

Заключение

Kubernetes — классное решение для оркестровки контейнеров как для микросервисных, так и для крупных проектов. А использование дополнительных решений — Jenkins, GitOps, Docker — позволяет упростить работу по подготовке и развёртыванию деплоя, а также сборку приложений.

А что вы думаете об автоматизации развёртывания Kubernetes? Поделитесь своим опытом в комментариях к этой статье — будем рады почитать вашу обратную связь!

Следите за новыми постами
Следите за новыми постами по любимым темам
515 открытий4К показов