Разворачиваем Hello Word сервис во Fleet
В этом посте я расскажу, как развернуть свой первый “облачный” сервис через распределённую систему fleet. Это система запуска сервисов в кластере машин на базе CoreOS. Вообще рекомендую прочитать про эту операционку, т.к. там многое сделано и заточено именно под кластерные системы.
Теория
CoreOS – это операционная система, заточенная на работу в кластере. У неё нет пакетного менеджера, т.к. работать в ней софт может только в контейнерах. Ну на самом деле не только, но главное понять что coreos – это хостова операционка для запуска контейнеров с сервисами.
Fleet – это сетевая версия systemd. Точнее сказать, это средство по управлению, балансировкой и оркестрацией сервисами (реализуемые в вид контейнеров) на уровне кластера. Например, мы запускаем сервис на однйо машине, она умирает и сервис запускается на другой. Сейчас мы попробуем это в действии.
Требования к испытательному стенду
Развернуть можно практически на любой машине. Ставим с офсайтов последнюю версию VirtualBox и Vagrant. Ну и git конечно.
Разворачиваем CoreOS кластер
1 2 3 4 5 6 7 8 9 |
$ 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
1 2 |
echo $(<span class="highlight">vagrant</span> ssh core-01 -c "ip address show eth1 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//'") ssh -A core@172.17.8.101 -i ~/.<span class="highlight">vagrant</span>.d/insecure_private_key -o "StrictHostKeyChecking no" |
Или можно коннектиться так:
1 2 3 4 |
$ 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
1 2 3 4 5 6 |
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" |
Теперь сохраняем файл и добаввляем его в кластер.
1 2 3 |
fleetctl submit hello.service fleetctl start hello.service fleetctl status hello.service |
Ну вот, сервис запущен в кластере.
1 2 3 4 5 6 7 8 9 10 11 |
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 адекватно работает только на той ноде, на которой запущен в данный момент сервис. Т.е. при подключении к одной ноде и попытке узнать в ней статус сервиса на другой ноде получим ошибку:
1 2 |
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.
1 2 3 |
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