Самый первый вариант установки и запуска собственного Hubot - это Heroku. В документации Hubot есть целый раздел, как это сделать. Это очень простое и понятное решение, но оно верно, если вы используете только Hubot и вам не нужно поддерживать какие-либо другие сервисы.

В современной компании объединение ваших услуг и ресурсов на одной платформе снижает затраты на обслуживание и эксплуатацию, не говоря уже о лучшем обмене знаниями внутри ИТ-отдела. Вам не нужно нанимать нескольких специалистов для поддержки каждой платформы, вам достаточно одного YAML-разработчика ;-)

Фон

Некоторое время назад мы начали перемещать все наши рассредоточенные сервисы в кластер Kubernetes (он же k8s), который работает на Google Cloud Platform. Поскольку это требует некоторых изменений в самом приложении, это не просто работа DevOps.

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

Этот пост адресован людям Devops, а также рядовым разработчикам вроде меня. Прочитав все части, вы узнаете, как настроить любое приложение на кластере k8s.

Предпосылка

Я предполагаю, что у вас работает собственный кластер k8s, а также у вас есть доступ к Jenkins, который работает в том же кластере, или, по крайней мере, на нем установлен плагин Kubernetes. Это необходимые шаги, прежде чем двигаться дальше. Если вы скучаете по ним, пожалуйста, наймите кого-нибудь из Devops, чтобы он все настроил для вас :)

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

  • Docker - у вас должна быть возможность запускать docker команду и docker-compose также
  • Helm v3.0 - пакетный менеджер для k8s
  • Kubectl - cli-инструмент для управления кластером k8s

Сказав это, самое последнее - это ваш экземпляр Hubot, который, как я полагаю, вы уже использовали и запускали на Heroku или около того.

Головной мозг

Одно из основных изменений в нашем экземпляре Hubot, который сейчас работает на Heroku, - это начать использовать MySQL вместо Redis для хранения мозгов Hubot. Настроить экземпляр MySQL на k8s очень просто по сравнению с кластером Redis. Кроме того, Hubot уже поддерживает MySQL, используя пакет hubot-mysql-brain, поэтому решение выглядит простым. Только не забудьте экспортировать текущий мозг Хубота :)

Dockerize

Самым первым шагом при запуске любого приложения в кластере k8s является его докеризация. Уже есть несколько готовых к использованию изображений, но я предпочитаю создавать свои собственные изображения с помощью Dockerfile. Ниже приведен пример, который я использую прямо сейчас для запуска всех наших ботов:

Hubot написан на Coffeescript, который компилируется в простой JavaScript, что означает, что это приложение на основе Node.js, поэтому я начал с node в качестве базового изображения. Затем я добавил несколько полезных пакетов, настроил правильный часовой пояс и определил пользователя - Devops это понравится ;-)

Затем я скопировал все связанные с Hubot папки и, наконец, открыл порт 8080 в качестве порта по умолчанию, используемого express серверной частью Hubot - это необходимо, если вы хотите использовать расширенный Slack API.

Вы можете создать и протестировать образ локально, используя следующие команды:

docker build -t bob-the-bot .
docker run -it --rm bob-the-bot

Вы увидите, что ваш бот работает, но у него отсутствует большая часть конфигурации. Давайте вместо этого используем docker-compose.yaml, чтобы правильно настроить всю среду.

докер-сочинять

Использование docker-compose.yaml позволяет нам настраивать не только образ Hubot, но также запускать экземпляр MySQL, который может использоваться Hubot. Как я упоминал ранее, настроить экземпляр MySQL в кластере k8s очень просто. Перед тем как начать это делать, рекомендуется все протестировать локально. Таким образом, это означает, что я должен настроить бота, чтобы он начал использовать hubot-mysql-brain вместо Redis. Пожалуйста, следуйте инструкциям на этой странице о том, как это сделать.

Подготовив бота к использованию MySQL, вы можете использовать приведенное ниже docker-compose.yaml для тестирования всех компонентов:

Необходимо объяснить лишь несколько вещей. Во-первых, MYSQL_URL - это URL-адрес, используемый hubot-mysql-brain для подключения к экземпляру MySQL, HUBOT_SLACK_TOKEN и HUBOT_SLACK_VERIFICATION_TOKEN - это два окружения, специфичные для вашего локального окружения - они будут передаваться непосредственно из вашего окружения в запущенный экземпляр образа Hubot.

Во-вторых, depend_on определяет зависимость от образа MySQL, что означает, что сначала должен быть запущен контейнер MySQL, а затем может быть запущен контейнер Hubot. Я использовал официальный образ MySQL из Docker Hub.

Последний шаг - инициализировать экземпляр MySQL, как того требует hubot-mysql-brain. Для этого я использовал внешний сценарий SQL для создания новой базы данных и таблицы. Чтобы запустить сценарий, вы должны определить command раздел с нужным объемом:

command: --init-file /data/application/init.sql
volumes:      
  - .:/data/application/

Скрипт SQL выглядит так:

Контрольная работа

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

docker-compose build
docker-compose up

Вы должны заметить, что экземпляр MySQL запущен и сценарий инициализации был загружен:

[Note] Execution of init_file '/data/application/init.sql' started.
[Note] Execution of init_file '/data/application/init.sql' ended.

Затем сам бот был запущен и подключен к Slack:

INFO Logged in as @bob in workspace SoftwareMill
INFO Connected to Slack RTM

Теперь мы готовы стать YAML-разработчиком и развернуть нашего бота в кластере Kubernetes.