Разворачиваем Hello Word сервис во Fleet

// Июнь 9th, 2016 // Виртуализация, Системное администрирование

coreos-logoВ этом посте я расскажу, как развернуть свой первый «облачный» сервис через распределённую систему fleet. Это система запуска сервисов в кластере машин на базе CoreOS. Вообще рекомендую прочитать про эту операционку, т.к. там многое сделано и заточено именно под кластерные системы.

Теория

CoreOS — это операционная система, заточенная на работу в кластере. У неё нет пакетного менеджера, т.к. работать в ней софт может только в контейнерах. Ну на самом деле не только, но главное понять что coreos — это хостова операционка для запуска контейнеров с сервисами.

Fleet — это сетевая версия systemd. Точнее сказать, это средство по управлению, балансировкой и оркестрацией сервисами (реализуемые в вид контейнеров) на уровне кластера. Например, мы запускаем сервис на однйо машине, она умирает и сервис запускается на другой. Сейчас мы попробуем это в действии.

fleet-pic

Требования к испытательному стенду

Развернуть можно практически на любой машине. Ставим с офсайтов последнюю версию 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

 

 

Share

Спасибо!


Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:


Комментировать