Как мы автоматизировали развертывание Kubernetes и решили поделиться этим со всеми

5 0

Введение: почему мы решили открыть свои наработки

Каждая компания, которая серьёзно занимается инфраструктурой, рано или поздно накапливает собственный набор инструментов, скриптов и практик. Что-то создаётся для решения сиюминутных задач, что-то вырастает в полноценные внутренние продукты. И в какой-то момент возникает вопрос: оставить это внутри компании или поделиться с партнёрским сообществом?

Компания СТАРКОВ Групп, генеральный партнёр Directum, всегда выбирает второй путь. Мы представляем сообществу свой Ansible-плейбук для развертывания отказоустойчивых Kubernetes кластеров и выкладываем его в открытый доступ на GitHub.

Почему мы приняли такое решение? Ответ прост: мы искренне верим, что экспертизой нужно делиться. За годы работы наша команда прошла через множество проектов, набила немало шишек и выработала подходы, которые реально работают. Этот опыт может быть полезен коллегам по отрасли, и было бы неправильно держать его под замком.

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

Проблема, с которой сталкивается каждый

Давайте поговорим о том, с чем приходится иметь дело инженерам, когда речь заходит о развертывании Kubernetes в production.

Ручная установка  дело хоть и интересное, но затратное, если рассчитывать это в человеко-часах, да и к тому же, никто не застрахован от ошибок.

Kubespray — мощное решение, ставшее своеобразным стандартом в индустрии. Это действительно впечатляющий проект с огромными возможностями. Такая мощность, однако, требует внимательного подхода: работа с сотнями переменных конфигурации, сложная иерархия ролей, а также значительное время выполнения процессов. Чтобы по-настоящему разобраться в Kubespray, понять логику его работы и научиться эффективно кастомизировать под свои нужды, требуются дни, а то и недели погружения.

Но есть ещё один важный момент, который часто остаётся за кадром. Задачи импортозамещения сегодня стоят перед многими организациями. Всё больше компаний, особенно в государственном секторе и в смежных отраслях, переходят на RedOS, Astra Linux и другие отечественные операционные системы. И вот тут возникает неприятный сюрприз: готовых, проверенных инструментов для развертывания Kubernetes на этих ОС практически не существует. Kubespray их не поддерживает из коробки.

Именно эта ситуация подтолкнула нас к созданию собственного инструмента. Нам нужно было что-то простое, понятное и поддерживаемое. Что-то, что решает реальные задачи здесь и сейчас, а не заставляет тратить время на изучение документации и разборы полётов.

Наша философия: честный разговор о простоте и прагматизме

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

Мы выбрали простоту вместо догматичного следования всем правилам.

Что это означает на практике? Плейбук местами использует модуль shell/command вместо специализированных Ansible-модулей. Для пуриста это может выглядеть как нарушение канонов. Но давайте посмотрим на это с другой стороны.

Когда инженер открывает наш плейбук, он видит понятные shell-команды  те самые, которые можно взять и выполнить руками в терминале. Любой специалист, знакомый с Linux и bash, сразу поймёт, что происходит в каждой таске. Не нужно лезть в документацию Ansible, изучать десятки специфичных модулей и разбираться в их особенностях. Минимум «магии»  максимум прозрачности.

Вот реальный пример из нашего плейбука:

ansible.builtin.shell: kubeadm token create -print-join-command

Одна строка. Понятная команда. Любой инженер сразу видит, что здесь происходит: создаётся токен и генерируется команда для подключения воркеров. Можно скопировать эту команду, выполнить вручную, убедиться что всё работает. Никакой магии, никаких скрытых абстракций.

Какие преимущества даёт такой подход?

  • Простой для понимания даже для тех, кто не глубоко знает Ansible. Достаточно базового понимания YAML и опыта работы с Linux.

  • Минимум зависимостей. Весь плейбук требует всего две внешние коллекции: community.general и ansible.posix. Никаких десятков зависимостей, которые могут конфликтовать между собой или устаревать.

  • Легко отлаживать. Если что-то не работает, можно взять команду из shell и выполнить её руками, чтобы понять причину проблемы, если дефолтного вывода ansible недостаточно.

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

Честное признание: да, это не идеальный код по всем канонам Ansible. Да, опытные разработчики могут найти к чему придраться. Но это работает, это понятно, и это легко поддерживать. Мы выбрали прагматизм вместо перфекционизма. И считаем это правильным выбором для инструмента, который должен решать реальные задачи в реальных проектах.

Что умеет наш плейбук: возможности без маркетингового тумана

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

Поддержка операционных систем

Одна из главных особенностей плейбука  поддержка импортозамещённых ОС, таких как: Astra Linux (Orel), RedOS 8, но также есть ещё и знакомые всем debian/ubuntu. Почему нет поддержки Astra Linux SE? Ответ довольно простой: для того чтобы Kubernetes корректно заработал в редакции SE, приходится все навороты от SE отключать  и какой в этом тогда смысл-то?

Важно отметить, что это не теоретическая поддержка «на бумаге», а проверенные с помощью десятков тестов варианты установки.

Сетевые плагины (CNI) на выбор

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

  • Flannel  простой и надёжный. Отличный выбор для тех, кто только начинает работу с Kubernetes или не нуждается в сложных сетевых политиках. Минимум настроек, предсказуемое поведение.
  • Calico  более функциональный вариант. Поддерживает сетевые политики, обеспечивает высокую производительность. Хороший выбор для production-окружений с требованиями к сетевой безопасности.
  • Cilium  современный подход на базе eBPF. Для тех, кто хочет использовать передовые технологии и готов к более сложной настройке.

Хранилища данных

Без персистентного хранилища Kubernetes-кластер подходит только для stateless-приложений. Наш плейбук пока что поддерживает два варианта:

  • local-path-provisioner от Rancher  простое решение, которое использует локальные диски нод. Подходит для разработки, тестирования и простых production-сценариев.
  • Longhorn  распределённое блочное хранилище. Обеспечивает репликацию данных между нодами, поддерживает снапшоты и бэкапы. Серьёзный выбор для production-окружений, где важна сохранность данных.

Высокая доступность: два подхода на выбор

Отказоустойчивость  ключевое требование для production-кластеров. Плейбук поддерживает два режима организации HA, и каждый имеет свои преимущества.

Классический подход: HAProxy + Keepalived

Это проверенная временем комбинация, знакомая большинству инженеров. HAProxy выступает в роли балансировщика нагрузки и распределяет трафик между API-серверами Kubernetes. Keepalived обеспечивает отказоустойчивый Virtual IP: если основная нода выходит из строя, IP-адрес автоматически переезжает на резервную.

Современный подход: kube-vip

Более элегантное решение, которое работает как static pod прямо внутри Kubernetes. Virtual IP обеспечивается через ARP с механизмом leader election. Главное преимущество  меньше внешних компонентов, проще архитектура, меньше точек отказа.

Объективное сравнение с альтернативами

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

В сравнении с Kubespray

  • Простота конфигурации. Вся настройка нашего плейбука умещается в одном файле hosts. В Kubespray вам придётся работать с сотнями переменных, разбросанных по множеству файлов.

  • Зависимости. Наш плейбук требует две Ansible-коллекции. Kubespray тянет за собой десятки зависимостей.

  • Время на освоение. Структуру нашего плейбука можно понять за час-два. На освоение Kubespray закладывайте, как минимум, неделю.

  • Поддержка отечественных ОС. RedOS и Astra Linux поддерживаются нативно. В Kubespray такой поддержки без «костылей» нет.

  • Скорость выполнения. Наш плейбук работает быстрее за счёт отсутствия избыточных проверок и универсальных абстракций.

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

В сравнении с ручной установкой

Если вы всё ещё разворачиваете кластеры руками, автоматизация даст очевидные преимущества:

  • Идемпотентность. Плейбук можно безопасно запускать повторно. Если что-то прервалось посередине, просто запустите снова.

  • Экономия времени. Хотите руками крутить кубик на ~10 нодах, вас никто не останавливает. Но сколько вы потратите на это времени? А если нод не 10, а 20? А если вообще 100?

  • Кластер из любых ОС. Данный плейбук создан, чтобы вы могли собрать любой кластер, из любых ОС. Хотите 3 мастера/воркера, но каждый с разными ОС? Пожалуйста! Просто укажите их ip в hosts файле, а плейбук сделает всё остальное, сам определит ОС, сам выполнит нужные шаги, вам остаётся только наблюдать за процессом!

  • Единообразие. Все серверы настраиваются одинаково.

Импортозамещение: не галочка, а реальная работа

Тема импортозамещения часто превращается в маркетинговый шум. Компании заявляют о поддержке отечественных ОС, но на практике оказывается, что эта поддержка существует только в презентациях, или в крайне «костыльных» решениях. Мы подходим к этому иначе. Поддержка RedOS и Astra Linux в нашем плейбуке  результат реальной работы и множества тестов. Но нюансы, конечно есть:

  • RedOS: Kubernetes доступен в стандартных репозиториях этой операционной системы, что упрощает установку и обновление.
  • Astra Linux: здесь ситуация немного сложнее, так как Kubernetes нет в штатных репозиториях. Плейбук выполняет установку из официальных бинарников, автоматически создаёт systemd-сервисы для всех компонентов и обходит известные ограничения ОС, которые могут мешать работе кластера.

Это не теоретическая поддержка  это проверенное на практике решение.

Быстрый старт: от нуля до работающего кластера

Одна из целей, которую мы ставили при создании плейбука  минимизировать время от «хочу попробовать» до «у меня работает кластер». Вот как выглядит процесс.

Конфигурация

Вся настройка выполняется в одном файле hosts. Вот пример типовой конфигурации:

[all:vars]

ansible_user=user

#Username для аутентификации на серверах

ansible_python_interpreter=/usr/bin/python3

# Kubernetes Configuration

kubernetes_cni=calico

# Варианты: flannel, calico, cilium, none

kubernetes_storage=longhorn

# Варианты: none, local-path, longhorn

kubernetes_repo_mirror=tsinghua

# Варианты: official, tsinghua

kubernetes_version=1.32.0

# Версия Kubernetes для установки (формат: X.Y.Z, например 1.32.0)

kubernetes_install_method=repo

# Метод установки Kubernetes:

# repo - из репозиториев (по умолчанию для Debian/Ubuntu/RedOS)

# binary - из бинарников (обязательно для Astra Linux, опционально для других)

# Для Astra Linux автоматически используется binary независимо от этой настройки

ha_type=kubevip

# Варианты: legacy (haproxy+keepalived), kubevip

# При kubevip используется дефолтный порт 6443, при legacy - 6444 (за HAProxy)

#enable_worker_on_cp=true

# Разрешить запуск workloads на control-plane нодах (снять taint, добавить метку worker)

# По умолчанию: true

[master_node]

master0 ansible_host=10.0.10.101 keepalived_priority=100

# Нода на которой будет производиться первоначальная инициализация, единственная обязательная нода в плейбуке.

[other_masters]

master1 ansible_host=10.0.10.102 keepalived_priority=99

master2 ansible_host=10.0.10.103 keepalived_priority=98

#master3 ansible_host...

#masterN ..

[worker_nodes]

worker1 ansible_host=10.0.10.104

worker2 ansible_host=10.0.10.105

#worker3 ansible_host...

#workerN

[control_plane:children]

master_node

other_masters

[control_plane:vars]

keepalived_virtual_ip=10.0.10.10

Всё понятно с первого взгляда: указываем версию Kubernetes, выбираем CNI и хранилище, перечисляем ноды с их IP-адресами, задаём Virtual IP для HA. Никаких сотен переменных, никаких вложенных файлов конфигурации за которые стоит беспокоиться инженеру.

И да  вас никто не заставляет разворачивать кластер из определенного количества нод, хотите кластер из 1 ноды? Удалите все master и worker записи, оставьте только master0 и запускайте!

Три команды для повседневной работы

  • Развернуть кластер: ansible-playbook -i hosts k8s.yml

  • Полностью удалить кластер: ansible-playbook -i hosts k8s-cleanup.yml

  • Выполнить только определённые шаги: ansible-playbook -i hosts k8s.yml -tags "storage"

Техническая структура

Плейбук состоит из 8 основных ролей: common, containerd, kubernetes-common, haproxy_keepalived, kubevip, kubernetes-master, kubernetes-con-node, kubernetes-storage. Поддерживается работа через китайские зеркала репозиториев (официальные репы могут блокироваться провайдерами). Pod CIDR по умолчанию настроен как 10.244.0.0/16, но легко меняется при необходимости.

Планы развития: мы здесь надолго

Выложить код в open source  это только начало. Мы планируем активно поддерживать и развивать плейбук.

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

  • Расширение списка ОС. Если появится потребность в поддержке других операционных систем  мы готовы её добавить. Но нужно время.

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

  • Расширение возможностей установки. В будущем появится возможность использования FQDN вместо IP, для controlplaneendpoint, что даст возможность использовать дефолтный порт 6443, при использовании legacy-метода HA.

  • И многое другое!

Заключение: попробуйте сами

Мы создали инструмент, который решает реальные задачи: развертывание отказоустойчивых кластеров Kubernetes просто, понятно и с полноценной поддержкой отечественных операционных систем. И решили поделиться им с вами, потому что верим: так правильно.

Плейбук доступен на GitHub: https://github.com/EgorovEA/k8s-ansible 

Мы приглашаем вас попробовать его в деле. Разверните тестовый кластер, посмотрите как всё работает, оцените подход. Если что-то не понравится или вы увидите возможность для улучшения  напишите нам. Любая обратная связь помогает делать продукт лучше.

И если вашей организации нужна помощь с внедрением Kubernetes, настройкой DevOps-практик или автоматизацией инфраструктуры, компания "СТАРКОВ Групп" готова помочь. Мы не просто выкладываем код в open source, мы реально работаем с этими технологиями каждый день и знаем их не по документации, а по опыту реальных проектов.

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий