Самый первый вариант установки и запуска собственного 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.