Разворачиваем Hello Word сервис во Fleet
// 9 июня, 2016 // Виртуализация, Системное администрирование
В этом посте я расскажу, как развернуть свой первый «облачный» сервис через распределённую систему fleet. Это система запуска сервисов в кластере машин на базе CoreOS. Вообще рекомендую прочитать про эту операционку, т.к. там многое сделано и заточено именно под кластерные системы.
Теория
CoreOS — это операционная система, заточенная на работу в кластере. У неё нет пакетного менеджера, т.к. работать в ней софт может только в контейнерах. Ну на самом деле не только, но главное понять что coreos — это хостова операционка для запуска контейнеров с сервисами.
Fleet — это сетевая версия systemd. Точнее сказать, это средство по управлению, балансировкой и оркестрацией сервисами (реализуемые в вид контейнеров) на уровне кластера. Например, мы запускаем сервис на однйо машине, она умирает и сервис запускается на другой. Сейчас мы попробуем это в действии.
Требования к испытательному стенду
Развернуть можно практически на любой машине. Ставим с офсайтов последнюю версию VirtualBox и Vagrant. Ну и git конечно.
Разворачиваем CoreOS кластер
$ git clone https://github.com/coreos/coreos-vagrant $ cd coreos-vagrant $ cp user-data.sample user-data $ curl https://discovery.etcd.io/new?size=3 // Забиваем полученный url в файл в user-data в раздел discovery: https://discovery.etcd.io/<token> $ cp config.rb.sample config.rb // ставим количество нод = 3 $ vagrant box update $ vagrant up
Должны создаться три виртуальные машины core-01, core-02, core-03.
Узнаём IP адрес любой машины (т.к. они равноправные) и заходим на неё по ssh
echo $(vagrant ssh core-01 -c "ip address show eth1 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//'") ssh -A core@172.17.8.101 -i ~/.vagrant.d/insecure_private_key -o "StrictHostKeyChecking no"
Или можно коннектиться так:
$ ssh-add ~/.vagrant.d/insecure_private_key Identity added: /Users/core/.vagrant.d/insecure_private_key (/Users/core/.vagrant.d/insecure_private_key) $ vagrant ssh core-01 -- -A CoreOS (beta)
Далее уже на одной из нод кластера. Создаём такой вот Unit-файл для fleet hello.service в текущем каталоге юзера core
core@core-02 ~ $ fleetctl cat hello.service [Unit] Description=Hello World [Service] ExecStart=/bin/bash -c "while true; do echo \"Hello, world\"; sleep 1; done"
Теперь сохраняем файл и добаввляем его в кластер.
fleetctl submit hello.service fleetctl start hello.service fleetctl status hello.service
Ну вот, сервис запущен в кластере.
core@core-01 ~ $ fleetctl status hello.service ● hello.service - Hello World Loaded: loaded (/run/fleet/units/hello.service; linked-runtime; vendor preset: disabled) Active: active (running) since Wed 2016-04-27 08:48:21 UTC; 1h 9min ago Main PID: 1409 (bash) Memory: 456.0K CPU: 4.309s CGroup: /system.slice/hello.service ├─1409 /bin/bash -c while true; do echo "Hello, world"; sleep 1; done └─5669 sleep 1 Apr 27 09:57:26 core-02 bash[1409]: Hello, world
Важно то, что fleetctl status адекватно работает только на той ноде, на которой запущен в данный момент сервис. Т.е. при подключении к одной ноде и попытке узнать в ней статус сервиса на другой ноде получим ошибку:
core@core-03 ~ $ fleetctl status hello.service Error running remote command: SSH_AUTH_SOCK environment variable is not set. Verify ssh-agent is running. See https://github.com/coreos/fleet/blob/master/Documentation/using-the-client.md for help
Как с этим бороться я пока не знаю, м.б. это нормальное поведение, т.к. fleetctl status является оберткой над systemctl status.
Теперь прибиваем одну из виртуалок и смотрим вывод команды fleetctl list-units.
core@core-01 ~ $ fleetctl list-units UNIT MACHINE ACTIVE SUB hello.service bee7c9a3.../172.17.8.102 active running
Сервис убежал на другую виртуалку.
Ссылки
https://coreos.com/blog/coreos-clustering-with-vagrant/
https://coreos.com/fleet/docs/latest/launching-containers-fleet.html
Спасибо!
Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это: