Как автоматизировать деплой с использованием Kubernetes
Kubernetes — оркестратор данных, или платформа для управления виратуальными пакетами. Рассказываем, как автоматизировать деплой с помощью Kubernetes, и рассматриваем реальные рейсы.
515 открытий4К показов
Что такое 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:
- Для стандартизации процессов, которая обеспечивает стабильное поведение и открываемость приложений в разных средах;
- Возможность легко масштабировать приложение без долгого времени на настройку.
Самое главное преимущества автоматизации — это ускорение процесса развёртывания приложений. Вручную — много часов, автоматически — несколько минут или даже секунд.
Ещё автоматизация деплоя помогает улучшить контроль версий за счёт интеграции с системами управления версиями (сюда относится Git). Так вы легко сможете отслеживать изменения кода и быстро откатываться к предыдущим версиям, если это необходимо.
Автоматизированные процессы исключают человеческий фактор, — здесь должна быть картинка «я что-то нажал и оно всё сломалось» :) — а это, в свою очередь, значительно повышает надёжность всей системы за счёт стандартного скрипта поведения приложений при каждом запуске.
Любые масштабы — ещё один плюс автоматизации. Добавьте новые сервера или среды без необходимости дополнительной ручной настройки.
Как настроить окружение Kubernetes для деплоя
В первую очередь (ну а вдруг вы ещё не установили K8s и Docker) — базовые рекомендации:
- Для начала необходимо подготовить сервера. Как правило, для этого используют виртуальные машины или облачные сервисы (например, AWS, GCP). Убедитесь, что на всех узлах установлены необходимые зависимости: Docker и kubeadm.
- Установите kubeadm, kubelet и kubectl;
- На главном узле запустите команду для инициализации мастера узла;
- Настройка сетевого плагина — для этого установите Flannel.
Создание и конфигурация кластера включает в себя следующие этапы:
- Подготовка серверов (обновление ОС, правильно заданное время хоста, добавление репозитория, инсталляция пакетов, необходимых для кластера, запуск Docker и kubelet, установка кластера);
- Установка мастера;
- Настройка виртуальной сети;
- Подключение вычислительных узлов;
- Управление кластером с узлов, не принадлежащих кластеру;
- Установка и получение доступа к Web-UI;
- (опционально) установка WeaveScope;
- Запуск приложения.
Подготовка приложения к деплою
Здесь обязательные шаги — это подготовка окружения (развёртывание кластера, проверка, настройка container registry), подготовка репозитория, создание набора ресурсов в Deployment, настройка Service, настройка Ingress и ввод команды «werf converge» для сборки и развёртывания приложения.
Как автоматизировать деплой с Kubernetes
- Первый шаг — это создание Deployment манифестов. Deployment манифесты позволяют управлять репликами подов.
- Второй шаг — автоматическое масштабирование. HorizontalPodAutoscaler автоматически увеличивает или уменьшает количество подов в зависимости от нагрузки.
- Третий шаг — использование ConfigMaps и Secrets. ConfigMaps управляет конфигурацией приложений вне контейнеров, а Secrets обеспечивает безопасное хранение конфиденциальных данных.
- Четвёртый шаг — настройка 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: поддержка серверов (сборки, среды тестирования, оркестровка), автоматическое развёртывание параллельных сред, естественная интеграция с процессами разработки и выпуска микросервисов.
Этапы автоматизации: установка и настройка Jenkins x Serverless, импорт существующего проекта в Jenkins (создание нового репозитория, добавление необходимых файлов для Jenkins, создание пользовательских пакетов сборки для Jenkins, выбор источника для пакетов сборки, добавление поддержки модульного тестирования), интеграционное тестирование в Jenkins с помощью API.
Заключение
Kubernetes — классное решение для оркестровки контейнеров как для микросервисных, так и для крупных проектов. А использование дополнительных решений — Jenkins, GitOps, Docker — позволяет упростить работу по подготовке и развёртыванию деплоя, а также сборку приложений.
А что вы думаете об автоматизации развёртывания Kubernetes? Поделитесь своим опытом в комментариях к этой статье — будем рады почитать вашу обратную связь!
515 открытий4К показов