Lev Goncharov

DevOps Engineer

View My GitHub Profile

Запускаем приложение в Openshift и сравниваем существующий инструментарий

Это расшифровка выступления на kubernetes SPB meetup #3 (RU) 2019-02-25 и ITGM #14 (ENG) 2019-03-23.

Предыстория

Я хочу рассказать история, как запускали приложение в Openshift. Так же по ходу пьесы рассмотрим утилиты для управления приложением внутри Openshift.

Цель

This is fine

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

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

Пререквизиты

Deploy

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

Deploy

Но мир жесток, у нас был ряд ограничений:

Ansible-container demo

Ansible-container

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

По большому счету, что бы сделать сделать демо мы взяли существующие роли, настраивающие всё и вся, и сделали “монолитный контейнер”. Что собрать контейнер не было особых проблем, т.к. у Openshift есть замечательные рекомендации, но отдельно отмечу:

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

Multiple containers demo

Multiple containers

Демо контейнер выполнил свою роль и мы распилили его на отдельные составляющие:

  1. Наше приложение.
  2. База данных.
  3. Внешние сервисы итд…

Multiple containers

Первое с чем столкнулись, как инициализировать базу данных? Понятно что используем миграции, но когда и как их применять? Тут стоит дать ссылку на замечательную статью описывающие устройство POD: PODs life. По большому счету есть несколько подходом:

Мы решили пойти по пути Init-container. Т.е. в POD нашего приложение, до старта нашего приложения, стартует контейнер, который катит миграции. Но как сконфигурировать само приложение и внешние интеграции?

Initialize the application

Multiple containers

Как я уже упоминал, наше приложение может и должно работать совершенно в разных окружениях, с разными БД и интеграциями. Опять же вопрос, как это все настраивать?

Мы выбрали последний подход, т.к. он позволяет делать конфигурацию воспроизводимой и самодостаточной. Только зачем-то изначально сделали этот контейнер в отдельном replication controller с фактором 1.

Multiple containers

Ок, почитаем документацию снова.

A pod (as in a pod of whales or pea pod) is a group of one or more containers (such as Docker containers), with shared storage/network, and a specification for how to run the containers.

POD это группа контейнеров. В итоге наш под состоял из 3 контейнеров

  1. Init container для инициализации a PostgreSQL.
  2. Контейнер с приложение.
  3. Контейнер с конфигурацией приложения.

Инструментарий

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

Openshift templates

Openshift templates

Openshift templates

Плюсы:

Минусы:

Scripts and template

Custom scripts

Плюсы:

Минусы:

Terraform k8s provider

Terraform k8s provider

Terraform k8s provider

Плюсы:

Минусы:

Ansible-container

Ansible-container

Ansible-container

Плюсы:

Минусы:

Ansible k8s module

Ansible k8s module

Ansible + k8s module

Плюсы:

Минусы:

Ansible Playbook Bundle

Ansible Playbook Bundle

Утилита Ansible Playbook Bundle (APB) предлагает подход: а давайте запакуем ansible роли для развертывания приложения внутри k8s/openshift в контейнер и будем запускать внутри k8s/openshift.

Плюсы:

Минусы:

Выводы

Result

Не хочется быть последний инстанцией, но поделюсь своими умозаключениями: