Все хотят, чтобы их приложение работало на Kubernetes. Но как начать этот процесс? Какие шаги нужно выполнить? Как оценить усилия?

Многие команды разработчиков только начинают свой путь к K8. Несмотря на популярность Kubernetes в последние годы, все еще есть много организаций, которые только начинают планировать процесс миграции.

В рамках нашей работы мы помогаем и поддерживаем такие компании в процессе миграции Kubernetes. Здесь мы хотели бы поделиться общими шагами и вехами, которые должны сделать команды разработчиков, чтобы перенести свое замечательное приложение на K8s. В этой статье мы выделяем три основные области этого процесса:

  1. Подготовьте приложение к K8s
  2. Создание процесса CI / CD
  3. Подготовьте кластер Kubernetes

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

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

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

Подготовьте приложение для K8s

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

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

Вам повезло, если вы задокументировали все части вашего приложения. Здесь вы должны хотя бы назвать все компоненты, которые будут перенесены. Более того, сложная часть состоит в том, как их интегрировать. Вы должны рассмотреть все варианты связи, которые присутствуют в вашем приложении, будь то очереди сообщений или служебные шины и т. Д. Общие диаграммы, такие как представление развертывания, диаграмма потоков данных или шестиугольное представление, будут полезны в этой части процесса.

2. Переосмыслить архитектуру. Часто команды поначалу проявляют большой энтузиазм - давайте перейдем на Kubernetes, давайте заменим монолит на микросервисы, давайте все перепишем! 😊

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

Это обеспечивает масштабируемость, но создает некоторые проблемы, которые необходимо преодолеть. Поэтому следующие области, которые необходимо изменить - решение для ведения журналов (переход к централизованному ведению журналов, например, ELK), общая память и хранилище сеансов (Redis) и файловое хранилище (внешние постоянные тома); плюс все остальное, что необходимо изменить перед переносом.

3. Автоматизировать тестирование. Да, это сделано намеренно и, по нашему опыту, очень важно. Мы твердо уверены, что культура автоматизации может сэкономить ваше время и деньги и снизить уровень стресса. Вы должны подумать о том, как вы будете тестировать перенесенные компоненты. У вас есть для них интеграционные тесты? Будете ли вы запускать новую и старую версии одновременно и сравнивать их результаты?

4. Создайте контейнер для вашего приложения. В настоящее время это несложно реализовать. Существует множество готовых образов Docker для многих фреймворков и сред выполнения приложений. Вы можете найти примеры и документы о том, как Dockerize ваш компонент для каждого современного языка программирования. Основное усилие здесь - настроить / заменить / найти библиотеки, которые будут работать в Linux. Кроме того, могут потребоваться некоторые изменения кода. Затем вы просто готовите файлы докеров и проверяете, что они работают.

5. Сопоставление с объектами K8s. Kubernetes предоставляет несколько объектов и параметров, которые вы можете использовать для размещения своих компонентов, таких как развертывания, службы, конечные точки, задания и другие объекты. На этом этапе полезным упражнением является создание проекта новой архитектуры K8s и выбор типов объектов для ваших модулей.

6. Скрипты Kubernetes. Следующим шагом является создание объектов Kubernetes для ваших компонентов. Вам следует писать файлы YAML для развертываний Kubernetes, служб, модулей, заданий и других компонентов.

Сценарии могут храниться рядом с каждым компонентом приложения, или вы можете создать отдельный репозиторий для этих конфигураций. Вы можете подготовить и протестировать такие скрипты на своей локальной установке K8s, используя minikube или Docker Desktop. Кроме того, здесь вы можете подготовить сценарии для некоторых частей инфраструктуры вашего приложения, например для установки RabbitMQ, Redis или любых других требований.

7. База данных приложения. В большинстве случаев вы оставите свою базу данных как есть и просто подключитесь к ней из нового приложения Kubernetes. Но иногда вы можете включить миграцию базы данных на собственные технологии Kubernetes; например, запуск PostgreSQL с использованием Crunchy data.

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

Установить процесс CI / CD

Этап, который важен и обычно не привлекает особого внимания, - это настройка конвейера доставки ваших изменений в Kubernetes. Желаемый процесс CI / CD показан на диаграмме ниже.

1. Начинается с новых изменений в репозитории исходного кода.

2. Затем запускается механизм CI / CD и выполняет процесс сборки.

3. Результатом сборки является готовый к развертыванию образ Docker с файлами приложения. Этот образ помещается в реестр Docker.

4. Механизм CI / CD запускает процесс развертывания, обновляя версию образа для соответствующего развертывания K8s.

5. Kubernetes обновляет модули и извлекает новый образ приложения из реестра Docker.

Мы предполагаем, что у вас уже есть инструмент CI / CD, поэтому мы можем начать со следующих шагов процесса миграции:

1. Настройка исполнителей сборки

На этом этапе важно, чтобы результатом процесса сборки был образ Docker. Это означает, что исполнители сборки должны поддерживать Docker и иметь возможность создавать ваше приложение и упаковывать его в образ.

Более того, было бы лучше иметь Docker runner, где каждая сборка выполняется внутри Docker. Это означает, что у вас будет возможность запускать несколько сборок параллельно и поддерживать чистоту ваших исполнителей сборки и не перегружать вас несколькими фреймворками и языками. Поэтому в этом случае вам необходимо подготовить несколько образов Docker для сборки с соответствующими фреймворками.

2. Создайте или выберите реестр Docker.

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

3. Настроить сборки CI / CD.

Здесь вы должны настроить процесс CI / CD для ваших компонентов, будь то вручную или если ваш инструмент поддерживает сценарии конфигурации. Лучший способ - написать файлы конфигурации (YAML или другие), которые описывают процесс сборки внутри каждого репозитория приложения.

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

4. Создайте сценарии развертывания Kubernetes.

Последним шагом на этом этапе является запуск Kubernetes Admin API для запуска процесса развертывания. Обычно для этого используются Python или сценарии оболочки.

Например, для Python существуют некоторые библиотеки Kube API client, которые вы можете использовать для доступа к Kubernetes и управления его ресурсами. Цель этих скриптов - обновить соответствующий объект развертывания K8s новой версией образа, после чего Kubernetes выполнит остальную работу. Вы можете начать тестирование таких сценариев на локальной установке K8s или на кластере разработчиков, если он готов.

Подготовить кластер Kubernetes

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

Что касается создания кластера, вы можете проверить официальную документацию и выбрать там какого-либо проверенного провайдера, например, Rancher или аналогичную технологию. Кроме того, у всех крупных облачных провайдеров есть свои версии управляемого кластера Kubernetes, который можно запустить в несколько кликов.

Мы не можем предоставить точные инструкции по установке или сценарии для установки Kubernetes, потому что каждое приложение настраивается и переносится по-разному. Но здесь мы перечислили компоненты или артефакты, которые вы должны учитывать для своего кластера.

  1. Удобная панель управления. Вам нужна панель администратора для управления всеми частями Kubernetes. Это зависит от того, как вы создадите свой кластер; некоторые инструменты уже предоставляют вам удобный интерфейс для управления K8s. Но на всякий случай вот несколько шагов по установке kubeadm.
  2. Настроены безопасность и политики. Установить безопасность кластера и организовать контроль доступа пользователей. Здесь официальная документация предоставит вам отличный обзор того, что и как нужно настраивать.
  3. Сетевой трафик и DNS. Сеть - неотъемлемая часть кластера. Начиная с некоторых базовых сетевых политик, затем настраивая входящий трафик, включая конфигурацию DNS.
  4. Мониторинг кластера. Собирайте метрики и настраивайте по ним соответствующие оповещения. Стандартная комбинация здесь - Прометей + Графана. Или готовые продукты вроде New Relic, Dynatrace, DataDog и других.
  5. Доступный объем хранилища. У большинства приложений есть файлы для хранения. В этом случае вы должны предоставить им постоянное и отказоустойчивое хранилище. Например, настроить том на основе NFS или даже AWS EBS или других типов хранилища класса.
  6. Хранение секретов. Именно здесь можно более эффективно хранить конфиденциальные данные, такие как строки подключения, пароли и т. Д. Опять же, Kubernetes предлагает вам здесь несколько вариантов, например, свои собственные Секретные объекты, или вы можете использовать другие альтернативы, например, AWS Secrets Manager.
  7. Централизованное хранилище журналов. Одна из наиболее важных частей вашего приложения - это журналы, вы должны знать, что происходит в ваших службах. Здесь вы можете создать собственное решение для ведения журнала, например, на базе ELK. Или используйте лог-продукты Graylog, Logz.io, Splunk и другие.
  8. Пространства имен Kubernetes. И последнее, но не менее важное, это пространства имен K8s. Вы должны подумать о том, как организовать ресурсы кластера. Будете ли вы работать в пространстве имен по умолчанию или каким-то образом создадите несколько пространств имен с собственными квотами ресурсов?

Желаемый результат здесь - иметь всю конфигурацию Kubernetes в виде исходного кода, который соответствует подходу IaC (инфраструктура как код). Часто у вас есть отдельный репозиторий, где вы храните скрипты для всех объектов Kubernetes. Вы можете начать с простых скриптов Kubernetes, а затем объединить их в Helm Charts.

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

Резюме

Мы надеемся, что эти шаги по миграции помогли вам понять, готово ли ваше приложение к Kubernetes или нет, и насколько сложно будет портировать его на Kubernetes. Вы можете использовать их для разработки собственного плана миграции K8s и выполнения плавной миграции позже. Продолжайте улучшать свое приложение!